Как найти точку входа и отладить проведение регламентной операции в 1С:Бухгалтерия 3.0

Программист 1С v8.3 (Управляемые формы) 1C:Бухгалтерия Бухгалтерский учет
← На главную

При работе с конфигурацией 1С:Бухгалтерия предприятия 3.0 разработчики часто сталкиваются с необходимостью изменить алгоритм формирования проводок в документах типа РегламентнаяОперация. Однако попытка найти привычную процедуру ОбработкаПроведения в модуле объекта часто заканчивается неудачей. Это связано с тем, что механизмы закрытия месяца в современных версиях БП 3.0 построены на сложной архитектуре диспетчеризации и выполнения заданий в фоновом режиме. Разберем по шагам, как найти точку начала выполнения кода и как правильно настроить отладчик для этой задачи.

Выясним причину: почему стандартные точки останова не работают

Прежде всего, проанализируем ситуацию: почему, установив точку останова в модуле, мы не видим остановки программы при запуске операции из помощника «Закрытие месяца»? Основная причина кроется в том, что процедура запускается в фоновом задании на стороне сервера. Если ваш отладчик настроен только на клиентский сеанс, он просто «проигнорирует» серверный процесс выполнения расчета.

Для того чтобы отладка сработала, необходимо выполнить следующие условия:

  1. Настройка сервера: Сервер «1С:Предприятия» должен быть запущен с ключом -debug. Без этого отладка серверных вызовов невозможна в принципе.
  2. Автоматическое подключение: В конфигураторе перейдите в меню «Отладка» -> «Подключения» -> «Автоматическое подключение». В открывшемся окне установите флажки для пунктов «Фоновые задания» и «Сервер».
  3. Параметр РежимОтладки: В некоторых случаях система может принудительно уводить выполнение в фоновый поток. Использование глобального поиска по строке РежимОтладки поможет найти места, где система проверяет, нужно ли выполнять код синхронно для целей тестирования.

Рассмотрим архитектуру через Общие модули

В типовом решении БП 3.0 логика регламентных операций вынесена из модулей самих документов. Проанализируем роль «диспетчера» — им выступает общий модуль ЗакрытиеМесяцаСервер. Именно он определяет, какую именно операцию нужно выполнить, и вызывает соответствующий обработчик.

Попробуем найти точку входа, используя следующие процедуры в общем модуле ЗакрытиеМесяцаСервер:

Если вы хотите перехватить выполнение конкретной операции (например, переоценку валюты или амортизацию), обратите внимание на Модуль менеджера документа РегламентнаяОперация. В нем часто располагаются экспортные функции типа ВыполнитьРасчет.

Поиск точки формирования проводок

Если ваша задача — изменить конкретную проводку, нет смысла искать самое начало модуля. Проанализируем ситуацию: проводки обычно формируются на основе временных таблиц или запросов. Рассмотрим основные места, где стоит искать логику заполнения движений:

  1. Используйте глобальный поиск (Ctrl+Shift+F) по названию ресурса или специфическому содержанию операции.
  2. Ищите в общих модулях с префиксами РегламентныеОперации.... Например, РегламентныеОперацииЛогика или РегламентныеОперацииБП.
  3. Финальная точка записи движений всегда связана с методом Движения.Хозрасчетный.Записать(). Установка точки останова перед этим вызовом позволит увидеть уже сформированную таблицу проводок и изменить её.

Использование подписки на события: правильный путь изменения типовой логики

Важно помнить, что прямое изменение типового модуля регламентной операции — это плохая практика, которая усложнит обновление конфигурации. Разберем более элегантное решение — использование Подписки на события. Мы можем перехватить момент проведения и внести свои коррективы.

Рассмотрим пример создания такой подписки:

  1. Создайте в метаданных новую Подписку на событие.
  2. В качестве источника выберите документ ДокументОбъект.РегламентнаяОперация.
  3. Событие — ОбработкаПроведения.
  4. В обработчике подписки (который должен располагаться в серверном общем модуле) напишите код для модификации движений.

Посмотрим на пример кода в обработчике подписки:


Процедура МояПодпискаПриПроведенииРегламентнойОперации(Источник, Отказ, РежимПроведения) Экспорт
    
    // Проверяем, что это нужный нам вид операции
    Если Источник.ВидОперации = ПредопределенноеЗначение("Перечисление.ВидыРегламентныхОпераций.ПереоценкаВалютныхСредств") Тогда
        
        // Получаем набор записей Хозрасчетного регистра
        НаборЗаписей = Источник.Движения.Хозрасчетный;
        
        // Если движения еще не прочитаны, читаем их
        Если НаборЗаписей.Количество() = 0 Тогда
            НаборЗаписей.Прочитать();
        КонецЕсли;
        
        Для Каждого Запись Из НаборЗаписей Цикл
            // Реализуем логику изменения проводки
            Если Запись.СчетДт = ПланыСчетов.Хозрасчетный.ВалютныеСчета Тогда
                 // Ваши изменения здесь
                 // Запись.Сумма = ...
            КонецЕсли;
        КонецЦикла;
        
        // Важно: записывать движения здесь не обязательно, 
        // если подписка выполняется в процессе проведения, 
        // так как платформа запишет их автоматически после завершения всех обработчиков.
        
    КонецЕсли;

КонецПроцедуры

Дополнительные рекомендации по отладке через Помощник

Когда вы запускаете операцию из формы «Закрытие месяца», система выполняет массу проверок: актуальность последовательности, наличие ошибок в предыдущих периодах и так далее. Проанализируем ситуацию: если отладчик не останавливается даже после настройки фоновых заданий, возможно, код просто не выполняется из-за того, что система считает операцию «актуальной» и не требующей перезапуска.

Чтобы гарантированно попасть в код расчета, попробуйте следующее:

Подведем итог: отладка регламентных операций требует комплексного подхода. Мы должны убедиться в правильности настроек сервера (ключ -debug), активировать автоматическое подключение к фоновым заданиям и искать логику не в модуле объекта, а в специализированных общих модулях ЗакрытиеМесяцаСервер или модулях менеджеров. Использование подписок на события позволит внедрить изменения, сохранив конфигурацию на поддержке.

← На главную