Почему не работают подписки на события и расширения при программном создании документов в фоновом задании?

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

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

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

Причина 1. Особенности отладки фоновых заданий на сервере

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

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

  1. Проверим, включена ли отладка на сервере 1С. Если сервер приложений запущен без ключа -debug (для протокола TCP) или без соответствующих настроек HTTP-отладки, точки останова на сервере в принципе работать не будут.
  2. Настроим автоматическое подключение. В Конфигураторе перейдем в меню Отладка -> Подключение.... В открывшемся окне нажмем кнопку Автоматическое подключение и установим флажок напротив пункта Фоновые задания. После этого конфигуратор будет автоматически "перехватывать" все создаваемые базой фоновые процессы.
  3. Учтем особенности многопроцессорных кластеров. Если в кластере серверов 1С работает несколько рабочих процессов rphost, или фоновое задание выполняется на другом сервере кластера, отладчик может физически не "поймать" нужный поток. В таких случаях рекомендуется использовать отладку по протоколу HTTP, которая работает стабильнее в распределенных системах.

Причина 2. Безопасный режим работы расширения

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

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

Решение: Перейдем в меню Администрирование -> Печатные формы, отчеты и обработки -> Расширения (или в аналогичный интерфейс управления расширениями вашей конфигурации), найдем наше расширение и обязательно снимем флажки "Безопасный режим" и "Защита от опасных действий".

Причина 3. Использование флага "ОбменДанными.Загрузка"

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

Посмотрим на типичный пример инициализации объекта в коде ERP:


НовыйДокумент = Документы.СписаниеБезналичныхДенежныхСредств.СоздатьДокумент();
// Заполнение реквизитов...
НовыйДокумент.ОбменДанными.Загрузка = Истина;
НовыйДокумент.Записать(РежимЗаписиДокумента.Проведение);

Если этот флаг установлен в Истина, то в стандартных подписках на события и в самом начале модулей объектов типовых конфигураций (в обработчиках ПередЗаписью, ПриЗаписи) срабатывает условие отсечки:


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

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

Причина 4. Проверка выполнения кода через Журнал регистрации

Чтобы гарантированно исключить проблемы с настройкой отладчика и проверить, выполняется ли ваш код на самом деле, откажемся на время от точек останова и воспользуемся записью в системный журнал. Это самый надежный способ экспресс-анализа.

Добавим в начало нашей процедуры в расширении следующий код:


&После("ПередЗаписью")
Процедура Мой_ПередЗаписьюПосле(Отказ, РежимЗаписи, РежимПроведения)
    
    // Запишем информацию в Журнал регистрации
    ТекстСообщения = СтрШаблон("Код расширения сработал! Режим записи: %1, Загрузка: %2", 
                                РежимЗаписи, 
                                ЭтотОбъект.ОбменДанными.Загрузка);
                                
    ЗаписьЖурналаРегистрации("ОтладкаФоновогоЗадания",
                             УровеньЖурналаРегистрации.Информация,
                             ЭтотОбъект.Метаданные(),
                             ЭтотОбъект.Ссылка,
                             ТекстСообщения);

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

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

Причина 5. Синхронный запуск фоновых заданий через режим отладки БСП

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

Разберем, как активировать этот режим:

  1. Запустим сеанс "1С:Предприятие" в режиме отладки из конфигуратора.
  2. В параметрах запуска приложения (в конфигураторе: Сервис -> Параметры -> Запуск 1С:Предприятия -> Основные) в поле Параметры запуска укажем команду: /C РежимОтладки.
  3. При наличии этого параметра БСП будет выполнять все фоновые задачи (в том числе формирование документов из АРМ) синхронно, в рамках вашего текущего клиентского сеанса.

Благодаря этому приему точка останова, установленная в модуле объекта или расширении, гарантированно сработает без необходимости настройки сложных серверных подключений и поиска нужных процессов rphost.

← На главную