Ситуация, когда разработчик вносит изменения в макет документа (добавляет новую ячейку-параметр), но система упорно их игнорирует, является классической для платформы 1С:Предприятие 8.3. Это проявляется в том, что в отладчике коллекция Параметры соответствующей области не содержит нового ключа, а при попытке программного заполнения возникает ошибка «Поле объекта не обнаружено». Рассмотрим детально причины этого поведения и разберем по шагам способы исправления.
Проанализируем самую распространенную причину в современных конфигурациях. Если ваша информационная база построена на основе Библиотеки стандартных подсистем (БСП), в ней реализован механизм «Печать — Изменяемые макеты». Этот функционал позволяет пользователям самостоятельно редактировать печатные формы прямо в режиме «1С:Предприятие».
Как только пользователь (или администратор) хотя бы один раз нажал кнопку «Редактировать макет» и сохранил его, система создает в базе данных запись в специальном регистре (или справочнике). С этого момента 1С при формировании печатной формы будет использовать именно этот сохраненный в базе макет, полностью игнорируя тот макет, который вы правите в конфигураторе.
Выясним, как проверить эту теорию и устранить проблему:
Важное замечание: Переименование макета в конфигураторе (как сделал автор темы) помогает именно потому, что система перестает сопоставлять старый пользовательский макет с новым именем в коде и обращается к метаданным конфигурации. Однако это «костыльное» решение, так как старый мусор остается в базе.
Разберем ситуацию, когда в базе установлены расширения. Если документ или его макет были добавлены в расширение (заимствованы), то система будет использовать макет из расширения.
Проанализируем логику работы: если вы добавили параметр в основном окне конфигурации, а в расширении этот макет остался старым, то в режиме исполнения вы увидите старую версию.
Для исправления необходимо:
ПолучитьМакет() система берет ожидаемый объект.Посмотрим на свойства ячейки в конфигураторе. Иногда визуально кажется, что параметр добавлен, но программно он не существует. В палитре свойств ячейки есть свойство Заполнение. Рассмотрим три его состояния:
ИмяПараметра, 1С не добавит его в коллекцию параметров.ДатаДокумента. В этом случае в коде мы обращаемся к нему как Область.Параметры.ДатаДокумента.Накладная № [Номер] от [Дата].Если вы установили свойство «Параметр», но случайно добавили пробел в начале или конце имени внутри ячейки, система может не распознать его при программном обращении. Рекомендуется переписать имя параметра вручную, избегая копирования из сторонних источников.
Выясним, как 1С формирует коллекцию параметров. Параметры доступны не у всего макета сразу, а у конкретной Области. Если вы добавили параметр в ячейку, которая визуально находится в «Шапке», но при назначении имен областей (горизонтальных или вертикальных линий) эта ячейка не попала в границы области Шапка, то метод Макет.ПолучитьОбласть("Шапка") вернет объект, в котором вашего параметра не будет.
Рассмотрим пример правильного получения области и заполнения параметров:
// Получаем макет из метаданных или менеджера
Макет = УправлениеПечатью.МакетДанных("Документ.РеализацияТоваровУслуг.ПФ_MXL_Накладная");
// Получаем конкретную область (строку, шапку)
ОбластьШапка = Макет.ПолучитьОбласть("Заголовок");
// Заполняем параметры
ОбластьШапка.Параметры.НовыйПараметр = "Значение";
ОбластьШапка.Параметры.Дата = ТекущаяДата();
// Выводим область в табличный документ
ТабДок.Вывести(ОбластьШапка);
Если вы используете отладчик, убедитесь, что вы проверяете переменную ОбластьШапка.Параметры после выполнения метода ПолучитьОбласть, но до вывода в табличный документ.
Проанализируем технический аспект работы платформы. При динамическом обновлении конфигурации («демоническое обновление») файлы макетов на стороне сервера или в локальном кэше пользователя могут не обновиться. Это приводит к тому, что код видит новую структуру, а объект макета в памяти остается старым.
Что нужно сделать для очистки:
1C:Enterprise 8.3 Server Agent и удаление папки snccntx в каталоге кластера).%AppData%\1C\1cv8 и %LocalAppData%\1C\1cv8)./ClearCache.Нельзя забывать о «визуальных двойниках». Буквы «с», «а», «о», «е», «р», «х» в кириллической и латинской раскладках выглядят одинаково. Если в макете параметр назван Цена (где 'е' — латинская), а в коде вы пишете Область.Параметры.Цена (где 'е' — русская), 1С выдаст ошибку.
Совет: Всегда перепечатывайте имя параметра в макете и в коде в одной раскладке (лучше всего — полностью на кириллице для русскоязычных конфигураций).
Если вы столкнулись с тем, что новый параметр макета «невидим» для системы:
Соблюдение этих шагов позволит вам быстро диагностировать и устранить проблему отсутствующих параметров в печатных формах 1С.