Почему расширение 1С не срабатывает при групповом перепроведении документов или закрытии месяца?

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

В практике разработки на платформе 1С:Предприятие 8.3 часто возникает ситуация: программист вносит изменения в логику проведения документа через расширение (используя аннотацию &Вместо, &Перед или &После), и при ручном проведении из формы документа всё работает идеально. Однако, стоит запустить процедуру "Закрытие месяца" или воспользоваться групповой обработкой перепроведения документов, как модифицированная логика "игнорируется", и документы проводятся по старому (типовому) алгоритму. Рассмотрим подробнее, почему это происходит и как обеспечить стабильную работу расширения в любых режимах.

Разберем влияние фоновых заданий и сеансов

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

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

Проанализируем режим загрузки данных

Многие механизмы групповой обработки, встроенные в типовые решения, устанавливают специальное свойство объекта — ОбменДанными.Загрузка в значение Истина. Это делается для того, чтобы ускорить запись объектов, пропуская сложные проверки и избыточные обработчики.

Посмотрим на типичный фрагмент кода в начале процедуры ОбработкаПроведения:


Процедура ОбработкаПроведения(Отказ, РежимПроведения)
    Если ОбменДанными.Загрузка Тогда
        Возврат;
    КонецЕсли;
    // Далее идет основная логика проведения
КонецПроцедуры

Если вы используете расширение с аннотацией &Вместо, вы обязаны учитывать этот флаг. Если групповое перепроведение устанавливает ОбменДанными.Загрузка = Истина, а ваш кастомный код не содержит этой проверки или, наоборот, прерывается по ней, результат будет отличаться от ручного проведения, где этот флаг обычно равен Ложь.

Выясним причины, связанные с кэшированием на сервере

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

Именно этим объясняются случаи "чудесного исцеления" системы после некоторого времени или перезагрузки. Для гарантированного применения изменений в расширении при работе с групповыми обработками рекомендуется:

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

Рассмотрим механизм отложенного проведения

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

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

Изучим точки входа в программный код

Иногда проблема кроется в том, что групповая обработка использует не стандартный метод Записать(РежимЗаписиДокумента.Проведение), а вызывает специализированные процедуры из модуля менеджера или общих модулей (например, механизмы БСП для массовых расчетов). Если вы изменили только ОбработкаПроведения в модуле объекта, а логика проведения при закрытии месяца вынесена в модуль менеджера (что часто встречается в новых версиях 1С), то ваш код в расширении просто не будет задействован.

Для решения этой задачи необходимо:

  1. Использовать замер производительности или отладку, чтобы точно определить, какой программный код вызывается при запуске закрытия месяца.
  2. Если логика вынесена в общие модули, расширять именно их, а не модуль объекта документа.

Пример правильного переопределения метода с учетом контекста

Посмотрим на пример кода в расширении, который учитывает возможные нюансы групповой обработки:


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

    // Выполняем свою логику
    СформироватьДвиженияПоСвоемуАлгоритму(ЭтотОбъект);
    
    // Если нужно сохранить и типовую логику (аналог ПродолжитьВызов)
    // то аннотация &Вместо требует вызова через Расширение.ИмяМетода, 
    // но в модулях объекта лучше использовать &Перед или &После
КонецПроцедуры

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

Если ваше расширение "не видит" групповую обработку, первым делом проверьте, выполняется ли код в фоновом задании. Используйте Журнал регистрации для записи отладочных сообщений прямо из кода расширения — это поможет понять, заходит ли система в ваш алгоритм. Помните, что кэш сервера и флаг ОбменДанными.Загрузка — две самые частые причины "невидимости" кода расширения при массовых операциях с документами.

← На главную