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

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

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

Анализ проблемы и контекста вызова

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

Чтобы избежать ошибки, рекомендуем использовать следующие подходы:

  1. Перенос получения данных на этап ПриСозданииНаСервере.
  2. Использование директивы &НаСервереБезКонтекста для получения данных, если это возможно.
  3. Организация передачи данных через дополнительные реквизиты формы или переменные модуля формы.

Реализация через массив на клиенте

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

На стороне сервера получаем список доступных элементов:


&НаСервере
Функция ПолучитьМассивПодписантов()
    Запрос = Новый Запрос;
    Запрос.Текст = "ВЫБРАТЬ Пользователи.Ссылка ИЗ Справочник.Пользователи КАК Пользователи";
    Возврат Запрос.Выполнить().Выгрузить().ВыгрузитьКолонку("Ссылка");
КонецФункции

На стороне клиента инициализируем переменную при открытии формы:


&НаКлиенте
Перем МассивПользователей;

&НаКлиенте
Процедура ПриОткрытии(Отказ)
    МассивПользователей = ПолучитьМассивПодписантов();
КонецПроцедуры

Почему выбранное значение не попадает в поле ввода?

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

Разберем правильный код обработчика события НачалоВыбора:


&НаКлиенте
Процедура ПодписантНачалоВыбора(Элемент, ДанныеВыбора, СтандартнаяОбработка)
    СтандартнаяОбработка = Ложь; // Отключаем открытие формы выбора по умолчанию
    ДанныеВыбора = Новый СписокЗначений;
    
    Для Каждого ЭлементСписка Из МассивПользователей Цикл
        // Добавляем значение и представление
        ДанныеВыбора.Добавить(ЭлементСписка, ЭлементСписка.Наименование);
    КонецЦикла;
КонецПроцедуры

Рекомендации по оптимизации

Помимо использования НачалоВыбора, обратите внимание на следующие рекомендации:

Проанализировав эти аспекты, вы сможете избежать ошибок при разработке интерфейсов. Главный урок здесь — всегда контролировать, чтобы ДанныеВыбора были объектом СписокЗначений, а событие выбора не содержало конфликтующих вызовов сервера.

← На главную