В процессе работы с "1С:Управление торговлей 11" (УТ11) часто возникает необходимость информировать пользователей о различных событиях, таких как изменения статуса заказа, оплата счета или любые другие изменения, происходящие в информационной базе. Механизм оповещений в УТ11, основанный на "Системе взаимодействия 1С:Предприятие", предоставляет мощный инструментарий для этих целей. Рассмотрим, как решить типичные проблемы, связанные с участием пользователей в обсуждениях, и как программно создавать автоматические оповещения, например, при изменении заказа регламентным заданием.
Прежде чем углубляться в программное создание оповещений, важно убедиться, что базовый функционал Системы взаимодействия настроен корректно, и пользователи могут участвовать в обсуждениях. Иногда пользователи сталкиваются с ситуацией, когда они не могут добавить других участников в созданную тему обсуждения или их сообщения видны только им самим. Проанализируем причину и решение этой проблемы.
Помните, что если обсуждение покидает последний участник, оно может быть автоматически уничтожено системой. Поэтому важно обеспечивать постоянное участие хотя бы одного активного пользователя или использовать служебные учетные записи для поддержания актуальных тем.
Одной из наиболее востребованных функций является автоматическая отправка оповещений при наступлении определенных событий, например, когда регламентное задание изменяет заказ или другой объект системы. Для этого нам потребуется программный доступ к Системе взаимодействия.
Рассмотрим сценарий: нам нужно, чтобы при изменении заказа регламентным заданием появлялось оповещение. Для реализации этой задачи мы будем использовать объекты Системы взаимодействия и специальный привилегированный режим.
Механизм оповещений в "1С:Предприятии" хранит информацию не в обычных справочниках или документах конфигурации, а в специальной базе Системы взаимодействия (СВ). Это отдельный компонент, который обеспечивает кроссплатформенную и кросс-базовую коммуникацию. Для программной работы с ним используются методы и объекты, предоставляемые платформой 1С.
Основные шаги для программного создания оповещения:
УстановитьПривилегированныйРежим(Истина) позволяет выполнять операции с данными от лица пользователей, которым данные недоступны, и ускоряет работу, так как не накладываются ограничения на доступ к данным. Код, исполняющийся в привилегированном режиме на сервере, не проверяет права доступа.МенеджерСистемыВзаимодействия.Рассмотрим пример процедуры, которая демонстрирует, как создать оповещение при изменении объекта. В данном случае, мы будем имитировать оповещение об изменении номенклатуры в рамках заказа, отправляя его в заранее созданную тему обсуждения с заголовком "Тест".
Процедура СистемаВзаимодействия_СоздатьОповещение(Номенклатура, Заказ)
Попытка
// 1. Устанавливаем привилегированный режим для выполнения операций с Системой взаимодействия.
// Это необходимо, так как регламентное задание может выполняться от имени пользователя
// с ограниченными правами, а также для обхода проверок прав при работе с СВ.
УстановитьПривилегированныйРежим(Истина);
// 2. Создаем экземпляр МенеджераСистемыВзаимодействия.
// Этот объект предоставляет методы для работы с обсуждениями и сообщениями.
МенеджерСВ = Новый МенеджерСистемыВзаимодействия;
// 3. Подготавливаем отбор для поиска нужной темы обсуждения.
// В данном случае, мы ищем групповое обсуждение.
Отбор = Новый ОтборОбсужденийСистемыВзаимодействия;
Отбор.Групповое = Истина;
// 4. Получаем список всех групповых обсуждений, соответствующих отбору.
Обсуждения = МенеджерСВ.ПолучитьОбсуждения(Отбор);
// 5. Ищем конкретное обсуждение по его заголовку (например, "Тест").
// В реальных условиях можно использовать идентификатор или более сложный отбор.
ОбсуждениеТест = Неопределено;
Для Каждого о Из Обсуждения Цикл
Если о.Заголовок = "Тест" Тогда
ОбсуждениеТест = о;
Прервать; // Обсуждение найдено, выходим из цикла
КонецЕсли;
КонецЦикла;
// Проверяем, найдено ли обсуждение. Если нет, можно его создать или выйти.
Если ОбсуждениеТест = Неопределено Тогда
Сообщить("Обсуждение с заголовком 'Тест' не найдено. Оповещение не отправлено.");
Возврат;
КонецЕсли;
// 6. Создаем новое сообщение в найденном обсуждении.
// Идентификатор обсуждения используется для привязки сообщения.
НовСообщ = МенеджерСВ.СоздатьСообщение(ОбсуждениеТест.Идентификатор);
// 7. Заполняем свойства нового сообщения.
// Дата сообщения.
НовСообщ.Дата = ТекущаяДата();
// Текст сообщения. Используем навигационную ссылку для удобства перехода к объекту.
НовСообщ.Текст = ПолучитьНавигационнуюСсылку(Номенклатура) + ": отредактировать";
// 8. Устанавливаем автора сообщения.
// Для этого нужно получить идентификатор пользователя Системы взаимодействия по его имени в ИБ.
// Предполагается, что существует пользователь с именем "Тест" в информационной базе,
// который также является пользователем Системы взаимодействия.
ИдентификаторПользователяСВ = СистемаВзаимодействия.ПолучитьИдентификаторПользователя(Пользователи.НайтиПоИмени("Тест").ИдентификаторПользователяИБ);
НовСообщ.Автор = ИдентификаторПользователяСВ;
// 9. Записываем сообщение в Систему взаимодействия.
НовСообщ.Записать();
Сообщить("Оповещение успешно отправлено в обсуждение 'Тест'.");
Исключение
// Обрабатываем возможные ошибки, например, если сервер СВ недоступен или пользователь не найден.
Сообщить("Ошибка при отправке оповещения: " + ОписаниеОшибки());
КонецПопытки;
КонецПроцедуры
УстановитьПривилегированныйРежим(Истина);
Эта строка критически важна, особенно если код выполняется в фоновом режиме (например, регламентным заданием) или от имени пользователя с ограниченными правами. Она временно отключает проверки прав доступа для текущего сеанса на сервере, позволяя выполнить операции с Системой взаимодействия, которые иначе могли бы быть заблокированы.
МенеджерСВ = Новый МенеджерСистемыВзаимодействия;
Мы создаем экземпляр объекта МенеджерСистемыВзаимодействия. Это основной объект для работы с функционалом СВ, предоставляющий методы для управления обсуждениями, сообщениями, пользователями и другими аспектами взаимодействия.
Отбор = Новый ОтборОбсужденийСистемыВзаимодействия; и Отбор.Групповое = Истина;
Для поиска конкретного обсуждения мы используем объект ОтборОбсужденийСистемыВзаимодействия. Здесь мы устанавливаем свойство Групповое = Истина, чтобы искать только групповые обсуждения, а не контекстные (привязанные к конкретному объекту информационной базы).
Обсуждения = МенеджерСВ.ПолучитьОбсуждения(Отбор);
Метод ПолучитьОбсуждения возвращает коллекцию всех обсуждений, соответствующих заданному отбору. В нашем случае это все групповые обсуждения.
Поиск обсуждения по заголовку:
Мы перебираем полученную коллекцию Обсуждения в цикле и ищем обсуждение, у которого свойство Заголовок соответствует строке "Тест". В реальных системах для повышения надежности и производительности часто используются заранее известные идентификаторы обсуждений, которые можно хранить, например, в константах или параметрах программы.
НовСообщ = МенеджерСВ.СоздатьСообщение(ОбсуждениеТест.Идентификатор);
Как только целевое обсуждение найдено, мы создаем новое сообщение, передавая в метод СоздатьСообщение его уникальный Идентификатор. Это гарантирует, что сообщение будет привязано именно к этой теме.
НовСообщ.Дата = ТекущаяДата(); и НовСообщ.Текст = ПолучитьНавигационнуюСсылку(Номенклатура) + ": отредактировать";
Мы заполняем свойства нового сообщения. Текст сообщения может быть любой строкой. Здесь использована функция ПолучитьНавигационнуюСсылку(), которая возвращает ссылку на объект информационной базы. Это очень удобно, так как получатель оповещения может просто кликнуть по ссылке и сразу перейти к измененному объекту (в данном случае, к Номенклатура).
ИдентификаторПользователяСВ = СистемаВзаимодействия.ПолучитьИдентификаторПользователя(Пользователи.НайтиПоИмени("Тест").ИдентификаторПользователяИБ); и НовСообщ.Автор = ИдентификаторПользователяСВ;
Каждое сообщение в СВ должно иметь автора. Мы получаем идентификатор пользователя СВ, сначала найдя пользователя в информационной базе по его имени (Пользователи.НайтиПоИмени("Тест")), затем получив его идентификатор пользователя ИБ (.ИдентификаторПользователяИБ), и уже по нему получаем идентификатор пользователя в Системе взаимодействия. Важно, чтобы такой пользователь существовал и был зарегистрирован в СВ.
НовСообщ.Записать();
После того как все свойства сообщения заполнены, мы вызываем метод Записать(), который сохраняет сообщение в базе Системы взаимодействия.
Блок Попытка...Исключение...КонецПопытки;
Использование блока обработки исключений является хорошей практикой. В случае возникновения ошибок (например, не найдено обсуждение, отсутствует связь с сервером СВ, не найден пользователь) программа не прекратит работу аварийно, а сообщит об ошибке, что позволит администратору или разработчику оперативно ее устранить.
Данный подход позволяет гибко настраивать содержимое оповещений, включая ссылки на измененные объекты, что значительно повышает удобство работы пользователей.
Для того чтобы процедура СистемаВзаимодействия_СоздатьОповещение выполнялась автоматически при изменении заказа или другого объекта, ее необходимо интегрировать в регламентное задание. Регламентные задания в 1С:Предприятии отвечают за выполнение различных фоновых операций по расписанию.
Рассмотрим шаги по интеграции:
СистемаВзаимодействия_СоздатьОповещение, передавая в нее необходимые параметры (например, измененный документ "Заказ").Важно помнить, что регламентные задания запускаются на сервере 1С:Предприятие, и их код должен быть серверным. Процедура создания оповещения, как мы видим, является серверной.
Помимо программного создания, УТ11 предлагает универсальный механизм оповещения пользователей о системных событиях с широкими возможностями настройки:
Типы оповещений:
Каналы оповещений: Помимо внутренних оповещений в "Обсуждениях", система предоставляет возможность отправки уведомлений через:
Настройка автоматических оповещений:
Для настройки этих функций в УТ11 мы переходим в раздел "НСИ и администрирование – Администрирование – Органайзер" после регистрации базы в системе взаимодействия. Здесь мы можем включить функциональность оповещений и настроить список активных оповещений.
Правила формирования оповещений настраиваются в справочнике "Виды оповещений пользователей". Здесь мы можем:
Каждый пользователь может самостоятельно отключить рассылку по каждому виду оповещений в своих персональных настройках, что обеспечивает гибкость и предотвращает перегрузку информацией.
Таким образом, комбинируя типовые настройки оповещений и программный подход через Систему взаимодействия, мы можем создать комплексную и эффективную систему информирования пользователей в УТ11 о любых значимых событиях.