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