При разработке механизмов оповещения в 1С:Управление нашей фирмой (УНФ) начинающие программисты часто сталкиваются с фундаментальными особенностями клиент-серверной архитектуры платформы «1С:Предприятие 8.3». Разберем типовую ситуацию: вы написали код для формирования уведомления о поступлении товара, но при попытке его запуска система выдает ошибку Переменная не определена, ссылаясь на имя вашего общего модуля.
В этой статье мы проанализируем причины возникновения этой ошибки, выясним, что такое мутабельные значения и как правильно организовать передачу данных между клиентом и сервером, чтобы ваш механизм уведомлений работал стабильно.
Первое, с чем мы сталкиваемся — это ошибка Переменная не определена (ОП_ОповещениеПользователейСервер). Проанализируем ситуацию: код выполняется на Тонком клиенте, а вызываемый модуль предназначен для работы на сервере. Для того чтобы клиентское приложение «увидело» серверный модуль, недостаточно просто создать его в дереве конфигурации.
Разберем по шагам, какие свойства должны быть установлены у общего модуля ОП_ОповещениеПользователейСервер:
Важно: для клиентского модуля ОП_ОповещениеПользователейКлиент, наоборот, должны быть установлены флаги Тонкий клиент и Клиент (управляемое приложение), но флаг Сервер там обычно не требуется.
Как только мы включим «Вызов сервера», мы можем столкнуться со следующей преградой: Попытка передачи с клиента на сервер мутабельного значения. Выясним причину этого явления.
В 1С объекты делятся на мутабельные (изменяемые) и немутабельные. К мутабельным относятся:
МассивСтруктураТаблицаЗначенийСоответствиеДокументОбъект.ПриходнаяНакладная)Рассмотрим пример кода автора, который вызывает ошибку:
// В клиентском модуле
Процедура ОП_ОповещениеПользователейКлиент Экспорт
ДокументСобытие = Новый Массив; // Мутабельный тип!
// ... заполнение массива ...
ОП_ОповещениеПользователейСервер.СформироватьСообщение(ТекстСообщения, ДокументСобытие, Пользователь);
КонецПроцедуры
Проблема заключается в том, что при передаче Массива или Структуры с клиента на сервер (и обратно) система должна выполнить глубокое копирование объекта. Если объект содержит ссылки на контекст формы или другие сложные данные, платформа блокирует передачу из соображений производительности и стабильности.
Как правильно передавать данные:
ДокументСсылка). Ссылки немутабельны и легко передаются.Посмотрим на задачу шире. Уведомление о поступлении товара — это событие, которое происходит в момент проведения документа ПриходнаяНакладная. Реализовывать это чисто в клиентском модуле — не самое удачное решение, так как менеджер может не проводить документ вручную (например, документ загружен через обмен или API).
Проанализируем более надежный подход с использованием Подписки на события:
ДокументОбъект.ПриходнаяНакладная.ОбработкаПроведения.В этом случае код будет выглядеть примерно так:
Процедура ОП_ПодпискаНаПоступлениеПриПроведении(Источник, Отказ, РежимПроведения) Экспорт
// Источник - это сам документ ПриходнаяНакладная
ОтветственныйМенеджер = Источник.Ответственный;
ТекстУведомления = "Поступил товар по документу " + Строка(Источник.Ссылка);
// Используем встроенную в УНФ систему взаимодействия или задачи
// В данном примере - запись в регистр для последующего отображения
ЗаписатьОповещениеВРегистр(ОтветственныйМенеджер, ТекстУведомления, Источник.Ссылка);
КонецПроцедуры
Вместо модальных окон ПоказатьВопрос, которые прерывают работу пользователя, в современных версиях 1С (включая УНФ) рекомендуется использовать Систему взаимодействия. Это встроенный мессенджер, который позволяет программно отправлять сообщения конкретным пользователям.
Рассмотрим пример отправки сообщения менеджеру:
// Серверный код
СистемаВзаимодействия.СоздатьСообщение(ОбсуждениеСсылка); // Нужно предварительно создать или найти обсуждение
Сообщение.Текст = "Внимание! Поступил товар по вашему заказу.";
Сообщение.Записать();
Такое уведомление появится у менеджера в виде всплывающего сообщения в нижнем углу экрана или в списке обсуждений, не блокируя работу программы. Это значительно удобнее и соответствует современным стандартам разработки на платформе 1С.
Чтобы ваша задача была решена успешно, выполните следующие действия: