При разработке обработок и документов на управляемых формах в 1С:Предприятии 8 часто возникает задача передачи данных из одной таблицы значений (объектного типа ТаблицаЗначений) в реквизит формы типа «Таблица значений». Основная сложность заключается в том, что реквизит управляемой формы на сервере фактически является коллекцией ДанныеФормыКоллекция, а имена колонок у источника и приемника могут отличаться.
Рассмотри подробно способы решения этой задачи на сервере управляемой формы и проанализируем варианты переноса данных при несовпадающих именах колонок.
Прежде чем переходить к способам заполнения, разберем ключевые особенности работы с коллекциями управляемой формы:
ДанныеФормыКоллекция. У данного объекта отсутствуют некоторые методы стандартной таблицы значений (например, Скопировать(), Сортировать() или Свернуть()).Загрузить(): Вызов РеквизитФормы.Загрузить(ИсточникТЗ) перезаписывает коллекцию на форме, но заполняет только те колонки, имена которых полностью совпадают. Данные из колонок с отличными именами игнорируются.Если имена колонок источника и реквизита формы отличаются, наиболее простым и понятным решением является перебор строк таблицы в цикле с явным сопоставлением полей.
Рассмотрим пример кода, в котором выполняется явное присвоение значений колонок с разными именами и использование функции ЗаполнитьЗначенияСвойств для совпадающих колонок:
// Очищаем реквизит формы перед заполнением
Объект.ТаблицаНаФорме.Очистить();
// Перебираем строки исходной таблицы значений
Для Каждого СтрокаИсточника Из ИсходнаяТЗ Цикл
// Добавляем новую строку в реквизит формы
НоваяСтрока = Объект.ТаблицаНаФорме.Добавить();
// Для колонок с совпадающими именами вызываем ЗаполнитьЗначенияСвойств
ЗаполнитьЗначенияСвойств(НоваяСтрока, СтрокаИсточника);
// Для колонок с разными именами заполняем значения явно
НоваяСтрока.ИмяКолонкиНаФорме = СтрокаИсточника.ИмяКолонкиИсточника;
КонецЦикла;
Этот вариант универсален, так как позволяет произвольно сопоставлять поля и при необходимости выполнять дополнительную обработку данных прямо в цикле.
Если требуется использовать системный метод Загрузить(), но названия колонок отличаются, можно создать копию исходной таблицы значений, скорректировать имена колонок в копии и загрузить её на форму.
Проанализируем алгоритм реализации этого способа:
Скопировать().ТаблицаЗначенийКолонки копии, чтобы их имена полностью совпали с именами колонок реквизита формы.Загрузить() у коллекции ДанныеФормыКоллекция.Посмотрим на пример кода:
// Создаем копию исходной таблицы значений
ТЗКопия = ИсходнаяТЗ.Скопировать();
// Изменяем имя колонки в копии под имя колонки на форме
ТЗКопия.Колонки.ИмяКолонкиИсточника.Имя = "ИмяКолонкиНаФорме";
// Загружаем подготовленную таблицу в реквизит формы
Объект.ТаблицаНаФорме.Загрузить(ТЗКопия);
Обратите внимание: метод Загрузить() полностью очищает коллекцию формы перед вставкой новых строк, поэтому предварительно вызывать метод Очистить() не требуется.
В ситуациях, когда над данными нужно выполнить сложную работу (сортировку, группировку, поиск), удобнее временно преобразовать реквизит формы в объектную таблицу значений с помощью функции РеквизитФормыВЗначение, а затем вернуть результат обратно вызовом ЗначениеВРеквизитФормы.
Рассмотрим пример этого подхода:
// Преобразуем реквизит формы в объектную ТаблицуЗначений
ТЗФормы = РеквизитФормыВЗначение("Объект.ТаблицаНаФорме");
// Переносим данные из источника
Для Каждого СтрИз ИсточникТЗ Цикл
НоваяСтрока = ТЗФормы.Добавить();
НоваяСтрока.ИмяКолонкиНаФорме = СтрИз.ИмяКолонкиИсточника;
КонецЦикла;
// Возвращаем результат в реквизит формы
ЗначениеВРеквизитФормы(ТЗФормы, "Объект.ТаблицаНаФорме");
Важный момент: при использовании ЗначениеВРеквизитФормы структура колонок в преобразованной таблице значений должна соответствовать объявленной структуре реквизита формы, иначе данные отсутствующих колонок на форме будут сброшены.