В процессе разработки в среде 1С:Предприятие 8 многие программисты сталкиваются с досадным ограничением стандартного Конфигуратора: отсутствие кнопок «Вверх» и «Вниз» для управления порядком реквизитов управляемой формы. Сортировка объектов метаданных вручную — занятие утомительное, а в то время как элементы формы (визуальные поля) можно легко перемещать, сами данные (реквизиты) часто отображаются либо в порядке их создания, либо по алфавиту. Рассмотрим подробнее, почему так происходит и какие существуют методы для наведения порядка в структуре формы.
На первый взгляд может показаться, что порядок реквизитов в правой части редактора формы — это вопрос исключительно эстетики и «перфекционизма». Однако при сопровождении сложных систем, где количество реквизитов формы может исчисляться десятками, их хаотичное расположение затрудняет поиск нужных переменных и увеличивает риск ошибок при разработке. Даже простое добавление реквизитов и элементов на управляемые формы требует определенной системности. Особенно остро проблема встает при работе с реквизитами типа ТаблицаЗначений: колонки этой таблицы в списке реквизитов зафиксированы в порядке их добавления, и изменить их визуальное представление без пересоздания в обычном Конфигураторе невозможно. Выясним причину такого поведения и разберем способы решения задачи.
Проанализируем самый современный и удобный способ. 1C:EDT — это среда разработки на базе Eclipse, которая постепенно заменяет классический Конфигуратор. В отличие от своего предшественника, EDT обладает гораздо более гибким интерфейсом для работы со структурой метаданных. Для тех, кто только планирует переход на новые инструменты, будет полезно изучить начало работы в 1С:EDT, чтобы освоить все преимущества современной среды.
Разберем по шагам, как это сделать в EDT:
Этот метод является наиболее безопасным и «цивилизованным», так как среда сама следит за целостностью структуры данных.
Если вы не используете EDT, можно прибегнуть к «низкоуровневому» методу, который часто называют «хаком». Метод заключается в прямой правке исходного кода формы. Посмотрим на этот процесс подробнее:
Form.form или располагается в папке с именем формы.<attributes>. Внутри нее каждый реквизит описан тегом <attribute>.ТаблицаЗначений внутри тега атрибута будет вложенная секция <columns> с тегами <column>.<attribute> или <column> целиком в нужном нам порядке.Важно: этот метод требует осторожности. Ошибка в структуре XML может привести к тому, что форма перестанет открываться в Конфигураторе.
Рассмотрим более простой, хотя и компромиссный вариант. Платформа часто сортирует плоские списки реквизитов по алфавиту. Чтобы логически сгруппировать данные, мы можем использовать систему префиксов в именах.
Например, вместо имен ДатаНачала, Статус, СуммаИтого, используем:
// Пример именования для группировки:
Параметры_ДатаНачала
Параметры_ДатаОкончания
Служебные_АдресСервера
Служебные_Токен
Такой подход позволяет Конфигуратору автоматически «прижать» связанные реквизиты друг к другу. Это не меняет физический порядок в данных, но значительно упрощает навигацию для программиста.
Важно различать реквизиты формы (данные) и элементы формы (визуальное представление). Если ваша задача — изменить порядок колонок в таблице на экране пользователя, это можно сделать программно в процедуре ПриСозданииНаСервере. Комплексное программное изменение форм позволяет автоматизировать настройку интерфейса под конкретные задачи.
Рассмотрим пример кода:
&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
// Переместим колонку "Цена" в самое начало таблицы "Товары"
ЭлементКолонка = Элементы.ТоварыЦена;
РодительТаблица = Элементы.Товары;
ЭлементПередКоторымВставить = Элементы.ТоварыНоменклатура;
Элементы.Переместить(ЭлементКолонка, РодительТаблица, ЭлементПередКоторымВставить);
КонецПроцедуры
Метод Элементы.Переместить() позволяет динамически управлять порядком интерфейсных полей, независимо от того, в каком порядке созданы сами реквизиты в конфигураторе. Кстати, аналогичный подход используется, когда требуется программное перемещение колонки динамического списка в зависимости от настроек пользователя.
Иногда требуется полностью динамическое формирование структуры данных. Выясним, как управлять порядком в этом случае. При использовании метода ИзменитьРеквизиты() новые поля всегда добавляются в конец списка. Если порядок критически важен, единственным выходом будет удаление всех реквизитов и их повторное создание в строгом порядке. В некоторых случаях для отладки структуры может пригодиться редактор форм в режиме предприятия, позволяющий видеть изменения свойств объектов без перезапуска.
Посмотрим на пример удаления и добавления:
&НаСервере
Процедура ПересоздатьРеквизиты()
МассивДобавляемых = Новый Массив;
МассивУдаляемых = Новый Массив;
// Сначала определяем, что нужно удалить
МассивУдаляемых.Добавить("СтарыйРеквизит");
// Определяем новые реквизиты в нужном порядке
НовыйТип = Новый ОписаниеТипов("Число");
МассивДобавляемых.Добавить(Новый РеквизитФормы("ПервыйРеквизит", НовыйТип));
МассивДобавляемых.Добавить(Новый РеквизитФормы("ВторойРеквизит", НовыйТип));
ЭтаФорма.ИзменитьРеквизиты(МассивДобавляемых, МассивУдаляемых);
КонецПроцедуры
Мы проанализировали ситуацию и выяснили, что штатного способа «перетаскивания» реквизитов в обычном Конфигураторе 1С не существует. Однако, используя EDT, прямую правку XML или программное перемещение элементов, можно добиться нужного результата. Для повседневной разработки наиболее эффективным считается использование префиксов в именах для автоматической сортировки и метод Элементы.Переместить() для настройки интерфейса.