При разработке в среде 1С:Предприятие 8.3, особенно в конфигурациях на базе БСП (Библиотеки стандартных подсистем), таких как УТ 11.4, ERP или КА, часто возникает необходимость выносить тяжелые операции в фоновое задание. Это позволяет не блокировать интерфейс пользователя. Однако возникает резонный вопрос: как передать информацию о ходе выполнения процесса или сообщить об ошибках (например, о списке номенклатуры без цен)?
В этой статье мы подробно разберем несколько эффективных способов реализации обратной связи между фоновым заданием и активным сеансом пользователя.
Проанализируем наиболее современный подход. В типовых конфигурациях запуск фоновых заданий обычно выполняется через программный интерфейс общего модуля ДлительныеОперации. Рассмотрим алгоритм действий.
Когда мы запускаем процедуру через ДлительныеОперации.ВыполнитьВФоне, система возвращает структуру, содержащую АдресРезультата. Это адрес во временном хранилище, по которому фоновое задание может положить любые данные перед завершением.
Разберем по шагам, как передать список ошибок:
ПоместитьВоВременноеХранилище, передав туда наши данные.АдресРезультата и получаем наши данные.Пример кода для серверной части (фоновое задание):
// В процедуре, выполняемой в фоне
СписокОшибок = Новый СписокЗначений;
// ... логика проверки цен ...
Если ЦенаНеОпределена Тогда
СписокОшибок.Добавить(ТекущаяНоменклатура, "Цена не определена");
КонецЕсли;
// Помещаем результат в хранилище, чтобы клиент мог его забрать
ПоместитьВоВременноеХранилище(СписокОшибок, АдресРезультата);
Выясним, как работает механизм сообщений. Если внутри кода фонового задания вызвать объект СообщениеПользователю, эти сообщения не пропадут бесследно. Платформа накапливает их в памяти фонового задания.
Для того чтобы пользователь их увидел, нам необходимо «прочитать» их из задания на клиенте. Если вы используете БСП, это делается одной строкой в обработчике завершения задания:
// На клиенте в обработчике ожидания
Результат = ДлительныеОперации.ЗаданиеВыполнено(ИдентификаторЗадания);
Если Результат.Статус = "Выполнено" Тогда
// Автоматический вывод накопленных сообщений
ДлительныеОперации.ПрочитатьСообщенияПользователю(ИдентификаторЗадания);
КонецЕсли;
Если же вы работаете напрямую с объектом ФоновоеЗадание, используйте метод ПолучитьСообщенияПользователю(Истина). Параметр Истина важен: он очищает очередь сообщений в задании, чтобы при повторном обращении вы не получили дубликаты.
Рассмотрим ситуацию, когда список номенклатуры без цен очень большой (сотни или тысячи позиций). Выводить такое количество строк через обычное Сообщить() — плохая практика, так как пользователю будет неудобно анализировать информацию.
В этом случае лучше реализовать следующий алгоритм:
ТаблицаЗначений с колонками "Номенклатура", "Характеристика", "Причина ошибки".Посмотрим на пример открытия формы с результатами:
ПараметрыФормы = Новый Структура;
ПараметрыФормы.Вставить("АдресДанных", РезультатЗадания.АдресРезультата);
ОткрытьФорму("ОбщаяФорма.РезультатыОбработки", ПараметрыФормы);
Такой подход позволяет пользователю не просто прочитать текст, но и, например, сразу перейти в карточку номенклатуры, кликнув по строке в таблице.
Если нам нужно просто уведомить пользователя о том, что возникли проблемы, без блокировки его текущей работы, воспользуемся методом ПоказатьОповещениеПользователя. Напрямую из фонового задания (на сервере) вызвать всплывающее окно нельзя. Поэтому мы передаем краткую информацию (например, количество ошибок) через результат задания и вызываем окно уже на клиенте.
Важный момент: Оповещение можно сделать кликабельным. Например, при нажатии на него может открываться форма со списком той самой номенклатуры без цен.
Проанализируем технический нюанс: чтобы сообщения «привязывались» к конкретным полям формы (например, подсвечивали конкретную строку), объекту СообщениеПользователю нужно передать УникальныйИдентификатор формы. В фоновом задании этот идентификатор напрямую не доступен, поэтому его часто передают как один из параметров запуска серверного метода. Однако для простых информационных сообщений это необязательно.
Поскольку фоновое задание может завершиться аварийно (например, из-за перезапуска рабочего процесса сервера 1С), всегда полезно дублировать критически важную информацию об ошибках в Журнал регистрации с помощью метода ЗаписатьВЖурналРегистрации. Это позволит администратору системы восстановить историю событий, если форма у пользователя была закрыта или сеанс прервался.
Таким образом, мы разобрали основные методы взаимодействия фонового процесса с пользователем. Выбор конкретного способа зависит от объема передаваемых данных и требований к удобству интерфейса: для коротких уведомлений достаточно ПрочитатьСообщенияПользователю, а для детальных отчетов об ошибках лучше использовать временное хранилище и специализированные формы.