Сообщения в 1С мешают работать: закрыть, отключить на старте, подавить в коде
Содержание
Окно сообщений в 1С убирается крестиком в его заголовке, а очищается командой Очистить из контекстного меню. В Конфигураторе то же окно прячется и показывается сочетанием Ctrl+Alt+O. Если окно возвращается снова и снова, причина в коде: где-то вызывается Сообщить(), срабатывает проверка заполнения или платформа предупреждает о модальном вызове.
Типичная ситуация: бухгалтер проводит пачку документов, и после каждого внизу формы всплывает «Не заполнено поле…» или служебный текст от доработки. Закрыть окно — дело одной секунды. Чтобы оно перестало появляться, нужно найти источник: пользовательский, стартовый или программный. Ниже разобраны все три уровня.
Как закрыть и очистить окно сообщений пользователю
В интерфейсе «Такси» сообщения выводятся в панель внизу текущей формы. Если формы нет (сообщение пришло при запуске или из общего модуля), платформа показывает отдельное окно «Сообщения».
Что можно сделать без прав администратора:
- Нажмите крестик в правом верхнем углу панели — она свернётся.
- Щёлкните правой кнопкой по тексту сообщения и выберите
Очистить— список опустеет. - Если сообщение привязано к полю, двойной щелчок по нему переводит курсор в это поле. Исправьте значение — и при следующей записи сообщение не появится.
Закрытая панель откроется сама при следующем сообщении. Это нормальное поведение платформы, а не сбой. Отключить панель галочкой в настройках пользователя нельзя.
Пользователю стоит различать типы сообщений:
- 📝 Проверка заполнения — «Поле “Контрагент” не заполнено». Уходит, когда заполнены обязательные реквизиты.
- ⚙️ Служебный вывод доработки — тексты вроде «Обработано 15 строк» или отладочные строки. Убирается только правкой кода.
- ⚠️ Предупреждения платформы — о модальных окнах и синхронных вызовах. Убирается настройкой конфигурации или переписыванием кода.
Если сообщения второго и третьего типа сыплются в рабочей базе — передайте программисту текст сообщения и название формы, где он появился.
Окно сообщений в Конфигураторе и отладочные настройки
В Конфигураторе окно сообщений показывает результат проверки модулей, ошибки сохранения конфигурации и вывод пакетных операций. Спрятать его можно так:
Ctrl+Alt+O— показать или скрыть окно;- крестик в заголовке окна;
Очиститьв контекстном меню — убрать старые строки, чтобы не путать их с новыми.
Окно можно открепить и перетащить в сторону, если оно занимает половину экрана. Положение запоминается для пользователя Конфигуратора.
Отдельный случай — отладка. Если в меню Отладка → Остановка по ошибке включена остановка, отладчик будет вставать на каждом исключении, даже перехваченном в Попытка…Исключение. Это выглядит как «окно, которое всё время выскакивает». Снимите галочку или задайте фильтр по тексту ошибки, чтобы останавливаться только на нужной.
Вторая настройка, которая плодит сообщения в режиме 1С:Предприятие, лежит в свойствах корня конфигурации:
| Свойство | Значение | Что видит пользователь |
|---|---|---|
| Режим использования модальности | Использовать | Модальные окна работают, сообщений нет |
| Режим использования модальности | Использовать с предупреждениями | Модальное окно открывается, но в сообщения пишется предупреждение |
| Режим использования модальности | Не использовать | Вызов модального метода приводит к ошибке |
| Режим использования синхронных вызовов расширений платформы и внешних компонент | те же три значения | Аналогично для синхронной работы с файлами и компонентами |
Значение «Использовать с предупреждениями» удобно на этапе перевода кода на асинхронные вызовы: предупреждения показывают, где осталась модальность. В рабочей базе оно раздражает пользователей. Правильный путь — переписать вызовы, временный — вернуть «Использовать».
В типовой конфигурации на поддержке эти свойства лучше не трогать: при обновлении они вернутся к значению поставщика. Вопрос решается в своих доработках, а не в настройках типовой.
Ключи запуска, которые убирают стартовые окна
Часть окон появляется до того, как пользователь что-то нажал: сообщение о несоответствии конфигурации базы данных, выбор базы, вопросы при пакетном запуске. Для них у платформы есть параметры командной строки.
| Ключ | Что делает |
|---|---|
/DisableStartupMessages | Подавляет стартовые сообщения, например о том, что конфигурация базы данных не соответствует сохранённой |
/DisableStartupDialogs | Не показывает стартовые диалоги; если параметров для входа не хватает, запуск завершается ошибкой без окна |
/DisableSplash | Не показывает заставку при запуске |
/Out <файл> | В пакетном режиме Конфигуратора пишет служебные сообщения в файл, а не на экран |
/C <строка> | Передаёт строку в глобальную переменную ПараметрЗапуска — её читает код конфигурации |
Пример ярлыка для ночного пакетного обновления конфигурации базы данных, где никто не нажмёт «ОК»:
"C:\Program Files\1cv8\common\1cestart.exe" DESIGNER /F "D:\Bases\Buh" /N "Робот" /P "пароль" ^
/DisableStartupMessages /DisableStartupDialogs ^
/UpdateDBCfg /Out "D:\Logs\update.log" /DumpResult "D:\Logs\result.txt"
Если что-то пошло не так, причина будет в update.log, а код завершения — в result.txt (0 — успех).
Обновление конфигурации базы данных требует монопольного доступа: перед запуском пользователи должны выйти из базы, иначе операция завершится ошибкой. Запускайте такие задания вне рабочего времени и после резервной копии.
/DisableStartupMessages прячет только стартовые сообщения. Тексты, которые выводит код конфигурации через Сообщить(), этим ключом не отключаются.
Тихий режим через ПараметрЗапуска и параметры сеанса
Когда базу запускает робот или тестовый сценарий, удобно, чтобы своя доработка не выводила сообщения вовсе. Платформа не знает, какие сообщения «лишние», поэтому флаг придётся завести самому.
Схема из трёх частей:
- В конфигурации (или в расширении) создайте параметр сеанса
ТихийРежимс типомБулево. - В модуле сеанса, в
УстановкаПараметровСеанса, задайте ему значениеЛожьпо умолчанию. - На клиенте при старте прочитайте
ПараметрЗапускаи, если в нём есть нужное слово, включите флаг через серверный вызов.
// Модуль управляемого приложения (или обработчик расширения)
Процедура ПриНачалеРаботыСистемы()
Если СтрНайти(ВРег(ПараметрЗапуска), "ТИХИЙРЕЖИМ") > 0 Тогда
ТихийРежимВызовСервера.Включить();
КонецЕсли;
КонецПроцедуры
// Общий модуль ТихийРежимВызовСервера (Сервер, Вызов сервера)
Процедура Включить() Экспорт
УстановитьПривилегированныйРежим(Истина);
ПараметрыСеанса.ТихийРежим = Истина;
КонецПроцедуры
Запуск с флагом: 1cv8.exe ENTERPRISE /F "D:\Bases\Test" /C "ТихийРежим".
ПараметрЗапуска доступен только на клиенте, а УстановкаПараметровСеанса выполняется на сервере. Поэтому значение передаётся отдельным вызовом, а не читается в модуле сеанса.
В типовых конфигурациях модуль приложения занят библиотекой стандартных подсистем. Свой обработчик добавляйте в расширение, а не правьте типовой модуль: так флаг переживёт обновление.
Чем заменить Сообщить() в своём коде
Сообщить() — самый простой и самый навязчивый способ вывода. В доработках его стоит заменить тем, что подходит конкретной ситуации.
| Задача | Что использовать | Как выглядит для пользователя |
|---|---|---|
| Ошибка в конкретном поле | СообщениеПользователю с заполненными Поле и ПутьКДанным | Сообщение подсвечивает поле, щелчок ведёт к нему |
| Короткое «Готово» | ПоказатьОповещениеПользователя() | Всплывающая подсказка в углу, исчезает сама |
| Ход длинной операции | Состояние() | Текст и прогресс без окна сообщений |
| Технические детали | ЗаписьЖурналаРегистрации() | Пользователь не видит, администратор читает в журнале |
| Важное уведомление | ПоказатьПредупреждение() | Немодальное окно с кнопкой «ОК» |
В типовых конфигурациях на БСП для сообщений у полей есть готовая процедура ОбщегоНазначенияКлиентСервер.СообщитьПользователю(). Своя обёртка нужна, когда требуется тихий режим:
// Общий модуль СообщенияСервер (Сервер)
Процедура Сообщить(Текст, Поле = "", ПутьКДанным = "") Экспорт
УстановитьПривилегированныйРежим(Истина);
Тихо = ПараметрыСеанса.ТихийРежим;
УстановитьПривилегированныйРежим(Ложь);
Если Тихо Тогда
ЗаписьЖурналаРегистрации("Сообщения.Подавлено",
УровеньЖурналаРегистрации.Информация, , , Текст);
Возврат;
КонецЕсли;
Сообщение = Новый СообщениеПользователю;
Сообщение.Текст = Текст;
Сообщение.Поле = Поле;
Сообщение.ПутьКДанным = ПутьКДанным;
Сообщение.Сообщить();
КонецПроцедуры
Дальше поиском по модулям (Ctrl+Shift+F в Конфигураторе) найдите вызовы Сообщить( в своих объектах и замените их на СообщенияСервер.Сообщить(. Типовые модули не трогайте.
Очистить уже выведенные сообщения программно можно методом ОчиститьСообщения() на клиенте. А ПолучитьСообщенияПользователю(Истина) вернёт накопленные сообщения массивом и удалит их из очереди — полезно, если нужно показать их по-своему.
Сообщения в фоновых и регламентных заданиях
У фонового задания нет экрана. Сообщить() внутри него ничего не показывает: сообщения копятся в самом задании и ждут, пока их заберут.
Забрать их можно с клиента или сервера, зная идентификатор задания:
Задание = ФоновыеЗадания.НайтиПоУникальномуИдентификатору(ИдентификаторЗадания);
Если Задание <> Неопределено Тогда
Для Каждого Сообщение Из Задание.ПолучитьСообщенияПользователю(Истина) Цикл
Сообщение.Сообщить();
КонецЦикла;
КонецЕсли;
Отсюда два практических вывода:
- 🔁 Если пользователь видит пачку сообщений после окончания длительной операции, их выводит именно такой цикл. Убрать их — значит не передавать их на клиент или фильтровать по тексту.
- 🕒 Регламентное задание запускается без пользователя, и его сообщения никто не заберёт. Для журнала работы используйте
ЗаписьЖурналаРегистрации(), а неСообщить().
Диалоги в фоновом задании невозможны в принципе: ПоказатьВопрос() и ПоказатьПредупреждение() работают только на клиенте. Если код задания упал с исключением, текст ошибки виден в журнале регистрации и в свойствах задания (ИнформацияОбОшибке).
Перехват исключений вместо окна с ошибкой
Окно ошибки с кнопкой «Подробно» появляется, когда исключение дошло до платформы необработанным. При массовой операции оно прерывает весь цикл на первом же документе.
Вместо этого перехватите исключение, запишите детали в журнал и покажите пользователю одну сводку в конце:
КоличествоОшибок = 0;
Для Каждого Ссылка Из СписокДокументов Цикл
ДокументОбъект = Ссылка.ПолучитьОбъект();
Попытка
ДокументОбъект.Записать(РежимЗаписиДокумента.Проведение);
Исключение
Инфо = ИнформацияОбОшибке();
ЗаписьЖурналаРегистрации("Перепроведение.Ошибка",
УровеньЖурналаРегистрации.Ошибка, Ссылка.Метаданные(), Ссылка,
ПодробноеПредставлениеОшибки(Инфо));
КоличествоОшибок = КоличествоОшибок + 1;
КонецПопытки;
КонецЦикла;
Если КоличествоОшибок > 0 Тогда
ТекстСводки = СтрШаблон("Не проведено документов: %1. Подробности в журнале регистрации.",
Формат(КоличествоОшибок, "ЧН=0; ЧГ=0"));
СообщенияСервер.Сообщить(ТекстСводки);
КонецЕсли;
Здесь вместо сотни окон пользователь получает одну строку, а администратор — полный текст каждой ошибки с привязкой к документу. Число оформлено через Формат() без разделителя групп разрядов, а ЧН=0 выведет ноль, а не пустую строку.
Правила, которые стоит соблюдать:
- ❌ Не оставляйте пустой блок
Исключение. Ошибка исчезнет бесследно, а данные останутся непроведёнными. - 🔄 Если ошибку нельзя обработать на этом уровне, после записи в журнал вызовите
ВызватьИсключение;без параметров — исключение уйдёт выше с исходным текстом. - 🧾 Внутри транзакции после исключения транзакцию нужно отменить:
ОтменитьТранзакцию()в блокеИсключение, иначе следующая запись упадёт с ошибкой «В данной транзакции уже происходили ошибки».
В новых версиях платформы методы представления ошибки доступны и через объект ОбработкаОшибок, но глобальные ПодробноеПредставлениеОшибки() и КраткоеПредставлениеОшибки() продолжают работать.
Массовое перепроведение меняет движения в учёте. Запускайте его на копии базы или после резервной копии и согласования с бухгалтерией.