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