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