При настройке обмена данными между конфигурациями (например, из «Управление торговлей» в «Бухгалтерию предприятия») часто возникает задача выгрузить табличную часть стандартного документа в движения документа ОперацияБух (Ручная операция). Особенность документа ОперацияБух заключается в том, что он выступает исключительно регистратором для набора записей регистра бухгалтерии Хозрасчетный, и привычная табличная часть с субконто у него отсутствует.
Рассмотрим, как правильно реализовать такой перенос в конфигурации «Конвертация данных 2.1» различными способами.
Прежде чем переходить к написанию правил, проанализируем ключевые технические нюансы работы с документом ОперацияБух:
СуммаОперации: В шапке документа присутствует обязательный реквизит СуммаОперации. Если не заполнить его при загрузке, документ в списках будет отображаться с нулевой суммой, несмотря на наличие проводок.Записывать = Истина.Разберем основной вариант переноса данных через правила конвертации группы свойств (ПКГС) в КД 2.1. Этот подход позволяет переопределить источника для набора движений Движения.Хозрасчетный.
В правиле конвертации объектов (ПКО) для документа ОперацияБух создаем группу правил конвертации свойств для подчиненного набора движений. В обработчике ПередВыгрузкой этой группы переопределяем переменную КоллекцияОбъектов.
Посмотрим, как выглядит заполнение коллекции объектов программным кодом:
// В обработчике "ПередВыгрузкой" группы ПКГС (Движения.Хозрасчетный)
ТЗ = Новый ТаблицаЗначений;
ТЗ.Колонки.Добавить("СчетДт");
ТЗ.Колонки.Добавить("СчетКт");
ТЗ.Колонки.Добавить("Сумма");
ТЗ.Колонки.Добавить("КоличествоДт");
ТЗ.Колонки.Добавить("Номенклатура");
Для Каждого Стр Из Источник.Товары Цикл
НоваяСтр = ТЗ.Добавить();
НоваяСтр.СчетДт = "41.01";
НоваяСтр.СчетКт = "000";
НоваяСтр.Сумма = Стр.Сумма;
НоваяСтр.КоличествоДт = Стр.Количество;
НоваяСтр.Номенклатура = Стр.Номенклатура;
КонецЦикла;
// Переопределяем стандартное получение коллекции
КоллекцияОбъектов = ТЗ;
При таком подходе платформа не будет выполнять стандартное чтение коллекции из источника, а сформирует движения на основе переданной таблицы значений.
Второй вариант заключается в передаче данных табличной части во временную структуру или параметры и формировании движений напрямую на стороне базы-приемника.
Разберем по шагам алгоритм работы этого способа:
ПослеЗагрузки ПКО документа ОперацияБух создаем набор записей регистра бухгалтерии.Проанализируем пример кода для обработчика ПослеЗагрузки:
// Создаем набор записей регистра бухгалтерии
НаборЗаписей = РегистрыБухгалтерии.Хозрасчетный.СоздатьНаборЗаписей();
НаборЗаписей.Отбор.Регистратор.Установить(Объект.Ссылка);
ИтоговаяСумма = 0;
Для Каждого Стр Из ТаблицаДанных Цикл
Запись = НаборЗаписей.Добавить();
Запись.Регистратор = Объект.Ссылка;
Запись.Период = Объект.Дата;
// Заполнение счетов учета
Запись.СчетДт = ПланыСчетов.Хозрасчетный.ТоварыНаСкладах; // 41.01
Запись.СчетКт = ПланыСчетов.Хозрасчетный.Вспомогательный; // 000
// Заполнение сумм и количественных показателей
Запись.Сумма = Стр.Сумма;
Запись.КоличествоДт = Стр.Количество;
// Заполнение аналитики (субконто)
Запись.СубконтоДт[ПланыВидовХарактеристик.ВидыСубконтоХозрасчетные.Номенклатура] = Стр.Номенклатура;
ИтоговаяСумма = ИтоговаяСумма + Стр.Сумма;
КонецЦикла;
// Записываем полученные проводки
НаборЗаписей.Записать();
// Обновляем реквизит шапки "СуммаОперации"
Объект.СуммаОперации = ИтоговаяСумма;
Объект.Записать();
Если задача переноса остатков носит разовый характер, выделим альтернативные способы решения без использования ручных операций:
Хозрасчетный.