При разработке в среде 1С:Предприятие программисты часто сталкиваются с ситуацией: при интерактивном создании и проведении документа из формы все обработчики (подписки на события, процедуры модуля объекта ПередЗаписью, ПриЗаписи, а также их расширения с аннотациями &Перед, &После) отрабатывают корректно. Однако при программном создании тех же документов в фоновом задании (например, при генерации распоряжений или списаний денежных средств из автоматизированного рабочего места "Платежный календарь" в 1С:ERP) код расширения или подписки как будто полностью игнорируется, а точки останова в конфигураторе не срабатывают.
В этой статье мы подробно разберем причины такого поведения платформы, выясним, почему "не заходит" в процедуры, и рассмотрим пошаговые методики устранения проблемы и настройки отладки серверного кода.
Самая распространенная причина, по которой разработчики считают, что "код не выполняется" — это неработающая отладка фоновых заданий. По умолчанию конфигуратор отлаживает только тот сеанс, который запущен непосредственно из него (клиентский сеанс). Фоновые задания выполняются в отдельных сеансах на сервере приложений 1С, и для их отладки требуются дополнительные настройки.
Проанализируем шаги, которые необходимо выполнить для подключения отладчика к фоновому процессу:
-debug (для протокола TCP) или без соответствующих настроек HTTP-отладки, точки останова на сервере в принципе работать не будут.rphost, или фоновое задание выполняется на другом сервере кластера, отладчик может физически не "поймать" нужный поток. В таких случаях рекомендуется использовать отладку по протоколу HTTP, которая работает стабильнее в распределенных системах.Если мы используем расширение конфигурации для доработки логики проведения или записи (например, через аннотации &После("ПередЗаписью")), критически важно проверить свойства этого расширения в режиме "1С:Предприятие".
По умолчанию при импорте или обновлении расширения платформа устанавливает для него флаг Безопасный режим. В безопасном режиме накладываются жесткие ограничения на выполнение программного кода:
&Перед, &После, &Вместо) для объектов, создаваемых в фоновых сеансах, запущенных от имени системных служб БСП.Решение: Перейдем в меню Администрирование -> Печатные формы, отчеты и обработки -> Расширения (или в аналогичный интерфейс управления расширениями вашей конфигурации), найдем наше расширение и обязательно снимем флажки "Безопасный режим" и "Защита от опасных действий".
При программном создании документов из обработок (в том числе из "Платежного календаря") разработчики типовых решений часто используют оптимизацию записи документов. Для этого взводится флаг загрузки данных, чтобы пропустить тяжелые транзакционные проверки и ускорить создание объектов.
Посмотрим на типичный пример инициализации объекта в коде ERP:
НовыйДокумент = Документы.СписаниеБезналичныхДенежныхСредств.СоздатьДокумент();
// Заполнение реквизитов...
НовыйДокумент.ОбменДанными.Загрузка = Истина;
НовыйДокумент.Записать(РежимЗаписиДокумента.Проведение);
Если этот флаг установлен в Истина, то в стандартных подписках на события и в самом начале модулей объектов типовых конфигураций (в обработчиках ПередЗаписью, ПриЗаписи) срабатывает условие отсечки:
Процедура ПередЗаписью(Отказ, РежимЗаписи, РежимПроведения)
Если ОбменДанными.Загрузка Тогда
Возврат;
КонецЕсли;
// Основная логика, до которой код не доходит при программном создании
КонецПроцедуры
Если ваш код в расширении привязан через &После("ПередЗаписью"), и оригинальный метод завершился досрочно по причине ОбменДанными.Загрузка = Истина, то ваша кастомная логика может выполниться некорректно или не выполниться вовсе, если она опирается на результаты расчетов из основного метода. Проанализируем этот момент в коде и при необходимости адаптируем алгоритм расширения под работу в режиме загрузки данных.
Чтобы гарантированно исключить проблемы с настройкой отладчика и проверить, выполняется ли ваш код на самом деле, откажемся на время от точек останова и воспользуемся записью в системный журнал. Это самый надежный способ экспресс-анализа.
Добавим в начало нашей процедуры в расширении следующий код:
&После("ПередЗаписью")
Процедура Мой_ПередЗаписьюПосле(Отказ, РежимЗаписи, РежимПроведения)
// Запишем информацию в Журнал регистрации
ТекстСообщения = СтрШаблон("Код расширения сработал! Режим записи: %1, Загрузка: %2",
РежимЗаписи,
ЭтотОбъект.ОбменДанными.Загрузка);
ЗаписьЖурналаРегистрации("ОтладкаФоновогоЗадания",
УровеньЖурналаРегистрации.Информация,
ЭтотОбъект.Метаданные(),
ЭтотОбъект.Ссылка,
ТекстСообщения);
КонецПроцедуры
Запустим процесс формирования документов из "Платежного календаря". После завершения операции перейдем в Журнал регистрации и установим отбор по событию "ОтладкаФоновогоЗадания". Если записи появились, значит, код вашего расширения физически выполняется платформой в фоновом задании, а проблема отсутствия реакции кроется исключительно в неотлаженном подключении конфигуратора к серверным процессам.
В современных конфигурациях, построенных на базе Библиотеки Стандартных Подсистем (БСП), длительные операции на сервере запускаются через специальный механизм фоновых заданий. Для упрощения жизни разработчиков в БСП заложен механизм синхронного выполнения фонового кода прямо в сеансе клиента.
Разберем, как активировать этот режим:
/C РежимОтладки.Благодаря этому приему точка останова, установленная в модуле объекта или расширении, гарантированно сработает без необходимости настройки сложных серверных подключений и поиска нужных процессов rphost.