При разработке в среде 1С:Предприятие 8.3 программисты часто сталкиваются с ситуацией: после добавления стандартного макета (табличного документа) в расширение, код, который раньше работал идеально, начинает выдавать ошибки. Чаще всего это ошибки вида «Поле объекта не обнаружено» при обращении к параметрам области или некорректное заполнение печатной формы. Рассмотрим подробнее, почему это происходит и как правильно работать с макетами в расширениях.
Разберем ситуацию, описанную пользователем. При переносе макета в расширение визуально всё кажется правильным: те же строки, те же колонки. Однако при выполнении кода Область.Параметры.ИмяПараметра система сообщает об отсутствии этого параметра. Выясним причину этого поведения.
Механизм расширений в 1С работает по принципу объединения (merging). Когда вы заимствуете макет, платформа пытается сопоставить структуру макета из основной конфигурации с версией в расширении. В процессе этого сопоставления могут возникнуть следующие коллизии:
<ИмяПараметра> отображается, но технически параметром не является.ПолучитьОбласть() вернет не тот фрагмент таблицы, который ожидается.Если вам необходимо работать именно с заимствованным макетом, можно применить «ручное» восстановление. Как заметил автор темы, иногда достаточно просто переписать имя параметра в свойствах ячейки.
Рассмотрим алгоритм действий:
Опытные разработчики рекомендуют избегать прямого заимствования сложных макетов. Вместо этого лучше создать в расширении полностью новый объект. Проанализируем, почему это надежнее.
Создавая новый макет в расширении (например, с префиксом пр_МатериальныйПропуск), вы полностью изолируете его от изменений в основной конфигурации при обновлениях. Чтобы внедрить такой макет, нужно перехватить процедуру печати.
Рассмотрим пример кода, где мы заменяем получение стандартного макета на свой собственный в расширении:
&Вместо("СформироватьПечатнуюФорму")
Процедура пр_СформироватьПечатнуюФорму(ПараметрыПечати, КоллекцияПечатныхФорм)
// Получаем макет не из основной конфигурации, а наш новый из расширения
// Метод ПолучитьМакет в контексте расширения сначала ищет макет в самом расширении
ТабДок = Новый ТабличныйДокумент;
Макет = ЭтотОбъект.ПолучитьМакет("пр_МакетПечати");
ОбластьЗаголовок = Макет.ПолучитьОбласть("Заголовок");
ОбластьЗаголовок.Параметры.ДатаДокумента = ТекущаяДата();
ТабДок.Вывести(ОбластьЗаголовок);
// ... дальнейшая логика вывода областей
КонецПроцедуры
Этот способ гарантирует, что никакие механизмы объединения макетов платформы не «испортят» ваши параметры, так как макет существует в единственном экземпляре внутри расширения.
Важно понимать, откуда именно платформа берет макет при вызове метода ПолучитьМакет(). Проанализируем ситуацию:
&Вместо), то вызов ЭтотОбъект.ПолучитьМакет("Имя") сначала будет искать макет в расширении.Если вы все же решили использовать заимствованный макет и столкнулись с ошибкой, выполните следующие шаги:
Макет.ПолучитьОбласть("ИмяОбласти")) посмотрите значение переменной в табло. Разверните свойство Параметры. Если нужного параметра там нет — значит, в макете расширения для этой ячейки не установлен тип «Параметр».Резюме: При работе с расширениями 1С 8.3 самым стабильным решением является создание нового макета в расширении и программная подмена его вызова. Если же необходимо изменить существующий, тщательно проверяйте свойства «Заполнение» у каждой ячейки после переноса в расширение.