Разработчики и администраторы систем на платформе 1С:Предприятие часто сталкиваются с ситуацией, когда внешняя печатная форма (ВПФ), которая годами работала без нареканий, внезапно начинает «намертво» завешивать сеанс пользователя. Особенно неприятно, когда это происходит периодически, только на определенных компьютерах и только для конкретных документов. Пользователь нажимает кнопку «Печать», программа уходит в бесконечную задумчивость, а в диспетчере задач процесс 1С получает статус «Не отвечает».
В этой статье мы подробно разберем, почему возникает этот неприятный эффект, проанализируем неочевидные баги платформы (в частности, ветки 8.3.16) и найдем несколько практических путей решения этой проблемы без кардинального изменения кода конфигурации.
Рассмотрим классический сценарий. В нашей системе (например, в 1С:Управление нашей фирмой) зарегистрирована внешняя печатная форма для документа Заказ покупателя. Код формирования печатной формы выглядит стандартно:
Процедура Печать(МассивОбъектов, КоллекцияПечатныхФорм, ОбъектыПечати, ПараметрыВывода) Экспорт
УправлениеПечатью.ВывестиТабличныйДокументВКоллекцию(
КоллекцияПечатныхФорм,
"КоммерческоеПредОкна",
"Коммерческое предложение окна",
СформироватьПечатнуюФорму(МассивОбъектов[0], ОбъектыПечати)
);
КонецПроцедуры
Функция СформироватьПечатнуюФорму(СсылкаНаДокумент, ОбъектыПечати)
ТабличныйДокумент = Новый ТабличныйДокумент;
ТабличныйДокумент.ИмяПараметровПечати = "ПАРАМЕТРЫ_ПЕЧАТИ_КоммерческоеПредОкна";
Макет = ПолучитьМакет("КоммерческоеПредОкна");
// Здесь происходит заполнение областей макета параметрами
Возврат ТабличныйДокумент;
КонецФункции
При тестировании этой формы в режиме отладки через отдельную обработку вызова метода Показать() документ формируется мгновенно и без ошибок. Однако при интеграции ВПФ в справочник «Дополнительные отчеты и обработки» и вызове через стандартную форму предварительного просмотра БСП (Библиотеки Стандартных Подсистем) система зависает. Очистка кэша конфигурации, тестирование и исправление (ТиИ) базы данных не приносят никаких результатов.
Выясним истинные причины такого поведения платформы и разберем варианты решения.
Практика показывает, что корень проблемы часто кроется в багах рендеринга табличных документов конкретных релизов платформы. В частности, на релизе 8.3.16.1063 (и смежных версиях этой ветки) наблюдаются критические ошибки графической подсистемы при взаимодействии с драйверами принтеров в режиме управляемых форм.
Если специфика вашей конфигурации позволяет использовать предыдущую стабильную ветку платформы, наиболее быстрым решением будет откат на платформу версии 8.3.15. Как подтверждает опыт многих специалистов, после перехода на версию 8.3.15 зависания при формировании предварительного просмотра полностью исчезают.
Однако если ваши расширения или метаданные конфигурации требуют строго платформы версии 8.3.16 и выше, перейдем к разбору внутренних механизмов платформы и точечным исправлениям.
Начиная с версии 8.3.16, архитектура взаимодействия 1С с принтерами претерпела изменения. Чтобы сбойные драйверы печати не приводили к аварийному завершению работы всего сеанса 1С, опрос очереди печати и получение параметров страницы были вынесены во внешние процессы:
В момент вывода окна предпросмотра платформа пытается запустить один из этих исполняемых файлов из своего каталога установки. В этот момент могут происходить следующие коллизии:
Что делать: Добавьте исполняемые файлы 1cv8p32.bin и 1cv8p64.bin (находящиеся в подпапке bin установленной платформы 1С) в белый список (исключения) вашего антивирусного ПО и убедитесь, что у пользователей операционной системы есть права на их запуск.
Еще один коварный баг графического движка 1С проявляется при расчете высоты строк табличного документа. Если в свойствах строк макета или у отдельных ячеек включено свойство «Параграф -> Вместе со следующим» (Keep with next), это может привести к бесконечному циклу расчета разрывов страниц.
Сценарий зависания:
Решение:
Платформа 1С сохраняет индивидуальные параметры печати для каждого пользователя и для каждого типа печатной формы отдельно в базе данных и системном реестре. Эти данные хранятся в так называемых настройках Moxel.
Если у пользователя в операционной системе по умолчанию выбран сетевой принтер, который в данный момент отключен, недоступен или удален, платформа 1С при выводе окна предварительного просмотра будет совершать многократные попытки связаться с этим устройством по сети. Это приводит к длительным зависаниям интерфейса.
Для устранения этой проблемы выполните следующие шаги:
Разработчики, использующие платформу версии 8.3.16 совместно с конфигурацией «Управление нашей фирмой» (УНФ) или «1С:Розница», часто сталкивались со схожим сопутствующим багом: при выводе ценников штрихкод отображается корректно, а сопутствующий текст (наименование товара, артикул, цена) полностью исчезает с экрана.
Этот баг графического рендеринга также обходится простым действием в макете шаблона:
Применяя указанные методы последовательно, вы сможете локализовать причину зависания вашей внешней печатной формы и восстановить стабильную работу пользователей без отката на устаревшие версии платформы.