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