При разработке или модификации внешних печатных форм в современных конфигурациях на базе Библиотеки стандартных подсистем (БСП), таких как 1С:Зарплата и Управление Персоналом, 1С:ERP Управление предприятием или 1С:Комплексная автоматизация, разработчики часто сталкиваются со скрытой ошибкой. На этапе формирования печатной формы и вывода ее на экран все работает корректно, однако при попытке пользователя сохранить готовый документ (нажатием на кнопку с дискетой в форме просмотра) система аварийно завершает работу с ошибкой: «Значение не является значением объектного типа (Имя)».
В рамках этой статьи мы подробно разберем причины возникновения этой проблемы, изучим внутренние механизмы подсистемы печати БСП и рассмотрим практические варианты ее решения с примерами кода.
Для того чтобы понять природу ошибки, проанализируем, что происходит в системе в момент нажатия кнопки сохранения («дискеты»). При нажатии на эту кнопку в стандартной форме ОбщаяФорма.ПечатьДокументов инициализируется диалог «Сохранение печатной формы». БСП предлагает пользователю несколько вариантов сохранения: на локальный компьютер или в качестве присоединенного файла прямо к объекту-источнику (например, к элементу справочника Сотрудники).
Чтобы реализовать этот функционал, БСП анализирует коллекцию ОбъектыПечати. На основе переданных ссылок система пытается:
[СинонимОбъекта] + [Номер] + [Дата]).ВладелецПрисоединенныхФайлов).Если на одном из этих этапов БСП сталкивается с некорректными данными, происходит сбой, приводящий к ошибке обращения к свойству Имя у неопределенного объекта.
Наиболее распространенная техническая причина кроется в вызове процедуры разметки областей печати:
УправлениеПечатью.ЗадатьОбластьПечатиДокумента(ТабличныйДокумент, НомерСтрокиНачало, ОбъектыПечати, ПараметрыМакета.Ссылка);
Если в качестве четвертого параметра (в нашем примере это ПараметрыМакета.Ссылка) передается невалидная ссылка на объект базы данных, а, например:
Неопределено (когда реквизит не был инициализирован или печать вызывается для нового, еще не записанного в базу объекта);В этом случае метод ЗадатьОбластьПечатиДокумента без ошибок добавляет это некорректное значение в коллекцию ОбъектыПечати. Документ успешно выводится на экран. Но при попытке сохранения БСП пытается получить метаданные объекта методом Метаданные.НайтиПоТипу(ТипЗнч(Ссылка)). Так как тип переданного значения не является ссылочным типом данных 1С, поиск возвращает Неопределено. Попытка обратиться к свойству МетаданныеОбъекта.Имя вызывает ошибку «Значение не является значением объектного типа (Имя)».
Перед вызовом процедуры разметки области печати обязательно убедимся, что передаваемый параметр действительно является ссылкой на существующий объект информационной базы. Разберем правильный шаблон вызова:
// Проверяем, что ссылка заполнена и имеет корректный ссылочный тип
Если ЗначениеЗаполнено(ПараметрыМакета.Ссылка)
И Справочники.ТипВсеСсылки().СодержитТип(ТипЗнч(ПараметрыМакета.Ссылка)) Тогда
УправлениеПечатью.ЗадатьОбластьПечатиДокумента(
ТабличныйДокумент,
НомерСтрокиНачало,
ОбъектыПечати,
ПараметрыМакета.Ссылка
);
КонецЕсли;
Если мы формируем «холостую» печатную форму (например, пустой шаблон без привязки к конкретному сотруднику или документу), вызов процедуры ЗадатьОбластьПечатиДокумента следует пропустить. При этом печатная форма сохранит возможность записи на локальный диск компьютера, но автосохранение в присоединенные файлы базы данных для нее будет отключено.
Вторая частая причина кроется непосредственно внутри общего модуля подсистемы печати, в строке кода:
ТабличныйДокумент.Область(НомерСтрокиНачало, , НомерСтрокиОкончание, ).Имя = ИмяОбласти;
Если в процессе заполнения макета данные не были выведены (например, запрос к базе данных вернул пустую выборку), то высота результирующего табличного документа останется равной нулю. При попытке программного обращения к области Область(1, , 0, ) (где начало — это первая строка, а конец равен нулю) платформа 1С возвращает пустое значение Неопределено вместо реального объекта области ячеек табличного документа. Попытка задать имя для несуществующей области закономерно приводит к падению системы.
Для предотвращения этой ситуации добавим явную проверку высоты результирующей таблицы перед регистрацией областей печати:
// Проверяем, что в табличный документ действительно были выведены строки
Если ТабличныйДокумент.ВысотаТаблицы > 0 Тогда
УправлениеПечатью.ЗадатьОбластьПечатиДокумента(
ТабличныйДокумент,
НомерСтрокиНачало,
ОбъектыПечати,
ПараметрыМакета.Ссылка
);
КонецЕсли;
Рассмотрим ситуацию, когда печатная форма разрабатывается для справочника, который изначально не поддерживает механизм прикрепления файлов (например, у него отсутствует связанный подчиненный справочник присоединенных файлов типа ИмяСправочникаПрисоединенныеФайлы).
В устаревших или сильно кастомизированных версиях БСП алгоритм определения доступных вариантов сохранения может завершаться ошибкой, если объект передан в ОбъектыПечати, но не включен в определяемый тип ВладелецПрисоединенныхФайлов.
Чтобы исправить это поведение без изменения метаданных конфигурации, можно программно переопределить состав доступных команд в форме печати документов, отключив команду сохранения в присоединенные файлы для конкретных типов объектов.
Если ошибка продолжает воспроизводиться, проанализируем ситуацию в режиме отладчика:
УправлениеПечатью внутри процедуры ЗадатьОбластьПечатиДокумента.НомерСтрокиНачало, ОбъектыПечати и тип значения ПараметрыМакета.Ссылка через табло вычисления выражений (клавиши Shift+F9).Неопределено — мы нашли место возникновения ошибки. Исправим заполнение параметров макета в модуле менеджера нашей внешней обработки.Применяя данные защитные проверки в коде своих внешних печатных форм, мы гарантируем их стабильную работу при любых действиях конечных пользователей.