Как вывести реквизит расширения на форму списка в 1С:Предприятие 8.3

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

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

Разберем причину проблемы

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

Способ 1. Визуальная настройка в конфигураторе

Проанализируем самый простой путь, который доступен в современных версиях платформы (8.3.15 и выше). Перед тем как приступать к написанию кода, попробуем выполнить следующие действия:

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

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

Способ 2. Программное изменение текста запроса и добавление колонки

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

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


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

    // 3. Добавляем в текст запроса наш реквизит из расширения
    // Обратите внимание на обращение: ИмяТаблицы.ИмяРеквизитаРасширения
    ТекстДобавить = "ВЫБРАТЬ " + ИмяТаблицы + ".Расш1_МойРеквизит КАК Расш1_МойРеквизит, ";
    Список.ТекстЗапроса = СтрЗаменить(Список.ТекстЗапроса, "ВЫБРАТЬ", ТекстДобавить);

    // 4. Программно создаем колонку в таблице формы
    НоваяКолонка = Элементы.Добавить("Расш1_МойРеквизит", Тип("ПолеФормы"), Элементы.Список);
    НоваяКолонка.Вид = ВидПоляФормы.ПолеНадписи;
    НоваяКолонка.ПутьКДанным = "Список.Расш1_МойРеквизит";
    НоваяКолонка.Заголовок = "Доп. реквизит (Расш)";
КонецПроцедуры

Выясним, что именно происходит в этом коде. Мы используем метод СтрЗаменить, чтобы внедрить выборку нашего нового поля в начало секции ВЫБРАТЬ. После изменения текста запроса ДинамическийСписок автоматически обновляет свой набор данных, и мы можем связать новую колонку формы (объект ПолеФормы) с данными из списка через свойство ПутьКДанным.

Работа с отчетами и реквизитами расширения

Часто программисты задаются вопросом: как вытащить созданный в расширении реквизит в отчет? Здесь действует несколько правил:

Важные практические советы

Проанализируем дополнительные аспекты, которые влияют на корректность отображения данных:

Права доступа. Это самая частая причина, по которой поле не появляется на форме. В расширении необходимо создать свою роль, добавить в неё права на Чтение и Просмотр для нового реквизита и назначить эту роль пользователю. Без этого платформа просто скроет колонку, даже если код отработал без ошибок.

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

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

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

← На главную