Разберем типичную задачу, с которой сталкиваются многие разработчики: необходимость ограничить выбор пользователей в поле ввода Подписант на основе данных из регистра сведений. В процессе реализации часто возникает проблема, когда значение, выбранное пользователем, не отображается в поле ввода, даже если сам список сформирован корректно.
Первое, что необходимо усвоить: событие НачалоВыбора является клиентским. Попытка вызвать из него серверную процедуру напрямую приводит к ошибке, так как платформа блокирует серверные вызовы, инициирующие изменение свойств формы, способных вызвать принудительную перерисовку в процессе интерактивного выбора.
Чтобы избежать ошибки, рекомендуем использовать следующие подходы:
ПриСозданииНаСервере.&НаСервереБезКонтекста для получения данных, если это возможно.Если вам требуется высокая скорость работы интерфейса, можно заранее получить список доступных пользователей на сервере и сохранить его в переменную модуля формы. Рассмотрим пример реализации:
На стороне сервера получаем список доступных элементов:
&НаСервере
Функция ПолучитьМассивПодписантов()
Запрос = Новый Запрос;
Запрос.Текст = "ВЫБРАТЬ Пользователи.Ссылка ИЗ Справочник.Пользователи КАК Пользователи";
Возврат Запрос.Выполнить().Выгрузить().ВыгрузитьКолонку("Ссылка");
КонецФункции
На стороне клиента инициализируем переменную при открытии формы:
&НаКлиенте
Перем МассивПользователей;
&НаКлиенте
Процедура ПриОткрытии(Отказ)
МассивПользователей = ПолучитьМассивПодписантов();
КонецПроцедуры
Если после выбора элемента в списке поле остается пустым, причина почти всегда кроется в неправильном наполнении параметра ДанныеВыбора. Платформа 1С требует, чтобы параметр ДанныеВыбора был объектом типа СписокЗначений, где каждое значение — это ссылка на объект базы данных, а представление — строка, понятная пользователю.
Разберем правильный код обработчика события НачалоВыбора:
&НаКлиенте
Процедура ПодписантНачалоВыбора(Элемент, ДанныеВыбора, СтандартнаяОбработка)
СтандартнаяОбработка = Ложь; // Отключаем открытие формы выбора по умолчанию
ДанныеВыбора = Новый СписокЗначений;
Для Каждого ЭлементСписка Из МассивПользователей Цикл
// Добавляем значение и представление
ДанныеВыбора.Добавить(ЭлементСписка, ЭлементСписка.Наименование);
КонецЦикла;
КонецПроцедуры
Помимо использования НачалоВыбора, обратите внимание на следующие рекомендации:
СписокЗначений, полностью соответствует типу реквизита, привязанного к полю ввода. Если тип отличается, платформа не сможет корректно отобразить значение.СписокВыбора у самого поля формы в конфигураторе. В этом случае достаточно просто заполнить его при открытии формы, установив свойство РежимВыбораИзСписка в значение Истина. Это избавит вас от необходимости писать код для НачалоВыбора.Проанализировав эти аспекты, вы сможете избежать ошибок при разработке интерфейсов. Главный урок здесь — всегда контролировать, чтобы ДанныеВыбора были объектом СписокЗначений, а событие выбора не содержало конфликтующих вызовов сервера.