Поймай 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