Почему завершается сеанс 1С при создании документа через Веб-сервис?

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

Работа с веб-сервисами в системе 1С:Предприятие требует особого внимания к контексту исполнения кода. Часто разработчики сталкиваются с ситуацией, когда при вызове метода СоздатьДокумент() через внешнее соединение или веб-сервис сеанс просто «вылетает» без каких-либо явных ошибок в Журнале регистрации. В этой статье мы подробно разберем, почему это происходит, как диагностировать проблему и как правильно писать код модулей объектов, чтобы они корректно работали в разных режимах.

Суть проблемы: почему 1С «молчит» при падении

Рассмотрим типичную ситуацию: веб-сервис успешно создает документ РеализацияТоваровУслуг, но при попытке создать ПеремещениеТоваров соединение обрывается. Отладка показывает, что выполнение останавливается ровно на строке Документы.ПеремещениеТоваров.СоздатьДокумент(). При этом система не заходит внутрь модуля объекта, не выдает исключение в блоке Попытка...Исключение и не записывает ошибку в ЖР.

Выясним причину: в момент вызова СоздатьДокумент() сервер 1С выполняет компиляцию всего модуля объекта. Если в модуле содержится синтаксическая ошибка или обращение к методу, недоступному на сервере (например, Вопрос() или Предупреждение()), и этот вызов не обернут в инструкции препроцессора, сервер не может скомпилировать контекст объекта. В режиме веб-сервиса это часто приводит к аварийному завершению рабочего процесса rphost или обрыву соединения IIS, что внешне выглядит как «тихое» падение.

Шаг 1: Диагностика через замер производительности

Если обычный отладчик не позволяет зайти внутрь метода СоздатьДокумент(), проанализируем ситуацию с помощью замера производительности. Это поможет понять, выполнялся ли какой-то код внутри модуля или система «упала» на этапе инициализации.

  1. Установим точку останова непосредственно перед вызовом проблемного метода.
  2. Включим «Замер производительности» в меню «Отладка».
  3. Нажмем F5 (Продолжить).
  4. После того как сеанс завершится или отвалится по таймауту, изучим результаты замера.

Если в замере мы видим, что 99% времени потрачено на строку создания объекта и нет ни одного захода в процедуры модуля (такие как ПередЗаписью или ПриУстановкеНовогоНомера), значит, проблема именно в компиляции модуля.

Шаг 2: Проверка интерактивных функций в модуле объекта

Разберем основной источник бед в типовых и старых самописных конфигурациях (например, УПП). В модулях объектов часто встречаются вызовы клиентских методов, которые должны срабатывать только при работе пользователя в интерфейсе. Рассмотрим пример опасного кода в модуле объекта:


Процедура ПроверитьЗаполнениеДанных()
    Если Не ЗначениеЗаполнено(Склад) Тогда
        ТекстВопроса = "Склад не заполнен. Продолжить?";
        Ответ = Вопрос(ТекстВопроса, РежимДиалогаВопрос.ДаНет); // ОШИБКА: метод недоступен на сервере
        Если Ответ = КодВозвратаДиалога.Нет Тогда
            Отказ = Истина;
        КонецЕсли;
    КонецЕсли;
КонецПроцедуры

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

Шаг 3: Правильное использование препроцессора

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


#Если Клиент Тогда
    // Этот код будет скомпилирован только на стороне клиента
    ТекстВопроса = "Вы уверены, что хотите провести документ?";
    Если Вопрос(ТекстВопроса, РежимДиалогаВопрос.ДаНет) = КодВозвратаДиалога.Нет Тогда
        Возврат;
    КонецЕсли;
#КонецЕсли

Важный нюанс: если вы вызываете свою функцию из модуля объекта, которая содержит интерактивные элементы, она также должна быть защищена. Например, если у вас есть функция СообщитьПользователюОбОшибке(), проверьте ее содержимое. Даже если вы не планируете вызывать эту функцию через веб-сервис, само ее наличие в модуле без препроцессора «сломает» создание объекта.

Шаг 4: Автоматическая проверка конфигурации

Чтобы не искать такие ошибки вручную по всем модулям, воспользуемся встроенным инструментом 1С. Рассмотрим алгоритм проверки:

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

Система выдаст список всех мест, где используются недопустимые методы в серверном контексте. Проанализируем этот список и добавим #Если Клиент Тогда там, где это необходимо.

Почему не помогло ОбменДанными.Загрузка = Истина?

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

Дополнительные рекомендации для стабильности Web-сервисов

Для предотвращения подобных проблем в будущем, рекомендуем придерживаться следующих правил при проектировании системы:

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

← На главную