Как выгрузить данные из двух табличных частей в одну при настройке правил обмена?

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

При настройке обмена данными между конфигурациями 1С с использованием программного продукта «1С:Конвертация данных 2.1» разработчики часто сталкиваются с ситуацией, когда структура объектов в источнике и приемнике различается. Типичный пример — документ ПоступлениеТоваровИУслуг в БП 3.0, где товары и услуги разнесены по разным табличным частям, и аналогичный документ в УТ 11, где все данные хранятся в одной табличной части Товары.

Если просто сопоставить две табличные части источника одной табличной части приемника в ПКС (правилах конвертации свойств), при загрузке данных возникнет проблема: вторая табличная часть будет полностью перезаписывать данные первой. В итоге в документе-приемнике останутся только услуги. В данной статье мы разберем несколько проверенных способов решения этой задачи, проанализируем программные механизмы и выясним, как правильно объединить данные без потерь.

Способ 1: Использование флага «НеОчищать»

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

  1. В ПКО (Правила конвертации объектов) создаем две группы свойств ПКГС (Правила конвертации групп свойств) для одной и той же табличной части приемника.
  2. Первая группа: Товары (источник) -> Товары (приемник).
  3. Вторая группа: Услуги (источник) -> Товары (приемник).
  4. Переходим в настройки второй группы (Услуги) и находим обработчик события ПередОбработкой.

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


Если Источник.Товары.Количество() > 0 Тогда
    НеОчищать = Истина;
КонецЕсли;

Важный нюанс: Обработка свойств в Конвертации данных идет сверху вниз. Флаг НеОчищать должен быть установлен именно для второй группы свойств. Если установить его для первой, то при повторной загрузке того же документа (например, при внесении в него изменений) старые строки не будут удалены, и данные начнут дублироваться.

Способ 2: Формирование объединенной коллекции через запрос (КоллекцияОбъектов)

Если вам требуется более сложная логика — например, пересчет цен, фильтрация определенных строк или объединение данных по определенным условиям — лучше всего использовать программное формирование коллекции. Рассмотрим ситуацию, когда мы полностью отказываемся от автоматического сопоставления табличных частей и пишем алгоритм в обработчике ПередОбработкой правила конвертации группы свойств Товары.

Проанализируем пример запроса, который объединяет товары и услуги в одну таблицу значений прямо в процессе выгрузки:


Запрос = Новый Запрос;
Запрос.Текст = 
"ВЫБРАТЬ
|	Т.Номенклатура,
|	Т.Количество,
|	Т.СтавкаНДС,
|	Т.Сумма,
|	Т.Цена
|ИЗ
|	Документ.ПоступлениеТоваровУслуг.Товары КАК Т
|ГДЕ
|	Т.Ссылка = &Ссылка
|
|ОБЪЕДИНИТЬ ВСЕ
|
|ВЫБРАТЬ
|	У.Номенклатура,
|	У.Количество,
|	У.СтавкаНДС,
|	У.Сумма,
|	У.Цена
|ИЗ
|	Документ.ПоступлениеТоваровУслуг.Услуги КАК У
|ГДЕ
|	У.Ссылка = &Ссылка";

Запрос.УстановитьПараметр("Ссылка", Источник.Ссылка);
РезультатЗапроса = Запрос.Выполнить();

// Присваиваем результат встроенной переменной
КоллекцияОбъектов = РезультатЗапроса.Выгрузить();

После этого в ПКС внутри данной табличной части необходимо оставить поля Источник пустыми, а в поле Приемник указать соответствующие реквизиты. Система автоматически сопоставит колонки таблицы значений КоллекцияОбъектов с реквизитами ТЧ документа-приемника по именам.

Способ 3: Передача данных через структуру «Входящие данные»

Бывают случаи, когда данные удобнее подготовить заранее, на уровне ПВД (Правил выгрузки данных) или в обработчике Перед выгрузкой самого документа. Мы можем собрать данные в таблицу значений и передать её в ПКО. Рассмотрим пример кода в обработчике Перед выгрузкой ПКО документа:


Запрос = Новый Запрос("
|ВЫБРАТЬ
|   Товары.Номенклатура,
|   Товары.Количество,
|   Товары.Цена,
|   Товары.Сумма
|ИЗ
|   Документ.ЗаказПокупателя.Товары КАК Товары
|ГДЕ
|   Товары.Ссылка = &Документ
|
|ОБЪЕДИНИТЬ ВСЕ
|
|ВЫБРАТЬ
|   Услуги.Номенклатура,
|   Услуги.Количество,
|   Услуги.Цена,
|   Услуги.Сумма
|ИЗ
|   Документ.ЗаказПокупателя.Услуги КАК Услуги
|ГДЕ
|   Услуги.Ссылка = &Документ");

Запрос.УстановитьПараметр("Документ", Источник.Ссылка);
ВходящиеДанные = Новый Структура;
ВходящиеДанные.Вставить("ТаблицаТовары", Запрос.Выполнить().Выгрузить());

Затем в ПКГС табличной части Товары нужно установить флаг «Получать из входящих данных». Это позволяет оптимизировать выгрузку и избежать лишних обращений к базе данных, если информация уже была получена ранее.

Важные технические нюансы и рекомендации

При объединении двух табличных частей в одну важно учитывать следующие моменты, чтобы избежать ошибок при проведении документа в приемнике:

  1. Нумерация строк: В источнике в обеих табличных частях (Товары и Услуги) строки начинаются с номера 1. При простом объединении через НеОчищать в приемнике окажется две строки с номером 1, две с номером 2 и так далее. Рекомендуется либо не переносить НомерСтроки (чтобы система пересчитала его автоматически при записи), либо добавлять смещение программно: Значение = Источник.Товары.Количество() + ОбъектКоллекции.НомерСтроки;.
  2. Типы номенклатуры: В конфигурациях на базе БСП (УТ 11, ERP) поведение строк в табличной части сильно зависит от типа номенклатуры. Убедитесь, что для строк, пришедших из ТЧ Услуги, в приемник передается номенклатура с типом Услуга. В противном случае система может потребовать заполнения склада, ГТД или других складских реквизитов.
  3. Реквизит «Содержание»: В бухгалтерии для услуг часто заполняется только текстовое содержание. В торговых конфигурациях номенклатура обязательна. Проанализируем ситуацию: если в источнике номенклатура услуги пуста, необходимо предусмотреть подстановку дефолтного значения или перенос текста в доп. реквизит строки.
  4. Склады: Если в документе-источнике склад указан в шапке, а в приемнике — в табличной части (как в УТ 11), не забудьте заполнить это поле для всех строк, включая те, что пришли из раздела услуг (хотя для услуг склад обычно не заполняется, структура ТЧ требует наличия колонки).

Используя предложенные методы, мы можем гибко настраивать правила обмена любой сложности. Выбор конкретного способа зависит от объема данных и необходимости дополнительной трансформации строк в процессе выгрузки. Для простых случаев достаточно флага НеОчищать, а для сложных архитектурных решений лучше применять программное формирование КоллекцииОбъектов через запрос.

← На главную