Как программно добавить элемент формы на основе реквизита типа Булево в 1С 8.3

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

При разработке на платформе 1С:Предприятие 8.3 (Управляемые формы) часто возникает необходимость динамически изменять интерфейс. Одной из типичных задач является программное добавление флажка (типа Булево). Однако начинающие разработчики часто сталкиваются с ошибкой «Недопустимое значение» при попытке связать новый элемент с данными. В этой статье мы подробно разберем, как правильно создать реквизит, добавить его на форму и избежать распространенных ошибок.

Причина возникновения ошибки «Недопустимое значение»

Рассмотрим ситуацию: вы пытаетесь добавить элемент формы и сразу прописать ему ПутьКДанным. Ошибка возникает в двух основных случаях:

  1. Нарушение последовательности действий: Попытка назначить путь к реквизиту, который еще не был физически создан в памяти формы.
  2. Неверный контекст пути: Вы указываете путь "Объект.ИмяРеквизита", когда реквизит создан непосредственно в форме (а не в объекте конфигурации), или наоборот.

Проанализируем правильный алгоритм работы, который гарантирует стабильный результат.

Шаг 1. Программное создание реквизита формы

Перед тем как выводить визуальный элемент (флажок), нам нужно подготовить «место» для хранения данных — реквизит. Если этот реквизит не добавлен в метаданные в конфигураторе, его нужно создать программно методом ИзменитьРеквизиты. Рассмотрим код добавления реквизита:


// Создаем массив для новых реквизитов
ДобавляемыеРеквизиты = Новый Массив;

// Описываем новый реквизит формы: Имя, Тип, Путь, Заголовок, Сохраняемые данные
ИмяРеквизита = "Расш2_РазрешитьОтгрузку";
ТипРеквизита = Новый ОписаниеТипов("Булево");
НовыйРеквизит = Новый РеквизитФормы(ИмяРеквизита, ТипРеквизита, , "Разрешить отгрузку", Истина);

// Добавляем описание в массив
ДобавляемыеРеквизиты.Добавить(НовыйРеквизит);

// Фиксируем изменения на форме
ЭтаФорма.ИзменитьРеквизиты(ДобавляемыеРеквизиты);

Важный момент: Метод ИзменитьРеквизиты является ресурсоемким. Если вам нужно добавить несколько реквизитов, всегда собирайте их в один массив и вызывайте метод один раз. Никогда не вызывайте его внутри цикла.

Шаг 2. Программное создание элемента формы (Поле флажка)

Теперь, когда реквизит существует в контексте формы, мы можем создать визуальный элемент и привязать его к этому реквизиту. Выясним причину, по которой это нужно делать именно вторым шагом: ПутьКДанным проверяется системой в момент назначения, и если реквизит Расш2_РазрешитьОтгрузку еще не «принят» формой, возникнет исключение.


// Определяем родительскую группу, где будет стоять флажок
ИмяГруппы = "ГруппаНомерДата";
ГруппаФормы = ЭтаФорма.Элементы.Найти(ИмяГруппы);

Если ГруппаФормы <> Неопределено Тогда
    ИмяЭлемента = "Расш2_РазрешитьОтгрузку";
    
    // Проверяем, не был ли элемент добавлен ранее
    Если ЭтаФорма.Элементы.Найти(ИмяЭлемента) = Неопределено Тогда
        // Добавляем элемент типа ПолеФормы
        НовыйЭлемент = ЭтаФорма.Элементы.Добавить(ИмяЭлемента, Тип("ПолеФормы"), ГруппаФормы);
        
        // Устанавливаем вид — Поле флажка
        НовыйЭлемент.Вид = ВидПоляФормы.ПолеФлажка;
        
        // Указываем путь к данным. 
        // ВНИМАНИЕ: если реквизит создан программно через ИзменитьРеквизиты, 
        // префикс "Объект." НЕ НУЖЕН.
        НовыйЭлемент.ПутьКДанным = "Расш2_РазрешитьОтгрузку";
        
        // Дополнительные настройки внешнего вида
        НовыйЭлемент.Заголовок = "Разрешить отгрузку";
    КонецЕсли;
КонецЕсли;

Различие в путях к данным: Объект vs Форма

Разберем подробнее, почему в Сообщении 1 из темы возникла ошибка, а в Сообщении 4 — нет. Это ключевой момент понимания архитектуры управляемых форм 1С:

Попытка указать "Объект.РеквизитФормы" приведет к ошибке «Недопустимое значение», так как внутри структуры Объект (которая обычно является ДанныеФормыСтруктура) такого поля не существует.

Нюансы сохранения данных

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

Чтобы данные сохранялись, у нас есть два пути:

  1. Использовать реквизиты объекта: Добавить поле в сам документ или справочник в конфигураторе. Тогда путь к данным будет "Объект.Имя", и 1С сама запишет значение в БД при нажатии кнопки «Записать».
  2. Ручное сохранение: Если реквизит должен быть именно программным, нам придется перехватывать событие ПередЗаписьюНаСервере и вручную переносить значение из программного реквизита формы в какой-либо дополнительный параметр или реквизит объекта.

Добавление обработчиков событий

Просто создать флажок часто недостаточно — нужно, чтобы при его изменении выполнялся какой-то код. Для этого используется метод УстановитьДействие. Рассмотрим пример подключения обработчика «ПриИзменении»:


// В процедуре создания элемента
НовыйЭлемент.УстановитьДействие("ПриИзменении", "Подключаемый_ПриИзмененииФлажка");

// В модуле формы должна быть соответствующая процедура
&НаКлиенте
Процедура Подключаемый_ПриИзмененииФлажка(Элемент)
    // Ваша логика здесь
    Сообщить("Значение флажка изменено!");
КонецПроцедуры

Типичные ошибки при выборе родителя элемента

Посмотрим на опыт пользователя из Сообщения 13. Ошибка может возникнуть, если вы пытаетесь добавить элемент в родителя, который не поддерживает данный тип элемента. Например, если вы указываете родителем ТаблицуФормы, но при этом добавляете ПолеФормы напрямую, а не в составе колонки. Всегда проверяйте, что ГруппаФормы, в которую вы добавляете элемент, действительно существует и подходит для размещения элементов типа ПолеФормы.

Итоги

Для успешного программного создания элементов управления в 1С следуйте строгому регламенту:

  1. Сформируйте массив объектов РеквизитФормы.
  2. Вызовите ЭтаФорма.ИзменитьРеквизиты().
  3. Добавьте элемент через ЭтаФорма.Элементы.Добавить().
  4. Установите Вид элемента (например, ВидПоляФормы.ПолеФлажка).
  5. Укажите корректный ПутьКДанным без лишних префиксов (если это реквизит формы).

Соблюдение этого порядка исключит большинство ошибок типизации и обеспечит корректную работу интерфейса вашего решения.

← На главную