Как исправить ошибку «Переменная не определена» и реализовать уведомления менеджерам в 1С:УНФ

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

При разработке механизмов оповещения в 1С:Управление нашей фирмой (УНФ) начинающие программисты часто сталкиваются с фундаментальными особенностями клиент-серверной архитектуры платформы «1С:Предприятие 8.3». Разберем типовую ситуацию: вы написали код для формирования уведомления о поступлении товара, но при попытке его запуска система выдает ошибку Переменная не определена, ссылаясь на имя вашего общего модуля.

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

Причина 1: Настройка области видимости общего модуля

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

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

  1. Откройте свойства общего модуля в конфигураторе.
  2. Убедитесь, что установлен флаг Сервер. Это позволяет коду модуля выполняться на стороне сервера.
  3. Установите флаг Вызов сервера. Именно этот флаг делает экспортные процедуры и функции модуля доступными для вызова из клиентского контекста (Тонкий клиент, Веб-клиент).

Важно: для клиентского модуля ОП_ОповещениеПользователейКлиент, наоборот, должны быть установлены флаги Тонкий клиент и Клиент (управляемое приложение), но флаг Сервер там обычно не требуется.

Причина 2: Передача мутабельных значений через границу клиента и сервера

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

В 1С объекты делятся на мутабельные (изменяемые) и немутабельные. К мутабельным относятся:

Рассмотрим пример кода автора, который вызывает ошибку:


// В клиентском модуле
Процедура ОП_ОповещениеПользователейКлиент Экспорт
    ДокументСобытие = Новый Массив; // Мутабельный тип!
    // ... заполнение массива ...
    ОП_ОповещениеПользователейСервер.СформироватьСообщение(ТекстСообщения, ДокументСобытие, Пользователь); 
КонецПроцедуры

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

Как правильно передавать данные:

  1. Вместо передачи объектов (ДокументОбъект) передавайте Ссылки (ДокументСсылка). Ссылки немутабельны и легко передаются.
  2. Если необходимо передать коллекцию данных, преобразуйте ее в простую Строку (например, используя формат JSON) или передавайте значения по отдельности, если их немного.
  3. Для простых структур данных можно использовать фиксированные массивы и фиксированные структуры, но чаще всего достаточно просто оптимизировать состав параметров.

Правильная архитектура уведомлений в 1С:УНФ

Посмотрим на задачу шире. Уведомление о поступлении товара — это событие, которое происходит в момент проведения документа ПриходнаяНакладная. Реализовывать это чисто в клиентском модуле — не самое удачное решение, так как менеджер может не проводить документ вручную (например, документ загружен через обмен или API).

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

  1. Создайте новый объект Подписка на событие.
  2. Источник: ДокументОбъект.ПриходнаяНакладная.
  3. Событие: ОбработкаПроведения.
  4. Обработчик: процедура в серверном общем модуле.

В этом случае код будет выглядеть примерно так:


Процедура ОП_ПодпискаНаПоступлениеПриПроведении(Источник, Отказ, РежимПроведения) Экспорт
    
    // Источник - это сам документ ПриходнаяНакладная
    ОтветственныйМенеджер = Источник.Ответственный;
    ТекстУведомления = "Поступил товар по документу " + Строка(Источник.Ссылка);
    
    // Используем встроенную в УНФ систему взаимодействия или задачи
    // В данном примере - запись в регистр для последующего отображения
    ЗаписатьОповещениеВРегистр(ОтветственныйМенеджер, ТекстУведомления, Источник.Ссылка);
    
КонецПроцедуры

Использование Системы взаимодействия для мгновенных оповещений

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

Рассмотрим пример отправки сообщения менеджеру:


// Серверный код
СистемаВзаимодействия.СоздатьСообщение(ОбсуждениеСсылка); // Нужно предварительно создать или найти обсуждение
Сообщение.Текст = "Внимание! Поступил товар по вашему заказу.";
Сообщение.Записать();

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

Резюме решения

Чтобы ваша задача была решена успешно, выполните следующие действия:

← На главную