Почему падает веб-сервис 1С при обращении к общему модулю в режиме совместимости?

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

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

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

Причина ошибки: несовместимость синтаксиса и отказ динамической компиляции

Проанализируем контекст выполнения веб-сервисов. Веб-сервисы в 1С работают исключительно в серверном контексте. При первом обращении к любому общему модулю из веб-сервиса платформа выполняет его динамическую компиляцию на сервере.

Если конфигурация работает с установленным свойством Режим совместимости (например, Версия 8.2.16 или Версия 8.2.13), платформа строго проверяет синтаксис компилируемого модуля на соответствие правилам выбранной версии. Если в коде вызываемого общего модуля присутствуют функции, методы или синтаксические конструкции, появившиеся только в более поздних версиях платформы 1С 8.3, происходит критический сбой компиляции модуля.

Поскольку модуль не может скомпилироваться, он не инициализируется. Выполнение веб-сервиса аварийно прерывается веб-расширением до передачи управления внутрь процедуры, из-за чего стандартная конструкция Попытка ... Исключение внутри вызываемого метода веб-сервиса не успевает перехватить ошибку.

Посмотрим на пример конструкций, которые приводят к ошибке в режиме совместимости 8.2.16:


// Данный код вызовет ошибку компиляции в режиме совместимости 8.2:
Позиция = СтрНайти(СтрокаПоиска, "Подстрока");
МассивЧастей = СтрРазделить(ИсходнаяСтрока, ";");
ИтоговаяСтрока = СтрШаблон("Значение: %1", Параметр);

В режиме совместимости с платформой 8.2 такие функции встроенного языка, как СтрНайти(), СтрРазделить(), СтрСоединить(), СтрШаблон(), СтрНачинаетсяС(), СтрЗаканчиваетсяНа(), не поддерживаются компилятором.

Способы исправления кода для режима совместимости

Для восстановления работоспособности веб-сервиса заменим вызовы новых строковых функций на конструкции, поддерживаемые версией 8.2:

  1. Замена поиска подстроки: вместо СтрНайти() используем базовую функцию Найти().
  2. Замена форматирования: вместо СтрШаблон() используем функцию СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку() или классическую конкатенацию строк.
  3. Замена разделения строк: для разбиения строки на части используем классический цикл с функцией Найти() и Сред() либо функции БСП.

Рассмотрим пример корректного поиска подстроки в режиме совместимости:


// Корректный вызов для режима совместимости 8.2.16
Позиция = Найти(СтрокаПоиска, "Подстрока");
Если Позиция > 0 Тогда
    // Обработка найденного фрагмента
КонецЕсли;

Проверка свойств общих модулей для веб-сервисов

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

  1. Флаг Сервер должен быть обязательно установлен.
  2. Флаг Внешнее соединение рекомендуется включать, если к модулю планируется обращение через COM-соединение.
  3. Флаг Вызов сервера для обращения из веб-сервиса не требуется, так как вызов уже происходит на стороне сервера, однако его отсутствие не должно блокировать серверные вызовы.

Методы диагностики скрытых ошибок в веб-сервисах

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

  1. Запуск синтаксического контроля конфигуратора: перейдем в главное меню: Конфигурация — Проверка конфигурации. В окне настроек обязательно включим флаг Синтаксический контроль модулей и выберем все режимы (включая сервер и внешнее соединение). Конфигуратор найдет все несовместимые с текущим режимом совместимости функции.
  2. Включение серверной отладки: убедимся, что служба сервера 1С:Предприятия запущена с ключом -debug (или включена отладка по протоколу HTTP), а в меню Отладка — Подключение включен перехват фоновых заданий и веб-сервисов.
  3. Использование технологического журнала (ТЖ): настроим сбор событий EXCP и EXCPCNTX в конфигурационном файле logcfg.xml. При падении веб-сервиса технологический журнал зафиксирует точный стек исключения и причину отказа компиляции модуля с указанием номера строки.
← На главную