В процессе работы с конфигурацией «1С:Управление производственным предприятием» (УПП, редакция 1.3) на платформе «1С:Предприятие 8.2» (или в режиме совместимости на 8.3) пользователи часто сталкиваются с неприятной ситуацией. При попытке распечатать документ Комплектация номенклатуры система никак не реагирует: на экран не выводится печатная форма, не возникает видимых ошибок, а принтер молчит. При этом другие документы в системе печатаются в штатном режиме.
В этой статье мы подробно проанализируем причины такого поведения системы, разберем сопутствующие ошибки, возникающие при отладке (в частности, сбой обращения к ХранилищеПараметровВнешнихРегламентированныхОтчётов), и рассмотрим пошаговые методы устранения этой проблемы.
Давайте выясним первопричину, почему программа «молчит» при нажатии кнопки «Печать». Дело в том, что документ Комплектация номенклатуры имеет два принципиально разных вида операции, которые выбираются в шапке документа:
Разработчики фирмы «1С» заложили встроенный макет печатной формы только для первого вида операции — «Комплектация номенклатуры». Для операции «Выпуск продукции» встроенного макета в типовой конфигурации УПП 1.3 не предусмотрено вовсе. Когда пользователь нажимает кнопку печати, алгоритм модуля документа проверяет текущий вид операции. Не находя соответствующего макета или обработчика для «Выпуска продукции», программа просто прерывает выполнение процедуры без вывода предупреждающих сообщений.
Посмотрим на пример упрощенного кода в модуле документа, иллюстрирующий эту логику:
Функция Печать(ИмяМакета, КоличествоЭкземпляров = 1, НаПечать = Ложь) Экспорт
// Проверяем вид операции документа
Если ЭтотОбъект.ВидОперации = Перечисления.ВидыОперацийКомплектацияНоменклатуры.Комплектация Тогда
ТабДокумент = ПечатьКомплектации(ИмяМакета);
Возврат ТабДокумент;
ИначеЕсли ЭтотОбъект.ВидОперации = Перечисления.ВидыОперацийКомплектацияНоменклатуры.ВыпускПродукции Тогда
// Для выпуска продукции встроенная печатная форма не предусмотрена!
// Возвращаем Неопределено, из-за чего экран формы печати не открывается
Возврат Неопределено;
КонецЕсли;
КонецФункции
Для решения этой проблемы на практике мы можем пойти двумя путями:
Отчет производства за смену.Иногда при попытке отладить процесс печати и пошагово пройти алгоритм в конфигураторе разработчик натыкается на непредвиденную ошибку времени выполнения:
Ошибка при получении значения атрибута контекста (ХранилищеПараметровВнешнихРегламентированныхОтчётов) в модуле ОбщийМодуль.РегламентированнаяОтчетность.Модуль...
Эта ошибка напрямую не связана с макетом комплектации, но блокирует работу механизмов печати. Проанализируем ситуацию: почему платформа спотыкается на обращении к этому атрибуту? Выделим три ключевые причины:
ХранилищеПараметровВнешнихРегламентированныхОтчётов является частью подсистемы регламентированной отчетности. Даже если у пользователя установлены «Полные права», в некоторых нетиповых или измененных ролях могут отсутствовать права на чтение конкретных системных регистров или справочников, где хранятся параметры отчетов.Рассмотрим подробнее комплекс шагов, которые помогут полностью восстановить работоспособность печати и устранить системные ошибки.
Если при попытке печати или в процессе отладки возникает ошибка обращения к контексту общего модуля, первым делом выполним глубокую очистку кэша. Для этого выполним следующие действия:
ИмяПользователя — учетная запись в ОС):
C:\Users\ИмяПользователя\AppData\Local\1C\1Cv82C:\Users\ИмяПользователя\AppData\Roaming\1C\1Cv821Cv8.
a3b2c1d0-e5f6-...). Именно в них хранится временный кэш конфигурации.Для устранения внутренних сбоев логической целостности и восстановления индексов таблиц базы данных запустим утилиту тестирования в Конфигураторе:
Если детальный анализ прав показал, что ошибка чтения атрибута ХранилищеПараметровВнешнихРегламентированныхОтчётов происходит из-за жестких ограничений безопасности, мы можем временно запустить исполнение кода в привилегированном режиме. Посмотрим на пример модификации кода общего модуля:
// Перед обращением к проблемному атрибуту включаем привилегированный режим
УстановитьПривилегированныйРежим(Истина);
Попытка
ПараметрыХранилища = РегламентированнаяОтчетность.ХранилищеПараметровВнешнихРегламентированныхОтчётов;
Исключение
ПараметрыХранилища = Неопределено;
ЗаписатьЛогОшибки(ОписаниеОшибки());
КонецПопытки;
// Обязательно отключаем привилегированный режим после выполнения операции
УстановитьПривилегированныйРежим(Ложь);
Чтобы пользователи могли печатать документ комплектации с операцией «Выпуск продукции», выполним разработку и подключение внешней формы:
Печать()..epf..epf и укажем в табличной части документ Комплектация номенклатуры.После этого у пользователей при нажатии кнопки «Печать» в документе появится выбор новой внешней печатной формы, которая будет корректно работать для любого вида операции.