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

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

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

В этой статье мы подробно разберем, почему возникает такое поведение системы, проанализируем изменения в поведении платформы начиная с версий 8.3.14 и 8.3.15, а также рассмотрим несколько надежных способов решения данной проблемы — от настройки прав доступа до динамического программного создания элементов формы, что является лучшей практикой (Best Practice) в современной разработке.

Выясняем причину: особенности поведения платформы 8.3.14 и выше

Для начала проанализируем, почему возникает такое расхождение между серверными данными и клиентским отображением. Начиная с версии платформы 1С 8.3.14, разработчики существенно ужесточили политику безопасности и разграничения прав доступа для объектов, создаваемых в расширениях конфигурации.

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

  1. Она оставляет реквизит в структуре прикладного объекта на сервере (поэтому в Объект.Товары в отладке реквизит виден).
  2. Платформа неявно и без генерации ошибок удаляет элемент управления (колонку) из коллекции Элементы на форме. В результате элемент визуально исчезает, а попытка обратиться к нему программно вызывает исключение.

Рассмотрим пошагово четыре основных способа решения этой проблемы в зависимости от архитектуры вашей базы данных.

---

Решение 1: Настройка ролей и прав доступа в расширении

Если в основной конфигурации используется сложная система прав (например, в конфигурациях на базе БСП, таких как 1С:ERP, 1С:Комплексная автоматизация или 1С:Управление торговлей), права на новые объекты расширения нужно определять явным образом.

Выполним следующие действия по шагам:

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

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

---

Решение 2: Сброс кэша пользовательских настроек формы

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

Проверим и устраним эту проблему:

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

Во многих случаях после сброса настроек к стандартным новая колонка мгновенно отображается на экране.

---

Решение 3: Соблюдение корректной последовательности заимствования элементов

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

Выясним правильную последовательность действий при визуальном проектировании:

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

---

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

Заимствование сложных типовых форм (особенно в конфигурациях на БСП, таких как ERP, КА 2, УТ 11) визуальным способом крайне не рекомендуется. При обновлении конфигурации поставщика заимствованные формы часто вызывают конфликты сравнения-объединения, а также могут «слетать» при изменении стандартных элементов поставщиком.

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

Рассмотрим пример реализации этого подхода по шагам:

  1. Создадим реквизит табличной части в самом объекте (например, в документе) внутри расширения.
  2. Заимствуем форму документа в расширение, но не трогаем ее элементы визуально. Заимствуем только обработчик события формы ПриСозданииНаСервере с аннотацией &После.
  3. В модуле заимствованной формы напишем следующий отказоустойчивый код:

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

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

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

← На главную