Как в «1С:Конвертация данных 2.0» программно обработать табличную часть с распределением ГТД по партиям

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

При настройке обмена данными между конфигурациями 1С часто возникают ситуации, когда простого сопоставления полей «Источник — Приемник» недостаточно. Типичный пример — выгрузка документов реализации из учетной системы (например, «Далион» или старые редакции «Управление торговлей»), где сведения о номерах ГТД и странах происхождения не хранятся непосредственно в табличной части документа, а определяются в момент проведения по регистрам партий. В этой статье мы подробно разберем, как решить задачу программного заполнения ГТД, используя механизмы «1С:Конвертация данных 2.0» (КД 2.0).

В чем сложность стандартного подхода?

Стандартный механизм КД 2.0 работает линейно: для каждой строки табличной части источника создается соответствующая строка в приемнике. Однако при партионном учете одна строка товара в реализации может списывать остатки из нескольких разных приходов. Это означает, что одной строке «Источника» могут соответствовать две, три или более строк «Приемника» с разными номерами ГТД. Попытка решить это через обычное Правило Конвертации Свойств (ПКС) внутри табличной части обречена на провал, так как ПКС не имеет контекста «уже использованных» количеств из других строк и не может самостоятельно «размножить» строки.

Решение через подмену КоллекцияОбъектов

Наиболее эффективный и гибкий метод решения — это использование обработчика «Перед выгрузкой» в Правиле Конвертации Группы Свойств (ПКГС). Рассмотрим этот процесс по шагам.

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

Шаг 1. Подготовка данных в ПКГС

Найдем в правилах конвертации объекта (ПКО) нужного документа группу свойств, отвечающую за табличную часть (например, «Товары»). Перейдем в обработчик «Перед выгрузкой» этой группы. Именно здесь мы опишем логику получения партий.

Рассмотрим пример кода, который подготавливает данные:


// Создаем таблицу значений, которая станет нашей новой коллекцией
ТЗ_Товары = Новый ТаблицаЗначений;
ТЗ_Товары.Колонки.Добавить("Номенклатура");
ТЗ_Товары.Колонки.Добавить("Количество");
ТЗ_Товары.Колонки.Добавить("Цена");
ТЗ_Товары.Колонки.Добавить("Сумма");
ТЗ_Товары.Колонки.Добавить("НомерГТД");
ТЗ_Товары.Колонки.Добавить("СтранаПроисхождения");

// Здесь мы можем вызвать функцию из модуля конфигурации Источника
// или написать свой запрос к регистрам партий.
// Допустим, мы используем штатную функцию Источника:
Валюта = ""; Курс = 0; Кратность = 0;
ТаблицаПартий = ПодготовитьДанныеДляБухгалтерии(Источник, "Товары", Валюта, Курс, Кратность);

// Заполняем нашу КоллекцияОбъектов данными из результата запроса/функции
Для Каждого СтрокаПартии Из ТаблицаПартий Цикл
    НоваяСтрока = ТЗ_Товары.Добавить();
    ЗаполнитьЗначенияСвойств(НоваяСтрока, СтрокаПартии);
    
    // Здесь может быть ваша специфичная логика обработки
    // Например, поиск ссылки на ГТД в справочнике
КонецЦикла;

// Ключевой момент: передаем таблицу в стандартную переменную КД
КоллекцияОбъектов = ТЗ_Товары;

Используя такой подход, мы полностью контролируем состав строк. Если одна позиция номенклатуры списалась из трех партий, в ТЗ_Товары попадет три строки, и в документе «Приемника» их также станет три.

Шаг 2. Использование параметров для учета остатков

Иногда запрос по партиям нужно выполнить не для всей табличной части сразу, а с учетом накопленного итога. Проанализируем ситуацию: если мы хотим гарантировать, что один и тот же номер ГТД не будет использован сверх того количества, что есть на складе, мы можем подготовить общую таблицу остатков еще раньше — в обработчике «Перед выгрузкой» самого объекта (документа).

Разберем, как это сделать через структуру Параметры:

  1. В ПКО документа «Перед выгрузкой» формируем запрос по всем остаткам ГТД, которые числятся за документом.
  2. Сохраняем эту таблицу: Параметры.Вставить("ТаблицаОстатковГТД", РезультатЗапроса.Выгрузить());.
  3. В ПКГС табличной части при формировании КоллекцияОбъектов обращаемся к этой таблице, распределяем количества и удаляем/уменьшаем строки в Параметры.ТаблицаОстатковГТД по мере их использования.

Это позволяет реализовать классический алгоритм ФИФО прямо в процессе конвертации, обеспечивая точность данных в принимающей базе.

Шаг 3. Обработка ссылочных данных (ГТД и Страны)

Важно помнить, что в КоллекцияОбъектов мы передаем данные из «Источника». Если в «Источнике» ГТД — это просто строка, а в «Приемнике» — справочник, нам необходимо настроить соответствующее ПКС для этого поля.

Выясним, как правильно настроить передачу ссылки:

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

Особенности для конфигураций типа «Далион»

Как было замечено в обсуждении, в конфигурации «Далион: Авто» уже существуют экспортные функции для подготовки данных к выгрузке. Рассмотрим подробнее ситуацию, когда мы находим функцию типа ПодготовитьДанныеДляБухгалтерии() в глобальном модуле или модуле менеджера объекта.

Совет: Если вы не хотите вносить изменения в основную конфигурацию (чтобы не снимать ее с поддержки), вы можете скопировать текст этой функции и вставить ее в раздел «Алгоритмы» в самой «Конвертации данных». После этого вы сможете вызывать ее прямо из обработчиков правил: Выполнить(Алгоритмы.МойАлгоритмПодготовкиДанных);.

Преимущества данного метода

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

← На главную