В процессе разработки на управляемых формах 1С часто возникает ситуация, когда стандартной функциональности интерактивного изменения формы пользователем (команда Еще — Изменить форму) становится недостаточно. Пользователям бывает неудобно самостоятельно искать нужные поля через точку от ссылки и добавлять их по одному. В этой статье мы подробно разберем, как автоматизировать этот процесс и реализовать программный вывод нескольких пользовательских реквизитов нажатием одной кнопки.
Рассмотрим ситуацию: у нас есть форма списка справочника или документа, и мы хотим дать пользователю кнопку, которая мгновенно выведет на экран набор дополнительных колонок, например, «Артикул» и «Производитель» для номенклатуры в списке заказов. Проблема заключается в том, что эти данные не всегда присутствуют в основном запросе динамического списка, и их нужно добавить динамически.
Разберем, где хранятся такие данные. Когда пользователь вручную добавляет поле через «Изменить форму», платформа регистрирует это изменение в компоновщике настроек динамического списка. Эти элементы не всегда сразу видны в коллекции Элементы формы до момента применения настроек, что может приводить к ошибкам или даже «вылетам» платформы на старых релизах (ниже 8.3.15). Для стабильной работы нам нужно действовать последовательно: модифицировать данные (запрос или настройки компоновки) и визуализировать их (создать элементы формы).
Это самый прямой и надежный метод, если нам нужно добавить поля, которых изначально нет в выборке динамического списка. Мы можем заменить текст запроса «на лету» перед открытием формы или по нажатию кнопки.
Проанализируем пример кода, который позволяет внедрить дополнительные поля в запрос динамического списка:
// Определяем базовую строку поиска (откуда начинается выбор таблиц)
СтрокаДляПоиска = "ИЗ Справочник.Партнеры КАК СправочникПартнеры";
// Формируем новую структуру запроса с нужными реквизитами
СтрокаДляЗамены = "СправочникПартнеры.НужныйРеквизит1 КАК НужныйРеквизит1, " +
"СправочникПартнеры.НужныйРеквизит2 КАК НужныйРеквизит2 " +
"ИЗ Справочник.Партнеры КАК СправочникПартнеры";
// Модифицируем текст запроса динамического списка
Список.ТекстЗапроса = СтрЗаменить(Список.ТекстЗапроса, "ИЗ Справочник.Партнеры", СтрокаДляЗамены);
Важно помнить, что после изменения текста запроса необходимо обновить элементы формы, чтобы пользователь увидел результат. Если поля уже были добавлены в конфигураторе, но были скрыты, достаточно будет просто включить их видимость.
Если мы не хотим менять основной запрос (например, если он сложный и содержит объединения), мы можем воспользоваться механизмом Компоновщика настроек. Динамический список в 1С 8.3 — это, по сути, обертка над системой компоновки данных (СКД).
Рассмотрим пошагово, как добавить поле в выбранные поля программно:
Список.КомпоновщикНастроек.Настройки.ВыбранныеПоля.DataCompositionSelectedField.Ссылка.Артикул).Пример программной реализации:
// Создаем новое поле компоновки
НовоеПоле = Список.КомпоновщикНастроек.Настройки.ВыбранныеПоля.Элементы.Добавить(Тип("ВыбранноеПолеКомпоновкиДанных"));
НовоеПоле.Поле = Новый ПолеКомпоновкиДанных("Ссылка.Код");
НовоеПоле.Использование = Истина;
НовоеПоле.Заголовок = "Код объекта";
После этого поле станет доступным для отображения, но оно еще не появилось в таблице на форме. Нам нужно создать визуальный элемент.
Выясним, как создать саму колонку в таблице динамического списка. Для этого мы будем использовать метод Элементы.Добавить(). Главный секрет здесь — правильно указать ПутьКДанным. Он должен соответствовать структуре динамического списка.
Разберем пример создания колонки:
// Добавляем новую колонку в таблицу "Список"
ИмяКолонки = "ДополнительныйРеквизит";
НовыйЭлемент = Элементы.Добавить(ИмяКолонки, Тип("ПолеФормы"), Элементы.Список);
// Настраиваем свойства поля
НовыйЭлемент.Вид = ВидПоляФормы.ПолеНадписи;
// Указываем путь через точку от имени динамического списка
НовыйЭлемент.ПутьКДанным = "Список.Ссылка.НаименованиеПолное";
НовыйЭлемент.Заголовок = "Полное наименование";
// Обязательно устанавливаем видимость
НовыйЭлемент.Видимость = Истина;
Важный нюанс: Чтобы данные в такой колонке отображались корректно, убедитесь, что в свойствах динамического списка (в конфигураторе или программно) для реквизита Ссылка не стоит ограничение на использование. В некоторых случаях может потребоваться установить флаг «Использовать всегда» для родительского реквизита в схеме компоновки данных списка.
Проанализируем ситуацию, когда нам нужно распространить настройки одного пользователя на всех остальных. Все действия, которые делает пользователь через интерфейс (изменение ширины, добавление полей, группировки), сохраняются в системном хранилище настроек (SystemSettingsStorage).
Хотя мы не можем напрямую «влезть» в стандартное окно «Изменить форму», мы можем программно прочитать настройки формы одного пользователя и записать их другому. Это позволяет «настроить один раз» эталонный интерфейс и тиражировать его программно без необходимости заходить под каждой учетной записью.
Если ваша задача подразумевает массовое внедрение новых реквизитов, которые должны быть доступны всем пользователям постоянно, наиболее правильным архитектурным решением будет использование Расширений конфигурации. Рассмотрим преимущества этого подхода:
Подводя итог, можно сказать: для разовых задач по требованию пользователя лучше всего подходит программное создание элементов формы с указанием пути к данным через точку. Для системных доработок интерфейса следует отдавать предпочтение расширениям в сочетании с управлением свойством Видимость.