При разработке и публикации веб-сервисов в среде 1С:Предприятие разработчики нередко сталкиваются с ситуацией: подключение к веб-сервису проходит успешно, однако при попытке вызвать функцию веб-сервиса, обращающуюся к процедурам или функциям общих модулей, выполнение мгновенно прерывается. При этом в Журнале регистрации не фиксируется никаких записей об ошибке, а в отладчике выполнение останавливается на строке вызова общего модуля без захода внутрь.
Разберем детально механизм возникновения этой проблемы, выясним причину такого поведения платформы и рассмотрим способы ее устранения и предотвращения.
Проанализируем контекст выполнения веб-сервисов. Веб-сервисы в 1С работают исключительно в серверном контексте. При первом обращении к любому общему модулю из веб-сервиса платформа выполняет его динамическую компиляцию на сервере.
Если конфигурация работает с установленным свойством Режим совместимости (например, Версия 8.2.16 или Версия 8.2.13), платформа строго проверяет синтаксис компилируемого модуля на соответствие правилам выбранной версии. Если в коде вызываемого общего модуля присутствуют функции, методы или синтаксические конструкции, появившиеся только в более поздних версиях платформы 1С 8.3, происходит критический сбой компиляции модуля.
Поскольку модуль не может скомпилироваться, он не инициализируется. Выполнение веб-сервиса аварийно прерывается веб-расширением до передачи управления внутрь процедуры, из-за чего стандартная конструкция Попытка ... Исключение внутри вызываемого метода веб-сервиса не успевает перехватить ошибку.
Посмотрим на пример конструкций, которые приводят к ошибке в режиме совместимости 8.2.16:
// Данный код вызовет ошибку компиляции в режиме совместимости 8.2:
Позиция = СтрНайти(СтрокаПоиска, "Подстрока");
МассивЧастей = СтрРазделить(ИсходнаяСтрока, ";");
ИтоговаяСтрока = СтрШаблон("Значение: %1", Параметр);
В режиме совместимости с платформой 8.2 такие функции встроенного языка, как СтрНайти(), СтрРазделить(), СтрСоединить(), СтрШаблон(), СтрНачинаетсяС(), СтрЗаканчиваетсяНа(), не поддерживаются компилятором.
Для восстановления работоспособности веб-сервиса заменим вызовы новых строковых функций на конструкции, поддерживаемые версией 8.2:
СтрНайти() используем базовую функцию Найти().СтрШаблон() используем функцию СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку() или классическую конкатенацию строк.Найти() и Сред() либо функции БСП.Рассмотрим пример корректного поиска подстроки в режиме совместимости:
// Корректный вызов для режима совместимости 8.2.16
Позиция = Найти(СтрокаПоиска, "Подстрока");
Если Позиция > 0 Тогда
// Обработка найденного фрагмента
КонецЕсли;
Проверим настройки общего модуля, к которому обращается веб-сервис. Так как веб-сервис выполняется в фоновом серверном потоке, общий модуль должен иметь соответствующие флаги компиляции:
Если веб-сервис прерывает работу без понятных сообщений, применим следующие шаги для локализации проблемы:
Конфигурация — Проверка конфигурации. В окне настроек обязательно включим флаг Синтаксический контроль модулей и выберем все режимы (включая сервер и внешнее соединение). Конфигуратор найдет все несовместимые с текущим режимом совместимости функции.-debug (или включена отладка по протоколу HTTP), а в меню Отладка — Подключение включен перехват фоновых заданий и веб-сервисов.EXCP и EXCPCNTX в конфигурационном файле logcfg.xml. При падении веб-сервиса технологический журнал зафиксирует точный стек исключения и причину отказа компиляции модуля с указанием номера строки.