Что делать, когда фоновые задания для печатных форм 1С тормозят?
Поймай 1С если сможешь
Недавно мне довелось поработать с конфигурацией Комплексная Автоматизация 2.5.15.82, на релизе 8.3.24.1342. Ничего близкого к HighLoad, базы до 10 гигабайт на MS SQL, свежий выделенный однопроцессорный сервер, десяток пользователей и жалобы на медленное формирование печатных форм документов, даже если в базе один человек.
Анализ загруженности оборудования выявил его незагруженность как на клиенте, так и на сервере. Клиенты тонкие, конфигурация полностью типовая, при обычной работе загрузка сервера (кластер 1С + MS SQL) не превышает 60% в пике в отдельные редкие моменты. Конечно незагруженность это еще не показатель проблем — кто то где то может ждать как в 1С + MS SQL против Матрицы виртуализации / Хабр (habr.com) в самых неожиданных местах, но существенных ожиданий на MS SQL тоже не было.
Было видно, что 1С все вызовы по формированию печатных форм заворачивала в фоновые задания. Казалось бы — почему Универсальный передаточный документ (УПД) (1c.ru) из выданного счета фактуры должен формироваться 10–15 секунд? За это время рекламу можно показать тут:
Пришлось отладчиком пройтись по джунглям структуированного и универсального программного кода, это не плохо, когда он хорошо работает, но текущий результат на лицо. Вообще на разработчиков типовых конфигураций большая ответственность — они закладывают паттерны и Best practice по разработке на 1С для нового поколения. Clean code и все такое, тем более что при модификации приходится следовать окружению типовых процедур. Посмотрим, что нам ставят в пример.
Все дороги идут сюда
Начинаем из модуля формы счета фактуры, вы уже не найдете кнопку сформировать поскольку команды формируются динамически:
Далее уходим в общие модули. Я не буду приводить их все (это легко пройти самим), а сразу перейду к главному:
Вот тут начинается подготовка к запуску в фоне. Заметьте, что название модуля как бы намекает, что печать УПД это уже длительная операция.
Вот мы уже ближе к точке принятия решения. Обратите внимание — кто не владеет русским, никогда не узнают причину исключения и не имеют шансов вставить это в яндекс translate:
Ну вот эти условия. Как видите, при определенных обстоятельствах (файловая база, включенный режим отладки, либо явное указание ПараметрыВыполнения.ЗапуститьНеВфоне ) позволяет избежать выполнения фоновым заданием:
Т.е. без фонового задания можно обойтись:
WorkAround или жди когда поправят
Вообще создание Workaround это исскуство Workaround me в 1С\MS SQL и не только, научный подход к созданию костылей / Хабр (habr.com), которое стараются скрыть. Но без этого тут никак.
Я просто попробовал установить через конфигуратор параметр запуска РежимОтладки.
«Параметр запуска — параметр запуска; доступен для обработки через свойство глобального контекста ПараметрЗапуска (аналог параметру, передаваемому через ключ командной строки /C).»
Далее запустил в режиме отладки и о чудо! Все печатные формы стали формироваться меньше 5 секунд без фоновых заданий.
Можно настроить это как запуск с ярлыка если добавить туда параметр \С РежимОтладки, будет тот же эффект.
Но этот параметр работает на все случаи в данном коде и еще других местах. Возможно какие‑то процедуры нужно оставить выполняющимися в фоне. Поэтому лучше поправить код для установки ПараметрыВыполнения.ЗапуститьНеВФоне только для печатных форм документов.
Итак — этот пример наглядно показывает, что проблема именно в запуске кода в виде фонового задания. Причины нужно еще исследовать, но судя по сообщениям тут 8.3.22.1709 Тормоза фоновых заданий — Форум.Инфостарт (infostart.ru) проблема частая. В целом подсистема фоновых заданий с каждым релизом приносит новые проблемы о которых я писал тут Осторожно у 1С новый релиз.
Проблема началась недавно c какого то нового релиза и если для больших фоновых заданий она не заметна, то для печатных форм и отдельных вызовов в рамках документа вполне мешает.
Исследование и убеждение 1С скорее всего будет долгим, поскольку тут без глубокого изучения технологического лога не обойтись, а саппорту нужно принести на блюдечке. В bugboard.v8.1c.ru ничего подобного нет.
Корень проблемы понятен — попытки подменить асинхронность при выполнении отчетов\и печатных форм фоновыми заданиями.
Фоновое задание оно не только имеет накладные расходы при запуске (прием передача параметров, ожидание свой очереди в rmanager с его неочевидной логикой), но и еще зависит от аккаунта под которым работает сервис кластера. Я встречал случаи когда кластер, работающий под доменным аккаунтом запускал фоновые задания медленней, чем под системным. Видимо влияло время ответа домена.
Асинхронность в 1С вроде как появилась еще в релизе 8.3.18.1128, но пока я не вижу широкого распространения в коде типовых конфигураций. В 1С фоновые задания требуют рефакторинга о чем написано тут Язык мой Враг мой. Архитектору о будущем 1С.
Подписывайтесь на наш канал, будем придумывать Workaroundы профессионально t.me/Chat1CUnlimited