При разработке интерфейсов на управляемых формах часто требуется дать пользователю возможность гибко настраивать состав видимых колонок через стандартное меню «Еще — Изменить форму». Если колонка таблицы или дерева значений содержит одиночную ссылку (например, справочник Организации), платформа штатно позволяет раскрыть ветку подчиненных реквизитов по кнопке «Добавить поля» и выбрать для показа, например, ИНН или КПП. Однако при попытке проделать то же самое с колонкой, имеющей составной тип (например, ссылки на два разных вида документов), список зависимых реквизитов оказывается недоступен. Разберем причины такого поведения платформы «1С:Предприятие» и рассмотрим правильные варианты реализации задачи.
Проанализируем ситуацию на уровне архитектуры платформы. Поведение системы обусловлено следующими факторами:
ДанныеФормыДерево или ДанныеФормыКоллекция, функционирует только при условии, что тип колонки является строго однозначным ссылочным типом. Если колонка объявлена составным типом (даже если в него входят всего два документа), платформа не строит единую модель подчиненных метаданных. Пересечения общих свойств (таких как Номер, Дата или Проведен) платформой автоматически не объединяются, поэтому ветка зависимых реквизитов в окне добавления полей полностью блокируется.ДинамическогоСписка, который генерирует оптимизированный SQL-запрос с соединениями к таблицам базы, разыменование ссылок в дереве значений на клиенте приводит к неявным считываниям объектов целиком при отрисовке каждой строки. Для деревьев с большим количеством уровней и строк вывод зависимых полей через интерфейс может повлечь существенные задержки и лишние серверные вызовы.Рассмотрим наиболее производительный и надежный способ. Вместо попытки разыменовать составной тип на клиенте мы сразу получаем все необходимые реквизиты запросом на сервере и помещаем их в явные типизированные колонки дерева значений.
Разберем реализацию по шагам:
ДатаДокумента (тип Дата), НомерДокумента (тип Строка) и Сумма (тип Число).ВЫБОР КОГДА или ВЫРАЗИТЬ(... КАК ...) для корректного извлечения реквизитов из составного источника.Посмотрим на пример текста запроса для извлечения данных из составного поля:
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| Источник.Ссылка КАК ДокументСсылка,
| ВЫБОР
| КОГДА Источник.Ссылка ССЫЛКА Документ.РеализацияТоваровУслуг
| ТОГДА ВЫРАЗИТЬ(Источник.Ссылка КАК Документ.РеализацияТоваровУслуг).Номер
| КОГДА Источник.Ссылка ССЫЛКА Документ.ПоступлениеТоваровУслуг
| ТОГДА ВЫРАЗИТЬ(Источник.Ссылка КАК Документ.ПоступлениеТоваровУслуг).Номер
| ИНАЧЕ """""
| КОНЕЦ КАК НомерДокумента,
| ВЫБОР
| КОГДА Источник.Ссылка ССЫЛКА Документ.РеализацияТоваровУслуг
| ТОГДА ВЫРАЗИТЬ(Источник.Ссылка КАК Документ.РеализацияТоваровУслуг).СуммаДокумента
| КОГДА Источник.Ссылка ССЫЛКА Документ.ПоступлениеТоваровУслуг
| ТОГДА ВЫРАЗИТЬ(Источник.Ссылка КАК Документ.ПоступлениеТоваровУслуг).СуммаДокумента
| ИНАЧЕ 0
| КОНЕЦ КАК Сумма
|ИЗ
| РегистрСведений.ДанныеДокументов КАК Источник";
Выгрузив результат запроса в дерево значений и применив метод ЗначениеВРеквизитФормы(), мы получаем готовую структуру, в которой данные уже вычислены, а пользователь может скрывать или отображать эти колонки штатными флажками.
Если набор возможных реквизитов известен заранее, разберем альтернативный вариант, позволяющий пользователю самостоятельно включать видимость колонок без риска замедления системы:
ТаблицаФормы.Если специфика бизнес-логики требует оперировать именно объектами ссылочного типа с сохранением возможности стандартного разыменования подчиненных полей, разделим составной тип на несколько колонок:
Реализация (тип ДокументСсылка.РеализацияТоваровУслуг) и Поступление (тип ДокументСсылка.ПоступлениеТоваровУслуг).