В этой статье мы подробно разберем ситуацию, с которой часто сталкиваются специалисты поддержки и программисты 1С: типовая конфигурация, стандартный код, но при печати конкретного документа возникает ошибка. Рассмотрим реальный кейс на примере ошибки при формировании печатной формы Счета-фактуры.
При попытке распечатать документ программа выдает сообщение об ошибке, указывающее на отсутствие поля или свойства объекта. В нашем случае ошибка звучит так:
Поле объекта не обнаружено (ЕдиницаИзмерения)
Ситуация осложняется следующими факторами:
Давайте проанализируем причины такого поведения и найдем решение.
Ошибка «Поле объекта не обнаружено» при обращении к параметрам макета обычно возникает в момент выполнения кода заполнения печатной формы. Рассмотрим типичный фрагмент кода, отвечающий за вывод строки табличной части:
ОбластьМакета = Макет.ПолучитьОбласть("Строка");
ОбластьМакета.Параметры.ТоварНаименование = ВыборкаСтрок.Товар;
ОбластьМакета.Параметры.ЕдиницаИзмерения = ВыборкаСтрок.ЕдиницаИзмерения; // Ошибка здесь
ТабДокумент.Вывести(ОбластьМакета);
Платформа 1С обращается к коллекции Параметры полученной области макета. Если в самом макете (табличном документе) в данной области нет ячейки с типом заполнения «Параметр» и именем «ЕдиницаИзмерения» (даже если это Счет-фактура без характеристик), то свойства с таким именем в коллекции не существует. Попытка записи в несуществующее свойство вызывает исключение.
Но мы знаем, что в Конфигураторе макет верный. Почему же в режиме Предприятия он отличается?
В современных конфигурациях на платформе 1С:Предприятие 8.3 реализован механизм редактирования макетов печатных форм без изменения конфигурации (в режиме «1С:Предприятие»).
Когда пользователь открывает форму печати и нажимает кнопку «Изменить макет» (или переходит в раздел администрирования макетов), система создает копию эталонного макета и сохраняет её в регистре сведений (обычно это регистр ПользовательскиеМакетыПечати).
Сценарий возникновения ошибки:
[ЕдиницаИзмерения].При этом, когда мы сравниваем конфигурации (CF-файлы), мы сравниваем только эталонные макеты. Пользовательские изменения хранятся в данных информационной базы, поэтому обновление конфигурации или загрузка CF из рабочей базы не исправляют проблему.
Чтобы исправить ошибку, нам необходимо либо удалить пользовательский макет (вернуться к стандартному), либо корректно настроить пользовательский. Разберем по шагам, как это сделать.
Этот способ самый быстрый и надежный, если пользовательские правки не являются критически важными.
Если изменения в макете важны для бизнеса, нужно найти ошибку и исправить её вручную.
Параметр или Шаблон.[]) указано точное имя переменной, которое ожидает программный код: ЕдиницаИзмерения.Если вы хотите убедиться, что причина именно в макете, воспользуйтесь отладчиком. Это поможет точно определить, какого параметра не хватает.
Поставим точку останова в общем модуле, отвечающем за печать (например, УчетНДС или модуль менеджера документа).
// Примерный код для анализа в отладчике
Область = Макет.ПолучитьОбласть("Подвал");
// Ставим точку останова на следующей строке
Область.Параметры.ЕдиницаИзмерения = Данные.Валюта;
Когда выполнение остановится:
Область и нажмите Shift+F9 (Вычислить выражение).Параметры.ЕдиницаИзмерения, значит, в текущем активном макете эта ячейка переименована, удалена или превращена в простой текст.В обсуждаемой теме упоминалась конфигурация для Узбекистана. Особенность локализованных решений в том, что печатные формы часто содержат дублирующиеся параметры для вывода информации на двух языках или специфические параметры валют.
При использовании обработок типа «Сумма прописью» код может пытаться записать результат в параметр, который находится внутри текстовой строки (шаблона). Если пользователь случайно удалил квадратные скобки [] вокруг имени параметра при редактировании перевода, параметр перестает определяться системой, что и приводит к падению программы.
Ошибка «Поле объекта не обнаружено» при печати в типовой конфигурации в 99% случаев означает наличие пользовательского макета с некорректной структурой. Программный код пытается передать данные в ячейку, которой больше нет.
Резюме действий: