В работе с 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.2026 10 000 руб.
|
|
Внимание! Превышен лимит!
";
Форма.МоёHTMLПоле.УстановитьТекст(HTMLТекст);
Форма.Открыть();
⚠️ Внимание: При использовании внешних компонент проверьте их совместимость с текущей версией 1С:Предприятие. Некоторые решения (например, Advantshop или Infostart Workflow) могут конфликтовать с обновлениями платформы.
5. Уведомления в фоновых заданиях: ОтправитьОповещениеПользователю()
Фоновые задания выполняются без взаимодействия с пользователем, поэтому стандартные Сообщить() или ПоказатьВопрос() не работают. Чтобы уведомить пользователя о результате фона, используйте:
ОтправитьОповещениеПользователю(
Пользователь, // Ссылка на пользователя (например, ПользователиИнформационнойБазы.НайтиПоИмени("Иванов"))
"Задание завершено!", // Текст уведомления
"Результаты обработки", // Заголовок
Истина, // Показывать немедленно
Ложь // Не отправлять на email
);
Где будет показано уведомление:
- 📌 В личном кабинете пользователя в разделе "Оповещения".
- 📌 В мобильном приложении 1С (если включены push-уведомления).
- 📌 На email (если последний параметр =
Истина).
Важно: Уведомления через ОтправитьОповещениеПользователю() сохраняются в базе данных и могут быть прочитаны позже, даже если пользователь был offline в момент отправки.
Проверьте права пользователя на чтение оповещений|Укажите корректный email в карточке пользователя|Настройте расписание фонового задания с учётом пиковых нагрузок|Протестируйте отправку на тестовом пользователе-->
6. Системные уведомления без программирования
Если вы не программист, но нужно настроить уведомления для пользователей, используйте встроенные механизмы платформы:
- 📋 Подписки на события (например, "Изменение статуса документа") — настраиваются в
Администрирование → Подписки на события. - 📧 Рассылки отчётов — автоматические email-уведомления с результатами отчётов (настраивается в каждом отчёте индивидуально).
- 🔔 Оповещения о просроченных задачах — в модуле "Задачи" (для конфигураций с поддержкой бизнес-процессов).
Пример настройки подписки на событие:
- Откройте
Администрирование → Подписки на события. - Создайте новую подписку, выберите объект (например, "Документ ЗаказПокупателя").
- Укажите событие: "При записи" или "При проведении".
- В поле "Получатели" добавьте пользователей или роли.
- Задайте текст уведомления с использованием
%Параметр%(например,Заказ №%Номер% на сумму %СуммаДокумента% проведён).
⚠️ Внимание: Системные уведомления не поддерживают интерактивные элементы (кнопки, ввод данных). Для таких сценариев потребуется доработка конфигурации.
7. Типичные ошибки и как их избежать
Даже опытные разработчики сталкиваются с проблемами при работе с сообщениями в 1С. Рассмотрим TOP-5 ошибок и их решения:
| Ошибка | Причина | Решение |
|---|---|---|
| Сообщение не показывается в веб-клиенте | Блокировка всплывающих окон браузером | Добавьте сайт в исключения блокировщика или используйте ПоказатьОповещениеПользователя() |
ПоказатьВопрос() возвращает Неопределено |
Окно закрыто по таймауту или крестиком | Проверяйте результат: Если Результат = Неопределено Тогда ... |
| Уведомление дублируется | Один и тот же идентификатор используется многократно | Генерируйте уникальный ID: УникальныйИдентификатор() + ТекущаяДата() |
| HTML-разметка не отображается | Не включён режим HTML в поле формы | Установите свойство ТолькоПросмотр = Ложь и HTMLДокумент = Истина |
Фоновое задание "зависло" на Сообщить() |
Метод не поддерживается в фоне | Замените на ЗаписатьЖурналРегистрации() или ОтправитьОповещениеПользователю() |
Для отладки сообщений используйте журнал регистрации:
ЗаписатьЖурналРегистрации(
НСтр("ru = 'Тестовое сообщение'"),
УровеньЖурналаРегистрации.Информация,
,
, Истина // Показать пользователю
);
- В тонком клиенте (если пользователи работают через RDP).
- В мобильном приложении (для push-уведомлений).
- При низкой скорости интернета (для веб-клиента).-->
FAQ: Частые вопросы по сообщениям в 1С
Как показать сообщение с прогресс-баром?
Используйте ПоказатьПрогресс() в цикле обработки:
Прогресс = Новый ПрогрессОбработки("Обработка данных...");
Прогресс.ВсегоШагов = 100;
Для Сч = 1 По 100 Цикл
Прогресс.ТекущийШаг(Сч);
// Ваш код
КонецЦикла;
В фоновых заданиях прогресс-бар не отображается — используйте запись в журнал.
Можно ли отправить сообщение на email из 1С?
Да, через:
- Встроенную почту:
Почта.Отправить()(требует настройки SMTP в администрировании). - HTTP-запросы к API почтового сервиса (например, Mailgun или SendPulse).
- Внешние обработки (например, "Помощник отправки писем" с Infostart).
Пример кода для SMTP:
Почта = Новый Почта;
Сообщение = Новый ПочтовоеСообщение;
Сообщение.Текст = "Тело письма";
Сообщение.Тема = "Уведомление из 1С";
Сообщение.Получатели.Добавить("user@example.com");
Почта.Отправить(Сообщение);
Как сделать сообщение с таймером обратного отсчёта?
Используйте комбинацию ПоказатьВопрос() с таймаутом и JavaScript (для веб-клиента):
ТекстВопроса = "Окно закроется автоматически через 10 секунд...
|
| setTimeout(function(){ window.close(); }, 10000);
|";
ПоказатьВопрос(ТекстВопроса, , 10);
Для управляемых форм создайте реквизит ОставшеесяВремя и обновляйте его через УстановитьИнтервал().
Почему ПоказатьОповещениеПользователя() не работает в мобильном приложении?
Проверьте:
- 📱 В настройках мобильного клиента включены push-уведомления.
- 🔄 Пользователь авторизован в приложении (сессия активна).
- 📡 На сервере 1С настроен сервис оповещений (порт 1545 по умолчанию).
Для теста используйте:
МобильноеПриложениеКлиент.ПоказатьУведомление("Тест", "Это тестовое уведомление");
Как локализовать сообщения для разных языков?
Используйте многоязычные строки:
ТекстСообщения = НСтр("ru = 'Документ сохранён';
en = 'Document saved';
kk = 'Құжат сақталды'");
Сообщить(ТекстСообщения);
Для динамического определения языка:
ТекущийЯзык = НСтр("ru = 'Русский'; en = 'English'");
Если ТекущийЯзык = "Русский" Тогда
// Логика для русского
КонецЕсли;