Как добавить реквизит документа в расширении и вывести его в динамическом списке: подробное руководство

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

При разработке в расширениях для современных конфигураций (таких как УТ 11, ERP 2 или КА 2) программисты часто сталкиваются с проблемой: новый реквизит документа, добавленный в расширении, невозможно стандартными средствами вывести в журнал документов. Это происходит из-за того, что списки в этих конфигурациях строятся не на таблицах самих документов, а на вспомогательном регистре сведений РеестрДокументов.

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

Суть проблемы: почему «не ставится плюсик» в конструкторе запросов?

Когда мы работаем в основной конфигурации, поле Ссылка в регистре РеестрДокументов имеет четко определенный составной тип, включающий все документы системы. Однако в расширении это поле часто интерпретируется платформой как ЛюбаяСсылка.

В результате возникают следующие трудности:

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

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

Способ 1. Программная модификация запроса и элементов формы

Этот метод является наиболее универсальным, так как не требует изменения состава типов в самом регистре. Мы перехватываем момент создания формы и «на лету» подменяем текст запроса динамического списка.

Шаг 1. Перехват события создания формы.

Добавим форму списка (или форму журнала) в расширение и создадим обработчик ПриСозданииНаСервере с аннотацией &После.

Шаг 2. Программное изменение текста запроса.

Нам нужно вставить наш реквизит в выборку. Посмотрим на примере документа «Реализация товаров и услуг» и реквизита Проект.


&НаСервере
Процедура КАС_ПриСозданииНаСервереПосле(Отказ, СтандартнаяОбработка)
    
    // Получаем текущий текст запроса динамического списка
    Текст = Список.ТекстЗапроса;
    
    // Добавляем выборку нашего реквизита через разыменование ссылки.
    // Используем СтрЗаменить, чтобы внедрить поле сразу после оператора ВЫБРАТЬ
    НовоеПоле = "ВЫБРАТЬ
    |    РеестрДокументов.Ссылка.КАС_Проект КАК КАС_Проект,";
    
    Список.ТекстЗапроса = СтрЗаменить(Текст, "ВЫБРАТЬ", НовоеПоле);
    
    // Теперь программно добавляем колонку на форму
    НоваяКолонка = Элементы.Вставить("КАС_Проект", Тип("ПолеФормы"), Элементы.Список, Элементы.СписокДата);
    НоваяКолонка.Вид = ВидПоляФормы.ПолеВвода;
    НоваяКолонка.ПутьКДанным = "Список.КАС_Проект";
    НоваяКолонка.Заголовок = "Проект (из расширения)";
    
КонецПроцедуры

Важно помнить: при использовании метода Элементы.Вставить() мы можем указать четвертым параметром элемент, перед которым нужно вставить нашу колонку. В примере выше это Элементы.СписокДата.

Способ 2. Использование оператора ВЫРАЗИТЬ в запросе

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

В тексте запроса динамического списка проанализируем ситуацию и используем следующую конструкцию:


ВЫБРАТЬ
    Реестр.Ссылка,
    ВЫБРАТЬ(Реестр.Ссылка КАК Документ.РеализацияТоваровУслуг).КАС_Проект КАК КАС_Проект
ИЗ
    РегистрСведений.РеестрДокументов КАК Реестр

Почему это важно: Оператор ВЫРАЗИТЬ ограничивает область поиска. Если в реестре попадется документ другого типа (например, «Поступление»), поле будет заполнено значением NULL, но сам запрос не «упадет» с ошибкой.

Способ 3. Расширение состава регистра «Реестр документов» (Оптимальный для производительности)

Ранее описанные методы имеют один существенный недостаток: при выводе списка система будет выполнять LEFT JOIN к таблице каждого документа для каждой строки списка. На больших базах это может привести к заметным задержкам.

Проанализируем более профессиональный подход:

  1. Добавим в расширение сам регистр сведений РеестрДокументов.
  2. Добавим в него новый ресурс или реквизит (например, КАС_Проект) с нужным нам типом.
  3. Расширим процедуру заполнения реестра в модуле менеджера документа. Обычно это функции, вызываемые при проведении документа (например, СформироватьЗаписиРеестра).

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

Важные нюансы и решение проблем с правами доступа

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

Проблема прав:

Реквизиты, созданные в расширении, не попадают автоматически в типовые роли (например, «Просмотр реализации»). Чтобы исправить это, выполним следующие действия:

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

Обновление формы:

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

Заключение

Мы рассмотрели три способа вывода данных из расширения в список. Программный метод хорош для быстрой реализации, использование ВЫРАЗИТЬ подходит для простых отчетов, а изменение состава реестра — самый правильный путь с точки зрения производительности системы. Выбирайте метод в зависимости от нагрузки на вашу базу данных и сложности задачи.

← На главную