Как использовать фиксированные структуры в реквизитах управляемой формы 1С?

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

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

В чем заключается проблема визуальной разработки?

Многие разработчики знают, что в 1С можно создать реквизит формы с типом Произвольный. В такой реквизит во время выполнения кода вполне можно поместить Структура или ФиксированнаяСтруктура. Однако главная проблема кроется на этапе проектирования в Конфигураторе.

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

Архитектура платформы и ДанныеФормыСтруктура

Интересно, что механика, которая позволяет обращаться к вложенным свойствам через точку на форме, под капотом платформы 1С уже существует. Проанализируем, как это работает:

Когда мы добавляем на форму основной реквизит (например, Объект типа Справочник или Документ), платформа автоматически конвертирует его в специальный платформенный тип ДанныеФормыСтруктура. Именно благодаря этому типу мы можем обращаться к полям через точку (например, Объект.Организация) и визуально раскрывать дерево реквизитов для привязки элементов формы.

Но платформа искусственно ограничивает создание таких вложенных структур «с нуля» прямо в дереве реквизитов формы — они обязательно должны опираться на реальные объекты метаданных конфигурации. Поэтому «из коробки» добавить просто абстрактную структуру с полями нельзя.

Практические способы решения (Workarounds)

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

1. Использование фиктивной Обработки или Отчета

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

  1. Создаем в дереве метаданных конфигурации новую Обработку (например, НастройкиФормы).
  2. Добавляем в эту обработку все необходимые переменные как ее реквизиты.
  3. На нужной нам форме создаем реквизит с типом ОбработкаОбъект.НастройкиФормы.

В результате мы получаем ту самую желаемую структуру, доступную через точку (например, МоиНастройки.ИспользоватьКэш). Дерево реквизитов раскрывается в конфигураторе, и к нему легко привязывать элементы интерфейса.

2. Группировка с помощью «Таблицы значений»

Еще один оригинальный метод — использование таблицы для хранения плоских данных:

  1. Создаем реквизит формы с типом ТаблицаЗначений.
  2. Прямо в конфигураторе задаем для нее нужные колонки (наши будущие "реквизиты").
  3. В обработчике события формы программно добавляем ровно одну строку.

Посмотрим на пример инициализации такой структуры:


&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
    // Добавляем единственную строку, которая будет хранить наши настройки
    НоваяСтрока = НастройкиФормыТЗ.Добавить();
    НоваяСтрока.ТекущийПользователь = Пользователи.ТекущийПользователь();
    НоваяСтрока.ЦветФона = WebЦвета.Белый;
КонецПроцедуры

В коде к полям можно обращаться через индекс: НастройкиФормыТЗ[0].ЦветФона. Однако стоит учитывать, что этот метод не очень удобен для визуального маппинга (привязки) элементов формы в редакторе.

3. Использование префиксов (Типовой подход 1С)

Проанализируем подход, который массово применяется в современных типовых конфигурациях (ERP, БП, ЗУП). Чтобы длинные списки реквизитов не превращались в хаос, применяются строгие правила именования с использованием префиксов.

Вместо создания структуры, реквизиты называются, например: Настройка_Цвет, Настройка_Размер, Кэш_ТекущийПользователь. В панели реквизитов конфигуратора они автоматически выстраиваются по алфавиту, образуя аккуратные визуальные блоки.

Для передачи этих данных между сервером и клиентом их часто программно упаковывают в реальную Структура с помощью отдельной функции.

4. Программная генерация реквизитов и элементов (Динамические формы)

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

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

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

← На главную