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