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

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

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

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

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

Начнем с самой распространенной методологической ошибки, которую совершают как начинающие, так и опытные разработчики. Когда мы добавляем новый реквизит в объект метаданных (например, новый реквизит в заимствованный документ) внутри расширения, нам необходимо корректно связать его с интерфейсной частью.

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

Решение по шагам:

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

Причина 2. Кэширование пользовательских настроек формы

Платформа 1С очень бережно относится к персональным настройкам пользователей. Механизм сохранения настроек (доступный по кнопке Ещё -> Изменить форму) записывает структуру элементов формы для каждого пользователя индивидуально.

Если вы или тестировщик хотя бы один раз открывали эту форму в режиме «1С:Предприятие» до того, как в расширении был добавлен новый элемент управления, платформа запомнила «старый» вид формы. При последующих открытиях система пытается наложить ранее сохраненные пользовательские настройки поверх измененной структуры метаданных из расширения. В итоге новый элемент просто отбрасывается механизмом компоновки интерфейса.

Решение по шагам:

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

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

  1. Перейдем в раздел Администрирование -> Настройки пользователей и прав.
  2. Выберем пункт Очистка настроек.
  3. Найдем настройки нужной формы для всех пользователей и удалим их. При следующем открытии пользователи увидят обновленный интерфейс со всеми добавленными элементами.

Причина 3. Невидимость элемента из-за прав доступа и ролей

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

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

Решение по шагам:

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

Причина 4. Проблемы с платформенным кэшем и динамическим обновлением

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

Способы борьбы с кэшем:

  1. Очистка клиентского кэша: Самый простой способ — запустить информационную базу с параметром /ClearCache в строке запуска или полностью удалить базу из списка запуска и добавить ее заново (при этом папки с кэшем в каталогах %userprofile%\AppData\Local\1C и %userprofile%\AppData\Roaming\1C будут пересозданы).
  2. Очистка серверного кэша (для клиент-серверного варианта): Потребуется остановить службу кластера серверов 1С (ragent), зайти в каталог расположения реестра кластера (по умолчанию C:\Program Files\1cv8\srvinfo) и удалить временные папки кэша (папки формата snccntx...). После этого запустим службу заново.

Причина 5. Системные баги платформы (версии 8.3.15 и 8.3.16) и режим совместимости

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

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

Как реализовать обходной путь:

  1. В конфигураторе откроем свойства нашего расширения (нажав правой кнопкой мыши по корню расширения и выбрав Свойства).
  2. Найдем свойство Режим совместимости и временно установим его в значение Версия 8.3.13.
  3. Сохраним изменения. Заимствуем необходимую управляемую форму заново (или обновим существующую).
  4. Добавим новый реквизит и перенесем его на форму. На платформе версии 8.3.13 использовался старый, более жесткий, но стабильный механизм компиляции XML-схем форм, который гарантированно прописывает реквизиты в коллекцию.
  5. Запустим сеанс предприятия для проверки — реквизит сразу же отобразится на форме.
  6. После успешной проверки мы можем перенести данную разработку в рабочую базу или вернуть режим совместимости расширения обратно к требованиям основной конфигурации (например, 8.3.15). При этом созданная связь формы и реквизита уже не разрушится.

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


&НаСервере
Процедура Расш1_ПриСозданииНаСервереПосле(Отказ, СтандартнаяОбработка)
    
    // Проверим, существует ли добавленный нами элемент в коллекции формы на сервере
    ИмяПроверяемогоЭлемента = "Расш1_МойНовыйРеквизит";
    НайденныйЭлемент = Элементы.Найти(ИмяПроверяемогоЭлемента);
    
    Если НайденныйЭлемент = Неопределено Тогда
        // Если элемент не найден, значит имеет место баг платформы или проблема кэша метаданных
        ЗаписьЖурналаРегистрации(
            "ПроверкаРасширения",
            УровеньЖурналаРегистрации.Предупреждение,
            ,
            ,
            "Элемент '" + ИмяПроверяемогоЭлемента + "' не обнаружен в коллекции элементов формы при создании на сервере!"
        );
    Иначе
        // Если элемент найден, проверим его видимость и доступность
        НайденныйЭлемент.Видимость = Истина;
        НайденныйЭлемент.Доступность = Истина;
    КонецЕсли;
    
КонецПроцедуры

Используя данный метод программной проверки, мы сможем однозначно определить, на каком этапе происходит скрытие элемента: на этапе генерации формы сервером 1С или на этапе клиентской отрисовки под влиянием пользовательских настроек интерфейса.

← На главную