При разработке сложных интерфейсов на управляемых формах часто возникает потребность логически сгруппировать множество реквизитов. На форумах разработчиков периодически звучит вопрос: можно ли создать реквизит формы с типом «Фиксированная структура», визуально добавить в него поля (ключи) и обращаться к ним в коде через точку (например, МояСтруктура.Поле1)? Давайте разберем эту ситуацию подробнее, выясним причину ограничений платформы и рассмотрим рабочие способы решения этой задачи.
Многие разработчики знают, что в 1С можно создать реквизит формы с типом Произвольный. В такой реквизит во время выполнения кода вполне можно поместить Структура или ФиксированнаяСтруктура. Однако главная проблема кроется на этапе проектирования в Конфигураторе.
Платформа не позволяет визуально задать ключи (состав) этой структуры в свойствах реквизита. Из-за этого мы лишаемся возможности прямо в визуальном редакторе форм привязать элемент (поле ввода, флажок, переключатель) к конкретному ключу через путь к данным. Как справедливо отмечают участники обсуждения, через тип Произвольный элементы интерфейса просто так не подвяжешь, а состав реквизита остается неочевидным для разработчика. В итоге в крупных формах скапливаются «портянки» из десятков плоских реквизитов.
Интересно, что механика, которая позволяет обращаться к вложенным свойствам через точку на форме, под капотом платформы 1С уже существует. Проанализируем, как это работает:
Когда мы добавляем на форму основной реквизит (например, Объект типа Справочник или Документ), платформа автоматически конвертирует его в специальный платформенный тип ДанныеФормыСтруктура. Именно благодаря этому типу мы можем обращаться к полям через точку (например, Объект.Организация) и визуально раскрывать дерево реквизитов для привязки элементов формы.
Но платформа искусственно ограничивает создание таких вложенных структур «с нуля» прямо в дереве реквизитов формы — они обязательно должны опираться на реальные объекты метаданных конфигурации. Поэтому «из коробки» добавить просто абстрактную структуру с полями нельзя.
Разберем по шагам, какие архитектурные подходы выработали разработчики 1С, чтобы логически структурировать данные на управляемых формах.
Если реквизитов (например, различных настроек рабочего места) действительно много и их критически важно сгруппировать в виде дерева, мы можем использовать объекты метаданных:
НастройкиФормы).ОбработкаОбъект.НастройкиФормы.В результате мы получаем ту самую желаемую структуру, доступную через точку (например, МоиНастройки.ИспользоватьКэш). Дерево реквизитов раскрывается в конфигураторе, и к нему легко привязывать элементы интерфейса.
Еще один оригинальный метод — использование таблицы для хранения плоских данных:
ТаблицаЗначений.Посмотрим на пример инициализации такой структуры:
&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
// Добавляем единственную строку, которая будет хранить наши настройки
НоваяСтрока = НастройкиФормыТЗ.Добавить();
НоваяСтрока.ТекущийПользователь = Пользователи.ТекущийПользователь();
НоваяСтрока.ЦветФона = WebЦвета.Белый;
КонецПроцедуры
В коде к полям можно обращаться через индекс: НастройкиФормыТЗ[0].ЦветФона. Однако стоит учитывать, что этот метод не очень удобен для визуального маппинга (привязки) элементов формы в редакторе.
Проанализируем подход, который массово применяется в современных типовых конфигурациях (ERP, БП, ЗУП). Чтобы длинные списки реквизитов не превращались в хаос, применяются строгие правила именования с использованием префиксов.
Вместо создания структуры, реквизиты называются, например: Настройка_Цвет, Настройка_Размер, Кэш_ТекущийПользователь. В панели реквизитов конфигуратора они автоматически выстраиваются по алфавиту, образуя аккуратные визуальные блоки.
Для передачи этих данных между сервером и клиентом их часто программно упаковывают в реальную Структура с помощью отдельной функции.
Если структура данных заранее неизвестна (например, собирается по результатам запроса или пользовательским настройкам), мы применяем динамическую генерацию.
В этом случае мы используем метод формы ИзменитьРеквизиты() для программного добавления полей, а затем выводим элементы управления на форму через Элементы.Добавить(). Разработчик сам пишет код, который читает введенные данные и собирает их в фиксированную структуру перед дальнейшей обработкой.
Подведем итог: Несмотря на то, что кнопка «Создать фиксированную структуру» в редакторе реквизитов формы отсутствует, экосистема платформы 1С предоставляет достаточно гибкие альтернативные инструменты. Выбор конкретного метода зависит от задачи: для десятка настроек отлично подойдут префиксы, а для масштабной группировки сложного интерфейса имеет смысл создать вспомогательную Обработку.