Рассмотрим ситуацию, с которой часто сталкиваются разработчики и системные администраторы при работе с конфигурацией 1С:Зарплата и Управление Персоналом (ЗУП) версии 3.1. При программной загрузке справок 2-НДФЛ в базу документы успешно создаются и внешне выглядят корректно. Однако, если мы попытаемся распечатать такой документ, система выдает критическую ошибку: Значение не является значением объектного типа (ВысотаТаблицы) в модуле УправлениеПечатью.
Проанализируем причину этой проблемы по шагам и разберем несколько вариантов её решения, включая штатные механизмы и программные доработки.
Выясним причину аварийного завершения. Ошибка возникает в общем модуле подсистемы БСП (Библиотека стандартных подсистем) на этапе формирования коллекции печатных форм. Алгоритм пытается проверить, не пуст ли сформированный макет, обращаясь к свойству ВысотаТаблицы. Ошибка «не является значением объектного типа» означает, что вместо готового объекта ТабличныйДокумент система получила значение Неопределено, у которого нет никаких свойств.
Почему это происходит только с загруженными документами? Посмотрим на разницу между ручным и программным вводом:
ТабличныйДокумент, даже если в справке не хватает данных.Разберем самый простой и правильный способ решения. Проблема кроется в недоработках конкретного релиза (в частности, 3.1.9.106). Разработчики 1С оперативно исправили баг генерации печатных форм при потоковой или программной обработке документов в следующем обновлении.
Если вы столкнулись с такой ситуацией, обновите конфигурацию до версии 3.1.9.107 (или более новой). После обновления функция печати начнет корректно возвращать объект ТабличныйДокумент при любых сценариях, и ошибка уйдет сама собой.
Если прямо сейчас обновить базу невозможно, мы вместе решим задачу программным путем. Создадим расширение конфигурации для общего модуля УправлениеПечатью. Наша цель — добавить проверку типа значения перед тем, как система попытается обратиться к свойству ВысотаТаблицы.
Рассмотрим пример кода, который нужно поместить в расширение (перед проблемной строкой):
// В расширении перехватываем процедуру печати
Если ТабличныйДокумент = Неопределено Тогда
Продолжить; // Пропускаем пустой документ, избегая падения платформы
КонецЕсли;
Если ТабличныйДокумент.ВысотаТаблицы = 0 Или ОбъектыПечати.Количество() = 0 Тогда
// Стандартный код 1С
КонецЕсли;
Такой подход заставит систему проигнорировать «битый» макет и не прерывать работу пользователя аварийным сообщением.
Проанализируем еще один вариант: исправление на стороне вашего скрипта загрузки. В обработке, которая программно загружает справки 2-НДФЛ, можно добавить принудительную инициализацию печатных форм.
Посмотрим на пример того, как можно обезопасить алгоритм формирования коллекции печатных форм:
// В вашей обработке перед передачей коллекции на печать
Для Каждого СтрокаПечати Из КоллекцияПечатныхФорм Цикл
Если СтрокаПечати.ТабличныйДокумент = Неопределено Тогда
СтрокаПечати.ТабличныйДокумент = Новый ТабличныйДокумент;
КонецЕсли;
КонецЦикла;
Используя команду Новый ТабличныйДокумент, мы искусственно подсовываем системе пустой, но корректный объект объектного типа. После этого проверка свойства ВысотаТаблицы пройдет успешно, и алгоритмы БСП отработают без ошибок.