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