При работе с тяжелыми или объемными отчетами в 1С пользователи часто сталкиваются с ситуацией, когда система надолго блокирует интерфейс (появляется так называемый «крутящийся бублик»). В этот момент экономисты, бухгалтеры и аналитики вынуждены просто ждать завершения процесса, теряя рабочее время. Отличным решением является вывод всплывающего системного уведомления с помощью платформенного метода ПоказатьОповещениеПользователя. Такое окно покажется поверх других окон, даже если пользователь в этот момент переключился на другую задачу (например, работает в браузере или таблицах Excel).
В этой статье мы подробно разберем, как правильно внедрить такое оповещение во внешний отчет на управляемых формах в 1С:Предприятии 8.3, исправим распространенные ошибки начинающих разработчиков и рассмотрим альтернативные (более продвинутые) варианты фонового формирования отчетов.
Прежде чем переходить к написанию кода, проанализируем важный архитектурный аспект платформы 1С. Любое всплывающее окно, диалог или интерактивное действие относится к клиентскому контексту (выполняется на компьютере пользователя). Формирование самого отчета (компоновка данных, выполнение запросов к базе данных, расчет итогов) всегда происходит на сервере.
Именно поэтому стандартное предопределенное событие модуля объекта отчета ПриКомпоновкеРезультата выполняется строго на сервере. Попытка вызвать из него функцию ПоказатьОповещениеПользователя приведет к критической ошибке: «Процедура или функция с указанным именем не определена». Клиентские методы физически недоступны на сервере приложения.
Для решения этой задачи нам потребуется создать собственную форму отчета и переопределить стандартную команду формирования, чтобы управлять процессом «клиент — сервер — клиент» вручную.
Разберем по шагам, как реализовать вывод оповещения, создав собственную форму отчета и изменив логику работы стандартной кнопки.
СформироватьОтчет. Задайте ей понятный заголовок, например, «Сформировать».СформироватьОтчет в списке команд, откройте ее свойства и нажмите на лупу в поле Действие. Выберите вариант создания обработчика Создать на клиенте.Теперь перейдем в модуль созданной формы отчета. ИИ-помощники часто генерируют код с грубой ошибкой, пытаясь вызвать метод СкомпоноватьРезультат через ключевое слово ЭтотОбъект внутри серверного контекста формы. В контексте управляемой формы ЭтотОбъект указывает на саму форму, у которой нет такого метода, что вызывает сбой системы. Выясним, как написать этот код правильно.
Рассмотрим корректный и лаконичный вариант программного кода для модуля управляемой формы:
&НаКлиенте
Процедура СформироватьОтчет(Команда)
// Очищаем окно сообщений перед новым запуском
ОчиститьСообщения();
// Сформируем отчет напрямую с клиента с помощью стандартного метода расширения формы отчета
СкомпоноватьРезультат();
// Настраиваем всплывающее оповещение после успешного завершения компоновки
ДействиеПриКлике = Новый ОписаниеОповещения("АктивироватьОкноОтчета", ЭтотОбъект);
ПоказатьОповещениеПользователя(
"Отчет сформирован", // Текст заголовка оповещения
ДействиеПриКлике, // Действие, выполняемое при клике на всплывающее окно
"Нажмите для перехода к результатам", // Поясняющий текст
БиблиотекаКартинок.ВыполненоУспешно // Стандартная иконка успешного выполнения
);
КонецПроцедуры
&НаКлиенте
Процедура АктивироватьОкноОтчета(ДополнительныеПараметры) Экспорт
// Метод активизирует текущее окно 1С, возвращая фокус пользователю
Активизировать();
КонецПроцедуры
Преимущества этого способа: Крайне простая реализация, не требующая сложных серверных вызовов и ручной обработки макетов компоновки данных. При клике на всплывающее оповещение платформа автоматически переведет фокус на окно с готовым отчетом.
Предыдущий способ имеет один существенный недостаток: пока отчет формируется, интерфейс 1С заблокирован «бубликом». Если отчет строится 5–10 минут, пользователь не сможет открыть другие документы или справочники в этом сеансе программы.
Чтобы действительно освободить интерфейс для параллельной работы, пока 1С выполняет вычисления, необходимо использовать встроенный платформенный фоновый режим компоновки результата. Разберем, как его реализовать.
Для запуска фонового формирования нам достаточно передать специальный параметр в метод СкомпоноватьРезультат. Изменим код обработчика нашей команды:
&НаКлиенте
Процедура СформироватьОтчет(Команда)
ОчиститьСообщения();
// Запускаем асинхронное (фоновое) формирование отчета средствами платформы
СкомпоноватьРезультат(РежимКомпоновкиРезультата.Фоновый);
// Если версия платформы 1С ниже 8.3.25 / 8.5, нам потребуется обработчик ожидания
ПодключитьОбработчикОжидания("ПроверитьСтатусФормирования", 2, Ложь);
КонецПроцедуры
Теперь нам необходимо периодически проверять, завершилось ли фоновое задание, запущенное платформой. Для этого опишем процедуру проверки, которая будет срабатывать каждые 2 секунды:
&НаКлиенте
Процедура ПроверитьСтатусФормирования()
// Проверяем состояние формирования табличного документа отчета
Если НЕ ОтчетФормируетсяФоновымЗаданием() Тогда
// Отключаем обработчик ожидания, чтобы он не зацикливался
ОтключитьОбработчикОжидания("ПроверитьСтатусФормирования");
// Показываем долгожданное оповещение
ДействиеПриКлике = Новый ОписаниеОповещения("АктивироватьОкноОтчета", ЭтотОбъект);
ПоказатьОповещениеПользователя(
"Отчет готов!",
ДействиеПриКлике,
"Вы можете ознакомиться с результатом",
БиблиотекаКартинок.ВыполненоУспешно
);
КонецЕсли;
КонецПроцедуры
&НаКлиенте
Процедура АктивироватьОкноОтчета(ДополнительныеПараметры) Экспорт
Активизировать();
КонецПроцедуры
Важное примечание для современных версий платформы (8.3.25, 8.5 и выше): В новых версиях платформы 1С разработчики добавили стандартное клиентское событие формы отчета ПослеКомпоновкиРезультата. Если вы работаете на современной версии платформы, вам больше не нужно писать ручные обработчики ожидания с таймером. Достаточно просто выбрать это событие в свойствах формы и прописать внутри него вызов ПоказатьОповещениеПользователя.
Если ваша конфигурация 1С типовая (например, Бухгалтерия предприятия, ERP, Управление торговлей или Комплексная автоматизация), в ней гарантированно установлена БСП. Это дает возможность использовать готовые подсистемы длительных операций.
Вместо создания собственных кнопок и переопределения интерфейса, вы можете пойти по пути интеграции внешнего отчета в справочник «Дополнительные отчеты и обработки». При таком подходе:
Используйте рассмотренные методы в зависимости от сложности вашего отчета и требований к интерфейсу. Для простых отчетов отлично подойдет Способ 1 с прямой компоновкой. Для ресурсоемких задач всегда отдавайте предпочтение Способу 2 с фоновым выполнением, чтобы сохранить отзывчивость и высокую скорость работы интерфейса программы 1С.