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

Программист 1C:Бухгалтерия IT и автоматизация бизнеса
← На главную

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

Анализ проблемы: «молчаливое» зависание

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


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

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

Причина №1: Интерактивные методы в неинтерактивном режиме

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

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

Решение проблемы с помощью инструкций препроцессора

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

Рассмотрим правильный вариант написания кода в модуле объекта:


#Если Клиент Тогда
    Сообщить("Документ успешно инициализирован в интерфейсе");
#КонецЕсли

// Или с использованием проверки на внешнее соединение и сервер
Если НЕ ПредприятиеКлиент Тогда
    // Здесь код, который выполняется только на сервере или в веб-сервисе
Иначе
    Предупреждение("Внимание, проверьте данные!");
КонецЕсли;

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

Причина №2: Особенности события «ОбработкаЗаполнения»

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

Важный совет: всегда разделяйте логику формирования данных и логику их визуального представления. В ОбработкаЗаполнения должна находиться только работа с реквизитами документа.

Причина №3: Параметры сеанса и права доступа

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

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

Как правильно отлаживать такие ситуации

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

  1. Проверка Журнала регистрации: Это первое место, куда нужно заглянуть. Ищите записи с уровнем «Ошибка» и текстом «Использование интерактивных методов в неинтерактивном режиме».
  2. Настройка отладки веб-сервисов: Убедитесь, что на сервере 1С включен режим отладки (параметр -debug). В конфигураторе в меню «Отладка — Подключения» проверьте, что установлены флажки «Веб-сервисы» и «Фоновые задания».
  3. Остановка по ошибке: В меню «Отладка — Настройка остановки по ошибке» установите флажок «Останавливаться по всем ошибкам». Это позволит поймать исключение внутри модуля объекта до того, как сеанс веб-сервиса будет прерван.
  4. Анализ динамических обновлений: Помните, что «динамическое обновление» (F7 при работающих пользователях) часто приводит к тому, что веб-сервис продолжает использовать старую версию кода из кэша. Если вы добавили #Если Клиент, но ничего не изменилось — очистите серверный кэш или перезапустите службу 1С / веб-сервер (IIS/Apache).

Итоги и рекомендации

Мы выяснили, что основной причиной «зависания» веб-сервиса при создании документа является нарушение принципа разделения серверной логики и интерфейсных функций. Для обеспечения стабильной работы ваших интеграций придерживайтесь следующих правил:

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

← На главную