При работе с конфигурацией 1С:Бухгалтерия предприятия 3.0 разработчики часто сталкиваются с необходимостью изменить алгоритм формирования проводок в документах типа РегламентнаяОперация. Однако попытка найти привычную процедуру ОбработкаПроведения в модуле объекта часто заканчивается неудачей. Это связано с тем, что механизмы закрытия месяца в современных версиях БП 3.0 построены на сложной архитектуре диспетчеризации и выполнения заданий в фоновом режиме. Разберем по шагам, как найти точку начала выполнения кода и как правильно настроить отладчик для этой задачи.
Прежде всего, проанализируем ситуацию: почему, установив точку останова в модуле, мы не видим остановки программы при запуске операции из помощника «Закрытие месяца»? Основная причина кроется в том, что процедура запускается в фоновом задании на стороне сервера. Если ваш отладчик настроен только на клиентский сеанс, он просто «проигнорирует» серверный процесс выполнения расчета.
Для того чтобы отладка сработала, необходимо выполнить следующие условия:
-debug. Без этого отладка серверных вызовов невозможна в принципе.РежимОтладки поможет найти места, где система проверяет, нужно ли выполнять код синхронно для целей тестирования.В типовом решении БП 3.0 логика регламентных операций вынесена из модулей самих документов. Проанализируем роль «диспетчера» — им выступает общий модуль ЗакрытиеМесяцаСервер. Именно он определяет, какую именно операцию нужно выполнить, и вызывает соответствующий обработчик.
Попробуем найти точку входа, используя следующие процедуры в общем модуле ЗакрытиеМесяцаСервер:
ЗакрытиеМесяцаСервер.ВыполнитьОперацию() — это одна из центральных точек, через которую проходит управление при запуске из помощника.ЗакрытиеМесяцаСервер.ПровестиРегламентнуюОперацию() — здесь происходит вызов логики проведения документа.Если вы хотите перехватить выполнение конкретной операции (например, переоценку валюты или амортизацию), обратите внимание на Модуль менеджера документа РегламентнаяОперация. В нем часто располагаются экспортные функции типа ВыполнитьРасчет.
Если ваша задача — изменить конкретную проводку, нет смысла искать самое начало модуля. Проанализируем ситуацию: проводки обычно формируются на основе временных таблиц или запросов. Рассмотрим основные места, где стоит искать логику заполнения движений:
Ctrl+Shift+F) по названию ресурса или специфическому содержанию операции.РегламентныеОперации.... Например, РегламентныеОперацииЛогика или РегламентныеОперацииБП.Движения.Хозрасчетный.Записать(). Установка точки останова перед этим вызовом позволит увидеть уже сформированную таблицу проводок и изменить её.Важно помнить, что прямое изменение типового модуля регламентной операции — это плохая практика, которая усложнит обновление конфигурации. Разберем более элегантное решение — использование Подписки на события. Мы можем перехватить момент проведения и внести свои коррективы.
Рассмотрим пример создания такой подписки:
ДокументОбъект.РегламентнаяОперация.ОбработкаПроведения.Посмотрим на пример кода в обработчике подписки:
Процедура МояПодпискаПриПроведенииРегламентнойОперации(Источник, Отказ, РежимПроведения) Экспорт
// Проверяем, что это нужный нам вид операции
Если Источник.ВидОперации = ПредопределенноеЗначение("Перечисление.ВидыРегламентныхОпераций.ПереоценкаВалютныхСредств") Тогда
// Получаем набор записей Хозрасчетного регистра
НаборЗаписей = Источник.Движения.Хозрасчетный;
// Если движения еще не прочитаны, читаем их
Если НаборЗаписей.Количество() = 0 Тогда
НаборЗаписей.Прочитать();
КонецЕсли;
Для Каждого Запись Из НаборЗаписей Цикл
// Реализуем логику изменения проводки
Если Запись.СчетДт = ПланыСчетов.Хозрасчетный.ВалютныеСчета Тогда
// Ваши изменения здесь
// Запись.Сумма = ...
КонецЕсли;
КонецЦикла;
// Важно: записывать движения здесь не обязательно,
// если подписка выполняется в процессе проведения,
// так как платформа запишет их автоматически после завершения всех обработчиков.
КонецЕсли;
КонецПроцедуры
Когда вы запускаете операцию из формы «Закрытие месяца», система выполняет массу проверок: актуальность последовательности, наличие ошибок в предыдущих периодах и так далее. Проанализируем ситуацию: если отладчик не останавливается даже после настройки фоновых заданий, возможно, код просто не выполняется из-за того, что система считает операцию «актуальной» и не требующей перезапуска.
Чтобы гарантированно попасть в код расчета, попробуйте следующее:
ВыполнитьОперацию в модуле объекта и убедитесь, что она действительно вызывается. В некоторых версиях конфигурации точка входа может быть в Функция ВыполнитьОперацию(БлокировкаУстановленаНеявно = Ложь) Экспорт.Подведем итог: отладка регламентных операций требует комплексного подхода. Мы должны убедиться в правильности настроек сервера (ключ -debug), активировать автоматическое подключение к фоновым заданиям и искать логику не в модуле объекта, а в специализированных общих модулях ЗакрытиеМесяцаСервер или модулях менеджеров. Использование подписок на события позволит внедрить изменения, сохранив конфигурацию на поддержке.