При разработке обменов данными между конфигурацией 1С:ERP Управление предприятием (или 1С:Комплексная автоматизация) и внешними учетными системами разработчики часто сталкиваются со спецификой архитектуры проведения документов. Если в конфигурациях предыдущих поколений (например, УПП 1.3 или Бухгалтерия предприятия) проведение по оперативным регистрам и формирование бухгалтерских проводок происходят одновременно в одной транзакции, то в 1С:ERP эти процессы разделены во времени.
В результате возникает типовая коллизия: документ проводится оперативно, сразу регистрируется в плане обмена и выгружается в приемник еще без бухгалтерских проводок. Спустя некоторое время регламентная процедура формирует проводки в регистре бухгалтерии Хозрасчетный, однако сам документ повторно в план обмена не попадает. Разберем по шагам, почему так происходит, как правильно настроить регистрацию событий и на что обратить внимание при отладке.
Проанализируем архитектуру подсистемы регламентированного учета в 1С:ERP:
ОтражениеДокументовВРеглУчете записывается статус К отражению.Хозрасчетный.ПриЗаписи самого документа не срабатывают повторно.Наиболее надежный и прямой способ отследить появление или изменение проводок — перехватить момент записи движений в регистр бухгалтерии. Рассмотрим по шагам, как это реализовать:
ЗарегистрироватьДокументПоРегиструБухгалтерииПриЗаписи).РегистрБухгалтерииНаборЗаписей.Хозрасчетный.ПриЗаписи.Посмотрим на пример программного кода обработчика подписки:
Процедура ЗарегистрироватьДокументПоРегиструБухгалтерииПриЗаписи(Источник, Отказ) Экспорт
// Проверяем флаг загрузки обмена во избежание зацикливания
Если Источник.ОбменДанными.Загрузка Тогда
Возврат;
КонецЕсли;
// Проверяем наличие отбора по регистратору
Если Источник.Отбор.Найти("Регистратор") = Неопределено Тогда
Возврат;
КонецЕсли;
Если Источник.Отбор.Регистратор.Использование И ЗначениеЗаполнено(Источник.Отбор.Регистратор.Значение) Тогда
ДокументСсылка = Источник.Отбор.Регистратор.Значение;
// Получаем узел или массив узлов плана обмена
УзлыОбмена = ПланыОбмена.ОбменERP_УПП.Выбрать();
Пока УзлыОбмена.Следующий() Цикл
Если УзлыОбмена.Ссылка = ПланыОбмена.ОбменERP_УПП.ЭтотУзел() Тогда
Продолжить;
КонецЕсли;
// Регистрируем документ для передачи с новыми проводками
ПланыОбмена.ЗарегистрироватьИзменения(УзлыОбмена.Ссылка, ДокументСсылка);
КонецЦикла;
КонецЕсли;
КонецПроцедуры
Другой подход заключается в отслеживании изменения состояния отражения документа через специализированный регистр сведений ОтражениеДокументовВРеглУчете. В нем хранится статус документа (например, Отражен, Отражен вручную или Требует подтверждения).
Рассмотрим логику реализации:
ПриЗаписи для объекта РегистрСведенийНаборЗаписей.ОтражениеДокументовВРеглУчете.Перечисления.СтатусыОтраженияВРегламентированномУчете.Отражен.Этот способ позволяет избежать отправки промежуточных данных, если проводки сформировались с ошибками или требуют ручной проверки главным бухгалтером.
Чтобы избежать ситуации, когда документ выгружается в базу-приемник в «сыром» виде (без проводок), рекомендуется скорректировать Правила регистрации объектов в конфигурации Конвертация данных 2.0:
Отказ = Истина;.Таким образом, первичное проведение документа не вызовет его регистрацию в плане обмена. Документ встанет в очередь выгрузки только тогда, когда сработает подписка на запись регистра бухгалтерии после успешного фонового отражения.
Выясним частую причину, почему подписка на событие регистра бухгалтерии кажется «неработающей» при ручной проверке разработчиком:
При нажатии кнопки Отразить в регл. учете в форме документа или при автоматическом регламентном задании процесс отражения выполняется на стороне сервера в фоновом задании. Если в конфигураторе в меню Отладка → Подключение не включен автоматический перехват фоновых заданий, точка останова внутри обработчика подписки не сработает.
Для корректной отладки выполним следующие действия:
РегистрБухгалтерииНаборЗаписей успешно сработает.Важное предостережение для высоконагруженных баз: при включенном многопоточном отражении документов параллельная регистрация изменений в плане обмена напрямую через ПланыОбмена.ЗарегистрироватьИзменения может вызывать взаимоблокировки (deadlocks) на таблицах регистрации. В крупных корпоративных системах рекомендуется буферизовать очередь выгрузки через отдельный промежуточный регистр сведений или оптимизировать транзакции регистрации.