К статье
Практический материал

Разработка и Конфигурация · 11 мин

1С: поле выбора — как установить значение программно

Как программно установить значение поля выбора в 1С 8.3: управляемые и обычные формы, связь с реквизитом, выбор из списка, типичные ошибки и проверка результата.

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

Ошибка новичков — попытка написать что-то вроде Элементы.ПолеВыбора.Значение = .... Такого свойства у элемента формы нет, и попытка обращения вызовет ошибку исполнения. Правильный путь — найти, с каким реквизитом связано поле (свойство «ПутьКДанным» в палитре свойств), и присвоить значение именно этому реквизиту.

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

Как устроено поле выбора и почему значение ставится в реквизит

В управляемом интерфейсе 1С форма — это декларативное описание. Элемент «ПолеВвода» с видом «Поле выбора» лишь отображает данные, путь к которым указан в свойстве ПутьКДанным. Как только вы меняете значение реквизита в коде, платформа сама перерисовывает элемент — отдельно «обновлять» поле не нужно.

Узнать, к какому реквизиту привязано поле, можно в конфигураторе: откройте форму, выделите элемент и посмотрите свойство «ПутьКДанным». Типичные варианты: Объект.Склад, Объект.Контрагент, ТекущаяОрганизация (реквизит формы). Именно по этому пути и выполняется присваивание.

Есть и обратная сторона: если нужно только ограничить список выбора или подставить подсказку, меняются свойства элемента — СписокВыбора, КнопкаВыбора, ПодсказкаВвода. Но само значение всегда живёт в данных формы.

Установка значения в управляемой форме

Самый частый случай — поле выбора на форме документа или справочника в управляемом приложении. Код выполняется в модуле формы, в контексте которой доступен основной реквизит Объект.

&НаКлиенте

Процедура УстановитьСклад(Команда)

Объект.Склад = ПредопределенноеЗначение("Справочник.Склады.ОсновнойСклад");

КонецПроцедуры

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

&НаСервере

Процедура УстановитьКонтрагентаПоИНН(ИНН)

Запрос = Новый Запрос;

Запрос.Текст = "ВЫБРАТЬ ПЕРВЫЕ 1 Т.Ссылка ИЗ Справочник.Контрагенты КАК Т ГДЕ Т.ИНН = &ИНН";

Запрос.УстановитьПараметр("ИНН", ИНН);

Выборка = Запрос.Выполнить().Выбрать();

Если Выборка.Следующий() Тогда

Объект.Контрагент = Выборка.Ссылка;

КонецЕсли;

КонецПроцедуры

После присваивания значение появится в поле сразу — при выходе из обработчика форма перерисуется. Если поле осталось пустым, почти всегда причина в несовпадении типов или в том, что изменён другой реквизит, не связанный с этим элементом.

Установка значения в обычной форме

В обычных формах (толстый клиент, режим обычного приложения) логика та же: значение ставится в реквизит объекта или в реквизит формы. Разница в том, что разделения на клиент и сервер нет — весь код выполняется в одном контексте.

Процедура КнопкаУстановитьНажатие(Элемент)

// Реквизит объекта

Контрагент = Справочники.Контрагенты.НайтиПоКоду("000000123");

// Или реквизит формы, связанный с полем выбора

ТекущийСклад = Справочники.Склады.НайтиПоНаименованию("Основной");

КонецПроцедуры

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

Выбор значения из списка выбора

Когда поле выбора работает со СписокЗначений (например, выбор строкового варианта — «Наличный расчёт» / «Безналичный расчёт»), программно установить можно только значение, которое есть в списке. Иначе поле визуально очистится или покажет несоответствие.

&НаКлиенте

Процедура ПриОткрытии(Отказ)

Элементы.СпособОплаты.СписокВыбора.Добавить("Наличный");

Элементы.СпособОплаты.СписокВыбора.Добавить("Безналичный");

// Установка значения по умолчанию

СпособОплаты = "Наличный";

КонецПроцедуры

Проверить, допустимо ли значение, можно через НайтиПоЗначению:

Если Элементы.СпособОплаты.СписокВыбора.НайтиПоЗначению(НовоеЗначение) <> Неопределено Тогда

СпособОплаты = НовоеЗначение;

КонецЕсли;

Порядок установки значения программно
  1. 1
    Откройте форму в конфигураторе и найдите свойство ПутьКДанным у поля выбора
  2. 2
    Определите тип реквизита: ссылка, строка, перечисление
  3. 3
    Получите или сформируйте значение строго этого типа
  4. 4
    Присвойте значение реквизиту по пути из ПутьКДанным
  5. 5
    Откройте форму в режиме Предприятие и убедитесь, что поле заполнено и проходит проверку заполнения

Очистка поля и установка пустого значения

Чтобы программно очистить поле выбора, реквизиту присваивается пустое значение соответствующего типа. Универсальный способ — Неопределено, но для ссылочных реквизитов корректнее использовать пустую ссылку.

Объект.Контрагент = Неопределено;

// или строго по типу:

Объект.Склад = ПредопределенноеЗначение("Справочник.Склады.ПустаяСсылка");

// для перечисления:

Объект.СтавкаНДС = Перечисления.СтавкиНДС.ПустаяСсылка();

Учтите: если у реквизита включена проверка заполнения, при записи объекта с очищенным полем пользователь получит сообщение об ошибке. Программная очистка не отменяет бизнес-правил — она лишь меняет данные.

Проверка результата и типичные ошибки

После программной установки значения проверьте три вещи: поле отображает значение в интерфейсе, значение реально записалось в объект (проверка в отладчике или через «Ещё → Изменить форму» не требуется — достаточно перепровести/записать), обработчики ПриИзменении отработали ожидаемо.

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

Объект.Контрагент = НайденныйКонтрагент;

КонтрагентПриИзменении(Неопределено); // явный вызов логики заполнения

Типичные ошибки
01
Присваивание элементу формы (Элементы.Поле.Значение) вместо реквизита — ошибка исполнения или отсутствие эффекта
02
Несовпадение типов: строка вместо ссылки — поле остаётся пустым без видимой ошибки
03
Забытый явный вызов обработчика ПриИзменении — зависимые поля не заполняются
04
Присваивание значения, отсутствующего в СписокВыбора, — поле визуально пустое
05
Изменение реквизита формы вместо реквизита объекта — данные не сохраняются при записи

Ещё одна частая ситуация: значение устанавливается в обработчике ПриСозданииНаСервере, но затем перезаписывается стандартной обработкой заполнения. Порядок имеет значение — ставьте своё значение после вызова стандартных механизмов или в ПриОткрытии.

Контрольные точки

Как проверить результат

Отображение в поле
Норма

Поле показывает установленное значение после выполнения кода

Тревожный признак

Поле пустое — несовпадение типов или неверный путь к данным

Запись объекта
Норма

Объект записывается без сообщений о незаполненных реквизитах

Тревожный признак

Ошибка проверки заполнения — значение не дошло до реквизита объекта

Зависимые данные
Норма

Договоры, цены, остатки пересчитаны как при ручном выборе

Тревожный признак

Зависимые поля пусты — не вызван обработчик ПриИзменении

Альтернативные способы: значения по умолчанию и параметры выбора

Не всегда нужно присваивать значение кодом. Если цель — подставить значение по умолчанию при создании нового объекта, используйте событие ОбработкаЗаполнения в модуле объекта или «Значение заполнения» в свойствах реквизита. Это прозрачнее и работает при любом способе создания объекта — вручную, копированием, из обработки.

Для ограничения доступных вариантов вместо программной установки применяйте ПараметрыВыбора и СвязиПараметровВыбора — например, чтобы в поле «Договор» выбирались только договоры выбранного контрагента. Это снижает количество кода и ошибок пользователя.

Способы задать значение поля выбора

Присваивание реквизиту в коде формы

Гибко, подходит для разовой логики; требует явного вызова ПриИзменении

ОбработкаЗаполнения в модуле объекта

Значение по умолчанию для новых объектов; срабатывает при любом создании

Значение заполнения в свойствах реквизита

Без кода, только константные или предопределённые значения

ПараметрыВыбора и связи параметров

Не ставит значение, а ограничивает список; профилактика ошибок ввода

Частые вопросы

Как установить значение поля выбора из другой формы или внешней обработки?

Откройте форму с параметрами через ОткрытьФорму() и передайте нужные данные в структуре параметров, а в обработчике ПриСозданииНаСервере целевой формы присвойте значение реквизиту. Напрямую обращаться к реквизитам чужой формы извне нельзя — только через параметры или оповещения (Оповестить / ОбработкаОповещения).

Почему после присваивания поле выбора остаётся пустым?

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

Вызывается ли обработчик ПриИзменении при программной установке значения?

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

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

Обратитесь к строке табличной части и присвойте значение её реквизиту: Объект.Товары[0].Номенклатура = НайденнаяСсылка. Для активной строки на клиенте удобно использовать Элементы.Товары.ТекущиеДанные — изменения сразу отобразятся в таблице.

Можно ли программно открыть список выбора, чтобы пользователь сам выбрал значение?

Да, методом ПоказатьВыборИзСписка() или стандартной командой выбора через элемент формы. Это предпочтительнее, когда значение зависит от решения пользователя: программно вы только ограничиваете список, а выбор остаётся за человеком.

Как установить значение поля выбора при создании нового документа по умолчанию?

Используйте событие ОбработкаЗаполнения в модуле объекта — там присвойте реквизиту значение по умолчанию, например склад или организацию из настроек пользователя. Это сработает при любом способе создания документа, а не только при открытии конкретной формы.

Итог

Что важно запомнить

Значение поля выбора в 1С устанавливается присваиванием связанному реквизиту по пути из свойства ПутьКДанным, а не элементу формы. Тип значения должен совпадать с типом реквизита, обработчик ПриИзменении при программной установке вызывайте явно, а для значений по умолчанию используйте ОбработкаЗаполнения.