Как из табличной части Товары перенести данные в другую табличную часть этого же документа

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

В процессе разработки в среде «1С:Предприятие» часто возникает задача дублирования или трансформации данных между различными табличными частями (ТЧ) одного документа. Например, при поступлении товаров нам может потребоваться заполнить отдельную таблицу для учета весовых характеристик, логистических параметров или специфических аналитик. Разберем подробно, как реализовать перенос значения Номенклатура из основной ТЧ Товары в дополнительную ТЧ (в нашем примере — ВесНеттоБрутто).

Способ 1. Прямой перебор строк в цикле

Это самый понятный и доступный способ для начинающего разработчика. Мы последовательно проходим по каждой строке исходной таблицы и создаем соответствующую строку в целевой таблице. Проанализируем пример кода, который можно использовать в обработчике нажатия кнопки или в другом событии:


Для каждого СтрИзТовары Из Объект.Товары Цикл
    НоваяСтрока = Объект.ВесНеттоБрутто.Добавить();
    НоваяСтрока.Номенклатура = СтрИзТовары.Номенклатура;
КонецЦикла;

Важные нюансы этого подхода:

  1. Очистка перед заполнением: Если пользователь нажмет на кнопку заполнения дважды, данные в целевой ТЧ продублируются. Чтобы этого избежать, перед началом цикла следует вызвать метод Объект.ВесНеттоБрутто.Очистить();.
  2. Производительность: При очень большом количестве строк (тысячи и более) перебор в цикле может работать медленнее, чем специализированные методы платформы.
  3. Дополнительные данные: Внутри этого же цикла мы можем сразу заполнить и другие реквизиты, например, получить вес из справочника номенклатуры.

Способ 2. Использование методов Выгрузить и Загрузить

Платформа 1С предоставляет мощные инструменты для массовой работы с коллекциями строк. Метод Выгрузить позволяет получить ТаблицуЗначений из ТЧ, а метод Загрузить — мгновенно заполнить ТЧ из этой таблицы. Это работает значительно быстрее, чем цикл.

Рассмотрим краткий и эффективный вариант реализации:


// Выгружаем колонку "Номенклатура" из ТЧ Товары и сразу загружаем ее в ТЧ ВесНеттоБрутто
Объект.ВесНеттоБрутто.Загрузить(Объект.Товары.Выгрузить(, "Номенклатура"));

Почему это удобно:

Метод Выгрузить вторым параметром принимает список колонок. Если в обеих табличных частях колонки называются одинаково (Номенклатура), платформа сама сопоставит данные. При этом метод Загрузить автоматически очищает целевую таблицу перед заполнением, что избавляет нас от лишних строк кода.

Однако стоит помнить: если в целевой ТЧ есть другие колонки, которые пользователь заполнил вручную (например, «Вес»), после выполнения метода Загрузить эти данные будут стерты, так как таблица полностью перезаписывается.

Способ 3. Синхронизация через Ключ связи (КлючСтроки)

Иногда требуется не просто разово скопировать данные, а обеспечить их «связанность». Это актуально, когда вторая ТЧ является расширением первой. В типовых конфигурациях (например, «Управление производственным предприятием» или «ERP») для этого используется механизм Ключа связи.

Выясним, как это работает по шагам:

  1. В обеих табличных частях создается реквизит КлючСвязи (тип Число).
  2. При добавлении строки в ТЧ Товары генерируется уникальный номер (индекс или случайное число).
  3. При создании соответствующей строки в ТЧ ВесНеттоБрутто ей присваивается тот же самый КлючСвязи.

Это позволяет системе точно знать, какая строка из второй таблицы соответствует конкретной строке из первой, даже если пользователь изменил порядок строк, удалил промежуточные позиции или отсортировал таблицу. Пример реализации такой логики можно найти в документе ОтчетКомиссионера (в Бухгалтерии или УПП).

Где разместить код: выбор события

Определимся с тем, в какой момент должен срабатывать код переноса. Это критически важно для корректной работы интерфейса:

  1. По кнопке: Создаем команду на форме (например, «Заполнить веса»). Это самый безопасный вариант, так как пользователь сам контролирует процесс.
  2. При изменении номенклатуры в основной ТЧ: Если нужно, чтобы строка во второй таблице появлялась сразу, используем событие ТоварыНоменклатураПриИзменении. В этом случае мы ищем строку во второй ТЧ (например, по тому же КлючуСвязи) и обновляем ее.
  3. Перед записью документа: Если вторая ТЧ носит технический характер и должна быть всегда актуальной, код лучше разместить в модуле объекта в процедуре ПередЗаписью. Это гарантирует, что данные будут обновлены перед попаданием в базу данных.

Типичная ошибка: «Дублирование при начале редактирования»

Часто новички пытаются вставить код заполнения в событие ПриНачалеРедактирования или ПриАктивизацииСтроки. Рассмотрим, почему это плохо: каждое движение курсора или попытка изменить ячейку будет приводить к повторному запуску цикла заполнения. Это не только замедлит работу программы, но и приведет к хаосу в данных (бесконечное добавление одних и тех же строк).

Правильный подход: Используйте только те события, которые отвечают за изменение данных (ПриИзменении) или за намеренное действие пользователя (нажатие кнопки).

Автоматизация получения дополнительных данных

Поскольку целевая ТЧ называется ВесНеттоБрутто, проанализируем ситуацию: скорее всего, нам нужно не просто перенести название товара, но и подтянуть его физические параметры. Мы можем оптимизировать цикл, обращаясь к свойствам номенклатуры:


Для каждого Стр Из Объект.Товары Цикл
    // Проверяем, нет ли уже этой номенклатуры в таблице весов (опционально)
    ПараметрыПоиска = Новый Структура("Номенклатура", Стр.Номенклатура);
    НайденныеСтроки = Объект.ВесНеттоБрутто.НайтиСтроки(ПараметрыПоиска);
    
    Если НайденныеСтроки.Количество() = 0 Тогда
        НоваяСтр = Объект.ВесНеттоБрутто.Добавить();
        НоваяСтр.Номенклатура = Стр.Номенклатура;
        
        // Получаем вес из карточки товара
        // Предположим, что вес хранится в реквизите "Вес" справочника Номенклатура
        НоваяСтр.ВесНетто = Стр.Номенклатура.Вес; 
    КонецЕсли;
КонецЦикла;

Резюме:

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

← На главную