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