
Как получить доступ к реквизитам формы?
Если реквизит объекта "вытащен" на форму, то реквизит формы можно получить через объект ЭлементыФормы, который содержит коллекцию элементов формы, сканируя ее в цикле:
ДокСсылка = СсылкаНаДокумент(ТипДокумента, НомерДок);
ДокОбъект = ДокСсылка.ПолучитьОбъект();
ФормаОбъекта = ДокОбъект.ПолучитьФорму();
Для Каждого Элемент Из ФормаОбъекта.ЭлементыФормы Цикл
Сообщить(Элемент);
КонецЦикла;
Этот цикл позволяет просмотреть имена а так же типы всех реквизитов формы, в том числе такие реквизиты как надписи, командные панели и тд.
Реквизиты формы могут быть различных типов. Поставив фильтр в виде типа реквизита мы можем просмотреть реквизиты определенного типа.
Если реквизит формы имеет тип "ТабличноеПоле", то можно такой элемент просканировать во вложенном цикле и узнать имена колонок таблицы:
Для Каждого Элемент Из ФормаОбъекта.ЭлементыФормы Цикл
Сообщить(Элемент.Имя);
Если Тип(Элемент) = Тип("ТабличноеПоле") Тогда
Сообщить(" Это табличное поле! " + Элемент.Имя );
Для Каждого Колонка Из Элемент.Колонки Цикл
ИмяКолонки = Колонка.Имя;
Сообщить(ИмяКолонки);
КонецЦикла;
КонецЕсли;
КонецЦикла;
Как получить значение отдельного реквизита формы?
Чаще требуется получать не массив реквизитов формы, а значение отдельных конкретных реквизитов формы. Например реквизиты "Шапки" или "Подвала" формы документа.
Пример:
ФормаОбъекта = ДокОбъект.ПолучитьФорму("ФормаДокумента");
Поставщик = ФормаОбъекта.ЭлементыФормы.Поставщик;
Поставщик = ФормаОбъекта.ЭлементыФормы.Получатель;
Сообщить(ФормаОбъекта.ЭлементыФормы.ТаблПоле.Колонки.Количество());
Реквизиты шапки могут иметь различные типы: Дата, СправочникСсылка, ЧекБокс, элемент раскрывающегося списка и др.
Как получить значение элементов табличной части формы?
Доступ к табличной части формы через объект
Доступ к табличной части формы (например: Товары) можно получить через объект:
ДокОбъект = Док.ПолучитьОбъект(); //здесь Док - ссылка на объект
//просканируем построчно таб часть документа
Для Каждого Стр из ДокОбъект.Товары Цикл
Номенклатура = Стр.Номенклатура;
Стр.Коэффициент = 1;
КонецЦикла;
Здесь ДокОбъект.Товары - это табличная часть "Товары" объекта. Далее в цикле табличная часть построчно сканируется! В каждой итерации цикла можно получить доступ к любому полю строки указав через точку имя этого поля:
Номенклатура = Стр.Номенклатура;
Доступ к табличной части формы через ЭлементыФормы
Табличная часть объекта и табличная часть формы объекта - это не одно и то же!
Для того, чтобы код работал правильно, надо чтобы колонка формы табчасти объекта в свойстве данные ссылалась на реквизит табличной части объекта. Этим определяется тип колонки таб части формы.
То есть должна быть установлена связь между реквизитом табчасти объекта и реквизитом табчасти формы. Форм у объекта метаданных может быть много мы знаем. Табличную часть формы объекта можно получить через объект ЭлементыФормы:
Объект ЭлементыФормы используется для доступа к элементам управления, расположенным на форме, в частности к таб части документа.
ДокСсылка = СсылкаНаДокумент(ТипДокумента, НомерДок);
ДокОбъект = ДокСсылка.ПолучитьОбъект();
ФормаОбъекта = ДокОбъект.ПолучитьФорму();
Для Каждого Элемент Из ФормаОбъекта.ЭлементыФормы Цикл
Если Тип(Элемент) = Тип("ТабличноеПоле") Тогда //элемент формы - табличное поле
Если Элемент.Имя = "Товары" Тогда
Сообщить("Это табличное поле!! " + Элемент.Имя );
//ТабПоле = ФормаОбъекта.ЭлементыФормы.Товары.Значение;
ТабПоле = Элемент.Значение;
Колво = ТабПоле.Количество();
Сообщить("Количество строк: " + Колво);
Для Каждого ТекущаяСтрока Из ТабПоле Цикл
Имя = ТекущаяСтрока.Номенклатура;
Сообщить(Имя);
КонецЦикла;
КонецЕсли;
КонецЕсли;
КонецЦикла;
Результат для документа Авансовый отчет:
Это табличное поле!! Товары Количество строк: 4 Женские ботфорты коричневые Ботинки женские демисезонные Ботинки женские натуральная кожа Женские босоножки
Если надо получить значение всех колонок всех строк, то организуем дважды вложенный цикл: Во внешнем цикле сканируются строки, во внутреннем - колонки:
ДокСсылка = СсылкаНаДокумент(ТипДокумента, НомерДок);
ДокОбъект = ДокСсылка.ПолучитьОбъект();
ФормаОбъекта = ДокОбъект.ПолучитьФорму("ФормаДокумента");
Для Каждого Элемент Из ФормаОбъекта.ЭлементыФормы Цикл
Если Тип(Элемент) = Тип("ТабличноеПоле") Тогда
Если Элемент.Имя = "ВыданныеАвансы" Тогда //таб часть объекта
Сообщить(" Это табличное поле!! " + Элемент.Имя );
ТабПоле = Элемент.Значение;
Индекс = 0;
Для Каждого ТекущаяСтрока Из ТабПоле Цикл
Сообщить("=======================");
Для Каждого Колонка Из Элемент.Колонки Цикл
ИмяКолонки = Строка(Колонка.Имя);
Сообщить(ИмяКолонки);
Имя = ТекущаяСтрока[ИмяКолонки];//сработает только если есть такое поле таб части объекта
Сообщить("=== " + Имя);
КонецЦикла;
Индекс = Индекс + 1;
Если Индекс > 0 Тогда break КонецЕсли; //только первая строка
КонецЦикла;
КонецЕсли;
КонецЕсли;
КонецЦикла;
Результат для документа Авансовый отчет:
Это табличное поле!! ВыданныеАвансы ======================= НомерСтроки 1 ДокументАванса Расходный кассовый ордер ТК000000004 от 15.02.2007 19:24:03 СуммаДокументаАванса 300 ВалютаДокументаАванса USD Выдано 300 Сумма 174 Такое двойное сканирование удобно использовать для быстрой проверки того, что все колонки таб части формы имеют связь с реквизитами таб части объекта. Если такой связи у какой-либо колонки нет, система сгенерирует ошибку. |