Почему добавленные в расширении реквизиты документа не отображаются на форме и как это исправить?

Программист 1С v8.3 (Управляемые формы) IT и автоматизация бизнеса
← На главную

Работа с расширениями конфигурации в платформе «1С:Предприятие» — это стандартный и безопасный способ кастомизации прикладных решений. Однако разработчики часто сталкиваются с неприятной ситуацией: в конфигураторе реквизит успешно добавлен в расширение, элемент формы («Поле ввода» или «Колонка») создан, связь через ПутьКДанным настроена, но в режиме «1С:Предприятие» этого элемента просто нет на экране. При этом обычные декоративные элементы (например, надписи) отображаются без проблем.

В этой статье мы подробно разберем, почему возникает эта проблема, проанализируем поведение платформы и рассмотрим пошаговые сценарии ее решения.

Причина 1. Особенности заимствования формы и реквизита «Объект» (начиная с платформы 8.3.15)

Начиная с версии платформы 8.3.15, разработчики 1С существенно изменили внутренние механизмы заимствования форм. Теперь элементы основной конфигурации отображаются в расширении в режиме рефлексии (отражения). Если вы добавили форму в расширение, это еще не означает, что платформа автоматически синхронизировала структуру данных формы.

Для того чтобы связь между новым элементом формы и реквизитом объекта корректно заработала на клиенте, нам необходимо выполнить следующие действия:

  1. Откроем заимствованную форму документа в редакторе расширения.
  2. В правой верхней части редактора перейдем на вкладку «Реквизиты».
  3. Найдем основной реквизит формы — Объект (он обычно выделен жирным шрифтом).
  4. Нажмем на него правой кнопкой мыши и выберем команду «Добавить в расширение».
  5. После этого в меню редактора формы выполним команду «Обновить сохраненную форму» (или «Обновить расширение формы»). Это принудительно синхронизирует структуру реквизитов формы и восстановит корректный ПутьКДанным для добавленных полей.

Причина 2. Ограничение прав доступа и автоматически создаваемые роли

Еще одна распространенная причина кроется в подсистеме безопасности расширений. Когда мы добавляем новый объект или реквизит в расширение, платформа автоматически может создать в расширении собственную роль. Если эта роль создана, она начинает переопределять или дополнять права основной конфигурации.

Выясним, как решить эту проблему с правами:

  1. Проверим наличие ролей в самом расширении. Если в расширении автоматически создалась новая роль, убедимся, что для нее установлены права «Чтение» и «Просмотр» на добавленный реквизит документа.
  2. Обязательно назначим эту роль пользователю в режиме «1С:Предприятие» (через справочник «Пользователи» или назначение групп доступа).
  3. Альтернативное решение: если собственная роль в расширении создалась случайно и в ней нет реальной необходимости, просто удалим ее из метаданных расширения. После удаления роли права на новые реквизиты будут наследоваться по стандартным правилам платформы для администраторов или пользователей с полными правами.

Причина 3. Сохраненные настройки формы у пользователя (кэш настроек)

Часто разработчик проверяет доработки под учетной записью пользователя, который уже ранее открывал эту форму. Платформа 1С сохраняет персональные настройки отображения элементов (положение, видимость, ширину колонок) в системных таблицах базы данных. Так как на момент сохранения настроек нового реквизита еще не существовало, система выводит старый сохраненный макет формы из кэша, полностью игнорируя новые реквизиты расширения.

Разберем, как сбросить настройки формы к стандартным:

  1. Запустим базу в режиме «1С:Предприятие» и откроем проблемную форму документа.
  2. В правом верхнем углу формы нажмем кнопку «Ещё» и выберем команду «Изменить форму...».
  3. В открывшемся окне настройки формы нажмем кнопку «Ещё» (внутри окна настройки) и выберем пункт «Установить стандартные настройки».
  4. Нажмем «ОК» для применения изменений. Форма обновится, загрузив актуальную структуру из расширения, и добавленное поле появится на экране.

Причина 4. Влияние функциональных опций

Если новый или заимствованный реквизит, который мы пытаемся вывести на форму, в основной конфигурации связан с какой-либо функциональной опцией (ФО), платформа будет автоматически скрывать этот элемент, если функциональная опция выключена в пользовательском режиме.

Проанализируем свойства реквизита в конфигураторе:

  1. Откроем свойства реквизита в основной конфигурации или в расширении.
  2. Перейдем в раздел «Дополнительно» -> «Функциональные опции».
  3. Если реквизит привязан к ФО, проверим, включена ли эта опция в режиме «1С:Предприятие». Если опция отключена, элемент формы отображаться не будет. При необходимости снимем привязку к функциональной опции в расширении.

Причина 5. Особенности работы с табличными частями

Если вы добавляете реквизит не в шапку документа, а в его табличную часть, то простого заимствования формы будет недостаточно. Платформа должна четко понимать структуру новой таблицы на сервере.

Посмотрим на алгоритм заимствования для табличных частей:

  1. Добавим сам документ в расширение.
  2. Заимствуем в расширение конкретную табличную часть документа как объект метаданных (а не только форму).
  3. Добавим новый реквизит именно внутрь заимствованной табличной части в дереве метаданных расширения.
  4. Только после этого перетащим реквизит на форму в качестве колонки таблицы.

Рекомендуемый подход: Программное добавление элементов формы (Best Practice)

Чтобы избежать проблем с «слетанием» интерфейса при обновлениях конфигурации, конфликтов кэша настроек и багов платформы, опытные разработчики рекомендуют добавлять новые элементы формы программно в коде расширения.

Рассмотрим, как реализовать этот метод на практике. Для этого мы перехватим событие формы ПриСозданииНаСервере с помощью аннотации &После и программно опишем создание элемента:


&После("ПриСозданииНаСервере")
Процедура Расш1_ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
    
    ИмяЭлемента = "Расш1_НовоеПолеРеквизита";
    
    // Проверим, чтобы элемент не был создан повторно при перезаполнении формы
    Если Элементы.Найти(ИмяЭлемента) = Неопределено Тогда
        
        // Определим родительскую группу на форме, куда поместим новое поле
        РодительскаяГруппа = Элементы.ГруппаШапкаДокумента; 
        
        // Создаем новый элемент формы типа ПолеФормы
        НовоеПоле = Элементы.Добавить(ИмяЭлемента, Тип("ПолеФормы"), РодительскаяГруппа);
        НовоеПоле.Вид = ВидПоляФормы.ПолеВвода;
        
        // Связываем элемент с реквизитом, добавленным в расширение документа
        НовоеПоле.ПутьКДанным = "Объект.Расш1_ИмяНовогоРеквизита";
        НовоеПоле.Заголовок = "Дополнительный реквизит (расш.)";
        НовоеПоле.ПоложениеЗаголовка = ПоложениеЗаголовкаЭлементаФормы.Лево;
        
    КонецЕсли;
    
КонецПроцедуры

Этот способ гарантирует, что элемент формы будет создан динамически непосредственно в момент открытия формы у любого пользователя, независимо от сохраненных ранее персональных настроек интерфейса и специфических особенностей кэширования метаданных платформы.

← На главную