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

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

При переносе данных между различными конфигурациями (например, из 1С:Бухгалтерия предприятия 3.0 в 1С:Комплексная автоматизация 2.2 / 2.5 или 1С:ERP) разработчики часто сталкиваются с различиями в структуре документов поступления. В конфигурации-источнике товары и услуги могут храниться в отдельных табличных частях Товары и Услуги в рамках одного объекта метаданных ПоступлениеТоваровУслуг, разделяясь по реквизиту ВидОперации. При этом в конфигурации-приемнике целевой документ часто имеет единую табличную часть.

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

Способ 1. Переопределение параметра КоллекцияОбъектов в ПКГС

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

Разберем по шагам порядок настройки:

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

Посмотрим на пример программного кода в событии ПередОбработкой ПКГС:


Если Источник.ВидОперации = Перечисления.ВидыОперацийПоступлениеТоваровУслуг.Товары Тогда 
    КоллекцияОбъектов = Источник.Товары.Выгрузить(); 
ИначеЕсли Источник.ВидОперации = Перечисления.ВидыОперацийПоступлениеТоваровУслуг.Услуги Тогда
    КоллекцияОбъектов = Источник.Услуги.Выгрузить();
КонецЕсли;

При таком подходе в выгрузку попадает именно та коллекция строк, которая соответствует текущему документу. Вложенные правила конвертации свойств (ПКС) внутри ПКГС сопоставляют колонки из полученной таблицы значений со свойствами табличной части приемника.

Способ 2. Объединение строк для смешанных документов

Рассмотрим подробнее ситуацию, когда документ в источнике оформлен с видом операции «Товары, услуги, комиссия» или «Покупка, комиссия» и содержит заполненные строки одновременно и в табличной части Товары, и в Услуги. Если использовать простое ветвление через ИначеЕсли, часть строк будет потеряна.

Для корректного переноса всех строк создадим единую результирующую таблицу значений в обработчике ПередОбработкой ПКГС:


КоллекцияОбъектов = Новый ТаблицаЗначений;
КоллекцияОбъектов.Колонки.Добавить("Номенклатура");
КоллекцияОбъектов.Колонки.Добавить("Количество");
КоллекцияОбъектов.Колонки.Добавить("Цена");
КоллекцияОбъектов.Колонки.Добавить("Сумма");
КоллекцияОбъектов.Колонки.Добавить("СтавкаНДС");
КоллекцияОбъектов.Колонки.Добавить("СуммаНДС");

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

// Добавляем строки с услугами
Для Каждого Стр Из Источник.Услуги Цикл
    ЗаполнитьЗначенияСвойств(КоллекцияОбъектов.Добавить(), Стр);
КонецЦикла;

Такой подход гарантирует, что ни одна позиция из смешанного документа не будет пропущена при конвертации.

Способ 3. Использование двух параллельных ПКГС с флагом Отказ

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

  1. Первое ПКГС: Источник — Товары, Приемник — Товары.
  2. Второе ПКГС: Источник — Услуги, Приемник — Товары.

В событии ПередОбработкой каждого ПКГС устанавливаем условие отсечения лишней выгрузки через параметр Отказ:


// В ПКГС для товаров:
Если Источник.Товары.Количество() = 0 Тогда
    Отказ = Истина;
КонецЕсли;

// В ПКГС для услуг:
Если Источник.Услуги.Количество() = 0 Тогда
    Отказ = Истина;
КонецЕсли;

Этот способ удобен тем, что сопоставление реквизитов строк для товаров и услуг можно настроить независимо в визуальном интерфейсе КД 2.1, не создавая промежуточные таблицы значений.

Особенности загрузки данных в конфигурации линейки КА 2 / ERP

При переносе документов в конфигурации на базе архитектуры УТ 11 / КА 2 / ERP необходимо учитывать специфику учета партнеров и регламентированного учета.

1. Обработка справочников Партнеры и Контрагенты

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

Разберем пример заполнения и привязки партнера в обработчике ПослеЗагрузки ПКО документа:


Если НЕ Объект.Контрагент = Справочники.Контрагенты.ПустаяСсылка() Тогда 
    Если Объект.Партнер = Справочники.Партнеры.ПустаяСсылка() Тогда
        
        Если Объект.Контрагент.Партнер = Справочники.Партнеры.ПустаяСсылка() Тогда
            НайденныйПартнер = Справочники.Партнеры.НайтиПоНаименованию(Объект.Контрагент.Наименование);
        Иначе
            НайденныйПартнер = Объект.Контрагент.Партнер;
        КонецЕсли;
        
        Если НайденныйПартнер = Справочники.Партнеры.ПустаяСсылка() Тогда
            нПартнер = Справочники.Партнеры.СоздатьЭлемент();
            нПартнер.Наименование = Объект.Контрагент.Наименование;
            нПартнер.Комментарий = "Создан при загрузке из БП";
            нПартнер.НаименованиеПолное = Объект.Контрагент.НаименованиеПолное;
            нПартнер.Поставщик = Истина;
            нПартнер.Клиент = Истина;
            нПартнер.ПрочиеОтношения = Истина;
            
            Если Объект.Контрагент.ЮридическоеФизическоеЛицо = Перечисления.ЮридическоеФизическоеЛицо.ЮридическоеЛицо Тогда
                нПартнер.ЮрФизЛицо = Перечисления.КомпанияЧастноеЛицо.Компания;
            Иначе
                нПартнер.ЮрФизЛицо = Перечисления.КомпанияЧастноеЛицо.ЧастноеЛицо;
            КонецЕсли;
            
            нПартнер.Записать();
            Объект.Партнер = нПартнер.Ссылка;
        Иначе
            Объект.Партнер = НайденныйПартнер.Ссылка;
        КонецЕсли;
        
    КонецЕсли;
КонецЕсли;

2. Отражение в регламентированном учете

В конфигурациях 1С:КА 2 и 1С:ERP проведение документов по оперативному контуру и формирование проводок по регламентированному учету разделены. При стандартной записи документа с режимом РежимЗаписиДокумента.Проведение проводки по бухгалтерскому учету сразу не формируются — документ лишь регистрируется к отражению.

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


Если Объект.Проведен Тогда
    Объект.Записать(РежимЗаписиДокумента.Проведение);
    РеглУчетПроведениеСервер.ОтразитьДокумент(Объект);
Иначе
    Объект.Записать(РежимЗаписиДокумента.Запись);
КонецЕсли;

Важно: вызов метода ОтразитьДокумент в процессе загрузки каждого отдельного объекта существенно увеличивает общее время обмена. Рекомендуется выполнять проведение по регламентированному учету после завершения всей загрузки — с помощью типового регламентного задания или рабочего места «Отражение документов в регл. учете».

← На главную