После установки обновления конфигурации «Управление торговлей» (УТ) версии 11.5.23.70 многие пользователи столкнулись с неприятной ситуацией: при попытке распечатать Универсальный передаточный документ (УПД), Счет-фактуру или ТОРГ-12 программа намертво зависает. Окно печати не открывается, ошибок не выдается, и сеанс приходится завершать принудительно. В данной статье мы подробно разберем причины этого поведения, проанализируем техническую суть ошибки и рассмотрим методы решения проблемы.
Проблема проявляется сразу после обновления на релиз 11.5.23.70 (а также аналогичные релизы КА 2.5.23 и ERP 2.5.23). Рассмотрим характерные признаки:
Особенно часто ошибка возникает, когда валюта документа отличается от валюты регламентированного или управленческого учета. Это связано с необходимостью пересчета сумм перед формированием печатной формы.
Давайте углубимся в программный код, чтобы понять, почему происходит зависание. В новой версии разработчики изменили механизм актуализации расчетов перед печатью.
В модулях менеджеров документов (например, СчетФактураВыданный и РеализацияТоваровУслуг) содержится функция подготовки данных для печати. В релизе 11.5.23.70 была внедрена попытка выполнить расчет сумм в валютах учета через механизм Неоперативной очереди заданий.
Логика работы следующая: система пытается запустить фоновое задание через очередь для расчета необходимых сумм и ожидает его завершения, чтобы продолжить формирование печатной формы. Однако, в текущей реализации этот процесс приводит к состоянию "deadlock" (взаимной блокировки) или бесконечному ожиданию ответа от фонового процесса. Интерфейс пользователя блокируется в ожидании сигнала, который так и не поступает.
Разберем конкретные способы решения этой проблемы.
Фирма «1С» признала наличие ошибки и зарегистрировала её под номером EF_00_00765293. Официальное описание гласит: «При формировании печатных форм документов продаж может возникать длительное ожидание или зависание сеанса».
Самым правильным и безопасным методом лечения является установка исправительного патча. Патч возвращает логику работы к состоянию предыдущих релизов (11.5.22), заменяя вызов фонового задания на синхронный расчет в текущем сеансе.
Чтобы исправить ошибку этим способом:
EF_00_00765293.Если по каким-то причинам вы не можете оперативно скачать патч или используете сильно доработанную конфигурацию, где автоматическая установка патчей затруднена, можно внести исправления вручную. Рассмотрим, какой именно код вызывает ошибку и как его безопасно изменить.
Мы будем искать проблемный участок кода в модулях менеджеров документов.
Откроем конфигуратор и найдем документ СчетФактураВыданный. Нас интересует его Модуль менеджера. В нем необходимо найти функцию ПолучитьДанныеДляПечатнойФормыСчетФактура.
Внутри этой функции есть блок кода, отвечающий за актуализацию расчетов. Проблемный фрагмент выглядит следующим образом:
// Фрагмент кода, вызывающий зависание
Если ПланыОбмена.ГлавныйУзел = Неопределено Тогда
НеоперативнаяОчередьЗаданий.ВыполнитьЗаданияНеоперативнойОчередиПоСпискуДокументов(МассивДокументов, Справочники.ВидыНеоперативныхЗаданий.АктуализацияДвиженийПоФинансовымРегистрам);
Иначе
РегистрыСведений.СуммыДокументовВВалютахУчета.РассчитатьСуммыДокументовВВалютахУчета(МассивДокументов);
КонецЕсли;
Именно вызов метода ВыполнитьЗаданияНеоперативнойОчередиПоСпискуДокументов приводит к зависанию. Наша задача — заставить программу выполнять расчет напрямую, через регистр сведений, минуя очередь заданий.
Для исправления закомментируйте условие и оставьте только прямой вызов расчета. Ваш код должен выглядеть так:
// Исправленный вариант
// Если ПланыОбмена.ГлавныйУзел = Неопределено Тогда
// НеоперативнаяОчередьЗаданий.ВыполнитьЗаданияНеоперативнойОчередиПоСпискуДокументов(МассивДокументов, Справочники.ВидыНеоперативныхЗаданий.АктуализацияДвиженийПоФинансовымРегистрам);
// Иначе
РегистрыСведений.СуммыДокументовВВалютахУчета.РассчитатьСуммыДокументовВВалютахУчета(МассивДокументов);
// КонецЕсли;
Таким образом, мы принудительно используем метод РассчитатьСуммыДокументовВВалютахУчета, который выполняется в текущем потоке и не вызывает блокировок интерфейса.
Аналогичная проблема существует и при печати ТОРГ-12 из документа реализации. Откроем документ РеализацияТоваровУслуг и перейдем в Модуль менеджера.
Здесь необходимо найти схожий участок кода. Рекомендуем воспользоваться глобальным поиском по строке НеоперативнаяОчередьЗаданий.ВыполнитьЗаданияНеоперативнойОчередиПоСпискуДокументов внутри модуля.
Как и в предыдущем случае, необходимо заменить вызов очереди на прямой расчет:
// Было (вызывает зависание):
// НеоперативнаяОчередьЗаданий.ВыполнитьЗаданияНеоперативнойОчередиПоСпискуДокументов(МассивДокументов, Справочники.ВидыНеоперативныхЗаданий.АктуализацияДвиженийПоФинансовымРегистрам);
// Стало (работает корректно):
РегистрыСведений.СуммыДокументовВВалютахУчета.РассчитатьСуммыДокументовВВалютахУчета(МассивДокументов);
После внесения этих изменений сохраните конфигурацию и обновите базу данных. Проблема с зависанием при печати должна полностью исчезнуть.
При выборе метода решения учитывайте следующие моменты:
&Вместо и разместите там исправленный код. Это сохранит типовую конфигурацию на поддержке и упростит дальнейшие обновления.Подводя итог, можно сказать, что ошибка вызвана некорректной работой нового механизма фоновой актуализации расчетов. Возврат к синхронному (последовательному) выполнению расчета сумм является надежным решением, которое не влияет на корректность данных, а лишь меняет способ выполнения технической процедуры.