Массовое оповещение сотрудников в 1С:Предприятии 8.3: обсуждения, код и rac

· 10 мин

Содержание

Кнопки «Отправить сообщение всем пользователям » в платформе 1С:Предприятие 8.3 нет. Быстрее всего разослать оповещение через «Обсуждения» (система взаимодействия) в типовых конфигурациях на БСП. Если нужно предупредить перед обновлением, подойдёт блокировка работы пользователей с текстом сообщения. Для постоянных объявлений делают небольшой механизм на коде: регистр сообщений и проверку по таймеру.

Обычная ситуация: в 18:00 надо обновить базу , а в ней сидят 40 человек из трёх отделов. Обходить кабинеты и писать в общий чат долго, половина не прочитает. Ниже разобраны способы, которые реально работают в 1С 8.3 в интерфейсе «Такси», от «без программирования» до доработки в расширении.

Что умеет платформа 1С и чего не умеет

Платформа не даёт отправить произвольный текст в чужой открытый сеанс. Один сеанс не может вызвать окно в другом. Всё, что выглядит как «рассылка», устроено одним из трёх способов:

  • 💬 Система взаимодействия — отдельный сервис, который доставляет сообщения в реальном времени. В интерфейсе он называется «Обсуждения».
  • 🔒 Блокировка сеансов — у неё есть поле с текстом. Его видят пользователи, которые пытаются войти, а в конфигурациях на БСП ещё и те, кто уже работает.
  • ⏱️ Опрос по таймеру — каждый клиент раз в N секунд спрашивает сервер «есть ли новые объявления?» и показывает их сам.
СпособНужен ли кодДоставкаКогда выбирать
ОбсужденияНетСразу, с историейОперативные объявления, переписка
Блокировка работы пользователей (БСП)НетПри входе и по таймеру БСПОбновление, регламентные работы
Регистр сообщений + обработчик ожиданияДаС задержкой до интервала опросаСвой формат, адресная рассылка, отчёт о прочтении
Система взаимодействия из кодаДаСразуАвтоматические уведомления из обработок
rac infobase update с запретом сеансовНет, командная строкаПри входеСкрипты обслуживания сервера
msg * на терминальном сервереНетСразуВсе работают через RDP на одном сервере

Рассылка через «Обсуждения» без программирования

В БП 3.0, ЗУП 3.1, УТ 11 и других конфигурациях на свежей БСП обсуждения встроены. Нужно один раз подключить базу к системе взаимодействия, это делает администратор.

  1. Откройте раздел Администрирование. Группа настроек обсуждений находится в Общих настройках, в старых релизах — в Интернет-поддержка и сервисы.
  2. Нажмите «Подключить» (или «Зарегистрировать»), укажите адрес электронной почты администратора и введите код подтверждения из письма.
  3. После регистрации на панели появится кнопка обсуждений (значок облачка в правом верхнем углу).

Дальше рассылка занимает минуту:

  1. Откройте обсуждения и создайте новое обсуждение.
  2. Добавьте участников: можно выбрать всех пользователей сразу.
  3. Напишите текст и отправьте.

У каждого, кто сейчас в программе, появится всплывающее уведомление и счётчик непрочитанных. Кто был не в сети, увидит сообщение при следующем входе. История сохраняется, на сообщение можно ответить.

Заведите одно постоянное обсуждение «Объявления» со всеми пользователями. Тогда каждую рассылку не надо собирать заново, а новые сотрудники получат прошлые объявления.

Ограничения тоже есть. Серверу базы нужен доступ в интернет к сервису 1С (или развёрнутый в организации свой сервер взаимодействия). Для файловой базы на локальном компьютере без интернета способ не подойдёт.

Блокировка работы с текстом предупреждения

Если цель — выгнать всех из базы перед обновлением, используйте штатную блокировку. Путь в типовых конфигурациях: Администрирование → Обслуживание → Блокировка работы пользователей.

  1. В поле сообщения напишите понятный текст: «В 18:00 обновление программы. Сохраните документы и выйдите из 1С».
  2. Укажите время начала и окончания блокировки.
  3. При необходимости задайте код разрешения: с ним администратор сможет войти, пока база заблокирована.
  4. Установите блокировку.

БСП показывает предупреждение работающим пользователям заранее, а к началу блокировки завершает их сеансы. Тот, кто попробует войти позже, увидит ваш текст и не войдёт.

Блокировка обрывает сеансы. Несохранённые документы пропадут. Ставьте её с запасом 10–15 минут и не во время закрытия месяца или выгрузки отчётности.

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

Программная рассылка: регистр сообщений и список сеансов

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

Шаг 1. Регистр для хранения объявлений

Создайте независимый регистр сведений СообщенияПользователям:

  • измерение Идентификатор — строка 36;
  • ресурсы Текст (строка неограниченной длины), ДатаСоздания, ДействуетДо (дата и время), Автор (строка 100).

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

Шаг 2. Отправка с сервера

Процедура в общем серверном модуле:

Процедура ОтправитьВсем(Текст, ЧасовДействия = 8) Экспорт
	Запись = РегистрыСведений.СообщенияПользователям.СоздатьМенеджерЗаписи();
	Запись.Идентификатор = Строка(Новый УникальныйИдентификатор);
	Запись.Текст = Текст;
	Запись.ДатаСоздания = ТекущаяДатаСеанса();
	Запись.ДействуетДо = Запись.ДатаСоздания + ЧасовДействия * 3600;
	Запись.Автор = ИмяПользователя();
	Запись.Записать();
КонецПроцедуры

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

Шаг 3. Проверка новых сообщений на клиенте

Функция в общем модуле с флагом «Вызов сервера»:

Функция НовыеСообщения(ПоследняяДата) Экспорт
	УстановитьПривилегированныйРежим(Истина);
	Запрос = Новый Запрос;
	Запрос.Текст =
	"ВЫБРАТЬ ПЕРВЫЕ 5
	|	С.Текст КАК Текст,
	|	С.ДатаСоздания КАК ДатаСоздания
	|ИЗ
	|	РегистрСведений.СообщенияПользователям КАК С
	|ГДЕ
	|	С.ДатаСоздания > &ПоследняяДата
	|	И С.ДействуетДо >= &ТекущаяДата
	|УПОРЯДОЧИТЬ ПО
	|	С.ДатаСоздания";
	Запрос.УстановитьПараметр("ПоследняяДата", ПоследняяДата);
	Запрос.УстановитьПараметр("ТекущаяДата", ТекущаяДатаСеанса());
	Результат = Новый Массив;
	Выборка = Запрос.Выполнить().Выбрать();
	Пока Выборка.Следующий() Цикл
		Результат.Добавить(Новый Структура("Текст, Дата", Выборка.Текст, Выборка.ДатаСоздания));
	КонецЦикла;
	Возврат Результат;
КонецФункции

Пусть модуль называется СообщенияВызовСервера. В модуле управляемого приложения (в расширении — через заимствование модуля и аннотацию &После) подключите опрос:

Перем ПоследняяДатаСообщения;

Процедура ПриНачалеРаботыСистемы()
	ПоследняяДатаСообщения = Дата(1, 1, 1);
	ПодключитьОбработчикОжидания("ПроверитьСообщенияПользователям", 60);
КонецПроцедуры

Процедура ПроверитьСообщенияПользователям() Экспорт
	Сообщения = СообщенияВызовСервера.НовыеСообщения(ПоследняяДатаСообщения);
	Для Каждого Сообщение Из Сообщения Цикл
		ПоказатьПредупреждение(, Сообщение.Текст);
		ПоследняяДатаСообщения = Сообщение.Дата;
	КонецЦикла;
КонецПроцедуры

Начальная дата пустая, поэтому тот, кто войдёт позже, тоже увидит действующие объявления. Устаревшие отсекает условие по ДействуетДо. Для мягкого уведомления в углу экрана вместо окна используйте ПоказатьОповещениеПользователя(): оно не мешает работе, но исчезает через несколько секунд.

Кто сейчас в базе: таблица сеансов

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

Функция КоличествоПользователейВСети() Экспорт
	Интерактивные = Новый Соответствие;
	Для Каждого Сеанс Из ПолучитьСеансыИнформационнойБазы() Цикл
		Если Сеанс.ИмяПриложения = "1CV8C"
			Или Сеанс.ИмяПриложения = "1CV8"
			Или Сеанс.ИмяПриложения = "WebClient" Тогда
			Если Сеанс.Пользователь <> Неопределено Тогда
				Интерактивные.Вставить(Сеанс.Пользователь.Имя, Истина);
			КонецЕсли;
		КонецЕсли;
	КонецЦикла;
	Возврат Интерактивные.Количество();
КонецФункции

Фильтр по ИмяПриложения отсекает фоновые задания (BackgroundJob), COM-соединения (COMConnection) и Конфигуратор (Designer): их окна никто не увидит. Соответствие убирает дубли, когда один человек открыл два сеанса. Для вызова метода нужно право «Администрирование», поэтому функцию вызывайте в привилегированном режиме или только от имени администратора.

Сообщение через систему взаимодействия из кода

Если база зарегистрирована в системе взаимодействия, объявления из обработок и регламентных заданий можно отправлять в обсуждение автоматически. Например, «Закрытие месяца выполнено» или «Обмен с сайтом упал».

Процедура ОтправитьВОбсуждение(ИдентификаторОбсуждения, Текст) Экспорт
	Если Не СистемаВзаимодействия.ИнформационнаяБазаЗарегистрирована() Тогда
		Возврат;
	КонецЕсли;
	Сообщение = СистемаВзаимодействия.СоздатьСообщение(ИдентификаторОбсуждения);
	Сообщение.Текст = Текст;
	Сообщение.Записать();
КонецПроцедуры

Обсуждение «Объявления» удобно создать один раз со всеми участниками и запомнить его идентификатор. Тогда коду не нужно каждый раз собирать участников: он просто пишет в готовое обсуждение. Набор методов системы взаимодействия расширялся от версии к версии платформы, поэтому сверяйтесь с синтакс-помощником вашей версии.

Утилиты ras и rac: кто в базе и блокировка с текстом

В клиент-серверной базе администратор может обойтись без входа в 1С. Сначала запускают сервер администрирования ras (порт по умолчанию 1545), затем работают консольной утилитой rac.

Произвольное сообщение в открытые сеансы rac не отправляет. Её используют для двух задач:

  1. Посмотреть, кого предупреждать. rac cluster list выдаёт идентификатор кластера, rac infobase summary list --cluster=<id> — список баз, rac session list --cluster=<id> — сеансы с именами пользователей и компьютеров.
  2. Запретить вход с текстом. У команды rac infobase update есть параметры --sessions-deny=on, --denied-message, --denied-from, --denied-to и --permission-code. Пользователь при попытке входа увидит текст из --denied-message.
rac infobase update --cluster=<id_кластера> --infobase=<id_базы> ^
  --infobase-user=Администратор --infobase-pwd=*** ^
  --sessions-deny=on --denied-message="Идёт обновление до 19:00" ^
  --permission-code=12345

Это та же блокировка сеансов, что и в платформе, только снаружи. Работающих пользователей она не выкидывает, их потом завершают отдельно. Полный набор параметров вашей версии смотрите командой rac help infobase.

Завершение сеансов через rac session terminate или консоль кластера обрывает работу без сохранения. Делайте это после рассылки и выдержки времени, а не вместо неё.

Другие каналы оповещения сотрудников

Иногда проще выйти за пределы 1С:

  • 🖥️ msg * на терминальном сервере. Если все работают в 1С через RDP на одном Windows Server, команда msg * "Через 10 минут перезагрузка сервера" покажет окно во всех сеансах сервера. Это не средство 1С, но для «все из базы, срочно» работает надёжнее всего.
  • ✉️ Электронная почта из 1С. Типовые конфигурации умеют отправлять письма через учётную запись в Администрирование → Органайзер. Для рассылки по списку сотрудников это удобнее, чем оповещение в окне: письмо прочитают и те, кто не в программе.
  • 📌 Напоминания и задачи. В конфигурациях с органайзером напоминание видит только его автор, поэтому для массовой рассылки этот механизм не подходит. Задачи по бизнес-процессам — да, но это уже рабочий процесс, а не объявление.
  • 📱 Корпоративный мессенджер. Для сообщений не про 1С выгоднее держать один канал, иначе сотрудники перестанут читать оба.

Технические тонкости и типичные сбои

Диагностика: выберите симптом

Ещё три нюанса, о которых вспоминают уже после внедрения:

  • Точность даты. ДатаСоздания хранится с точностью до секунды. Два объявления в одну секунду при фильтре «больше последней даты» могут потерять второе. Для надёжности сравнивайте ещё и по идентификатору или храните список показанных.
  • Нагрузка. 100 пользователей с опросом раз в 60 секунд дают около 1,7 серверного вызова в секунду. С индексированным регистром на 5–10 записей это незаметно. Интервал в 5 секунд даст уже 20 вызовов в секунду, поэтому меньше 30–60 секунд не ставьте.
  • Модальные окна. ПоказатьПредупреждение() не блокирует выполнение кода, но если на экране уже открыто окно, предупреждение встанет поверх. Длинный текст лучше открывать отдельной формой со скроллом.

Как внедрить рассылку без проблем

Перед запуском рассылки в рабочей базе
Выполнено: 0 / 6

Несколько правил из практики:

  • ✍️ Пишите в объявлении три вещи: что произойдёт, когда, что сделать пользователю. «В 18:00 обновление на 30 минут, сохраните документы и выйдите» понятнее, чем «Техработы».
  • 🕒 Перед обновлением шлите два сообщения: за час и за 10 минут. Блокировку ставьте после второго.
  • 🧹 Чистите регистр объявлений регламентным заданием раз в месяц. Хватит удаления записей, у которых ДействуетДо в прошлом.
  • 🔁 Не дублируйте одно объявление во все каналы сразу. Обсуждения плюс блокировка перед обновлением — достаточно.

Частые вопросы

Работает ли рассылка в файловой базе?
Да. Регистр с обработчиком ожидания и блокировка работы пользователей работают и в файловом варианте. Утилиты ras и rac — только для клиент-серверной базы.
Можно ли узнать, кто прочитал сообщение?
В обсуждениях видно, кто прочитал. В своём механизме добавьте регистр «Прочтения»: клиент записывает в него пользователя и идентификатор объявления после показа.
Увидят ли сообщение пользователи веб-клиента?
Да. Обработчик ожидания, ПоказатьПредупреждение и обсуждения работают в веб-клиенте так же, как в тонком.
Платная ли система взаимодействия?
Для типовых конфигураций обсуждения подключаются через сервис 1С по регистрации базы. Актуальные условия и лимиты уточняйте у партнёра 1С; альтернатива — свой сервер взаимодействия в сети организации.
Можно ли отправить сообщение только одному отделу?
В обсуждениях создайте отдельное обсуждение с нужными участниками. В своём механизме добавьте в регистр измерение пользователя или группы и фильтруйте по нему в запросе.