Как изменить алгоритм закрытия 25 счета через расширение и почему не срабатывает код

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

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

Почему расширение «игнорирует» ваш код: технические аспекты

Проанализируем ситуацию: вы добавили процедуру-перехватчик с аннотацией &Перед, но точка останова не срабатывает. Выясним основные причины этого поведения, связанные с особенностями платформы 1С:Предприятие 8.3.

  1. Фоновые задания и отладка. Закрытие месяца практически всегда запускается как фоновое задание. По умолчанию отладчик конфигуратора не «цепляет» сеансы фоновых заданий. Чтобы увидеть выполнение кода, необходимо в меню «Отладка» выбрать пункт «Настройка отладки» и установить флажок «Отлаживать фоновые задания».
  2. Безопасный режим и защита от опасных действий. Для работы расширений, влияющих на проведение документов и расчеты, необходимо снять флажки «Безопасный режим» и «Защита от опасных действий» в свойствах расширения в справочнике «Расширения конфигурации». Если эти флажки установлены, выполнение кода может быть блокировано или ограничено платформой.
  3. Контекст выполнения. Процедура ВыполнитьОперацию может вызываться через Выполнить() или в специфическом серверном контексте, где расширение модулей объектов не всегда отрабатывает ожидаемым образом, если не соблюдены правила компиляции.

Посмотрим на пример правильного оформления перехвата в модуле расширения:


&Вместо("ВыполнитьОперацию")
Процедура ру_ВыполнитьОперацию(БлокировкаУстановленаНеявно = Ложь)
    // Ваш код до выполнения основной логики
    ЗаписьЖурналаРегистрации("ЗакрытиеМесяца", УровеньЖурналаРегистрации.Информация, , , "Начало выполнения операции через расширение");
    
    // Вызов основной процедуры
    ПродолжитьВызов(БлокировкаУстановленаНеявно);
    
    // Ваш код после выполнения
КонецПроцедуры

Методология распределения 25 счета: почему «штатное» поведение изменилось

Проанализируем ситуацию со стороны бухгалтерского учета. С 2021 года, в связи с введением ФСБУ 5/2019, логика программы 1С:Бухгалтерия была пересмотрена. Рассмотрим подробнее, как теперь работает счет 25 (Общепроизводственные расходы).

Если в конкретном подразделении по счету 20.01 (Основное производство) в текущем месяце нет выпуска продукции или оказания услуг (отсутствует база распределения), программа автоматически классифицирует такое подразделение как «обслуживающее». В этом случае затраты 25 счета распределяются на другие подразделения, где выпуск был. Это делается для того, чтобы счет 25 закрылся полностью, так как он не может иметь сальдо на конец месяца.

Требование бухгалтера: «Затраты подразделения А должны распределяться только на счет 20 этого же подразделения А, даже если там нет выпуска». Это означает, что затраты должны остаться в незавершенном производстве (НЗП) именно этого цеха. Рассмотрим, как этого добиться.

Решение проблемы через настройки учетной политики

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

Если ни одна из баз не подходит, так как выпуска нет совсем, можно использовать механизм «Ручного распределения» через документ Установка показателей для распределения производственных затрат. Если в этот документ внести данные по нужному подразделению, программа «увидит» базу и закроет 25 счет именно туда, создав остаток НЗП на счете 20.

Программная реализация: где на самом деле нужно менять код

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

  1. Общий модуль МенеджерРасчетаЗатрат — здесь формируются запросы и таблицы для распределения.
  2. Общий модуль УчетЗатратРаспределение — содержит алгоритмы расчета коэффициентов.
  3. Общий модуль УчетЗатратПереопределяемый — это идеальное место для внесения изменений. Разработчики 1С специально оставляют «точки входа» для кастомизации правил.

Рассмотрим пример добавления собственного правила распределения через расширение общего модуля:


&После("ПриОпределенииПравилРаспределенияЗатрат")
Процедура ру_ПриОпределенииПравилРаспределенияЗатрат(Правила)
    // Добавляем описание собственного алгоритма
    НовоеПравило = Правила.Добавить();
    НовоеПравило.Идентификатор = "СвояБазаРаспределения";
    НовоеПравило.Наименование = "Распределение по подразделениям (без учета выпуска)";
КонецПроцедуры

Выясним причину, по которой 25 счет «уходит» на другие подразделения. В коде это обычно связано с проверкой ТаблицаБазыРаспределения.Количество() > 0. Если база пуста, алгоритм ищет альтернативные пути распределения. Ваша задача в расширении — принудительно заполнить таблицу базы распределения нужным подразделением, даже если реальных затрат по счету 20 там не зафиксировано.

Использование записи в журнал регистрации для отладки

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


&Перед("ВыполнитьОперацию")
Процедура ру_ПередВыполнитьОперацию(БлокировкаУстановленаНеявно = Ложь)
    ТекстСообщения = "Документ: " + Строка(ЭтотОбъект.Ссылка) + " | Период: " + Строка(ЭтотОбъект.Период);
    ЗаписьЖурналаРегистрации("ОтладкаРасширения", УровеньЖурналаРегистрации.Предупреждение, , , ТекстСообщения);
    
    // Проверка условий, при которых алгоритм должен измениться
    Если ЭтотОбъект.ВидОперации = Перечисления.ВидыРегламентныхОпераций.ЗакрытиеСчетов20_23_25_26 Тогда
        // Логика подмены параметров
    КонецЕсли;
КонецПроцедуры

Подведем итоги

Для успешного решения задачи нам необходимо:

Используя этот комплексный подход, мы сможем не только решить техническую проблему с «неработающим» кодом, но и реализовать требования бизнеса наиболее корректным с точки зрения архитектуры 1С способом.

← На главную