При разработке в среде 1С:Предприятие 8 часто возникает задача программного создания документов или справочников. Одной из неочевидных проблем для начинающих разработчиков становится заполнение реквизитов, которые на форме представлены в виде переключателя (radio button). Рассмотрим подробно, как правильно работать с такими полями, разберем взаимосвязь метаданных и интерфейса, а также выясним, почему иногда программно установленные значения «не долетают» до базы данных.
Прежде всего, нам необходимо четко разделить два понятия: реквизит объекта и элемент формы. Как справедливо отмечено в ходе обсуждения проблемы, реквизита с типом «Переключатель» в метаданных не существует. Переключатель — это исключительно визуальный способ представления данных на форме. Реквизит же, который стоит за этим переключателем, чаще всего имеет тип ПеречислениеСсылка, Число или Булево.
Когда мы говорим «установить поле переключателя программно», мы имеем в виду присвоение значения реквизиту объекта, к которому этот переключатель привязан через свойство Данные (DataPath).
Если ваш переключатель отображает статусы (например, «Оплачен», «Не оплачен», «Частично оплачен»), скорее всего, в метаданных создан соответствующий объект Перечисление. Рассмотрим правильный синтаксис заполнения такого поля при программном создании документа.
Проанализируем пример кода:
// Создаем новый документ программно
НовыйДокумент = Документы.ПредварительныйЗаказ.СоздатьДокумент();
НовыйДокумент.Дата = ТекущаяДата();
// Устанавливаем значение реквизита, связанного с переключателем
// ВАЖНО: Присваиваем именно ссылку на значение перечисления, а не строку!
НовыйДокумент.СтатусОплатыЗаказа = Перечисления.ВариантыОплатыЗаказа.ОплаченКартой;
// Записываем документ
НовыйДокумент.Записать();
Важный нюанс: Одной из распространенных ошибок является попытка присвоить строковое значение, например НовыйДокумент.СтатусОплатыЗаказа = "ОплаченКартой". В 1С это приведет к ошибке несоответствия типов или записи пустого значения, так как реквизит ожидает ссылку (Ref), а не текст.
В некоторых конфигурациях (особенно на обычных формах или при использовании специфических настроек) переключатель может работать с типом Число. В этом случае выбор первого положения соответствует числу 0, второго — 1, и так далее.
Разберем, как это реализовать:
// Предположим, реквизит "ТипДоставки" имеет тип Число
// 0 - Самовывоз, 1 - Курьер, 2 - Почта
НовыйДокумент.ТипДоставки = 1; // Устанавливаем "Курьер"
Если вы используете правильный синтаксис (как в Варианте 1), но после выполнения кода реквизит остается пустым, нужно провести глубокий анализ. Рассмотрим основные причины возникновения такой ситуации.
1. Переопределение в модуле объекта.
Это самая вероятная причина. Программа может успешно присвоить ваше значение, но в момент вызова метода Записать() срабатывают стандартные обработчики событий ПередЗаписью или ПриЗаписи, расположенные в модуле объекта документа. В этих процедурах часто прописана логика автоматического определения статусов.
Выясним причину с помощью отладки:
ПередЗаписью модуля документа.2. Особенности списка выбора (ChoiceList).
В Управляемых формах для элемента типа «Поле переключателя» может быть жестко задан Список выбора. Если вы программно устанавливаете значение реквизита, которого нет в этом списке выбора на форме, то при открытии документа пользователь увидит «пустой» переключатель (ни одна точка не будет выбрана), хотя в самой базе данных значение может присутствовать.
Если ваша задача — чтобы значение переключателя устанавливалось автоматически при создании нового документа пользователем в интерфейсе, правильнее использовать механизм заполнения по умолчанию. Рассмотрим реализацию в модуле объекта:
Процедура ОбработкаЗаполнения(ДанныеЗаполнения, ТекстЗаполнения, СтандартнаяОбработка)
// Устанавливаем значение по умолчанию для новых документов
Если ЗначениеЗаполнено(ДанныеЗаполнения) Тогда
// Логика заполнения на основании других данных
Иначе
// Значение по умолчанию для «пустого» нового документа
ЭтотОбъект.СтатусОплатыЗаказа = Перечисления.ВариантыОплатыЗаказа.ОжидаетОплаты;
КонецЕсли;
КонецПроцедуры
Если вы работаете со старыми конфигурациями, важно помнить о свойстве «Первый в группе». В обычном интерфейсе переключатели — это набор отдельных элементов управления. Чтобы они работали как единый выбор для одного реквизита, они должны располагаться в строгом порядке обхода, и у самого первого элемента должен стоять флаг «Первый в группе». Реквизит (Данные) при этом привязывается только к этому первому элементу. Все последующие элементы группы автоматически управляют тем же реквизитом, записывая в него порядковый индекс (0, 1, 2...).
Подведем итог нашему разбору. Для программной установки переключателя выполните следующие шаги:
Перечисление, Число или Булево).Перечисления.Имя.Значение).Используя эти методы, вы сможете гибко управлять поведением интерфейса и корректно заполнять данные в базе 1С:Предприятие.