При настройке обмена данными между конфигурациями 1С с использованием программного продукта «1С:Конвертация данных 2.1» разработчики часто сталкиваются с ситуацией, когда структура объектов в источнике и приемнике различается. Типичный пример — документ ПоступлениеТоваровИУслуг в БП 3.0, где товары и услуги разнесены по разным табличным частям, и аналогичный документ в УТ 11, где все данные хранятся в одной табличной части Товары.
Если просто сопоставить две табличные части источника одной табличной части приемника в ПКС (правилах конвертации свойств), при загрузке данных возникнет проблема: вторая табличная часть будет полностью перезаписывать данные первой. В итоге в документе-приемнике останутся только услуги. В данной статье мы разберем несколько проверенных способов решения этой задачи, проанализируем программные механизмы и выясним, как правильно объединить данные без потерь.
Это самый простой и быстрый метод, не требующий написания сложных запросов. Суть метода заключается в управлении алгоритмом загрузки в приемнике. Рассмотрим этот процесс по шагам:
Товары (источник) -> Товары (приемник).Услуги (источник) -> Товары (приемник).ПередОбработкой.Для того чтобы система не затирала данные, загруженные из первой ТЧ, нам необходимо установить специальный флаг. Пропишем следующий код:
Если Источник.Товары.Количество() > 0 Тогда
НеОчищать = Истина;
КонецЕсли;
Важный нюанс: Обработка свойств в Конвертации данных идет сверху вниз. Флаг НеОчищать должен быть установлен именно для второй группы свойств. Если установить его для первой, то при повторной загрузке того же документа (например, при внесении в него изменений) старые строки не будут удалены, и данные начнут дублироваться.
Если вам требуется более сложная логика — например, пересчет цен, фильтрация определенных строк или объединение данных по определенным условиям — лучше всего использовать программное формирование коллекции. Рассмотрим ситуацию, когда мы полностью отказываемся от автоматического сопоставления табличных частей и пишем алгоритм в обработчике ПередОбработкой правила конвертации группы свойств Товары.
Проанализируем пример запроса, который объединяет товары и услуги в одну таблицу значений прямо в процессе выгрузки:
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| Т.Номенклатура,
| Т.Количество,
| Т.СтавкаНДС,
| Т.Сумма,
| Т.Цена
|ИЗ
| Документ.ПоступлениеТоваровУслуг.Товары КАК Т
|ГДЕ
| Т.Ссылка = &Ссылка
|
|ОБЪЕДИНИТЬ ВСЕ
|
|ВЫБРАТЬ
| У.Номенклатура,
| У.Количество,
| У.СтавкаНДС,
| У.Сумма,
| У.Цена
|ИЗ
| Документ.ПоступлениеТоваровУслуг.Услуги КАК У
|ГДЕ
| У.Ссылка = &Ссылка";
Запрос.УстановитьПараметр("Ссылка", Источник.Ссылка);
РезультатЗапроса = Запрос.Выполнить();
// Присваиваем результат встроенной переменной
КоллекцияОбъектов = РезультатЗапроса.Выгрузить();
После этого в ПКС внутри данной табличной части необходимо оставить поля Источник пустыми, а в поле Приемник указать соответствующие реквизиты. Система автоматически сопоставит колонки таблицы значений КоллекцияОбъектов с реквизитами ТЧ документа-приемника по именам.
Бывают случаи, когда данные удобнее подготовить заранее, на уровне ПВД (Правил выгрузки данных) или в обработчике Перед выгрузкой самого документа. Мы можем собрать данные в таблицу значений и передать её в ПКО. Рассмотрим пример кода в обработчике Перед выгрузкой ПКО документа:
Запрос = Новый Запрос("
|ВЫБРАТЬ
| Товары.Номенклатура,
| Товары.Количество,
| Товары.Цена,
| Товары.Сумма
|ИЗ
| Документ.ЗаказПокупателя.Товары КАК Товары
|ГДЕ
| Товары.Ссылка = &Документ
|
|ОБЪЕДИНИТЬ ВСЕ
|
|ВЫБРАТЬ
| Услуги.Номенклатура,
| Услуги.Количество,
| Услуги.Цена,
| Услуги.Сумма
|ИЗ
| Документ.ЗаказПокупателя.Услуги КАК Услуги
|ГДЕ
| Услуги.Ссылка = &Документ");
Запрос.УстановитьПараметр("Документ", Источник.Ссылка);
ВходящиеДанные = Новый Структура;
ВходящиеДанные.Вставить("ТаблицаТовары", Запрос.Выполнить().Выгрузить());
Затем в ПКГС табличной части Товары нужно установить флаг «Получать из входящих данных». Это позволяет оптимизировать выгрузку и избежать лишних обращений к базе данных, если информация уже была получена ранее.
При объединении двух табличных частей в одну важно учитывать следующие моменты, чтобы избежать ошибок при проведении документа в приемнике:
НеОчищать в приемнике окажется две строки с номером 1, две с номером 2 и так далее. Рекомендуется либо не переносить НомерСтроки (чтобы система пересчитала его автоматически при записи), либо добавлять смещение программно: Значение = Источник.Товары.Количество() + ОбъектКоллекции.НомерСтроки;.Услуги, в приемник передается номенклатура с типом Услуга. В противном случае система может потребовать заполнения склада, ГТД или других складских реквизитов.Используя предложенные методы, мы можем гибко настраивать правила обмена любой сложности. Выбор конкретного способа зависит от объема данных и необходимости дополнительной трансформации строк в процессе выгрузки. Для простых случаев достаточно флага НеОчищать, а для сложных архитектурных решений лучше применять программное формирование КоллекцииОбъектов через запрос.