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