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