Почему веб-сервис 1С аварийно закрывает соединение при попытке создать элемент справочника?

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

При разработке интеграционных механизмов на базе веб-сервисов (WS) или HTTP-сервисов в 1С разработчики нередко сталкиваются с ситуацией, когда выполнение алгоритма внезапно прерывается на простых операциях. Типичный сценарий: клиент отправляет данные, сервер начинает обработку, но на строке Справочники.Материалы.СоздатьЭлемент() происходит мгновенный разрыв WS-соединения. При этом блок Попытка ... Исключение не срабатывает, в журнал регистрации не записывается ошибка выполнения, а попытка вычислить выражение в отладчике приводит к зависанию конфигуратора. Разберем подробно, почему возникает такое поведение платформы и как правильно локализовать и устранить неисправность.

Анализ механизма компиляции модулей и причин сбоя

Для понимания природы проблемы проанализируем, как платформа 1С:Предприятие исполняет программный код в неинтерактивных сеансах (веб-сервисы, HTTP-сервисы, COM-соединения, фоновые задания):

  1. Разделение ошибок компиляции и времени выполнения: Конструкция Попытка ... Исключение перехватывает исключительно исключения времени выполнения (runtime exceptions). Если же в модуле присутствует синтаксическая ошибка или вызов метода, недоступного в текущем контексте (например, клиентской функции), ошибка происходит на этапе предварительной компиляции модуля платформой. В неинтерактивном сеансе ошибка сборки модуля приводит к аварийному завершению потока и закрытию сессии.
  2. Момент инициализации объекта данных: При вызове конструктора СоздатьЭлемент() или СоздатьГруппу() платформа выполняет инициализацию объекта в памяти. В этот момент происходит обязательная компиляция модуля объекта, модуля менеджера справочника, а также модулей обработчиков подписок на события. Если хотя бы в одной процедуре модуля объекта содержится синтаксическая некорректность для сервера/внешнего соединения, модуль не может быть скомпилирован, даже если сам исполняемый алгоритм в эту процедуру не заходит.
  3. Недопустимые клиентские методы: Использование в модулях объектов таких методов, как Состояние(), Предупреждение(), Вопрос() или обращение к глобальным переменным интерактивного контекста, корректно работает в режиме толстого или тонкого клиента, но делает модуль невалидным при вызове из веб-сервиса.

Пошаговая диагностика и поиск проблемного кода

Разберем по шагам, как выявить модуль, вызывающий падение соединения веб-сервиса:

  1. Запуск синтаксической проверки конфигурации: Откроем конфигуратор и перейдем в главное меню: Конфигурация — Проверка конфигурации. В появившемся окне обязательно отметим флаги «Синтаксический контроль модулей», а также режимы проверки: «Сервер», «Внешнее соединение» и «Модули объектов». Это позволит мгновенно обнаружить строки с вызовами интерфейсных функций.
  2. Настройка локальной проверки модуля: Для проверки конкретного проблемного модуля перейдем в меню: Сервис — Параметры — Модули — Проверка и установим флаги для внешнего соединения и сервера. Затем откроем модуль объекта справочника и нажмем сочетание клавиш Ctrl + F7.
  3. Анализ подписок на события: Проверим все подписки на события, привязанные к источнику СправочникОбъект. Модули обработчиков подписок должны иметь установленный флаг «Сервер» или «Вызов сервера», а также не содержать прямого обращения к элементам пользовательского интерфейса.
  4. Анализ Технологического журнала: Если место падения не очевидно, настроим сбор событий EXCP, EXCPCNTX и CALL в файле logcfg.xml. Это позволит увидеть точный стек вызовов и причину завершения рабочего процесса сеанса.

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

Рассмотрим варианты исправления ситуации в зависимости от архитектуры конфигурации.

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

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


Процедура ПриУстановкеНовогоКода(СтандартнаяОбработка, Префикс)
    
    #Если Клиент Тогда
        Состояние("Выполняется установка нового кода элемента...");
    #КонецЕсли
    
    // Основная логика формирования кода
    Префикс = "МАТ-";
    
КонецПроцедуры

В неинтерактивном сеансе веб-сервиса код внутри блока #Если Клиент будет полностью проигнорирован препроцессором, и модуль успешно скомпилируется сервером 1С.

Вариант 2. Корректная обработка создания элементов через модули менеджеров и сервисов

При проектировании сервисов интеграции рекомендуется разделять интерактивный интерфейсный код и серверную бизнес-логику. Посмотрим на пример корректной реализации создания элемента внутри веб-сервиса:


Функция СоздатьНовыйМатериал(НаименованиеМатериала, Артикул) Экспорт

    УстановитьПривилегированныйРежим(Истина);
    
    Попытка
        НовыйОбъект = Справочники.Материалы.СоздатьЭлемент();
        НовыйОбъект.Наименование = НаименованиеМатериала;
        НовыйОбъект.Артикул = Артикул;
        
        // Запись объекта с отключением стандартных интерактивных проверок при необходимости
        НовыйОбъект.Записать();
        
        Возврат НовыйОбъект.Ссылка;
    Исключение
        ИнформацияОбОшибке = ОписаниеОшибки();
        ЗаписьЖурналаРегистрации("Интеграция.WS", УровеньЖурналаРегистрации.Ошибка,,, ИнформацияОбОшибке);
        ВызватьИсключение "Ошибка при создании элемента: " + ИнформацияОбОшибке;
    КонецПопытки;

КонецФункции

Таким образом, главная причина внезапного закрытия веб-сервисного соединения без генерации стандартного исключения кроется в ошибках компиляции контекста модулей. Регулярная проверка конфигурации в режимах «Сервер» и «Внешнее соединение» позволяет предотвратить подобные сбои на этапе разработки.

← На главную