Почему программно добавленная колонка не отображается на форме в 1С?

Программист 1С v8.3 (Управляемые формы) 1С:Зарплата и Управление Персоналом IT и автоматизация бизнеса
← На главную

Рассмотрим частую ситуацию при разработке в 1С: вы программно добавляете новые колонки в табличную часть формы или в динамический список, но на экране появляется только часть из них, либо элементы не отображаются вовсе. Проанализируем типичный пример кода, который вызывает такую проблему:


НоваяКолонкаТаблицы = Элементы.Вставить("СпособОтраженияЗарплатыВБухучете", Тип("ПолеФормы"), Элементы.Список, Элементы.ДатаЗакрытия);
НоваяКолонкаТаблицы.ПутьКДанным = "Список.СпособОтраженияЗарплатыВБухучете";  
НоваяКолонкаТаблицы.Заголовок   = "Способ отражения";

НоваяКолонкаТаблицы = Элементы.Вставить("УсловияТруда", Тип("ПолеФормы"), Элементы.Список, Элементы.ДатаЗакрытия);
НоваяКолонкаТаблицы.ПутьКДанным = "Список.условияПриема";
НоваяКолонкаТаблицы.Заголовок   = "Условия труда";

В данном случае разработчик добавляет два реквизита на форму, но один из них отображается корректно, а второй исчезает. Разберем по шагам, почему так происходит и как правильно организовать программное добавление элементов на управляемую форму.

Разница между визуальными элементами и данными

Выясним причину возникновения ошибки. Метод Элементы.Вставить() или Элементы.Добавить() отвечает исключительно за создание визуального элемента управления в интерфейсе. Это значит, что система рисует колонку, но для ее заполнения ей нужна связь с реальными данными. Эта связь задается через свойство ПутьКДанным.

Если в источнике данных (в нашем примере это динамический список Список) физически отсутствует поле условияПриема, то колонка будет добавлена на форму, но останется пустой или платформа вообще скроет ее во избежание ошибок отображения. В отладчике можно легко проверить наличие нужных полей в выборке: если поля нет в запросе динамического списка, визуальный элемент не заработает.

Как добавить данные из регистра в динамический список

Если необходимые данные (например, реквизиты из справочника или регистра сведений) отсутствуют в базовом запросе динамического списка, нам нужно предварительно модифицировать сам текст запроса. Обратимся к свойству Список.ТекстЗапроса. Сделать это можно двумя основными способами.

1. Работа со строками:

Вы можете использовать строковые функции 1С, такие как СтрЗаменить, чтобы врезать в существующий запрос левое соединение с нужным регистром и добавить выборку новых полей. Однако этот метод ненадежен при сложных запросах.

2. Использование объекта СхемаЗапроса (Рекомендуется):

Разберем более грамотный и безопасный подход. Объект СхемаЗапроса позволяет программно разобрать текст запроса на структурные блоки (пакеты, источники, поля выбора) и модифицировать их без риска синтаксических ошибок.


Схема = Новый СхемаЗапроса;
Схема.УстановитьТекстЗапроса(Список.ТекстЗапроса);

// Получаем первый пакет запроса
Пакет = Схема.ПакетЗапросов[0];

// Программное добавление новых источников и полей
// ... (логика работы со схемой)

Список.ТекстЗапроса = Схема.ПолучитьТекстЗапроса();

Указание вида поля формы

Проанализируем еще один важный момент. При добавлении колонки в коде выше упущено явное определение вида создаваемого поля. Платформа 1С должна понимать, как именно отрисовывать элемент: как обычную надпись, как поле ввода или как флажок. При программном создании всегда заполняйте свойство Вид.


НоваяКолонкаТаблицы.Вид = ВидПоляФормы.ПолеНадписи;
// или
НоваяКолонкаТаблицы.Вид = ВидПоляФормы.ПолеВвода;

Правильный алгоритм программного создания новых реквизитов

Посмотрим на общую картину. Если перед нами стоит задача не просто вывести существующее поле динамического списка, а создать совершенно новый независимый реквизит формы (для хранения пользовательского ввода), необходимо действовать в два этапа:

  1. Создание данных: Сначала формируется массив объектов типа РеквизитФормы. В нем описывается имя будущего реквизита и его тип. Затем этот массив передается в серверный метод ИзменитьРеквизиты(). Этот метод ресурсоемкий, поэтому все новые реквизиты собираются в один массив и добавляются за один вызов функции.
  2. Создание интерфейса: Только после того, как данные успешно созданы в структуре формы, мы вызываем метод Элементы.Добавить() для отрисовки элемента управления и привязываем его к ранее созданному реквизиту через ПутьКДанным.

Пример правильного добавления независимого реквизита:


// Шаг 1. Создание реквизита (данные)
МассивРеквизитов = Новый Массив;
НовыйРеквизит = Новый РеквизитФормы("ДополнительноеУсловие", Новый ОписаниеТипов("Строка"));
МассивРеквизитов.Добавить(НовыйРеквизит);
ИзменитьРеквизиты(МассивРеквизитов);

// Шаг 2. Создание элемента формы (визуализация)
НовыйЭлемент = Элементы.Добавить("ДополнительноеУсловиеНаФорме", Тип("ПолеФормы"), ЭтаФорма);
НовыйЭлемент.Вид = ВидПоляФормы.ПолеВвода;
НовыйЭлемент.ПутьКДанным = "ДополнительноеУсловие";
НовыйЭлемент.Заголовок = "Доп. условие";

Подведем итог: Если вы столкнулись с ситуацией, когда добавленная колонка не выводится на форму, первым делом проверьте отладчиком наличие этого поля в исходном запросе данных. Помните, что визуальный элемент управления не может существовать (или отображать значения) без жесткой привязки к реально существующим данным.

← На главную