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

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

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

В данной статье мы разберем, как грамотно «отловить» момент выполнения конкретной операции и внести свои правки в движения регистров, используя механизмы расширений и подписок на события.

Анализ архитектуры документа РегламентнаяОперация

Прежде всего, нам необходимо понять, как устроено закрытие месяца «под капотом». Основным объектом является документ РегламентнаяОперация. Однако его поведение не статично: оно определяется реквизитом ВидОперации, который ссылается на перечисление ВидыРегламентныхОпераций. Каждому виду операции соответствует своя процедура расчета в модуле документа или в специализированных общих модулях.

Для того чтобы внедрить свой код, нам нужно найти точку входа. Рассмотрим основные стратегии решения этой задачи.

Использование расширений с аннотациями &После и &Перед

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

Например, если нам нужно выполнить действия после закрытия 97 счета, мы можем использовать следующий код в расширении модуля документа:


&После("ЗакрытиеСчета97")
Процедура АЗАЗА_ЗакрытиеСчета97(СтруктураШапкиДокумента, Отказ, Ошибки)
    
    // Получаем набор записей регистра бухгалтерии, сформированный типовым кодом
    НаборХоз = Движения.Хозрасчетный;
    
    Для каждого ЗаписьНабора Из НаборХоз Цикл
        // Здесь мы можем проанализировать или изменить проводки
        // Например, скорректировать аналитику или суммы
    КонецЦикла;
    
КонецПроцедуры

Если же стоит задача вмешаться в процесс закрытия затратных счетов (20, 23, 25, 26), мы можем использовать аннотацию &Перед, чтобы подготовить данные или изменить параметры расчета:


&Перед("ЗакрытиеСчетов20_23_25_26")
Процедура АЛР_ЗакрытиеСчетов20_23_25_26(Период, Организация, Ссылка, Отказ, Ошибки)
    
    // Получаем документы регламентных операций за период для анализа
    ДокументЗакрытия25 = ПолучитьОперациюЗаМесяц(НачалоМесяца(Период), КонецМесяца(Период), "25");    
    ДокументЗакрытия23 = ПолучитьОперациюЗаМесяц(НачалоМесяца(Период), КонецМесяца(Период), "23");    
    
    // Выполняем вспомогательное списание затрат перед основным расчетом
    СписатьЗатраты(ДокументЗакрытия25, "25", НачалоМесяца(Период), КонецМесяца(Период), Организация);
    СписатьЗатраты(ДокументЗакрытия23, "23", НачалоМесяца(Период), КонецМесяца(Период), Организация);

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

Почему расширение может не работать: разбор типичных ошибок

Иногда программисты сталкиваются с тем, что добавленная в расширение процедура просто не вызывается (отладчик не заходит в код). Разберем причины этой ситуации:

  1. Фоновое выполнение: В БП 3.0 процедура закрытия месяца часто запускается в фоновом задании. Для отладки такого кода необходимо в конфигураторе включить «Автоматическое подключение» к фоновым заданиям.
  2. Безопасный режим: Если в свойствах расширения установлен флаг «Безопасный режим», платформа может ограничивать выполнение некоторых операций. Попробуйте снять этот флаг.
  3. Сигнатура метода: При использовании аннотации &Вместо или &После количество параметров в вашей процедуре должно строго совпадать с количеством параметров в оригинальной процедуре. Если 1С изменит количество параметров в обновлении, расширение перестанет работать.
  4. Область видимости: Если процедура в основной конфигурации не является экспортной (Экспорт), то расширить ее в модуле документа может быть невозможно. В этом случае стоит обратить внимание на общие модули, из которых вызывается расчет.

Альтернативный подход: Подписки на события

Если логика расчета резервов по сомнительным долгам (или любая другая) глубоко запрятана в недрах общих модулей и расширение модуля документа не помогает, стоит рассмотреть Подписки на события. Это более стабильный метод, который меньше зависит от обновлений кода внутренних процедур 1С.

Рассмотрим алгоритм реализации через подписку:

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

Влияние обновлений и режима совместимости

Важно помнить, что 1С регулярно обновляет механизмы закрытия месяца. При переходе на новые версии (например, с 3.0.64 на 3.0.65) может измениться режим совместимости конфигурации. В этом случае все расширения также должны быть переведены на новый режим совместимости, иначе они будут отключены платформой автоматически.

Также при обновлении могут меняться места расположения процедур. Например, логика сопоставления номенклатуры может переехать из общих форм в формы обработок. Если ваше расширение завязано на конкретные методы, будьте готовы пересматривать их после каждого крупного релиза БП 3.0.

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

← На главную