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