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

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

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

1. Использование «Связей параметров выбора»

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

  1. Откройте форму документа в конфигураторе.
  2. Перейдите в свойства элемента табличной части (например, реквизита Номенклатура).
  3. Найдите пункт Связи параметров выбора.
  4. Настройте связь так, чтобы отбор для выбранного поля зависел от значения другого реквизита (например, от реквизита Склад).

После такой настройки платформа автоматически будет фильтровать список выбора при нажатии пользователем на кнопку «лупы» или при использовании ввода по строке.

2. Программное ограничение через событие «НачалоВыбора»

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

Рассмотрим пример реализации этой задачи в модуле формы документа:


&НаКлиенте
Процедура ТЧТоварыНоменклатураНачалоВыбора(Элемент, ДанныеВыбора, СтандартнаяОбработка)
    
    СтандартнаяОбработка = Ложь;
    
    ПараметрыОтбора = Новый Структура;
    ПараметрыОтбора.Вставить("ВидНоменклатуры", Справочники.ВидыНоменклатуры.Товар);
    
    ПараметрыФормы = Новый Структура("Отбор", ПараметрыОтбора);
    
    ОткрытьФорму("Справочник.Номенклатура.ФормаВыбора", ПараметрыФормы, Элемент);
    
КонецПроцедуры

Важно помнить: установка СтандартнаяОбработка = Ложь обязательна, так как она отменяет открытие формы по умолчанию. Также учтите, что этот код срабатывает только при нажатии на кнопку выбора. Для ограничения ввода по строке потребуется дополнительная настройка в свойствах поля или использование обработчика Автоподбор.

3. Глобальный контроль через событие «ОбработкаПолученияДанныхВыбора»

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

4. Защита данных: проверка «ПриИзменении»

Нельзя забывать и про «защиту от дурака». Пользователь может попытаться изменить значение через буфер обмена или иными нестандартными способами. Чтобы гарантировать корректность данных, мы можем добавить проверку в процедуру ПриИзменении реквизита:


&НаКлиенте
Процедура ТЧТоварыНоменклатураПриИзменении(Элемент)
    
    ТекущиеДанные = Элементы.ТЧТовары.ТекущиеДанные;
    Если Не ПроверитьДопустимостьВыбора(ТекущиеДанные.Номенклатура) Тогда
        Сообщить("Данный товар недоступен для выбора в этом документе!");
        ТекущиеДанные.Номенклатура = ПредопределенноеЗначение("Справочник.Номенклатура.ПустаяСсылка");
    КонецЕсли;
    
КонецПроцедуры

5. Использование RLS (Record Level Security)

Если требуется запретить доступ к записям на уровне прав доступа, чтобы пользователь даже не знал о существовании определенных данных, мы используем RLS. Это самый строгий метод ограничения: если запись не проходит по шаблону ограничения, она просто не попадет в выборку запроса и не будет отображаться в списках. Это мощный инструмент, но он требует осторожности, так как может влиять на производительность системы при выполнении тяжелых запросов.

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

← На главную