Как программно изменить картинку подсистемы в 1С для уведомления пользователя?

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

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

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

Почему нельзя изменить иконку подсистемы «на лету»?

Основная причина заключается в архитектуре платформы 1С. Командный интерфейс, включая панели разделов и подсистемы с их картинками, является статичной структурой. Разберем этот момент подробнее:

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

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

Альтернативные и правильные способы уведомления пользователей

Хотя исходная идея невыполнима, сама бизнес-задача — уведомить пользователя об изменениях — абсолютно стандартна и решается несколькими проверенными способами. Выбор конкретного способа зависит от того, какая реакция требуется от пользователя.

1. Условное оформление в динамических списках

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

Разберем по шагам:

  1. Добавляем реквизит. В нужный объект (например, документ «Заказ клиента») добавьте новый реквизит. Это может быть булево поле, например, ТребуетВнимания, или реквизит-перечисление СтатусОбработки (со значениями «Новый», «В работе», «Проверен»).
  2. Устанавливаем флаг. В модуле объекта, в обработчике события ПриЗаписи или ПередЗаписью, пропишите логику установки этого флага. Например, если изменилась сумма документа, устанавливаем ЭтотОбъект.ТребуетВнимания = Истина;.
  3. Настраиваем условное оформление. Откройте форму списка этого документа. В дереве элементов формы найдите динамический список, откройте его свойства и перейдите на вкладку «Условное оформление».
  4. Создаем правило. Добавьте новый элемент оформления.
    • Оформление: Укажите, что нужно изменить. Например, задайте цвет фона (ярко-желтый) или цвет текста (красный).
    • Условие: Задайте условие, при котором будет срабатывать оформление. Например: Документ.ТребуетВнимания = Истина.
    • Оформляемые поля: Укажите, к каким колонкам применять оформление (или оставьте пустым, чтобы применить ко всей строке).
  5. Снимаем флаг. Продумайте логику, когда флаг должен сниматься. Например, при открытии формы документа пользователем, который должен на него отреагировать, можно в обработчике ПриОткрытии установить Объект.ТребуетВнимания = Ложь; и записать документ.

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

2. Задачи и бизнес-процессы

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

Как это работает:

При записи измененного документа программно создается объект Задача. В этой задаче указывается:

Новая задача появляется у исполнителя на начальной странице в списке «Мои задачи». Этот механизм позволяет не только уведомить, но и проконтролировать исполнение, так как у задачи есть статусы (не начата, в работе, выполнена), и система фиксирует, кто и когда ее выполнил.

3. Система взаимодействия

Это встроенный в платформу корпоративный мессенджер. Он отлично подходит для неформальных уведомлений и обсуждений, привязанных к объектам системы.

При изменении документа можно программно создать новое обсуждение, связанное с этим документом, и добавить в него нужных пользователей. У этих пользователей появится уведомление в специальной панели («колокольчик»). Они смогут открыть чат, увидеть ссылку на измененный документ и обсудить его. Это менее формально, чем задачи, и хорошо подходит для командной работы.

4. Всплывающие оповещения

Для мгновенных, некритичных уведомлений можно использовать метод глобального контекста ПоказатьОповещениеПользователя().


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

// В модуле управляемого приложения или общей форме
&НаКлиенте
Процедура ОбработкаОповещения(ИмяСобытия, Параметр, Источник)
    
    Если ИмяСобытия = "ОбновлениеДанныхДляОповещения" Тогда
        ПоказатьОповещениеПользователя(
            "Внимание!",
            Параметр.Объект,
            "Важный документ был изменен. Нажмите, чтобы открыть.",
            БиблиотекаКартинок.Информация32);
    КонецЕсли;

КонецПроцедуры

Такой механизм требует организации обмена сообщениями между сеансами (например, через регистр сведений и регламентное задание, которое проверяет новые записи и рассылает оповещения). Это решение подходит для информирования в режиме реального времени, но у него есть минус: если пользователь пропустил всплывающее окно, оно исчезнет, и след от уведомления не сохранится.

Итоги

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

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

← На главную