При разработке расширений для конфигураций 1С часто возникает задача: добавить новый реквизит к существующему справочнику или документу и отобразить его не только в карточке объекта, но и в общем списке. Несмотря на то что в последних версиях платформы работа с расширениями стала интуитивно понятнее, начинающие разработчики часто сталкиваются с тем, что новый реквизит не появляется в настройках динамического списка или в выборе полей формы. Рассмотрим подробно, как решить эту задачу различными методами: от визуального проектирования до программного манипулирования метаданными.
Когда мы добавляем реквизит в расширение, он физически добавляется в таблицу базы данных. Однако форма списка в основной конфигурации часто использует Динамический список. Этот объект работает на основе запроса к базе данных. Если форма списка была перенесена в расширение, она сохраняет настройки из основной конфигурации. Если в динамическом списке не включен «Произвольный запрос», платформа автоматически формирует выборку полей. Проблема заключается в том, что расширение не всегда автоматически подтягивает новые поля в уже существующие элементы формы, особенно если структура списка была жестко зафиксирована в основной конфигурации.
Проанализируем самый простой путь, который доступен в современных версиях платформы (8.3.15 и выше). Перед тем как приступать к написанию кода, попробуем выполнить следующие действия:
Список с типом ДинамическийСписок).Список в правой части редактора формы. Новый реквизит должен появиться там. После этого мы можем просто перетащить его в дерево элементов формы.ВЫБРАТЬ... и назначим ему понятный псевдоним.Важный нюанс: если поле не появляется в списке выбора «Путь к данным» у элемента формы, попробуйте перезапустить конфигуратор или обновить конфигурацию базы данных. Иногда кеш метаданных не обновляется мгновенно.
Рассмотрим ситуацию, когда форма списка слишком сложная или нам нужно динамически управлять отображением колонок, не меняя структуру основной конфигурации в визуальном редакторе. Это особенно актуально, если мы хотим избежать конфликтов при обновлении основной конфигурации.
Для этого мы воспользуемся обработчиком события ПриСозданииНаСервере. Мы программно перехватим момент инициализации формы и внесем правки в текст запроса динамического списка. Посмотрим на пример кода, который позволяет сделать список «Произвольным», если он таковым не был, и добавить в него наше поле:
&НаСервере
Процедура Расш1_ПриСозданииНаСервереПосле(Отказ, СтандартнаяОбработка)
// 1. Получаем метаданные объекта основной таблицы списка
МетаданныеОбъекта = Метаданные.НайтиПоПолномуИмени(Список.ОсновнаяТаблица);
ИмяТаблицы = СтрЗаменить(Список.ОсновнаяТаблица, ".", "");
// 2. Проверяем, является ли запрос произвольным. Если нет — формируем его текст.
Если Не Список.ПроизвольныйЗапрос Тогда
МассивПолей = Новый Массив;
// Собираем все стандартные реквизиты
Для Каждого Реквизит Из МетаданныеОбъекта.СтандартныеРеквизиты Цикл
МассивПолей.Добавить(ИмяТаблицы + "." + Реквизит.Имя);
КонецЦикла;
// Собираем все обычные реквизиты
Для Каждого Реквизит Из МетаданныеОбъекта.Реквизиты Цикл
МассивПолей.Добавить(ИмяТаблицы + "." + Реквизит.Имя);
КонецЦикла;
Список.ПроизвольныйЗапрос = Истина;
Список.ТекстЗапроса = "ВЫБРАТЬ " + СтрСоединить(МассивПолей, ", ") + " ИЗ " + Список.ОсновнаяТаблица + " КАК " + ИмяТаблицы;
КонецЕсли;
// 3. Добавляем в текст запроса наш реквизит из расширения
// Обратите внимание на обращение: ИмяТаблицы.ИмяРеквизитаРасширения
ТекстДобавить = "ВЫБРАТЬ " + ИмяТаблицы + ".Расш1_МойРеквизит КАК Расш1_МойРеквизит, ";
Список.ТекстЗапроса = СтрЗаменить(Список.ТекстЗапроса, "ВЫБРАТЬ", ТекстДобавить);
// 4. Программно создаем колонку в таблице формы
НоваяКолонка = Элементы.Добавить("Расш1_МойРеквизит", Тип("ПолеФормы"), Элементы.Список);
НоваяКолонка.Вид = ВидПоляФормы.ПолеНадписи;
НоваяКолонка.ПутьКДанным = "Список.Расш1_МойРеквизит";
НоваяКолонка.Заголовок = "Доп. реквизит (Расш)";
КонецПроцедуры
Выясним, что именно происходит в этом коде. Мы используем метод СтрЗаменить, чтобы внедрить выборку нашего нового поля в начало секции ВЫБРАТЬ. После изменения текста запроса ДинамическийСписок автоматически обновляет свой набор данных, и мы можем связать новую колонку формы (объект ПолеФормы) с данными из списка через свойство ПутьКДанным.
Часто программисты задаются вопросом: как вытащить созданный в расширении реквизит в отчет? Здесь действует несколько правил:
Справочник.Номенклатура, поле Расш1_МойРеквизит будет доступно в конструкторе или при ручном написании текста запроса.Объект.ИмяПрефикса_ИмяРеквизита).Проанализируем дополнительные аспекты, которые влияют на корректность отображения данных:
Права доступа. Это самая частая причина, по которой поле не появляется на форме. В расширении необходимо создать свою роль, добавить в неё права на Чтение и Просмотр для нового реквизита и назначить эту роль пользователю. Без этого платформа просто скроет колонку, даже если код отработал без ошибок.
Индексирование. Если пользователи будут часто искать или сортировать данные по новому полю в списке, обязательно установите свойство Индексировать у реквизита в расширении. В противном случае работа с динамическим списком на больших таблицах может существенно замедлиться.
Пользовательская видимость. Чтобы пользователь мог самостоятельно управлять отображением колонки через меню «Изменить форму», убедитесь, что у созданного программно или визуально элемента формы настроена пользовательская видимость. Если вы добавляете колонку программно, убедитесь, что вы задали ей Заголовок, иначе колонка в списке будет видна, но останется без названия в шапке.
Таким образом, мы рассмотрели комплексный подход к выводу данных из расширения. Выбор между визуальным и программным способом зависит от ваших задач по поддержке конфигурации, но программный метод через ПриСозданииНаСервере является наиболее гибким и безопасным при частых обновлениях типовых решений.