Окно сообщений 1С 8.3: вывод сообщений, отладка и журналы
Содержание
Окно сообщений в 1С открывается само, когда код вызывает Сообщить() или метод объекта СообщениеПользователю. В управляемом интерфейсе «Такси» сообщения всплывают панелью в нижней части окна программы. В Конфигураторе есть отдельное окно «Сообщения», туда же попадают ошибки синтаксического контроля и результаты поиска. Вручную «открыть» пользовательскую панель нельзя: она показывается только тогда, когда есть что показать.
Для разработчика окно сообщений — самый простой способ посмотреть значение переменной или убедиться, что ветка кода сработала. Для пользователя это место, где 1С объясняет, почему не провелся документ. Ниже разобрано, как выводить сообщения, чем они различаются на клиенте и сервере, как привязать текст к полю формы и чем заменить окно сообщений, когда его не хватает.
Где в 1С находится окно сообщений
Картина зависит от того, в каком режиме вы работаете.
| Режим | Где сообщения | Как вызвать |
|---|---|---|
| Предприятие, интерфейс «Такси» | Панель в нижней части окна | Появляется при вызове Сообщить() |
| Предприятие, обычные формы | Нижняя панель окна | То же самое |
| Конфигуратор | Окно «Сообщения» | Открывается при проверке модулей, поиске, запуске отладки |
| Консоль кода (внешняя обработка) | Панель сообщений 1С | Вызов Сообщить() из выполняемого кода |
Пользовательскую панель можно свернуть крестиком. При следующем сообщении она появится снова. Старые сообщения очищаются при открытии новой формы или по действию пользователя, поэтому длинные «простыни» лучше не выводить: прокрутка неудобна.
В Конфигураторе окно «Сообщения» можно найти в меню Вид. Если оно закрыто, а проверка модулей что-то выдала, окно откроется само.
Как вывести сообщение из кода
Самый короткий вариант:
Сообщить("Документ проведён без ошибок");
Вторым параметром задают статус сообщения. От него зависит значок перед текстом:
Сообщить("Остаток меньше минимального", СтатусСообщения.Важное);
Сообщить("Проверьте контрагента", СтатусСообщения.Внимание);
Сообщить("Загрузка завершена", СтатусСообщения.Информация);
Статус Обычное — значение по умолчанию. Важное и Внимание выделяются значком, поэтому не злоупотребляйте ими: если всё «важное», пользователь перестаёт читать.
Чтобы вывести число или дату, склейте их со строкой через Строка() или СтрШаблон():
Сообщить(СтрШаблон("Обработано строк: %1 из %2", Обработано, Всего));
Так надёжнее, чем склеивать вручную: шаблон сам преобразует значения в строки и не ломается на пустых значениях.
Сообщение с привязкой к полю формы
Обычное Сообщить() просто пишет текст. Если нужно, чтобы по клику на сообщение курсор переходил к проблемному реквизиту, используйте объект СообщениеПользователю:
Сообщение = Новый СообщениеПользователю;
Сообщение.Текст = "Не заполнен договор";
Сообщение.Поле = "Договор";
Сообщение.УстановитьДанные(Объект);
Сообщение.Сообщить();
Здесь Поле — имя реквизита формы, а УстановитьДанные связывает сообщение с объектом. Если сообщение выводится из серверной процедуры, свойство ПутьКДанным задаёт путь к реквизиту относительно данных формы.
Стандартные подсистемы (БСП) оборачивают это в процедуру ОбщегоНазначения.СообщитьПользователю(). Она принимает текст, ключ данных и поле, поэтому в конфигурациях на БСП удобнее вызывать её, а не собирать объект вручную.
Особенности вывода: клиент и сервер
Сообщить() доступен и в клиентском, и в серверном коде. Но на сервере сообщение не появляется мгновенно. Оно копится в контексте сеанса и уходит клиенту, когда серверный вызов завершится.
Отсюда частая жалоба: «в цикле на сервере вывожу прогресс, а на экране ничего нет до самого конца». Это нормально. Для длительных операций применяйте фоновые задания и индикатор выполнения, а не поток сообщений.
Ещё несколько правил:
- ⚠️ Не вызывайте
Сообщить()в обработчиках, которые срабатывают тысячи раз (проведение с большим числом строк, обход справочника). Окно переполнится, а клиент замедлится. - 📌 В фоновом задании сообщения не показываются в окне пользователя сразу. Их забирают методом
ПолучитьСообщенияПользователю()объекта задания. - 🔒 Внешнему соединению (COM) или веб-сервису окно сообщений не нужно: там сообщения читают программно или пишут в журнал.
Другие способы показать информацию пользователю
Окно сообщений — не единственный вариант. Выбирайте под задачу:
| Способ | Когда использовать |
|---|---|
ПоказатьПредупреждение() | Нужно остановить пользователя, пока он не прочтёт |
ПоказатьВопрос() | Нужен ответ «да/нет» |
ПоказатьОповещениеПользователя() | Короткая всплывающая подсказка без блокировки |
Состояние() | Текст в строке состояния во время долгой операции |
Сообщить() | Список замечаний, которые можно прочесть и продолжить работу |
Для критичных ошибок не ограничивайтесь окном сообщений: пользователь может не заметить его на фоне другой формы. Если операцию нужно прервать, вызовите исключение, и платформа покажет понятное окно.
Инструменты отладки вместо «Сообщить»
Пока кода мало, Сообщить() справляется. Когда ветвлений становится много, удобнее встроенный отладчик Конфигуратора.
Точки останова и шаги
- Откройте модуль в Конфигураторе.
- Поставьте точку останова на нужной строке клавишей
F9. - Запустите отладку и воспроизведите действие в Предприятии.
- Когда выполнение остановится, идите по строкам:
F10— шаг без захода в процедуру,F11— с заходом.
На остановке значения переменных видны в окне «Локальные переменные». Любое выражение можно вычислить через Shift+F9, не меняя код. Это заменяет десятки временных сообщений.
Условная точка останова срабатывает только при заданном условии. Удобно, когда ошибка проявляется на одной строке из тысячи: ставите условие по коду номенклатуры, и отладчик не будет останавливаться на остальных.
Вывод в журнал регистрации
Если нужно сохранить след, который не пропадёт при закрытии программы, пишите в журнал регистрации:
ЗаписьЖурналаРегистрации(
"Загрузка.Прайс",
УровеньЖурналаРегистрации.Информация,
,
,
"Загружено позиций: " + Формат(Количество, "ЧГ=0"));
Первый параметр — имя события, по нему потом удобно фильтровать. Читать записи можно в разделе Администрирование в блоке «Поддержка и обслуживание», пункт «Журнал регистрации». В других конфигурациях пункт может находиться в другом месте — тогда найдите его через Все функции или поиск по командам.
Журнал хорош для длинных заданий и регламентных операций, которые выполняются без участия пользователя. Окно сообщений в них бесполезно.
Консоль кода и внешние обработки
Консоль кода — обработка, в которую вводят фрагмент на встроенном языке и выполняют его без изменения конфигурации. Её запускают как внешнюю обработку через меню открытия файла. Есть готовые версии, распространяемые отдельно, а свою можно собрать за полчаса.
Принцип работы: текст кода берётся из поля формы и выполняется через Выполнить(Код). Вызов Сообщить() внутри выполняемого фрагмента показывает результат в обычной панели. Типичный сценарий:
Выборка = Справочники.Номенклатура.Выбрать();
Счётчик = 0;
Пока Выборка.Следующий() Цикл
Если Выборка.ПометкаУдаления Тогда
Счётчик = Счётчик + 1;
КонецЕсли;
КонецЦикла;
Сообщить("Помечено на удаление: " + Формат(Счётчик, "ЧГ=0"));
Так можно быстро проверить гипотезу на рабочих данных, не создавая обработку.
Что стоит учитывать:
- ⚠️ Консоль выполняет код с правами текущего пользователя. Запрос, который что-то записывает или удаляет, изменит реальную базу.
- 🔐 Запускайте внешние обработки только из надёжных источников: такой файл может выполнить любой код.
- 🧪 Изменяющие данные эксперименты делайте на копии базы.
Внешняя обработка подключается без перезапуска конфигурации, поэтому консоль удобна и для администратора: проверить состояние справочника, подсчитать записи, посмотреть значение константы.
Технологический журнал и логирование событий
Технологический журнал пишет сама платформа. Он фиксирует исключения, длительные вызовы, блокировки и обращения к СУБД. Окно сообщений для этого не годится, а журнал даёт полную картину.
Включается он файлом logcfg.xml в каталоге conf внутри каталога установки платформы. Минимальный пример: писать только исключения.
<?xml version="1.0" encoding="UTF-8"?>
<config xmlns="http://v8.1c.ru/v8/tech-log">
<log location="C:\1c-logs" history="24">
<event>
<eq property="name" value="EXCP"/>
</event>
<property name="all"/>
</log>
</config>
Параметр location — папка для логов, history — сколько часов хранить файлы. Событие EXCP фиксирует исключения, и по нему видно, какой вызов и на какой строке упал.
Что важно знать:
- Каталог для логов должен существовать, а учётная запись, под которой работает сервер 1С, — иметь право записи в него.
- Если условия отбора не заданы, журнал быстро разрастётся. Фильтруйте по имени события и держите
historyнебольшим. - После работы уберите настройку или верните узкий отбор: подробный журнал нагружает диск.
- Файлы журнала открывают как текст, хотя структурой они похожи на строки с полями через запятую.
Не оставляйте технологический журнал включённым на рабочем сервере без ограничений. За сутки подробной записи диск может заполниться.
Для разовой диагностики достаточно события EXCP плюс событий вызовов сервера. Если же нужна статистика по долгим запросам, добавляют события обращений к СУБД и фильтр по длительности.
Сообщения из фонового задания
У фонового задания собственный контекст, и окно пользователя оно напрямую не заполняет. Сообщения, которые задание вывело через Сообщить(), сохраняются, и их можно получить из объекта задания методом ПолучитьСообщенияПользователю(). Обычно это делают в обработчике ожидания на клиенте: проверяют состояние задания, забирают накопленные сообщения и показывают их.
Порядок такой:
- Запустите задание через
ДлительныеОперации.ВыполнитьВФоне()(в конфигурациях на БСП) или напрямую черезФоновыеЗадания.Выполнить(). - Подключите обработчик ожидания, который периодически опрашивает задание.
- Пока задание активно, забирайте новые сообщения и выводите их.
- После завершения проверьте, не закончилось ли оно ошибкой, и покажите итог.
Так пользователь видит ход работы, а форма не «зависает» в серверном вызове. Если же задание регламентное и запускается по расписанию, все важные события пишите в журнал регистрации: читать сообщения некому.
Как выбрать способ вывода
Короткая памятка по задачам:
- 🔹 Нужно просто сообщить результат и не мешать работе:
Сообщить(). - 🔹 Нужно указать на конкретное поле:
СообщениеПользователюс полем и путём к данным. - 🔹 Нужна гарантия, что текст прочтут:
ПоказатьПредупреждение(). - 🔹 Нужно разобраться, почему код ведёт себя странно: отладчик, а не десяток сообщений.
- 🔹 Нужно сохранить след на дни и недели: журнал регистрации.
- 🔹 Нужно понять причину падения на сервере: технологический журнал с событием
EXCP.
Практический совет по порядку: сначала отладчик, затем журнал регистрации, и только потом технологический журнал. Каждый следующий инструмент тяжелее предыдущего, а информацию на проблему чаще всего даёт один из первых двух.
Частые ошибки и способы их устранения
Эти симптомы встречаются чаще других.
Сообщения не появляются совсем. Проверьте, что код вообще выполняется: поставьте точку останова. Нередко процедура не вызывается из-за условия выше по тексту. Второй вариант — вызов идёт в фоновом задании, где окно сообщений не показывается.
Сообщение появляется, но пропадает. Панель очищается при открытии другой формы или закрытии текущей. Если после Сообщить() вы тут же открываете форму, текст исчезает за доли секунды. Вместо этого используйте ПоказатьПредупреждение() или откройте форму после закрытия сообщения.
Клик по сообщению не переводит к полю. Скорее всего, использован простой Сообщить(). Нужен объект СообщениеПользователю с заполненными Поле и ПутьКДанным, а также корректное имя реквизита.
В тексте вместо числа странный набор символов или пробелы в разрядах. Число показано со своим форматом. Передавайте его через Формат(Число, "ЧГ=0"), если разделители не нужны.
Журнал регистрации пуст. Проверьте фильтр по периоду и по пользователю. Другая причина — события вообще не записываются: имя события в ЗаписьЖурналаРегистрации не должно быть пустым.
Технологический журнал не создаётся. Обычно дело в неверном пути в location или в отсутствии прав на папку. Ещё одна ловушка — ошибка в XML: платформа молча игнорирует неправильный файл. Проверяйте, что теги закрыты и пространство имён указано точно как в примере.
Частые вопросы
Можно ли открыть окно сообщений в 1С вручную, если сообщений нет?
Вид.Чем `Сообщить()` отличается от `ПоказатьПредупреждение()`?
Сообщить() не блокирует работу и складывает текст в панель. ПоказатьПредупреждение() открывает окно, которое нужно закрыть, поэтому подходит для критичных случаев.Почему серверные сообщения приходят все сразу?
Как сделать так, чтобы сообщение привело к нужному полю?
Новый СообщениеПользователю, заполните Текст, Поле и при необходимости ПутьКДанным, затем вызовите Сообщить() у объекта.Где посмотреть то, что было выведено вчера?
ЗаписьЖурналаРегистрации.