Как выгрузить одну табличную часть документа в две разные таблицы значений в Конвертации Данных 2.1

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

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

Рассмотрим, с какими ошибками можно столкнуться при решении этой задачи в конфигурации «Конвертация Данных 2.1» (КД 2.1) и разберем наиболее эффективные способы перегрузки данных.

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

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

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

Способ 1. Настройка ПКГС с использованием КоллекцияОбъектов (Рекомендуемый)

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

Для реализации этого метода выполним следующие шаги:

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

// ПКГС: Товары -> Товары
// Обработчик: ПередОбработкой

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

КоллекцияОбъектов = МассивТоваров;

Для второго ПКГС (для услуг) прописываем аналогичный алгоритм в обработчике ПередОбработкой, фильтруя строки по типу номенклатуры «Услуга».

Способ 2. Использование условия Отказ в ПКГС

Если нет необходимости объединять или сворачивать строки, можно доверить платформе перебор стандартной табличной части и отсекать ненужные строки непосредственно при их выгрузке.

В этом случае в ПКГС Товары -> Товары в обработчике ПередОбработкойПравила (или при обработке конкретной строки) прописываем условие:


Если ОбъектКоллекции.Номенклатура.ТипНоменклатуры <> Перечисления.ТипыНоменклатуры.Товар Тогда
    Отказ = Истина;
КонецЕсли;

Для ПКГС Товары -> Услуги устанавливаем противоположное условие:


Если ОбъектКоллекции.Номенклатура.ТипНоменклатуры <> Перечисления.ТипыНоменклатуры.Услуга Тогда
    Отказ = Истина;
КонецЕсли;

Способ 3. Передача таблиц через ИсходящиеДанные

Если по логике обмена перед выгрузкой требуется сложная группировка или свертка данных, таблицы можно сформировать в ПКО в обработчике ПередВыгрузкойОбъекта и передать их в ПКГС.

Посмотрим на пример правильного кода инициализации структуры и группировки колонок:


// ПКО Документа: ПередВыгрузкойОбъекта

// 1. Обязательно инициализируем структуру ИсходящиеДанные
ИсходящиеДанные = Новый Структура;

// 2. Выгружаем ТЧ документа в память
ТЗ_Товары = Объект.Товары.Выгрузить();

// 3. Создаем копию для услуг и фильтруем данные
ТЗ_Услуги = ТЗ_Товары.Скопировать();

// Пример фильтрации и свертки для товаров:
// Важно! В первом параметре указываем колонки ГРУППИРОВКИ, во втором - СУММИРОВАНИЯ
ТЗ_Товары.Свернуть("Номенклатура, СтавкаНДС", "Количество, Сумма, СуммаНДС, СуммаСНДС");

// Передаем сформированные таблицы в структуру
ИсходящиеДанные.Вставить("Товары", ТЗ_Товары);
ИсходящиеДанные.Вставить("Услуги", ТЗ_Услуги);

После подготовки данных в ПКГС для табличных частей Товары и Услуги обязательно установим флаг «Получить из входящих данных». В этом случае механизм правила автоматически подтянет соответствующие таблицы из структуры.

Где найти типовые правила обмена в конфигурации

При работе с типовыми конфигурациями (например, УТ 11 или БП 3.0) не обязательно создавать правила с нуля. Чтобы посмотреть, как аналогичные задачи решены разработчиками 1С:

  1. Откроем конфигурацию в режиме 1С:Предприятие.
  2. Перейдем в регистр сведений ПравилаОбмена (или через меню функций в раздел настройки синхронизации данных).
  3. Найдем нужный план обмена (например, Управление торговлей — Бухгалтерия предприятия) и нажмем кнопку «Выгрузить правила в файл».
  4. Загрузим полученный файл XML в конфигурацию «Конвертация Данных 2.1» для детального изучения типовых обработчиков и ПКГС.
← На главную