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

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

При разработке и сопровождении конфигураций 1С разработчики нередко сталкиваются с ситуацией, когда программное создание документа без проблем отрабатывает в интерактивном сеансе пользователя, но аварийно завершается при запуске через регламентное или фоновое задание. В журнале регистрации или в консоли заданий при этом фиксируется исключение «Ошибка инициализации модуля: Документ.[ИмяДокумента].МодульОбъекта», а попытка пошаговой отладки строки создания объекта приводит к зависанию конфигуратора. Разберем по шагам причины такого поведения платформы, методы диагностики и способы корректного исправления ошибки.

Причины возникновения ошибки инициализации модуля

Проанализируем механику работы платформы при выполнении инструкций создания нового объекта данных. Когда выполняется программный вызов:

Док = Документы.ЗаказНаПроизводство.СоздатьДокумент();

Платформа 1С:Предприятие выполняет полную компиляцию модуля объекта в текущем контексте исполнения. Контекст исполнения регламентных и фоновых заданий — это исключительно серверный контекст (рабочий процесс кластера серверов rphost или режим внешнего соединения). На сервере отсутствует графический интерфейс пользователя и недоступны любые интерактивные методы платформы, такие как Предупреждение, Вопрос, ОткрытьФорму, Состояние или ВвестиЗначение.

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

Рассмотрим причину зависания отладчика: при пошаговой отладке фонового потока аварийное завершение процесса компиляции на стороне сервера 1С приводит к резкому разрыву сессии фонового задания. Конфигуратор не успевает получить корректный стек вызовов и зависает в ожидании ответа от отладочного сокета.

Диагностика проблемы с помощью проверки конфигурации

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

Выполним следующие шаги:

  1. В главном меню конфигуратора откроем пункт «Конфигурация» — «Проверка конфигурации...» (либо перейдем в меню «Сервис» — «Параметры» — «Модули» — «Проверка» для быстрой проверки текущего открытого окна).
  2. В окне настроек проверки обязательно установим флаги:
    1. Сервер;
    2. Внешнее соединение;
    3. Модули объектов;
    4. Поиск некорректных директив препроцессора.
  3. Нажмем кнопку «Выполнить» и дождемся формирования отчета об ошибках.

В результате проверки конфигуратор укажет точное место и строку с ошибкой вида «Процедура или функция с указанным именем не определена (Предупреждение)».

Способы устранения ошибки

Рассмотрим варианты исправления ситуации в зависимости от решаемой архитектурной задачи.

Вариант 1. Изоляция клиентского кода директивами препроцессора

Если в коде модуля объекта по историческим причинам остался интерактивный вызов, который требуется показывать только в толстом клиенте обычного приложения, обернем его в директиву препроцессора:


#Если Клиент Тогда
    Предупреждение("Обнаружено расхождение в данных спецификации!");
#КонецЕсли

После добавления директивы серверный компилятор пропустит данный блок при инициализации объекта в фоновом задании, и документ ЗаказНаПроизводство успешно создастся.

Вариант 2. Архитектурно правильный перенос логики (Стандарты разработки 1С)

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

  1. Интерактивные диалоги и вопросы переносим исключительно в модуль формы документа (в клиентские обработчики команд и событий перед записью).
  2. Ошибки бизнес-логики при проведении обрабатываем через установку признака отказа и вывод сообщений:
    
    Процедура ОбработкаПроведения(Отказ, РежимПроведения)
        
        // Пример проверки условия
        Если Не ПроверитьЗаполнениеДанных() Тогда
            Отказ = Истина;
            Сообщить("Не удалось провести документ: проверьте заполнение реквизитов.");
            Возврат;
        КонецЕсли;
        
    КонецПроцедуры
    
  3. Фиксация результатов в фоновых заданиях: при выполнении регламентных процедур все критические ситуации и результаты обработки необходимо записывать в системный журнал с помощью метода ЗаписьЖурналаРегистрации(). Это позволяет администраторам анализировать выполнение задач без прерывания серверных потоков.

Рекомендации по настройке отладки фоновых заданий

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

  1. Служба кластера серверов 1С:Предприятия должна быть запущена с флагом отладки -debug (или включен протокол отладки по HTTP).
  2. В конфигураторе в меню «Отладка» — «Подключение...» нажмем кнопку «Настройка» и включим флаг «Автоматическое подключение: Фоновые задания».
  3. Не оборачиваем инициализацию и создание критически важных объектов в пустые блоки Попытка ... Исключение, скрывающие реальный текст системной ошибки из журнала регистрации.
← На главную