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