При работе с конфигурацией «Бухгалтерия государственного учреждения» (БГУ 2.0) программисты часто сталкиваются с тем, что найти место формирования проводок в модуле документа (например, «Авансовый отчет») классическим способом через процедуру ОбработкаПроведения невозможно. Это связано с тем, что современные конфигурации на платформе 1С v8.3 используют сложные механизмы подсистем, где логика вынесена в общие модули или даже хранится в данных (справочниках). Рассмотрим пошагово, как «отловить» момент формирования движений.
Прежде чем приступать к отладке, проанализируем, почему обычный поиск не дает результатов. В БГУ 2.0 реализован механизм типовых операций. Проводки не прописываются жестко в коде документа. Вместо этого в документе на закладке «Бухгалтерская операция» выбирается элемент справочника ТиповыеОперации. Программа считывает настройки этой операции и программно формирует набор записей регистра бухгалтерии.
Часто логика формирования скрыта в общем модуле БухгалтерскиеОперацииБГУСервер или ПроведениеСервер. Кроме того, движения могут сначала формироваться во временных таблицах в памяти и записываться в базу данных одной командой в самом конце транзакции проведения. Чтобы найти этот момент, нам понадобятся специальные инструменты отладки.
Если нам не удается найти код в самом документе, мы можем зайти «с другой стороны» — со стороны регистра, в который записываются данные. Разберем этот алгоритм:
РегистрыБухгалтерии.ЖурналПроводокЕПСБУ).ПриЗаписи. Если его нет — создадим его.Пример кода, который можно использовать для отладки в модуле набора записей:
Процедура ПриЗаписи(Отказ, Замещение)
// Точка останова ставится на следующей строке
Если ЭтотОбъект.Количество() > 0 Тогда
ЗаписьДляАнализа = ЭтотОбъект[0];
КонецЕсли;
КонецПроцедуры
Когда система остановится на этой точке, воспользуемся панелью «Стек вызовов» (Call Stack). Проанализируем цепочку вызовов снизу вверх: так мы увидим, какая процедура в общем модуле инициировала запись регистра. Это позволит нам выйти на процедуру формирования набора записей.
Замер производительности — это мощнейший инструмент отладки, который позволяет увидеть абсолютно все строки кода, которые были выполнены за определенный период времени. Выясним причину отсутствия проводок именно через этот механизм:
Перед нами откроется таблица со всеми выполненными процедурами. Рассмотрим, как в ней ориентироваться:
Записать(), Движения, БухгалтерскиеОперации.Проанализируем ситуацию: если мы видим вызовы функций в модуле ПроведениеСервер, значит, мы на верном пути. Особое внимание уделим методу ЗаписатьДвижения — именно там данные из памяти физически попадают в таблицы базы данных.
Посмотрим на ситуацию с точки зрения архитектуры БГУ 2.0. Если вы обнаружили, что код формирования проводок ведет в процедуру Выполнить(), это означает, что логика хранится в базе данных. В БГУ 2.0 существуют так называемые «Алгоритмы для типовых операций».
Разберем по шагам, как их найти:
Если логика формирования слишком сложная, она может быть вынесена в Дополнительные алгоритмы, которые представляют собой фрагменты кода 1С, хранящиеся прямо в справочнике. Отладить такой код обычными точками останова сложно, поэтому программисты часто используют временную вставку Сообщить() или запись в журнал регистрации для анализа промежуточных данных.
Если вы ставите точку останова в ПриЗаписи или в общих модулях, но программа на ней не останавливается, проанализируем настройки сервера. В современных версиях 1С проведение часто выполняется в фоновом задании или на сервере.
Выясним, включена ли отладка на сервере:
-debug.Для того чтобы успешно найти момент формирования проводок в БГУ 2.0, мы рекомендуем совмещать методы. Сначала используйте замер производительности, чтобы ограничить область поиска. Затем, используя стек вызовов, дойдите до конкретного общего модуля. Не забывайте, что в БГУ 2.0 первичным является справочник ТиповыеОперации, который управляет процессом заполнения регистров через механизмы БСП.