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

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

При настройке обмена данными между конфигурациями (например, из «Управление торговлей» в «Бухгалтерию предприятия») часто возникает задача выгрузить табличную часть стандартного документа в движения документа ОперацияБух (Ручная операция). Особенность документа ОперацияБух заключается в том, что он выступает исключительно регистратором для набора записей регистра бухгалтерии Хозрасчетный, и привычная табличная часть с субконто у него отсутствует.

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

Особенности документа «ОперацияБух» в Бухгалтерии Предприятия 3.0

Прежде чем переходить к написанию правил, проанализируем ключевые технические нюансы работы с документом ОперацияБух:

  1. Режим проведения: У документа установлен режим проведения «Запретить». Он не формирует движения автоматически при проведении — записи создаются непосредственно в регистре бухгалтерии с привязкой к документу-регистратору.
  2. Реквизит СуммаОперации: В шапке документа присутствует обязательный реквизит СуммаОперации. Если не заполнить его при загрузке, документ в списках будет отображаться с нулевой суммой, несмотря на наличие проводок.
  3. Признак записи движений: При передаче набора записей стандартными механизмами КД важно гарантировать, что у формируемого набора записей установлен флаг Записывать = Истина.

Способ 1. Использование переменной «КоллекцияОбъектов» в ПКГС

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

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

Посмотрим, как выглядит заполнение коллекции объектов программным кодом:


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

Для Каждого Стр Из Источник.Товары Цикл
    НоваяСтр = ТЗ.Добавить();
    НоваяСтр.СчетДт = "41.01";
    НоваяСтр.СчетКт = "000";
    НоваяСтр.Сумма = Стр.Сумма;
    НоваяСтр.КоличествоДт = Стр.Количество;
    НоваяСтр.Номенклатура = Стр.Номенклатура;
КонецЦикла;

// Переопределяем стандартное получение коллекции
КоллекцияОбъектов = ТЗ;

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

Способ 2. Формирование движений в обработчике «ПослеЗагрузки»

Второй вариант заключается в передаче данных табличной части во временную структуру или параметры и формировании движений напрямую на стороне базы-приемника.

Разберем по шагам алгоритм работы этого способа:

  1. Выгружаем данные табличной части документа-источника в параметр обмена.
  2. В обработчике ПослеЗагрузки ПКО документа ОперацияБух создаем набор записей регистра бухгалтерии.
  3. Заполняем проводки, устанавливаем субконто, рассчитываем итог и записываем набор.

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


// Создаем набор записей регистра бухгалтерии
НаборЗаписей = РегистрыБухгалтерии.Хозрасчетный.СоздатьНаборЗаписей();
НаборЗаписей.Отбор.Регистратор.Установить(Объект.Ссылка);

ИтоговаяСумма = 0;

Для Каждого Стр Из ТаблицаДанных Цикл
    Запись = НаборЗаписей.Добавить();
    Запись.Регистратор = Объект.Ссылка;
    Запись.Период = Объект.Дата;
    
    // Заполнение счетов учета
    Запись.СчетДт = ПланыСчетов.Хозрасчетный.ТоварыНаСкладах; // 41.01
    Запись.СчетКт = ПланыСчетов.Хозрасчетный.Вспомогательный; // 000
    
    // Заполнение сумм и количественных показателей
    Запись.Сумма = Стр.Сумма;
    Запись.КоличествоДт = Стр.Количество;
    
    // Заполнение аналитики (субконто)
    Запись.СубконтоДт[ПланыВидовХарактеристик.ВидыСубконтоХозрасчетные.Номенклатура] = Стр.Номенклатура;
    
    ИтоговаяСумма = ИтоговаяСумма + Стр.Сумма;
КонецЦикла;

// Записываем полученные проводки
НаборЗаписей.Записать();

// Обновляем реквизит шапки "СуммаОперации"
Объект.СуммаОперации = ИтоговаяСумма;
Объект.Записать();

Альтернативные подходы к вводу остатков

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

← На главную