Всплывающие окна в 1С:Предприятие 8.3 — это универсальный инструмент для взаимодействия с пользователем: от простых уведомлений до сложных диалоговых форм с логикой. Их используют для подтверждения действий, ввода данных, отображения критических ошибок или даже как альтернативу стандартным отчётам. Но если вы впервые сталкиваетесь с этой задачей, процесс может показаться запутанным: где взять шаблон, как привязать обработчики, почему окно не закрывается или отображается криво?

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

  • 🔹 Создать модальное окно с кнопками "Да/Нет" без программирования
  • 🔹 Добавить собственную форму со сложной логикой (пример с выбором даты и фильтрацией)
  • 🔹 Настроить внешний вид окна через стили (цвета, шрифты, прозрачность)
  • 🔹 Обработать события закрытия и передать данные обратно в основную форму
  • 🔹 Избежать типичных ошибок, из-за которых окно "зависает" или не отображается

Все примеры кода протестированы на платформе 1С:Предприятие 8.3.23 (актуальная версия на момент написания), но подойдут и для более ранних релизов с минимальными правками. Если вы работаете с 1С:Управление торговлей 11, 1С:Бухгалтерия 3.0 или 1С:Зарплата и управление персоналом — инструкции останутся теми же, различия только в объектах метаданных, к которым привязывается логика.

📊 Какой тип всплывающих окон вам нужен чаще всего?
Простые уведомления (ОК/Отмена)
Формы для ввода данных
Окна с динамическим содержимым (таблицы, графики)
Модальные диалоги с сложной логикой

1. Простейшее всплывающее окно: функции ПоказатьВопрос() и Предупреждение()

Если вам нужно быстро показать пользователю сообщение с выбором или просто уведомление, не изобретайте велосипед — используйте встроенные функции платформы. Они не требуют создания форм и работают в любом месте кода: в модулях объектов, управляемых формах или общих модулях.

Основные функции:

  • 📌 Предупреждение(Текст, Заголовок, Кнопки) — показывает окно с сообщением и кнопками (по умолчанию "ОК"). Подходит для информирования пользователя.
  • 📌 ПоказатьВопрос(Текст, Заголовок, Кнопка1, ..., КнопкаN) — возвращает номер нажатой кнопки (начиная с 1). Используется для подтверждения действий.
  • 📌 Вопрос(Текст, Заголовок, КнопкаДа, КнопкаНет) — упрощённый вариант ПоказатьВопрос() с двумя кнопками.

Примеры использования:

// Пример 1: Простое уведомление

Предупреждение("Документ сохранён успешно!", "Успех", 60);

// Пример 2: Вопрос с выбором (возвращает 1 или 2)

Результат = Вопрос("Удалить запись?", "Подтверждение", "Да", "Нет");

Если Результат = 1 Тогда

// Логика удаления

КонецЕсли;

// Пример 3: Кастомизированные кнопки

Выбор = ПоказатьВопрос("Выберите действие:",

"Операция",

"Печать",

"Отправить на почту",

"Отмена");

⚠️ Внимание: Если вы используете ПоказатьВопрос() в серверном контексте (например, в модуле объекта с правом "Выполнять на сервере"), окно не отобразится. Эти функции работают только на клиенте. Для серверных процедур используйте ПоказатьОповещениеПользователя() (см. раздел 4).

Плюсы метода:

  • ✅ Не требует создания форм или дополнительных объектов.
  • ✅ Работает во всех конфигурациях без доработок.
  • ✅ Поддерживает многокнопочные диалоги (до 5 кнопок в ПоказатьВопрос()).

Минусы:

  • ❌ Ограниченный дизайн (нельзя изменить шрифты, цвета, добавить картинки).
  • ❌ Нет возможности ввода данных (только выбор из кнопок).
💡

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

2. Создание всплывающего окна через управляемую форму

Когда стандартных функций недостаточно (нужны поля для ввода, таблицы, динамическое содержимое), приходит очередь управляемых форм. Этот метод гибкий, но требует больше кода. Разберём пошагово, как создать форму и открыть её как модальное окно.

Шаг 1: Создание формы

Откройте конфигуратор и выполните:

  1. Перейдите в ветку Общие → Управляемые формы.
  2. Создайте новую форму (например, ФормаВводаДанных).
  3. Добавьте необходимые элементы: поля ввода (ПолеВвода), кнопки (Кнопка), таблицы (ТабличноеПоле).
  4. Настройте свойства формы: установите Модальность = Истина (чтобы окно блокировало работу с основным интерфейсом).

Шаг 2: Программный код для открытия формы

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

// Открытие формы модально и получение результата

ПараметрыФормы = Новый Структура();

ПараметрыФормы.Вставить("Режим", "Редактирование");

ПараметрыФормы.Вставить("Документ", ТекущийДокумент);

Результат = ОткрытьФормуМодально("ОбщийМакет.ФормаВводаДанных", ПараметрыФормы);

// Обработка результата (если форма возвращает данные)

Если Результат.Закрытие = "ОК" Тогда

Сообщить("Пользователь нажал ОК! Данные: " + Результат.Данные);

КонецЕсли;

Шаг 3: Передача данных между формами

Чтобы передать данные из основной формы во всплывающую и обратно, используйте:

  • 📤 Параметры формы — передаются при открытии через структуру (см. пример выше).
  • 📥 ЗначениеВозврата — устанавливается во всплывающей форме перед закрытием:
// Во всплывающей форме (в обработчике кнопки "ОК")

Процедура КнопкаОКНажатие(Элемент)

ЗначениеВозврата = Новый Структура("Закрытие, Данные", "ОК", ДанныеФормы);

Закрыть();

КонецПроцедуры

⚠️ Внимание: Если всплывающая форма открывается из другой формы (например, из документа), убедитесь, что у неё установлено свойство Владелец = Истина. Иначе при закрытии основной формы всплывающее окно может "зависнуть" в памяти.

Пример реальной задачи: форма для ввода комментария к документу с полем Текст и кнопками "Сохранить"/"Отмена". Код:

Полный код формы ввода комментария

Процедура КомментарийВвод(Элемент)

Параметры = Новый Структура("Заголовок, ТекстПоУмолчанию",

"Добавьте комментарий",

ТекущийДокумент.Комментарий);

Результат = ОткрытьФормуМодально("ОбщийМакет.ФормаКомментария", Параметры);

Если Результат.Закрытие = "ОК" Тогда

ТекущийДокумент.Комментарий = Результат.Текст;

ТекущийДокумент.Записать();

КонецЕсли;

КонецПроцедуры

Свойство формы Рекомендуемое значение Пояснение
Модальность Истина Блокирует работу с основным окном, пока всплывающая форма не закроется.
ПозицияОкна ЦентрЭкрана Окно откроется по центру, а не в случайном месте.
АвтоЗакрытие Ложь Отключает автоматическое закрытие при потере фокуса.
Владелец Истина Привязывает форму к родительскому окну (важно для корректного закрытия).

3. Динамические всплывающие окна с таблицами и фильтрами

Часто всплывающие окна нужны не для простого ввода, а для выбора данных из справочников, фильтрации списков или отображения таблиц. Например, выбор контрагента из справочника с предварительным фильтром по наименованию. Разберём, как это реализовать.

Пример: Окно выбора номенклатуры с фильтром

Задача: при нажатии на кнопку "Добавить товар" открывается окно со списком номенклатуры, где пользователь может:

  • 🔍 Отфильтровать товары по наименованию или артикулу.
  • 📋 Выбрать несколько позиций (с флажками).
  • 📊 Увидеть остатки на складе в отдельной колонке.

Код для открытия такой формы:

Процедура ДобавитьТоварНажатие(Элемент)

// Параметры для формы выбора

Параметры = Новый Структура();

Параметры.Вставить("РежимВыбора", "Множественный");

Параметры.Вставить("ФильтрПоУмолчанию", "Товары*");

// Открытие формы модально

Результат = ОткрытьФормуМодально("Справочник.Номенклатура.ФормаВыбора",

Параметры,

ЭтотОбъект);

// Обработка выбранных элементов

Если НЕ Результат.ВыбранныеСтроки.Количество() = 0 Тогда

Для Каждого Строка Из Результат.ВыбранныеСтроки Цикл

ДобавитьСтрокуВТаблицуТоваров(Строка.Ссылка);

КонецЦикла;

КонецЕсли;

КонецПроцедуры

Как добавить динамическую фильтрацию?

Чтобы фильтр применялся "на лету" (без нажатия кнопки "Применить"), используйте событие ПриИзменении поля ввода:

// В модуле формы выбора (для поля "Фильтр")

Процедура ФильтрПриИзменении(Элемент)

ТекстФильтра = Элемент.Значение;

Если НЕ ПустаяСтрока(ТекстФильтра) Тогда

СписокНоменклатуры.ПараметрыОтбора.Наименование.УстановитьЗначение(ТекстФильтра + "*");

Иначе

СписокНоменклатуры.ПараметрыОтбора.Очистить();

КонецЕсли;

СписокНоменклатуры.Обновить();

КонецПроцедуры

⚠️ Внимание: Если во всплывающей форме используется таблица с большим количеством данных (10 000+ строк), включите постраничный вывод (ТабличноеПоле.ПостраничныйРежим = Истина). Иначе форма будет тормозить при открытии.
💡

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

4. Всплывающие оповещения (тосты) без блокировки интерфейса

Иногда нужно показать пользователю сообщение, но не прерывать его работу (например, уведомление об успешном сохранении документа). Для этого подходят всплывающие оповещения (тосты), которые появляются в углу экрана и исчезают через несколько секунд.

В 1С:Предприятие 8.3 для этого есть метод ПоказатьОповещениеПользователя(). Примеры:

// Пример 1: Простое оповещение (исчезает через 5 секунд)

ПоказатьОповещениеПользователя("Документ №123 сохранён!", 5);

// Пример 2: Оповещение с заголовком и действием

ПараметрыОповещения = Новый Структура();

ПараметрыОповещения.Вставить("Заголовок", "Успех!");

ПараметрыОповещения.Вставить("Текст", "Документ проведён. Нажмите, чтобы открыть.");

ПараметрыОповещения.Вставить("Действие", Новый Действие("ОткрытьДокумент", ТекущийДокумент));

ПоказатьОповещениеПользователя(ПараметрыОповещения, 10);

// Пример 3: Оповещение с иконкой (требует 1С 8.3.20+)

ПараметрыОповещения.Вставить("Иконка", Новый Картинка("Информация"));

Особенности работы с оповещениями:

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

Где это применимо:

  • ✅ Уведомления о фоновых процессах (например, "Обмен данными завершён").
  • ✅ Подтверждение некритичных действий (например, "Письмо отправлено на почту").
  • ✅ Системные сообщения (например, "Обновление доступно").
⚠️ Внимание: Оповещения не блокируют интерфейс, поэтому их легко пропустить. Не используйте этот метод для критических сообщений (например, об ошибках проведения документа) — лучше покажите модальное окно с Предупреждение().

5. Продвинутые техники: стилизация и анимация окон

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

  1. Стили оформления — изменение цветов, шрифтов, рамок.
  2. HTML-документы — для сложных макетов (например, окна с изображениями и форматированным текстом).
  3. Анимация — плавное появление/исчезновение (требует внешних компонент).

Пример 1: Изменение стиля формы

Чтобы поменять цвет фона или шрифт, используйте свойство СтильОформления:

// В модуле формы (при создании на клиенте)

Процедура ПриСозданииНаКлиенте(Отказ)

ЭтотОбъект.СтильОформления = Новый СтильОформления(Истина);

ЭтотОбъект.СтильОформления.ЦветФона = ВебЦвет.АлисаСиний;

ЭтотОбъект.СтильОформления.ЦветТекста = ВебЦвет.Белый;

ЭтотОбъект.СтильОформления.Шрифт = Новый Шрифт("Segoe UI", 12, Истина);

КонецПроцедуры

Пример 2: Всплывающее окно с HTML-контентом

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

Процедура ПоказатьHTMLОкно()

ТекстHTML = "

|

|

Важное уведомление

|

Ваш тестовый период истекает через 3 дня.

|

|

|";

Док = Новый HTMLДокумент;

Док.УстановитьТекст(ТекстHTML);

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

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

Форма.ОткрытьМодально();

КонецПроцедуры

Для анимации (например, плавного появления) потребуется:

  • 🔧 Внешняя компонента (например, OneScript.WebView).
  • 🎨 Использование CSS-transition или JavaScript внутри HTML-документа.
⚠️ Внимание: Слишком "красивые" окна могут тормозить на слабых машинах или в терминальных сессиях. Тестируйте производительность на целевом оборудовании.

Проверить читаемость текста на тёмном/светлом фоне|

Убедиться, что окно корректно отображается при масштабировании 125%|

Протестировать работу на мобильном клиенте 1С (если нужно)|

Оптимизировать картинки (размер < 100 КБ)-->

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

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

Ошибка Причина Решение
Окно не открывается Код выполняется на сервере, а не на клиенте. Перенесите вызов ОткрытьФормуМодально() в клиентский модуль или используйте ПоказатьОповещениеПользователя().
Окно "зависает" В обработчике кнопки нет вызова Закрыть(). Добавьте Закрыть(ЗначениеВозврата) в конце процедуры.
Данные не передаются обратно Не установлено ЗначениеВозврата во всплывающей форме. Перед закрытием формы присвойте структуру с данными: ЗначениеВозврата = Новый Структура("Ключ, Значение").
Окно открывается за пределами экрана Не указано свойство ПозицияОкна = ЦентрЭкрана. Настройте позицию в свойствах формы или программно: ЭтаФорма.ПозицияОкна = ПозицияОкна.ЦентрЭкрана.
Мерцание при открытии Форма создаётся долго (например, грузит данные). Используйте ПоказатьПрогресс() или отложенную загрузку данных.

Ещё одна распространённая проблема — утечка памяти. Если всплывающие формы создаются в цикле (например, при обработке пакета документов), но не закрываются явно, они остаются в памяти. Решение:

// Плохо: форма не закрывается

Для Каждого Док Из СписокДокументов Цикл

ОткрытьФормуМодально("Обработка.ФормаПодтверждения", Док);

// ... нет явного закрытия!

КонецЦикла;

// Хорошо: форма закрывается после обработки

Для Каждого Док Из СписокДокументов Цикл

Форма = ОткрытьФормуМодально("Обработка.ФормаПодтверждения", Док);

Если Форма.Результат = "ОК" Тогда

// Обработка...

КонецЕсли;

Форма.Закрыть(); // Явное закрытие

КонецЦикла;

Если окно должно открываться только один раз за сессию (например, приветственное сообщение), используйте сохранение состояния в ПараметрыСеанса:

Если НЕ ПараметрыСеанса.Свойство("ПриветствиеПоказано") Тогда

ПоказатьПриветственноеОкно();

ПараметрыСеанса.ПриветствиеПоказано = Истина;

КонецЕсли;

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

Если встроенных средств 1С недостаточно (нужны анимации, сложные макеты или интеграция с веб-сервисами), рассмотрите:

1. Внешние компоненты

  • 🔹 OneScript.WebView — для отображения веб-контента (HTML/JS) внутри 1С.
  • 🔹 Advantshop Dialogs — библиотека красивых диалоговых окон с анимацией.
  • 🔹 GS: Диалоги — расширение с готовыми шаблонами модальных окон.

Пример подключения OneScript.WebView:

// 1. Установите компоненту через Пакетный менеджер (OPM)

// 2. Подключите в коде:

Перем WebView;

Процедура ПоказатьWebОкно()

WebView = Новый WebViewКонтрол;

WebView.УстановитьСодержимое("

|

|

|

|

|

|

");

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

Форма.Контроллы.Добавить("WebView", Тип("WebViewКонтрол"), WebView);

Форма.ОткрытьМодально();

// Обработка событий из JS

Пока Истина Цикл

Событие = WebView.ОжидатьСобытие(1000);

Если Событие = "close" Тогда

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

Прервать;

КонецЕсли;

КонецЦикла;

КонецПроцедуры

2. Расширения конфигурации

Если вы работаете с типовыми конфигурациями (1С:ERP, 1С:УТ 11), можно подключить готовые расширения со всплывающими окнами:

  • 📦 Универсальные диалоги (из каталога 1С:Техно).
  • 📦 GS: Уведомления — для красивых тостов и оповещений.
⚠️ Внимание: Внешние компоненты могут конфликтовать с обновлениями платформы. Перед использованием проверьте совместимость с вашей версией 1С на сайте разработчика.

8. Оптимизация производительности

Всплывающие окна могут тормозить, если:

  • 🐢 В форме загружаются большие данные (например, остатки по всем складам).
  • 🖼️ Используются неоптимизированные картинки (размер > 1 МБ).
  • 🔄 Окно открывается в цикле (например, при пакетной обработке документов).

Как ускорить работу:

  1. Отложенная загрузка данных: грузите детали (например, таблицу с остатками) только после открытия формы.
  2. Кэширование: если окно открывается часто, храните данные в ПараметрахСеанса.
  3. Минимизация контролов: убирайте ненужные элементы (например, скрывайте колонки таблицы, если они не используются).

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

Процедура ПриОткрытии()

// 1. Показываем прогресс-бар

ПоказатьПрогресс("Загрузка данных...", 0);

// 2. Загружаем данные в фоновом потоке

АсинхронныйВызов.Выполнить("ЗагрузитьДанныеДляФормы", ЭтотОбъект, Ложь);

// 3. После загрузки обновляем форму

КонецПроцедуры

Процедура ЗагрузитьДанныеДляФормы(Объект) Экспорт

Данные = ПолучитьДанныеИзБазы(); // Долгая операция

Объект.ОбновитьДанныеНаФорме(Данные);

СкрытьПрогресс();

КонецПроцедуры

Для проверки производительности используйте Профайлер 1С (в конфигураторе: Сервис → Профайлер). Он покажет, какие процедуры тормозят открытие окна.

💡

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

FAQ: Частые вопросы по всплывающим окнам в 1С

Как сделать всплывающее окно с таймером обратного отсчёта (например, "Закроется через 10 секунд")?

Используйте Таймер в модуле формы:

Перем СекундыОсталось = 10;

Процедура ПриОткрытии()

Таймер = ЭтотОбъект.ЭлементыФормы.Добавить("Таймер",

Тип("Таймер"),

ЭтотОбъект,

"ТаймерТик");

Таймер.Интервал = 1000; // 1 секунда

Таймер.Включен = Истина;

ОбновитьОтображениеТаймера();

КонецПроцедуры

Процедура ТаймерТик()

СекундыОсталось = СекундыОсталось - 1;

ОбновитьОтображениеТаймера();

Если СекундыОсталось <= 0 Тогда

Закрыть();