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