В процессе доработки конфигураций 1С часто возникает задача вывести в список документов или справочников дополнительную информацию, которой нет в основной таблице. Например, отобразить актуальную цену для товара или остаток на складе. Эта задача решается добавлением новой колонки в динамический список. Разберем по шагам, как это сделать правильно, рассмотрев как декларативный способ через Конфигуратор, так и программный метод для более гибкой настройки.
Проблема заключается в том, что недостаточно просто изменить запрос динамического списка. Чтобы колонка появилась на форме, нужно выполнить еще одно важное действие. Проанализируем оба этапа подробно.
Это самый простой и распространенный метод, который подходит для большинства случаев, когда структура списка постоянна. Весь процесс выполняется в режиме Конфигуратора без написания кода.
Рассмотрим на примере: нам нужно в список номенклатуры добавить колонку с ее последней установленной ценой из регистра сведений "Цены номенклатуры".
Открытие формы и свойств динамического списка.
Найдите в дереве конфигурации нужную форму списка (например, Справочник.Номенклатура.Форма.ФормаСписка) и откройте ее. В левой верхней панели "Реквизиты" выделите основной реквизит формы — это и есть наш динамический список (обычно называется "Список"). В палитре свойств этого реквизита найдите свойство Основная таблица. Убедитесь, что она установлена.
Включение произвольного запроса.
Чтобы получить возможность редактировать текст запроса, установите флаг Произвольный запрос. После этого свойство Текст запроса станет активным для редактирования.
Редактирование текста запроса.
Нажмите на кнопку "..." в свойстве Текст запроса, чтобы открыть Настройку списка, а в ней — Конструктор запроса. Здесь мы и будем модифицировать наш запрос.
Справочник.Номенклатура).РегистрСведений.ЦеныНоменклатуры.СрезПоследних.Справочник.Номенклатура.Ссылка = ЦеныНоменклатурыСрезПоследних.Номенклатура. Тип соединения установите ЛЕВОЕ СОЕДИНЕНИЕ. Это важно, чтобы в список попадала вся номенклатура, даже та, для которой цена не установлена.Добавление поля в выборку.
Перейдите на вкладку "Поля". В левой части найдите присоединенную таблицу (ЦеныНоменклатурыСрезПоследних), раскройте ее и перетащите поле Цена в правую часть (выбранные поля). Нажмите "ОК", чтобы сохранить изменения в запросе.
Вывод колонки на форму — ключевой шаг!
После сохранения запроса новое поле "Цена" появилось в списке доступных полей нашего динамического списка. Это можно увидеть, если в панели "Реквизиты" раскрыть реквизит "Список". Однако на самой форме колонка еще не появилась. Это частая ошибка начинающих разработчиков.
Чтобы колонка стала видна пользователю, нужно сделать следующее:
Список.Цена).После этого в дереве элементов появится новый элемент типа "Поле", и на предпросмотре формы вы увидите новую колонку "Цена". Для этой колонки можно настроить заголовок, ширину, формат и другие свойства.
Настройка свойства "Использовать всегда".
Чтобы гарантировать, что поле всегда будет получаться с сервера, даже если пользователь скроет колонку в своих настройках, вернитесь в свойства динамического списка ("Список"), откройте "Настройку списка", перейдите на вкладку "Настройка" и для поля "Цена" установите флаг "Использовать всегда".
Этот метод применяется, когда состав колонок должен меняться динамически в зависимости от условий: настроек программы, прав пользователя и т.д. Вся логика описывается в модуле формы на сервере, обычно в обработчике события ПриСозданииНаСервере.
Процесс также состоит из двух шагов: изменение текста запроса и программное добавление элемента формы.
Шаг 1. Модификация текста запроса.
Мы обращаемся к свойству ТекстЗапроса нашего динамического списка и изменяем его. Это можно сделать простыми строковыми функциями, например СтрЗаменить, или с помощью более надежного объекта СхемаЗапроса.
Шаг 2. Программное создание колонки на форме.
После изменения запроса нужно создать сам визуальный элемент (колонку) в таблице на форме. Для этого используется метод Элементы.Добавить(). Самое важное — правильно указать свойство ПутьКДанным, которое связывает новый элемент формы с новым полем в запросе.
Посмотрим на пример. Добавим в список колонку-флажок с произвольным названием.
&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
// Определяем, нужно ли добавлять колонку
УсловиеВыполнено = Истина; // Здесь может быть проверка настроек или прав
Если УсловиеВыполнено Тогда
// 1. Изменяем текст запроса, добавляя новое поле "ДопПоле"
// Добавляем поле после ключевого слова ВЫБРАТЬ
// Обратите внимание на запятую после нового поля
НовыйТекстЗапроса = СтрЗаменить(Список.ТекстЗапроса,
"ВЫБРАТЬ",
"ВЫБРАТЬ" + Символы.ПС + " ИСТИНА КАК ДопПоле,");
Список.ТекстЗапроса = НовыйТекстЗапроса;
// 2. Добавляем на форму элемент для отображения этой колонки
// Элементы.Список - это родительский элемент (таблица на форме)
НоваяКолонка = Элементы.Добавить("ДополнительнаяКолонкаФлаг", Тип("ПолеФормы"), Элементы.Список);
// Устанавливаем вид поля
НоваяКолонка.Вид = ВидПоляФормы.ПолеФлажка;
// Связываем элемент с данными из запроса. Путь должен быть "ИмяСписка.ИмяПоля"
НоваяКолонка.ПутьКДанным = "Список.ДопПоле";
// Настраиваем отображение
НоваяКолонка.Заголовок = "Доп. признак";
НоваяКолонка.Ширина = 15;
КонецЕсли;
КонецПроцедуры
В этом примере мы сначала добавили в запрос статическое поле ИСТИНА КАК ДопПоле, а затем создали на форме новый элемент типа ПолеФормы, установили ему вид флажка и, что самое главное, связали его с данными через ПутьКДанным = "Список.ДопПоле". Без этой связки колонка была бы пустой.
Два обязательных шага: всегда помните, что добавление колонки в динамический список — это двухэтапный процесс. Шаг 1: изменить запрос (добавить поле в ВЫБРАТЬ). Шаг 2: добавить элемент управления на форму (перетащить поле в Конфигураторе или создать его кодом).
Производительность: добавляя таблицы через ЛЕВОЕ СОЕДИНЕНИЕ, убедитесь, что поля, по которым вы устанавливаете связь, проиндексированы. Сложные соединения могут замедлить открытие списка.
Надежность программного изменения: для сложных модификаций запроса (добавление нескольких полей, соединений, условий) лучше использовать не строковые функции, а объект СхемаЗапроса. Он разбирает запрос на составные части, позволяет безопасно их изменять и затем собирает обратно. Это защищает код от ошибок при будущих изменениях исходного запроса в Конфигураторе.
Таким образом, разобравшись в этой двухступенчатой механике, вы сможете легко настраивать динамические списки и выводить в них любую необходимую информацию для пользователей.