В работе с 1С:Предприятие часто требуется информировать пользователя о результатах операций, ошибках или запросить подтверждение действий. От способа вывода сообщения зависит не только удобство работы, но и защита от случайных ошибок. Например, простое уведомление Сообщить() подойдёт для отладки, а модальное окно с кнопками "Да/Нет" — для критичных операций вроде удаления документов.

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

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

1. Простое сообщение: метод Сообщить()

Самый базовый способ вывести текст пользователю — функция Сообщить(). Она отображает сообщение в окне сообщений (внизу экрана в толстом клиенте) или в журнале сообщений (для фоновых задач). Главные плюсы:

  • 🔹 Не блокирует выполнение кода (асинхронный вывод).
  • 🔹 Работает во всех режимах (тонкий клиент, веб, мобильное приложение).
  • 🔹 Поддерживает форматирование с помощью СтрШаблон().

Пример вывода сообщения с переменной:

Перем ИмяПользователя;

ИмяПользователя = ПользователиИнформационнойБазы.ТекущийПользователь().Имя;

Сообщить(СтрШаблон("Привет, %1! Ваша сессия активна.", ИмяПользователя));

⚠️ Внимание: В фоновых заданиях сообщения из Сообщить() попадают в журнал заданий, но не показываются пользователю напрямую. Чтобы уведомить пользователя о результате фона, используйте ОтправитьОповещениеПользователю() (см. раздел 5).

Ограничения метода:

  • 🚫 Не подходит для запроса подтверждения (нет кнопок "ОК/Отмена").
  • 🚫 В веб-клиенте сообщение может потеряться среди других уведомлений браузера.
  • 🚫 Не поддерживает HTML-разметку (только текст).
💡

Чтобы вывести сообщение в конкретное место формы (например, над таблицей), создайте реквизит формы типа "Поле HTML-документа" и управляйте его содержимым через код: ЭлементыФормы.МоёПоле.Значение = "<div style='color:red'>Ошибка!</div>".

2. Модальные окна: ПоказатьВопрос() и Предупреждение()

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

Метод Назначение Возвращаемое значение Пример
Предупреждение() Вывод предупреждения с кнопкой "ОК" Нет (просто блокирует выполнение) Предупреждение("Документ не проведён!", 60);
ПоказатьВопрос() Запрос подтверждения (Да/Нет) Истина (Да) или Ложь (Нет) Если ПоказатьВопрос("Удалить документ?", РежимДиалогаВопрос.ДаНет) Тогда ...
Вопрос() Устаревший аналог ПоказатьВопрос() 1 (Да), 0 (Нет) Если Вопрос("Продолжить?", "Да|Нет", 60, "Внимание!") = 1 Тогда ...

Ключевые параметры ПоказатьВопрос():

  • 📌 РежимДиалогаВопрос.ДаНетОтмена — добавляет третью кнопку.
  • 📌 Таймаут (в секундах) — автоматическое закрытие окна.
  • 📌 Заголовок — текст в шапке окна (по умолчанию "1С:Предприятие").

Пример с обработкой всех вариантов ответа:

Результат = ПоказатьВопрос(

"Сохранить изменения перед закрытием?",

РежимДиалогаВопрос.ДаНетОтмена,

30,

"Подтверждение"

);

Если Результат = КодВозвратаДиалога.Да Тогда

СохранитьДанные();

ИначеЕсли Результат = КодВозвратаДиалога.Нет Тогда

ЗакрытьБезСохранения();

КонецЕсли;

⚠️ Внимание: В тонком клиенте модальные окна могут не отображаться, если пользователь работает через терминальный сервер с ограниченными правами. Проверьте настройки безопасности сервера или используйте альтернативные методы (см. раздел 4).
📊 Какой метод вывода сообщений используете чаще?
Сообщить()
ПоказатьВопрос()
Предупреждение()
Свои формы уведомлений

3. Статусные сообщения в формах: Статус() и ПоказатьОповещениеПользователя()

Для отображения временных уведомлений прямо в интерфейсе формы (без блокировки работы) используйте:

  • 🔸 Статус(Текст, Режим = 0) — показывает текст в строке состояния формы (исчезает при обновлении).
  • 🔸 ПоказатьОповещениеПользователя(Текст, УникальныйИдентификатор) — выводит "тост"-уведомление в правом нижнем углу (как в мобильных приложениях).

Пример использования ПоказатьОповещениеПользователя():

ПоказатьОповещениеПользователя(

"Документ №123 сохранён в 10:45",

"СообщениеОСохранении_" + ТекущийДокумент.Ссылка.УникальныйИдентификатор()

);

Особенности:

  • ✅ Уведомления не мешают работе (не модальные).
  • ✅ Можно закрывать программно: ЗакрытьОповещениеПользователя(Идентификатор).
  • ❌ В обычных формах (не управляемых) работает только Статус().
Как сделать уведомление с кнопкой "Закрыть"

Используйте ПоказатьОповещениеПользователя() с HTML-разметкой:

ТекстУведомления = "<div>Ошибка загрузки! <button onclick='ЗакрытьОповещение(""МоёУведомление"")'>Закрыть</button></div>";

ПоказатьОповещениеПользователя(ТекстУведомления, "МоёУведомление");

Важно: Для этого нужно подключить обработчик на клиенте через JavaScript (только для веб-клиента).

4. Альтернативные способы: HTML-окна и внешние компоненты

Если стандартных методов недостаточно (например, нужно показать кастомное окно с картинкой или таблицей данных), используйте:

  • 🌐 Поле HTML-документа в форме — для вывода форматированного текста, графиков, даже мини-сайтов.
  • 📦 Внешние компоненты (например, OneScript.Forms) — для создания полноценных диалоговых окон.
  • 📱 Мобильные уведомления — через МобильноеПриложениеКлиент.ПоказатьУведомление().

Пример вывода HTML-окна с таблицей:

// Создаём форму с полем HTML

Форма = Новый Форма;

Форма.ДобавитьРеквизит("МоёHTMLПоле", Новый ОписаниеТипов("HTMLДокумент"));

Элемент = Форма.ЭлементыФормы.Добавить("МоёHTMLПоле", Тип("ПолеHTMLДокумента"));

Элемент.Высота = 300;

// Формируем HTML-контент

HTMLТекст = "

|

|

|

|

ДатаСумма
01.05.202610 000 руб.

|

Внимание! Превышен лимит!

";

Форма.МоёHTMLПоле.УстановитьТекст(HTMLТекст);

Форма.Открыть();

⚠️ Внимание: При использовании внешних компонент проверьте их совместимость с текущей версией 1С:Предприятие. Некоторые решения (например, Advantshop или Infostart Workflow) могут конфликтовать с обновлениями платформы.

5. Уведомления в фоновых заданиях: ОтправитьОповещениеПользователю()

Фоновые задания выполняются без взаимодействия с пользователем, поэтому стандартные Сообщить() или ПоказатьВопрос() не работают. Чтобы уведомить пользователя о результате фона, используйте:

ОтправитьОповещениеПользователю(

Пользователь, // Ссылка на пользователя (например, ПользователиИнформационнойБазы.НайтиПоИмени("Иванов"))

"Задание завершено!", // Текст уведомления

"Результаты обработки", // Заголовок

Истина, // Показывать немедленно

Ложь // Не отправлять на email

);

Где будет показано уведомление:

  • 📌 В личном кабинете пользователя в разделе "Оповещения".
  • 📌 В мобильном приложении 1С (если включены push-уведомления).
  • 📌 На email (если последний параметр = Истина).

Важно: Уведомления через ОтправитьОповещениеПользователю() сохраняются в базе данных и могут быть прочитаны позже, даже если пользователь был offline в момент отправки.

Проверьте права пользователя на чтение оповещений|Укажите корректный email в карточке пользователя|Настройте расписание фонового задания с учётом пиковых нагрузок|Протестируйте отправку на тестовом пользователе-->

6. Системные уведомления без программирования

Если вы не программист, но нужно настроить уведомления для пользователей, используйте встроенные механизмы платформы:

  • 📋 Подписки на события (например, "Изменение статуса документа") — настраиваются в Администрирование → Подписки на события.
  • 📧 Рассылки отчётов — автоматические email-уведомления с результатами отчётов (настраивается в каждом отчёте индивидуально).
  • 🔔 Оповещения о просроченных задачах — в модуле "Задачи" (для конфигураций с поддержкой бизнес-процессов).

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

  1. Откройте Администрирование → Подписки на события.
  2. Создайте новую подписку, выберите объект (например, "Документ ЗаказПокупателя").
  3. Укажите событие: "При записи" или "При проведении".
  4. В поле "Получатели" добавьте пользователей или роли.
  5. Задайте текст уведомления с использованием %Параметр% (например, Заказ №%Номер% на сумму %СуммаДокумента% проведён).
⚠️ Внимание: Системные уведомления не поддерживают интерактивные элементы (кнопки, ввод данных). Для таких сценариев потребуется доработка конфигурации.

7. Типичные ошибки и как их избежать

Даже опытные разработчики сталкиваются с проблемами при работе с сообщениями в 1С. Рассмотрим TOP-5 ошибок и их решения:

Ошибка Причина Решение
Сообщение не показывается в веб-клиенте Блокировка всплывающих окон браузером Добавьте сайт в исключения блокировщика или используйте ПоказатьОповещениеПользователя()
ПоказатьВопрос() возвращает Неопределено Окно закрыто по таймауту или крестиком Проверяйте результат: Если Результат = Неопределено Тогда ...
Уведомление дублируется Один и тот же идентификатор используется многократно Генерируйте уникальный ID: УникальныйИдентификатор() + ТекущаяДата()
HTML-разметка не отображается Не включён режим HTML в поле формы Установите свойство ТолькоПросмотр = Ложь и HTMLДокумент = Истина
Фоновое задание "зависло" на Сообщить() Метод не поддерживается в фоне Замените на ЗаписатьЖурналРегистрации() или ОтправитьОповещениеПользователю()

Для отладки сообщений используйте журнал регистрации:

ЗаписатьЖурналРегистрации(

НСтр("ru = 'Тестовое сообщение'"),

УровеньЖурналаРегистрации.Информация,

,

, Истина // Показать пользователю

);

- В тонком клиенте (если пользователи работают через RDP).

- В мобильном приложении (для push-уведомлений).

- При низкой скорости интернета (для веб-клиента).-->

FAQ: Частые вопросы по сообщениям в 1С

Как показать сообщение с прогресс-баром?

Используйте ПоказатьПрогресс() в цикле обработки:

Прогресс = Новый ПрогрессОбработки("Обработка данных...");

Прогресс.ВсегоШагов = 100;

Для Сч = 1 По 100 Цикл

Прогресс.ТекущийШаг(Сч);

// Ваш код

КонецЦикла;

В фоновых заданиях прогресс-бар не отображается — используйте запись в журнал.

Можно ли отправить сообщение на email из 1С?

Да, через:

  1. Встроенную почту: Почта.Отправить() (требует настройки SMTP в администрировании).
  2. HTTP-запросы к API почтового сервиса (например, Mailgun или SendPulse).
  3. Внешние обработки (например, "Помощник отправки писем" с Infostart).

Пример кода для SMTP:

Почта = Новый Почта;

Сообщение = Новый ПочтовоеСообщение;

Сообщение.Текст = "Тело письма";

Сообщение.Тема = "Уведомление из 1С";

Сообщение.Получатели.Добавить("user@example.com");

Почта.Отправить(Сообщение);

Как сделать сообщение с таймером обратного отсчёта?

Используйте комбинацию ПоказатьВопрос() с таймаутом и JavaScript (для веб-клиента):

ТекстВопроса = "Окно закроется автоматически через 10 секунд...

|";

ПоказатьВопрос(ТекстВопроса, , 10);

Для управляемых форм создайте реквизит ОставшеесяВремя и обновляйте его через УстановитьИнтервал().

Почему ПоказатьОповещениеПользователя() не работает в мобильном приложении?

Проверьте:

  • 📱 В настройках мобильного клиента включены push-уведомления.
  • 🔄 Пользователь авторизован в приложении (сессия активна).
  • 📡 На сервере 1С настроен сервис оповещений (порт 1545 по умолчанию).

Для теста используйте:

МобильноеПриложениеКлиент.ПоказатьУведомление("Тест", "Это тестовое уведомление");
Как локализовать сообщения для разных языков?

Используйте многоязычные строки:

ТекстСообщения = НСтр("ru = 'Документ сохранён';

en = 'Document saved';

kk = 'Құжат сақталды'");

Сообщить(ТекстСообщения);

Для динамического определения языка:

ТекущийЯзык = НСтр("ru = 'Русский'; en = 'English'");

Если ТекущийЯзык = "Русский" Тогда

// Логика для русского

КонецЕсли;