Почему в колонке дерева значений не отображаются зависимые реквизиты через «Изменить форму»?

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

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

Причины ограничения платформы и особенности работы интерфейса

Проанализируем ситуацию на уровне архитектуры платформы. Поведение системы обусловлено следующими факторами:

  1. Ограничение механизма разыменования для составных типов: Интерактивное разворачивание полей («через точку») в элементах формы, связанных с коллекциями ДанныеФормыДерево или ДанныеФормыКоллекция, функционирует только при условии, что тип колонки является строго однозначным ссылочным типом. Если колонка объявлена составным типом (даже если в него входят всего два документа), платформа не строит единую модель подчиненных метаданных. Пересечения общих свойств (таких как Номер, Дата или Проведен) платформой автоматически не объединяются, поэтому ветка зависимых реквизитов в окне добавления полей полностью блокируется.
  2. Кэширование пользовательских настроек: Если изменить составной тип колонки на однозначный ссылочный тип непосредственно в конфигураторе, то в режиме «1С:Предприятие» окно изменения формы может продолжать вести себя по-старому. Причина заключается в сохраненных пользовательских настройках формы. В такой ситуации необходимо через меню «Еще» нажать команду «Установить стандартные настройки», чтобы форма перечитала обновленную структуру метаданных реквизитов.
  3. Производительность отображения данных: В отличие от ДинамическогоСписка, который генерирует оптимизированный SQL-запрос с соединениями к таблицам базы, разыменование ссылок в дереве значений на клиенте приводит к неявным считываниям объектов целиком при отрисовке каждой строки. Для деревьев с большим количеством уровней и строк вывод зависимых полей через интерфейс может повлечь существенные задержки и лишние серверные вызовы.

Решение 1. Вывод явных колонок с заполнением через запрос (рекомендуемый подход)

Рассмотрим наиболее производительный и надежный способ. Вместо попытки разыменовать составной тип на клиенте мы сразу получаем все необходимые реквизиты запросом на сервере и помещаем их в явные типизированные колонки дерева значений.

Разберем реализацию по шагам:

  1. Добавим в дерево значений на форме отдельные колонки под требуемые реквизиты: например, ДатаДокумента (тип Дата), НомерДокумента (тип Строка) и Сумма (тип Число).
  2. В серверной процедуре формирования данных используем конструкцию языка запросов ВЫБОР КОГДА или ВЫРАЗИТЬ(... КАК ...) для корректного извлечения реквизитов из составного источника.

Посмотрим на пример текста запроса для извлечения данных из составного поля:


Запрос = Новый Запрос;
Запрос.Текст = 
"ВЫБРАТЬ
|	Источник.Ссылка КАК ДокументСсылка,
|	ВЫБОР
|		КОГДА Источник.Ссылка ССЫЛКА Документ.РеализацияТоваровУслуг
|			ТОГДА ВЫРАЗИТЬ(Источник.Ссылка КАК Документ.РеализацияТоваровУслуг).Номер
|		КОГДА Источник.Ссылка ССЫЛКА Документ.ПоступлениеТоваровУслуг
|			ТОГДА ВЫРАЗИТЬ(Источник.Ссылка КАК Документ.ПоступлениеТоваровУслуг).Номер
|		ИНАЧЕ """""
|	КОНЕЦ КАК НомерДокумента,
|	ВЫБОР
|		КОГДА Источник.Ссылка ССЫЛКА Документ.РеализацияТоваровУслуг
|			ТОГДА ВЫРАЗИТЬ(Источник.Ссылка КАК Документ.РеализацияТоваровУслуг).СуммаДокумента
|		КОГДА Источник.Ссылка ССЫЛКА Документ.ПоступлениеТоваровУслуг
|			ТОГДА ВЫРАЗИТЬ(Источник.Ссылка КАК Документ.ПоступлениеТоваровУслуг).СуммаДокумента
|		ИНАЧЕ 0
|	КОНЕЦ КАК Сумма
|ИЗ
|	РегистрСведений.ДанныеДокументов КАК Источник";

Выгрузив результат запроса в дерево значений и применив метод ЗначениеВРеквизитФормы(), мы получаем готовую структуру, в которой данные уже вычислены, а пользователь может скрывать или отображать эти колонки штатными флажками.

Решение 2. Подготовка скрытых колонок для пользовательской настройки

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

  1. Создаем в реквизитах формы у дерева значений все потенциально нужные колонки.
  2. Размещаем соответствующие элементы в элементе формы типа ТаблицаФормы.
  3. Для тех колонок, которые не должны отображаться сразу, устанавливаем свойство «Видимость = Ложь» в палитре свойств или программно при инициализации.
  4. При открытии окна «Изменить форму» пользователь видит эти колонки в основном дереве элементов и может включить их отображение простой установкой флажка, не прибегая к команде разыменования «Добавить поля».

Решение 3. Разделение составного типа на отдельные типизированные колонки

Если специфика бизнес-логики требует оперировать именно объектами ссылочного типа с сохранением возможности стандартного разыменования подчиненных полей, разделим составной тип на несколько колонок:

  1. Вместо одного реквизита с составным типом создаем две независимые колонки дерева: например, Реализация (тип ДокументСсылка.РеализацияТоваровУслуг) и Поступление (тип ДокументСсылка.ПоступлениеТоваровУслуг).
  2. При заполнении дерева строк значение помещается в ту колонку, типу которой оно соответствует.
  3. Поскольку каждая колонка теперь имеет строго однозначный тип, в диалоге «Изменить форму» для них становится доступна команда «Добавить поля», и пользователь сможет интерактивно вывести любые подчиненные реквизиты объекта.
← На главную