Как выводить сообщения пользователю в процедуре ПередЗаписью, чтобы код работал на сервере и ТСД

Программист 1С v8.3 (Обычные формы) 1С:Управление торговлей Управленческий учет Торговля и дистрибуция
← На главную

При разработке в среде 1С:Предприятие программисты часто сталкиваются с ситуацией, когда код, написанный для работы в обычном интерфейсе, начинает вызывать критические ошибки при выполнении на сервере. Типичный пример — использование интерактивных функций, таких как Предупреждение, внутри модуля объекта (например, в обработчике ПередЗаписью). Это особенно актуально для конфигураций типа "Управление торговлей 10.3", где активно используется толстый клиент, но бизнес-процессы (например, сборка товара на терминалах сбора данных — ТСД) могут инициировать запись документа в серверном контексте.

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

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

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

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

Использование ОбщегоНазначения.СообщитьПользователю

Процедура ОбщегоНазначения.СообщитьПользователю является частью Библиотеки стандартных подсистем (БСП) или аналогичных общих модулей в типовых решениях. Рассмотрим подробнее, почему этот метод считается безопасным и универсальным:

  1. Механизм накопления сообщений: В отличие от Предупреждение, этот метод использует встроенный объект платформы СообщениеПользователю. Когда код выполняется на сервере, сообщения не выводятся мгновенно. Они помещаются в специальный буфер.
  2. Передача на клиент: После завершения серверного вызова и возврата управления на сторону клиента, платформа автоматически передает накопленные сообщения из буфера и отображает их в окне сообщений пользователя.
  3. Безопасность для ТСД: При работе через внешние соединения или фоновые задания (что часто используется в работе складов с ТСД) вызов СообщитьПользователю не прерывает выполнение программы. Сообщение либо фиксируется в журнале, либо игнорируется, если вызывающая сторона не настроена на чтение массива сообщений. Это позволяет избежать "падения" системы.

Пример использования данного метода в коде:


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

Применение инструкций препроцессора

Если вам все же необходимо использовать именно интерактивные методы (например, вы хотите гарантированно остановить внимание пользователя в толстом клиенте), следует использовать инструкции препроцессора. Это позволит системе "проигнорировать" кусок кода при выполнении на сервере.

Разберем, как это реализовать:


#Если Клиент Тогда
    Если Отказ Тогда
        Предупреждение("Внимание! Запись документа отменена по техническим причинам.");
    КонецЕсли;
#КонецЕсли

Как это работает: Весь код, заключенный между #Если Клиент и #КонецЕсли, физически не будет компилироваться для серверного контекста. Таким образом, при записи документа с ТСД сервер даже "не узнает" о существовании команды Предупреждение, и ошибка не возникнет.

Альтернативный метод: Вызов исключения

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

Проанализируем этот подход:


Если Не ДокументСоответствуетТребованиям Тогда
    ТекстОшибки = "Ошибка: недостаточно прав для записи документа в текущем статусе!";
    ВызватьИсключение ТекстОшибки;
КонецЕсли;

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

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

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

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

← На главную