Почему зависает печать УПД и счетов-фактур после обновления УТ на 11.5.23.70 и как это исправить?

Программист 1С v8.3 (Управляемые формы) 1С:Управление торговлей Управленческий учет Торговля и дистрибуция
← На главную

После установки обновления конфигурации «Управление торговлей» (УТ) версии 11.5.23.70 многие пользователи столкнулись с неприятной ситуацией: при попытке распечатать Универсальный передаточный документ (УПД), Счет-фактуру или ТОРГ-12 программа намертво зависает. Окно печати не открывается, ошибок не выдается, и сеанс приходится завершать принудительно. В данной статье мы подробно разберем причины этого поведения, проанализируем техническую суть ошибки и рассмотрим методы решения проблемы.

Симптомы и условия возникновения ошибки

Проблема проявляется сразу после обновления на релиз 11.5.23.70 (а также аналогичные релизы КА 2.5.23 и ERP 2.5.23). Рассмотрим характерные признаки:

  1. При нажатии кнопки «Печать» для форм УПД, Счет-фактура или ТОРГ-12 система «задумывается» и перестает реагировать на действия пользователя.
  2. Ошибка воспроизводится как в клиент-серверном, так и в файловом варианте работы базы.
  3. Зависание происходит на разных базах и организациях, независимо от используемого оборудования.
  4. Проблема актуальна, если в настройках базы включена функциональная опция «Новая архитектура взаиморасчетов».

Особенно часто ошибка возникает, когда валюта документа отличается от валюты регламентированного или управленческого учета. Это связано с необходимостью пересчета сумм перед формированием печатной формы.

Технический анализ причины сбоя

Давайте углубимся в программный код, чтобы понять, почему происходит зависание. В новой версии разработчики изменили механизм актуализации расчетов перед печатью.

В модулях менеджеров документов (например, СчетФактураВыданный и РеализацияТоваровУслуг) содержится функция подготовки данных для печати. В релизе 11.5.23.70 была внедрена попытка выполнить расчет сумм в валютах учета через механизм Неоперативной очереди заданий.

Логика работы следующая: система пытается запустить фоновое задание через очередь для расчета необходимых сумм и ожидает его завершения, чтобы продолжить формирование печатной формы. Однако, в текущей реализации этот процесс приводит к состоянию "deadlock" (взаимной блокировки) или бесконечному ожиданию ответа от фонового процесса. Интерфейс пользователя блокируется в ожидании сигнала, который так и не поступает.

Разберем конкретные способы решения этой проблемы.

Способ 1: Установка официального патча (Рекомендуемый)

Фирма «1С» признала наличие ошибки и зарегистрировала её под номером EF_00_00765293. Официальное описание гласит: «При формировании печатных форм документов продаж может возникать длительное ожидание или зависание сеанса».

Самым правильным и безопасным методом лечения является установка исправительного патча. Патч возвращает логику работы к состоянию предыдущих релизов (11.5.22), заменяя вызов фонового задания на синхронный расчет в текущем сеансе.

Чтобы исправить ошибку этим способом:

  1. Зайдите в раздел НСИ и Администрирование -> Обслуживание -> Обновление программы.
  2. Убедитесь, что у вас включена загрузка исправлений (патчей).
  3. Найдите и установите патч EF_00_00765293.
  4. После установки патча перезапустите сеанс предприятия.

Способ 2: Внесение изменений в код конфигурации

Если по каким-то причинам вы не можете оперативно скачать патч или используете сильно доработанную конфигурацию, где автоматическая установка патчей затруднена, можно внести исправления вручную. Рассмотрим, какой именно код вызывает ошибку и как его безопасно изменить.

Мы будем искать проблемный участок кода в модулях менеджеров документов.

Исправление для документа «Счет-фактура выданный»

Откроем конфигуратор и найдем документ СчетФактураВыданный. Нас интересует его Модуль менеджера. В нем необходимо найти функцию ПолучитьДанныеДляПечатнойФормыСчетФактура.

Внутри этой функции есть блок кода, отвечающий за актуализацию расчетов. Проблемный фрагмент выглядит следующим образом:


// Фрагмент кода, вызывающий зависание
Если ПланыОбмена.ГлавныйУзел = Неопределено Тогда
    НеоперативнаяОчередьЗаданий.ВыполнитьЗаданияНеоперативнойОчередиПоСпискуДокументов(МассивДокументов, Справочники.ВидыНеоперативныхЗаданий.АктуализацияДвиженийПоФинансовымРегистрам); 
Иначе
    РегистрыСведений.СуммыДокументовВВалютахУчета.РассчитатьСуммыДокументовВВалютахУчета(МассивДокументов);
КонецЕсли;

Именно вызов метода ВыполнитьЗаданияНеоперативнойОчередиПоСпискуДокументов приводит к зависанию. Наша задача — заставить программу выполнять расчет напрямую, через регистр сведений, минуя очередь заданий.

Для исправления закомментируйте условие и оставьте только прямой вызов расчета. Ваш код должен выглядеть так:


// Исправленный вариант
// Если ПланыОбмена.ГлавныйУзел = Неопределено Тогда
//     НеоперативнаяОчередьЗаданий.ВыполнитьЗаданияНеоперативнойОчередиПоСпискуДокументов(МассивДокументов, Справочники.ВидыНеоперативныхЗаданий.АктуализацияДвиженийПоФинансовымРегистрам); 
// Иначе
    РегистрыСведений.СуммыДокументовВВалютахУчета.РассчитатьСуммыДокументовВВалютахУчета(МассивДокументов);
// КонецЕсли;

Таким образом, мы принудительно используем метод РассчитатьСуммыДокументовВВалютахУчета, который выполняется в текущем потоке и не вызывает блокировок интерфейса.

Исправление для документа «Реализация товаров и услуг»

Аналогичная проблема существует и при печати ТОРГ-12 из документа реализации. Откроем документ РеализацияТоваровУслуг и перейдем в Модуль менеджера.

Здесь необходимо найти схожий участок кода. Рекомендуем воспользоваться глобальным поиском по строке НеоперативнаяОчередьЗаданий.ВыполнитьЗаданияНеоперативнойОчередиПоСпискуДокументов внутри модуля.

Как и в предыдущем случае, необходимо заменить вызов очереди на прямой расчет:


// Было (вызывает зависание):
// НеоперативнаяОчередьЗаданий.ВыполнитьЗаданияНеоперативнойОчередиПоСпискуДокументов(МассивДокументов, Справочники.ВидыНеоперативныхЗаданий.АктуализацияДвиженийПоФинансовымРегистрам);

// Стало (работает корректно):
РегистрыСведений.СуммыДокументовВВалютахУчета.РассчитатьСуммыДокументовВВалютахУчета(МассивДокументов);

После внесения этих изменений сохраните конфигурацию и обновите базу данных. Проблема с зависанием при печати должна полностью исчезнуть.

Рекомендации по применению исправлений

При выборе метода решения учитывайте следующие моменты:

  1. Расширения конфигурации. Если у вас есть возможность, лучше не вносить изменения в основную конфигурацию, а создать патч-расширение. Для этого добавьте заимствование указанных выше методов в расширение с аннотацией &Вместо и разместите там исправленный код. Это сохранит типовую конфигурацию на поддержке и упростит дальнейшие обновления.
  2. Тестирование. Перед применением изменений на рабочей базе ("проде") обязательно проверьте печать на копии базы. Попробуйте распечатать документы для организаций с разными системами налогообложения (ОСНО, УСН) и с разными валютами договоров.
  3. Официальная поддержка. Поскольку ошибка уже признана разработчиком (код ошибки 00-00765293), в следующих релизах (например, 11.5.23.8x) этот код, скорее всего, будет исправлен штатно. Если вы вносили правки вручную в основную конфигурацию, при следующем обновлении вам нужно будет проверить, не конфликтуют ли ваши правки с кодом поставщика.

Подводя итог, можно сказать, что ошибка вызвана некорректной работой нового механизма фоновой актуализации расчетов. Возврат к синхронному (последовательному) выполнению расчета сумм является надежным решением, которое не влияет на корректность данных, а лишь меняет способ выполнения технической процедуры.

← На главную