Как программно установить значение поля переключателя в 1С

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

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

Понимание природы переключателя

Прежде всего, нам необходимо четко разделить два понятия: реквизит объекта и элемент формы. Как справедливо отмечено в ходе обсуждения проблемы, реквизита с типом «Переключатель» в метаданных не существует. Переключатель — это исключительно визуальный способ представления данных на форме. Реквизит же, который стоит за этим переключателем, чаще всего имеет тип ПеречислениеСсылка, Число или Булево.

Когда мы говорим «установить поле переключателя программно», мы имеем в виду присвоение значения реквизиту объекта, к которому этот переключатель привязан через свойство Данные (DataPath).

Вариант 1: Работа с перечислениями (наиболее частый случай)

Если ваш переключатель отображает статусы (например, «Оплачен», «Не оплачен», «Частично оплачен»), скорее всего, в метаданных создан соответствующий объект Перечисление. Рассмотрим правильный синтаксис заполнения такого поля при программном создании документа.

Проанализируем пример кода:


// Создаем новый документ программно
НовыйДокумент = Документы.ПредварительныйЗаказ.СоздатьДокумент();
НовыйДокумент.Дата = ТекущаяДата();

// Устанавливаем значение реквизита, связанного с переключателем
// ВАЖНО: Присваиваем именно ссылку на значение перечисления, а не строку!
НовыйДокумент.СтатусОплатыЗаказа = Перечисления.ВариантыОплатыЗаказа.ОплаченКартой;

// Записываем документ
НовыйДокумент.Записать();

Важный нюанс: Одной из распространенных ошибок является попытка присвоить строковое значение, например НовыйДокумент.СтатусОплатыЗаказа = "ОплаченКартой". В 1С это приведет к ошибке несоответствия типов или записи пустого значения, так как реквизит ожидает ссылку (Ref), а не текст.

Вариант 2: Переключатель на основе числовых индексов

В некоторых конфигурациях (особенно на обычных формах или при использовании специфических настроек) переключатель может работать с типом Число. В этом случае выбор первого положения соответствует числу 0, второго — 1, и так далее.

Разберем, как это реализовать:


// Предположим, реквизит "ТипДоставки" имеет тип Число
// 0 - Самовывоз, 1 - Курьер, 2 - Почта
НовыйДокумент.ТипДоставки = 1; // Устанавливаем "Курьер"

Почему значение может не сохраняться?

Если вы используете правильный синтаксис (как в Варианте 1), но после выполнения кода реквизит остается пустым, нужно провести глубокий анализ. Рассмотрим основные причины возникновения такой ситуации.

1. Переопределение в модуле объекта.
Это самая вероятная причина. Программа может успешно присвоить ваше значение, но в момент вызова метода Записать() срабатывают стандартные обработчики событий ПередЗаписью или ПриЗаписи, расположенные в модуле объекта документа. В этих процедурах часто прописана логика автоматического определения статусов.

Выясним причину с помощью отладки:

2. Особенности списка выбора (ChoiceList).
В Управляемых формах для элемента типа «Поле переключателя» может быть жестко задан Список выбора. Если вы программно устанавливаете значение реквизита, которого нет в этом списке выбора на форме, то при открытии документа пользователь увидит «пустой» переключатель (ни одна точка не будет выбрана), хотя в самой базе данных значение может присутствовать.

Инициализация через «ОбработкуЗаполнения»

Если ваша задача — чтобы значение переключателя устанавливалось автоматически при создании нового документа пользователем в интерфейсе, правильнее использовать механизм заполнения по умолчанию. Рассмотрим реализацию в модуле объекта:


Процедура ОбработкаЗаполнения(ДанныеЗаполнения, ТекстЗаполнения, СтандартнаяОбработка)
    // Устанавливаем значение по умолчанию для новых документов
    Если ЗначениеЗаполнено(ДанныеЗаполнения) Тогда
        // Логика заполнения на основании других данных
    Иначе
        // Значение по умолчанию для «пустого» нового документа
        ЭтотОбъект.СтатусОплатыЗаказа = Перечисления.ВариантыОплатыЗаказа.ОжидаетОплаты;
    КонецЕсли;
КонецПроцедуры

Специфика Обычных форм (ОФ)

Если вы работаете со старыми конфигурациями, важно помнить о свойстве «Первый в группе». В обычном интерфейсе переключатели — это набор отдельных элементов управления. Чтобы они работали как единый выбор для одного реквизита, они должны располагаться в строгом порядке обхода, и у самого первого элемента должен стоять флаг «Первый в группе». Реквизит (Данные) при этом привязывается только к этому первому элементу. Все последующие элементы группы автоматически управляют тем же реквизитом, записывая в него порядковый индекс (0, 1, 2...).

Резюме для успешной разработки

Подведем итог нашему разбору. Для программной установки переключателя выполните следующие шаги:

  1. Проверьте тип данных реквизита в метаданных (Перечисление, Число или Булево).
  2. Присваивайте значение того же типа (используйте ссылки Перечисления.Имя.Значение).
  3. Убедитесь, что в модуле объекта в событиях записи нет кода, «затирающего» ваши данные.
  4. Проверьте корректность циклов и условий в вашем коде — часто ошибка кроется в неверно выстроенной логике обхода объектов, из-за чего строка присваивания просто не выполняется.

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

← На главную