Перенос документа ОперацияБух (или аналогичных документов ручных операций) между базами 1С с помощью конфигурации «Конвертация данных 2.1» (КД 2.1) — это классическая задача, с которой регулярно сталкиваются разработчики. Особенность этого документа заключается в том, что он не имеет стандартной процедуры проведения. У него отключено проведение, а все проводки хранятся непосредственно в табличных частях движений регистра бухгалтерии, где сам документ выступает в роли регистратора.
При стандартной настройке правил конвертации объектов (ПКО) этот документ часто переносится «пустым» — сам документ создается в базе-приемнике, но таблица проводок остается абсолютно чистой. В этой статье мы подробно разберем, почему возникает эта проблема, и рассмотрим несколько эффективных способов её решения.
В обычных документах (например, «Реализация товаров и услуг» или «Поступление на расчетный счет») движения по регистрам формируются программно в модуле документа в обработчике ОбработкаПроведения. При переносе таких документов через КД 2.1 достаточно перенести сам документ и при необходимости перепровести его в приемнике.
С документом ОперацияБух этот фокус не сработает. Так как алгоритма проведения у него нет, его движения должны переноситься напрямую из базы-источника. Однако платформа 1С при записи объекта типа ДокументОбъект по умолчанию очищает или просто не записывает наборы записей его движений, если ей явно не указать обратное. В результате создается пустой документ-пустышка.
Прежде чем приступать к написанию правил, давайте убедимся, что метаданные наших конфигураций были выгружены корректно. Это частая ошибка начинающих разработчиков.
При выгрузке структуры конфигурации с помощью обработки MD82Exp.epf обратите внимание на настройки. Нам необходимо в обязательном порядке снять флаг «Не выгружать регистры бухгалтерии». Если этот флаг будет установлен, КД 2.1 не увидит структуру регистра бухгалтерии (например, Хозрасчетный или ЖурналПроводокЕПСБУ), и мы не сможем настроить правила конвертации свойств (ПКС) для движений.
Рассмотрим самое простое и быстрое решение, которое помогает в 90% случаев. Нам нужно принудительно заставить платформу записать загруженный набор движений вместе с документом.
Для этого в конфигурации «Конвертация данных» откроем созданное ПКО для документа ОперацияБух (или ОперацияБухгалтерская) и перейдем в обработчик события «После загрузки». Запишем туда следующую строку кода:
Если мы переносим данные в Бухгалтерию предприятия 3.0 (БП):
Объект.Движения.Хозрасчетный.Записывать = Истина;
Если мы выполняем перенос в Бухгалтерию государственного учреждения 2.0 (БГУ):
Объект.Движения.ЖурналПроводокЕПСБУ.Записывать = Истина;
Как это работает: При синтаксическом анализе XML-файла КД автоматически заполняет коллекции движений в объекте. Установка свойства Записывать = Истина сообщает платформе, что при вызове метода Объект.Записать() этот конкретный набор записей регистра бухгалтерии должен быть принудительно сохранен в базу данных.
В некоторых конфигурациях или при наличии кастомных подписок на события (например, при записи документов) свойство Записывать = Истина может сбрасываться платформой в процессе транзакции. В результате движения все равно затираются.
Проанализируем более надежный программный обход этой проблемы. Мы можем временно сохранить прочитанные движения во временную таблицу значений, записать «пустой» документ для получения ссылки, а затем принудительно записать движения напрямую через менеджер набора записей регистра:
// Для БГУ используется "ЖурналПроводокЕПСБУ", для БП — "Хозрасчетный"
НаборДвижений = Объект.Движения.ЖурналПроводокЕПСБУ;
// Выгружаем загруженные конвертацией движения во временную таблицу значений
ТаблицаДвижений = НаборДвижений.Выгрузить();
// Записываем сам документ-регистратор в базу данных
Объект.Записать(РежимЗаписиДокумента.Запись);
// Создаем независимый набор записей регистра бухгалтерии
НаборЗаписей = РегистрыБухгалтерии.ЖурналПроводокЕПСБУ.СоздатьНаборЗаписей();
НаборЗаписей.Отбор.Регистратор.Установить(Объект.Ссылка);
// Загружаем сохраненные строки движений и записываем их напрямую
НаборЗаписей.Загрузить(ТаблицаДвижений);
НаборЗаписей.Записать();
Этот способ гарантирует 100% результат, поскольку запись движений происходит в обход стандартного механизма записи документа.
Даже если движения начали переноситься, вы можете столкнуться с тем, что аналитика (субконто) на счетах дебета или кредита оказывается пустой или вызывает ошибки при загрузке. Субконто в 1С — это динамические типы данных, базирующиеся на Планах видов характеристик (ПВХ). Давайте разберем, как правильно их настроить.
СубконтоДт и СубконтоКт группы свойств регистра обязательно укажите соответствующее ПКО для плана видов характеристик (например, ПКО ВидыСубконтоХозрасчетные или ВидыСубконтоЕПСБУ).
ИмяПКОВидСубконто = "ВидыСубконтоЕПСБУ";
Также возможна ситуация, когда в базе-источнике у счета настроено три субконто, а в базе-приемнике у этого же счета — только два. В этом случае попытка записать лишнее субконто приведет к ошибке транзакции. Чтобы обезопасить себя от этого, добавим в обработчик «После загрузки» ПКО документа код автоматической очистки лишней аналитики:
Для каждого Проводка из Объект.Движения.ЖурналПроводокЕПСБУ Цикл
// Проверяем и очищаем лишние Субконто Дт
Для каждого Субконто из Проводка.СубконтоДт Цикл
Доступно = Ложь;
Для каждого ВидСубконто из Проводка.СчетДт.ВидыСубконто Цикл
Если ВидСубконто.ВидСубконто = Субконто.Ключ Тогда
Доступно = Истина;
Прервать;
КонецЕсли;
КонецЦикла;
Если НЕ Доступно Тогда
Проводка.СубконтоДт.Удалить(Субконто.Ключ);
КонецЕсли;
КонецЦикла;
// Проверяем и очищаем лишние Субконто Кт
Для каждого Субконто из Проводка.СубконтоКт Цикл
Доступно = Ложь;
Для каждого ВидСубконто из Проводка.СчетКт.ВидыСубконто Цикл
Если ВидСубконто.ВидСубконто = Субконто.Ключ Тогда
Доступно = Истина;
Прервать;
КонецЕсли;
КонецЦикла;
Если НЕ Доступно Тогда
Проводка.СубконтоКт.Удалить(Субконто.Ключ);
КонецЕсли;
КонецЦикла;
КонецЦикла;
Если объем данных очень большой или стандартный XML-парсер КД дает сбои при сериализации движений регистра, мы можем применить альтернативный подход с использованием временной таблицы значений.
Рассмотрим схему реализации этого метода:
ТаблицаЗначений.ИсходящиеДанные:
ИсходящиеДанные = Новый Структура;
ИсходящиеДанные.Вставить("ТаблицаПроводок", ТаблицаДвижений);
ВходящиеДанные, обходим строки в цикле и вручную заполняем движения созданного документа ОперацияБух.Этот способ позволяет полностью абстрагироваться от стандартных механизмов КД по выгрузке регистров и гарантирует максимальную гибкость при сопоставлении аналитики счетов.
Используя предложенные методики, мы сможем настроить безошибочный и быстрый перенос любых ручных операций без потери важной бухгалтерской аналитики.