При разработке и сопровождении конфигураций 1С разработчики нередко сталкиваются с ситуацией, когда программное создание документа без проблем отрабатывает в интерактивном сеансе пользователя, но аварийно завершается при запуске через регламентное или фоновое задание. В журнале регистрации или в консоли заданий при этом фиксируется исключение «Ошибка инициализации модуля: Документ.[ИмяДокумента].МодульОбъекта», а попытка пошаговой отладки строки создания объекта приводит к зависанию конфигуратора. Разберем по шагам причины такого поведения платформы, методы диагностики и способы корректного исправления ошибки.
Проанализируем механику работы платформы при выполнении инструкций создания нового объекта данных. Когда выполняется программный вызов:
Док = Документы.ЗаказНаПроизводство.СоздатьДокумент();
Платформа 1С:Предприятие выполняет полную компиляцию модуля объекта в текущем контексте исполнения. Контекст исполнения регламентных и фоновых заданий — это исключительно серверный контекст (рабочий процесс кластера серверов rphost или режим внешнего соединения). На сервере отсутствует графический интерфейс пользователя и недоступны любые интерактивные методы платформы, такие как Предупреждение, Вопрос, ОткрытьФорму, Состояние или ВвестиЗначение.
Если в теле модуля объекта (в любых его процедурах, включая ОбработкаПроведения, ПередЗаписью, ОбработкаЗаполнения) присутствует вызов диалогового метода без экранирования директивами препроцессора, компилятор платформы на сервере не может разрешить идентификатор функции. В результате компиляция прерывается критической ошибкой инициализации модуля еще до того, как начнет выполняться какой-либо прикладной код.
Рассмотрим причину зависания отладчика: при пошаговой отладке фонового потока аварийное завершение процесса компиляции на стороне сервера 1С приводит к резкому разрыву сессии фонового задания. Конфигуратор не успевает получить корректный стек вызовов и зависает в ожидании ответа от отладочного сокета.
Поскольку при обычном синтаксическом контроле модуля в конфигураторе проверка выполняется для клиентского контекста толстого или тонкого клиента, ошибок не обнаруживается. Чтобы выявить скрытые синтаксические несовместимости, настроим сплошную проверку модулей.
Выполним следующие шаги:
В результате проверки конфигуратор укажет точное место и строку с ошибкой вида «Процедура или функция с указанным именем не определена (Предупреждение)».
Рассмотрим варианты исправления ситуации в зависимости от решаемой архитектурной задачи.
Если в коде модуля объекта по историческим причинам остался интерактивный вызов, который требуется показывать только в толстом клиенте обычного приложения, обернем его в директиву препроцессора:
#Если Клиент Тогда
Предупреждение("Обнаружено расхождение в данных спецификации!");
#КонецЕсли
После добавления директивы серверный компилятор пропустит данный блок при инициализации объекта в фоновом задании, и документ ЗаказНаПроизводство успешно создастся.
Использование интерактивных диалогов непосредственно в модулях объектов считается грубым нарушением стандартов разработки 1С. Если алгоритм проведения требует внимания пользователя или информирования о сбое, правильнее следовать следующей схеме:
Процедура ОбработкаПроведения(Отказ, РежимПроведения)
// Пример проверки условия
Если Не ПроверитьЗаполнениеДанных() Тогда
Отказ = Истина;
Сообщить("Не удалось провести документ: проверьте заполнение реквизитов.");
Возврат;
КонецЕсли;
КонецПроцедуры
ЗаписьЖурналаРегистрации(). Это позволяет администраторам анализировать выполнение задач без прерывания серверных потоков.Чтобы в дальнейшем комфортно локализовать подобные ошибки при работе регламентных заданий, убедимся в корректности настроек отладки на сервере:
-debug (или включен протокол отладки по HTTP).Попытка ... Исключение, скрывающие реальный текст системной ошибки из журнала регистрации.