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