Уведомления и сообщения при старте 1С: устройство, код и отключение лишнего

· 9 мин

Содержание

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

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

Как устроены оповещения и запуск в 1С

Механизм состоит из трёх слоёв. Их полезно различать: от слоя зависит, где искать причину и как её убрать.

СлойЧто делаетГде живёт код
Обработчики запускаВыполняют код при входе в базу: проверки, стартовые окна, подключение фоновых опросовМодуль управляемого приложения
Оповещения между формамиПередают событие всем открытым формам текущего сеансаВызов Оповестить, приём в ОбработкаОповещения формы
Оповещения пользователяПоказывают всплывающее сообщение в углу окнаПоказатьОповещениеПользователя

Что происходит при старте

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

  1. Платформа проверяет лицензию, аутентифицирует пользователя и загружает конфигурацию.
  2. Вызывается ПередНачаломРаботыСистемы(Отказ). Если в нём установить Отказ = Истина, программа закроется, не открыв рабочее окно.
  3. Открывается главное окно, затем вызывается ПриНачалеРаботыСистемы().
  4. Код из этих обработчиков подключает обработчики ожидания: они будут периодически опрашивать сервер — например, о новых напоминаниях или сообщениях.

Как ходят оповещения

Метод Оповестить(ИмяСобытия, Параметр, Источник) — клиентский. Он рассылает событие всем открытым формам только в текущем сеансе этого пользователя. Каждая форма получает его в обработчике ОбработкаОповещения и сама решает, реагировать ли.

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

ОповеститьОбИзменении(Ссылка) — частный случай: он сообщает динамическим спискам, что объект изменился, и списки перечитывают данные.

Откуда берутся уведомления: типичные сценарии

Большую часть окон и плашек в типовых конфигурациях (БП 3.0, ЗУП 3.1, УТ 11) выводит Библиотека стандартных подсистем (БСП). Платформа добавляет свои системные сообщения.

Что чаще всего видит пользователь при входе и во время работы:

  • 🔄 Сообщение о рекомендуемой версии платформы. Конфигурация сверяет номер платформы с минимальным и рекомендуемым. Если номер ниже рекомендуемого — предупреждает, ниже минимального — не даёт работать.
  • 📦 Обновление информационной базы. После обновления конфигурации первый вход запускает обработчики обновления, а затем может показать описание изменений.
  • 🧭 Вопрос о перемещённой базе. Если базу восстановили из копии или перенесли на другой сервер, БСП спрашивает, копия это или основная база, и блокирует работу с внешними ресурсами до ответа.
  • 🔐 Смена пароля. Если в настройках входа задан срок действия пароля, по его истечении пользователь получит требование сменить пароль .
  • ⏰ Напоминания. Пользователь сам ставит напоминание к документу или задаче, и в срок появляется окно.
  • 💬 «Обсуждения». Новые сообщения системы взаимодействия приходят оповещением и отображаются счётчиком.
  • 📋 «Текущие дела». Панель с задачами: неотправленные отчёты, непроведённые документы, задачи по ЭДО.
  • ✅ Плашки после записи. «Документ проведён», «Изменение» — это ПоказатьОповещениеПользователя из модуля формы.

Платформа сама выводит системные предупреждения. Пример — Конфигурация базы данных не соответствует сохраненной конфигурации. Продолжить? при входе в режим 1С:Предприятие из конфигуратора, когда изменения не применены к базе.

Права доступа и роли: кто что видит

Оповещения сами по себе не требуют отдельных прав. Но то, какие окна появятся у конкретного пользователя, определяют его роли.

Что влияетКак проявляется
Право «Администрирование»Предупреждения об обновлении базы, о перемещённой копии, о версии платформы адресованы в первую очередь администратору
Роли на объекты«Текущие дела» показывают задачи только по тем документам и отчётам, к которым есть доступ
Право «Сохранение данных пользователя»Без него не запоминаются личные настройки: скрытые панели и отключённые окна возвращаются при следующем входе
Подключённые «Обсуждения»Если информационная база не зарегистрирована в системе взаимодействия, оповещений о сообщениях не будет ни у кого

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

Не выдавайте право «Администрирование» рядовым пользователям ради того, чтобы «окно не мешало». Это права на всю базу, включая управление пользователями и выгрузку данных.

Как убрать лишнее без программиста

  1. Панель «Текущие дела» настраивается из самой панели: там можно отключить ненужные группы дел.
  2. Окно с описанием изменений после обновления обычно содержит флажок, отключающий показ.
  3. Напоминания удаляются из списка напоминаний пользователя.
  4. Вопрос о перемещённой базе исчезает после ответа: «это копия» или «это основная база». Ответ сохраняется.
  5. Лишние формы на начальной странице убираются через Вид → Настройка начальной страницы (в интерфейсе «Такси» команда находится в главном меню, кнопка с тремя полосками в левом верхнем углу).

Программное управление оповещениями

Здесь собраны рабочие шаблоны для разработчика. Все примеры — для управляемого приложения 8.3.

Рассылка и приём события между формами

В форме, которая что-то изменила:

&НаКлиенте
Процедура ПослеЗаписи(ПараметрыЗаписи)
	Оповестить("ИзмененыНастройкиСклада", Объект.Ссылка, ЭтотОбъект);
КонецПроцедуры

В форме, которая должна обновиться:

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

Сравнивайте ИмяСобытия первым же условием. ОбработкаОповещения вызывается на каждое оповещение в сеансе. Тяжёлый код без проверки имени будет выполняться десятки раз в минуту.

Всплывающее сообщение пользователю

&НаКлиенте
Процедура ПоказатьИтог(КоличествоДокументов)
	ПоказатьОповещениеПользователя(
		"Обработка завершена",
		,
		СтрШаблон("Проведено документов: %1", Формат(КоличествоДокументов, "ЧГ=0")));
КонецПроцедуры

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

Описание оповещения для асинхронных диалогов

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

&НаКлиенте
Процедура Удалить(Команда)
	Оповещение = Новый ОписаниеОповещения("ПослеОтветаНаВопрос", ЭтотОбъект);
	ПоказатьВопрос(Оповещение, "Удалить выбранные строки?", РежимДиалогаВопрос.ДаНет);
КонецПроцедуры

&НаКлиенте
Процедура ПослеОтветаНаВопрос(Ответ, ДополнительныеПараметры) Экспорт
	Если Ответ = КодВозвратаДиалога.Да Тогда
		УдалитьСтрокиНаСервере();
	КонецЕсли;
КонецПроцедуры

Процедура-обработчик обязана быть экспортной. Без Экспорт платформа выдаст ошибку при попытке её вызвать.

Оповещение других пользователей

С сервера вызвать Оповестить нельзя: метод клиентский. Рабочие варианты:

  • 💬 сообщение в «Обсуждения» через систему взаимодействия — пользователь увидит его, даже если открыт другой раздел;
  • ⏰ напоминание БСП на нужную дату;
  • 🔁 обработчик ожидания, который раз в N минут спрашивает сервер «есть ли новое» и показывает ПоказатьОповещениеПользователя.

Третий вариант самый простой, но каждый опрос — вызов сервера. При 100 пользователях и интервале 60 секунд это 100 лишних вызовов в минуту. Ставьте интервал не меньше нескольких минут.

Диагностика: почему оповещение не приходит или окно не уходит

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

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

Журнал регистрации и отладчик

Для проблем при старте два главных инструмента:

  1. Журнал регистрации (Администрирование → Обслуживание → Журнал регистрации в БП 3.0). Отберите события за время входа пользователя: ошибки обработчиков запуска записываются туда.
  2. Отладка запуска. В конфигураторе запустите отладку и поставьте точку останова в ПриНачалеРаботыСистемы модуля управляемого приложения. Так видно, какой вызов открывает окно.

В типовых конфигурациях на БСП сам модуль приложения короткий: он передаёт управление общим модулям подсистем. Ищите вызовы через глобальный поиск по имени нужного окна или текста сообщения.

Ускоряем запуск: что тормозит старт и как это лечить

Медленный вход почти всегда объясняется одним из четырёх факторов.

ПричинаПризнакЧто делать
Много вызовов сервера в обработчиках стартаЗадержка растёт с удалённостью от сервераСобрать данные в один серверный вызов, вернуть структурой
Тяжёлые проверки при каждом входеДолгое окно «Загрузка…» у всехПеренести второстепенное в отложенный обработчик ожидания
Разросшийся кэш клиентаТормозит у одного пользователя, у других нормальноЗапуск с параметром /ClearCache
Тяжёлые формы начальной страницыЗадержка после появления главного окнаУбрать лишние формы с начальной страницы

Отложенный запуск второстепенного

Всё, без чего пользователь может начать работу, выносите из ПриНачалеРаботыСистемы в однократный обработчик ожидания:

&НаКлиенте
Процедура ПриНачалеРаботыСистемы()
	ПодключитьОбработчикОжидания("ОтложенныеДействияПриЗапуске", 5, Истина);
КонецПроцедуры

&НаКлиенте
Процедура ОтложенныеДействияПриЗапуске() Экспорт
	ПроверитьНапоминанияНаСервере();
КонецПроцедуры

Третий параметр Истина делает обработчик однократным: он сработает через 5 секунд и больше не повторится. Процедура для обработчика ожидания не должна иметь параметров и должна быть доступна в том модуле, откуда её подключают.

Замер времени

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

Параметры командной строки

Несколько параметров 1cv8 полезны при диагностике запуска:

  • /ClearCache — очистить клиентский кэш перед стартом;
  • /DisableStartupMessages — подавить стартовые предупреждения платформы, например о несоответствии конфигурации базы данных;
  • /C <строка> — передать строку параметра запуска, которую конфигурация читает через ПараметрЗапуска. В БСП так работают /C ЗавершитьРаботуПользователей и /C РазрешитьРаботуПользователей.

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

"C:\Program Files\1cv8\common\1cestart.exe" ENTERPRISE /S"srv1c\buh" /ClearCache /DisableStartupMessages

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

Доработка без снятия с поддержки

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

Порядок действий:

  1. В конфигураторе создайте расширение (Конфигурация → Расширения конфигурации).
  2. Заимствуйте общий модуль подсистемы, которая показывает окно.
  3. Перехватите нужную процедуру аннотацией &Вместо или &После и измените поведение.
  4. Проверьте на копии базы, затем подключите расширение в рабочей.

Простое правило: отключать стоит только информационные окна. Проверки версии платформы, обновления базы и перемещённой копии защищают данные — их не трогайте.

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

Чем Оповестить отличается от ПоказатьОповещениеПользователя?
Оповестить передаёт событие открытым формам и ничего не показывает на экране. ПоказатьОповещениеПользователя выводит всплывающее сообщение и формам ничего не передаёт.
Можно ли вызвать оповещение из фонового задания?
Нет, у фонового задания нет клиента. Запишите результат в базу, а клиент заберёт его опросом по таймеру или пользователь получит сообщение через Обсуждения.
Почему ОбработкаОповещения срабатывает в форме, которая закрыта?
Не срабатывает. Если код выполнился, форма была открыта, возможно, в другой вкладке или скрыта. Закрытые формы оповещений не получают.
Влияет ли количество открытых форм на скорость оповещений?
Да. Каждая открытая форма с обработчиком получает каждое оповещение. Десятки форм с тяжёлым кодом без проверки имени события заметно тормозят интерфейс.
Нужно ли отключать обработчики ожидания при закрытии формы?
Обработчики ожидания формы снимаются вместе с формой. Глобальные обработчики модуля приложения работают до конца сеанса, их снимают через ОтключитьОбработчикОжидания.