Как перенести строку из одной таблицы значений в другую в 1С

Программист 1С v8.3 (Управляемые формы) IT и автоматизация бизнеса
← На главную

При разработке прикладных решений на платформе 1С:Предприятие часто возникает задача переноса или копирования одной конкретной строки из исходной таблицы значений в другую. Начинающие разработчики нередко сталкиваются с трудностями, пытаясь напрямую присвоить объект строки или выполнить полное копирование всей таблицы. Разберем по шагам, как устроен механизм работы со строками таблиц значений и какими способами можно быстро и правильно решить эту задачу.

Особенность объекта строки таблицы значений: объект СтрокаТаблицыЗначений жестко связан со своей таблицей-владельцем. Его нельзя просто взять и вставить методом добавления в другую таблицу как готовый объект. Чтобы перенести данные, необходимо создать новую строку в таблице-приемнике и перенести в нее значения колонок.

Способ 1. Использование универсальной процедуры ЗаполнитьЗначенияСвойств

Рассмотрим самый удобный, лаконичный и быстродействующий способ копирования строки в уже существующую таблицу-приемник. Для этого используется процедура ЗаполнитьЗначенияСвойств. Она автоматически сопоставляет имена колонок источника и приемника и переносит значения совпадающих реквизитов.

Посмотрим на пример кода:


// Создаем новую строку в таблице-приемнике и копируем в нее данные
НоваяСтрока = ТЗ2.Добавить();
ЗаполнитьЗначенияСвойств(НоваяСтрока, ВыбраннаяСтрока);

Проанализируем, как работает этот метод:

  1. Метод Добавить() у объекта ТЗ2 создает пустую строку в таблице-приемнике и возвращает ссылку на нее.
  2. Процедура ЗаполнитьЗначенияСвойств принимает два обязательных параметра: объект-приемник (НоваяСтрока) и объект-источник (ВыбраннаяСтрока).
  3. Все колонки с одинаковыми именами автоматически заполняются соответствующими значениями из исходной строки. Если в целевой таблице присутствуют колонки, которых нет в источнике, они останутся пустыми.

Если требуется выполнить именно перенос (то есть переместить строку с удалением из исходной таблицы), дополним код удалением строки из источника:


// 1. Добавляем и заполняем строку в целевой таблице
НоваяСтрока = ТЗ2.Добавить();
ЗаполнитьЗначенияСвойств(НоваяСтрока, ВыбраннаяСтрока);

// 2. Удаляем исходную строку из первой таблицы
ТЗ1.Удалить(ВыбраннаяСтрока);

Способ 2. Создание новой таблицы с помощью метода Скопировать

Если таблица-приемник еще не инициализирована или ее можно перезаписать заново с сохранением точной структуры исходной таблицы, рассмотрим штатный метод Скопировать(). В качестве параметра метод может принимать массив конкретных строк, которые требуется скопировать.

Разберем пример:


// Формируем массив строк, которые нужно перенести
МассивСтрок = Новый Массив;
МассивСтрок.Добавить(ВыбраннаяСтрока);

// Создаем новую таблицу с аналогичной структурой и только выбранной строкой
ТЗ2 = ТЗ1.Скопировать(МассивСтрок);

Этот способ удобен тем, что не требует предварительного создания колонок у второй таблицы — структура метаданных колонок полностью дублируется из ТЗ1.

Способ 3. Поколоночный перебор значений

В ситуациях, когда требуется выборочная трансформация данных или дополнительная проверка типов при несовпадении структур таблиц, разберем перенос строки через цикл по коллекции Колонки:


НоваяСтрока = ТЗ2.Добавить();

Для Каждого Колонка Из ТЗ1.Колонки Цикл
    // Проверяем наличие одноименной колонки в целевой таблице
    Если ТЗ2.Колонки.Найти(Колонка.Имя) <> Неопределено Тогда
        НоваяСтрока[Колонка.Имя] = ВыбраннаяСтрока[Колонка.Имя];
    КонецЕсли;
КонецЦикла;

Важные практические замечания

  1. Клиент-серверная архитектура: Объект ТаблицаЗначений доступен исключительно на стороне сервера или в толстом клиенте. В тонком клиенте на управляемых формах для хранения табличных данных используются объекты типа ДанныеФормыКоллекция.
  2. Копирование ссылочных и мутабельных типов: Примитивные типы (числа, строки, даты, булево) и ссылки базы данных (СправочникСсылка, ДокументСсылка) переносятся без особенностей. Однако если в ячейке хранится мутабельный объект (например, Структура или Массив), в новую строку скопируется ссылка на тот же самый объект в памяти. Для их независимого изменения потребуется клонирование.
← На главную