В процессе работы с документами и справочниками часто возникает задача: ограничить выбор пользователей, чтобы они не могли добавлять в табличные части или реквизиты элементы, которые помечены на удаление. Это помогает избежать ошибок в учете и поддерживает целостность данных. Давайте разберем, как реализовать такое ограничение в управляемых формах 1С, рассмотрев несколько подходов — от самых простых до более гибких.
Основная задача делится на две части:
Рассмотрим несколько эффективных способов решения этой задачи.
Это наиболее предпочтительный и простой способ для установки стандартных отборов. Механизм ПараметрыВыбора позволяет задать фильтрацию для полей ввода, и платформа автоматически применит эти фильтры как для формы выбора, так и для автоподбора при вводе текста. Настроить его можно как интерактивно, так и программно.
Программная настройка:
Самое правильное место для программной установки параметров — серверный обработчик события формы ПриСозданииНаСервере. Это гарантирует, что отбор будет действовать с самого момента открытия формы.
Посмотрим на пример. Допустим, у нас на форме есть поле Номенклатура, в котором нужно запретить выбор помеченных на удаление элементов.
&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
// Создаем структуру для отбора
ОтборПоПометкеУдаления = Новый Структура("ПометкаУдаления", Ложь);
// Создаем структуру для параметров выбора и вставляем в нее наш отбор
Параметры = Новый Структура("Отбор", ОтборПоПометкеУдаления);
// Присваиваем параметры выбора нужному элементу формы
// Предполагается, что на форме есть реквизит "Товары" (табличная часть) с колонкой "Номенклатура"
Элементы.ТоварыНоменклатура.ПараметрыВыбора = Параметры;
// Если это одиночный реквизит, а не колонка ТЧ:
// Элементы.Номенклатура.ПараметрыВыбора = Параметры;
КонецПроцедуры
Важный момент: всего несколько строк кода решают обе части задачи. Пользователь не увидит помеченные на удаление элементы ни в списке при открытии формы выбора, ни в списке автоподбора при наборе текста.
Иногда требуется более сложная логика, чем простой отбор. В таких случаях на помощь приходят обработчики событий элемента формы. Они дают полный контроль над процессом выбора и ввода данных.
Событие «АвтоПодбор»
Этот обработчик срабатывает, когда пользователь вводит текст в поле, и система пытается подобрать подходящие варианты. Мы можем перехватить этот процесс и предоставить свой, отфильтрованный список.
Разберем пример кода для обработчика АвтоПодбор у поля ввода в табличной части:
&НаКлиенте
Процедура ТоварыНоменклатураАвтоПодбор(Элемент, Текст, ДанныеВыбора, ПараметрыПолученияДанных, Ожидание, СтандартнаяОбработка)
// Отменяем стандартное поведение, чтобы полностью контролировать процесс
СтандартнаяОбработка = Ложь;
// Подготавливаем структуру отбора
СтруктураОтбора = Новый Структура("ПометкаУдаления", Ложь);
// Формируем параметры для получения данных выбора
ПараметрыПодбора = Новый Структура;
ПараметрыПодбора.Вставить("Отбор", СтруктураОтбора);
ПараметрыПодбора.Вставить("СтрокаПоиска", Текст); // Передаем введенный пользователем текст для поиска
ПараметрыПодбора.Вставить("ВыборГруппИЭлементов", ПредопределенноеЗначение("ИспользованиеГруппИЭлементов.Элементы"));
// Вызываем менеджер справочника для получения отфильтрованных данных
ДанныеВыбора = ПолучитьДанныеВыбора(Тип("СправочникСсылка.Номенклатура"), ПараметрыПодбора);
КонецПроцедуры
Этот метод позволяет реализовать сложную логику фильтрации, добавляя в СтруктураОтбора любые необходимые условия.
Событие «НачалоВыбора»
Данное событие срабатывает, когда пользователь нажимает кнопку выбора (...) или клавишу F4. В обработчике можно открыть нужную форму выбора, передав в нее параметры фильтрации.
&НаКлиенте
Процедура ТоварыНоменклатураНачалоВыбора(Элемент, ДанныеВыбора, СтандартнаяОбработка)
// Отменяем стандартное открытие формы выбора
СтандартнаяОбработка = Ложь;
// Готовим параметры для открытия формы
ПараметрыФормы = Новый Структура;
// Устанавливаем отбор
Отбор = Новый Структура("ПометкаУдаления", Ложь);
ПараметрыФормы.Вставить("Отбор", Отбор);
// Открываем стандартную форму выбора с нашим отбором
ОткрытьФорму("Справочник.Номенклатура.ФормаВыбора", ПараметрыФормы, Элемент);
КонецПроцедуры
Предыдущие методы улучшают удобство работы пользователя (UX), но не являются надежной защитой. Например, пользователь может вставить значение из буфера обмена. Чтобы гарантировать целостность данных, необходимо добавить серверную проверку, которая сработает непосредственно перед записью объекта.
Для этого идеально подходит обработчик ОбработкаПроверкиЗаполненияНаСервере.
&НаСервере
Процедура ОбработкаПроверкиЗаполненияНаСервере(Отказ, ПроверяемыеРеквизиты)
// "Объект" - это основной реквизит формы, например, документ
// "Товары" - его табличная часть
Для Каждого СтрокаТабличнойЧасти Из Объект.Товары Цикл
// Проверяем, не пустая ли ссылка и установлена ли пометка удаления
Если ЗначениеЗаполнено(СтрокаТабличнойЧасти.Номенклатура) И СтрокаТабличнойЧасти.Номенклатура.ПометкаУдаления Тогда
Сообщение = Новый СообщениеПользователю;
Сообщение.Текст = "В строке " + СтрокаТабличнойЧасти.НомерСтроки + " выбрана номенклатура, помеченная на удаление. Запись невозможна.";
// Привязываем сообщение к конкретному полю в табличной части для удобства пользователя
Сообщение.Поле = "Объект.Товары[" + (СтрокаТабличнойЧасти.НомерСтроки - 1) + "].Номенклатура";
Сообщение.Сообщить();
Отказ = Истина; // Отменяем запись объекта
КонецЕсли;
КонецЦикла;
КонецПроцедуры
Этот способ — надежный барьер, который не позволит записать в базу некорректные данные, даже если пользователь как-то обойдет клиентские ограничения.
Если помеченные на удаление объекты нужно скрыть от определенных групп пользователей не только в одном документе, а во всей системе, то стоит использовать механизм RLS (Record Level Security).
Настроив RLS, можно создать правило, по которому пользователи с определенной ролью в принципе не будут иметь прав на чтение записей с флагом ПометкаУдаления = Истина. В результате такие элементы исчезнут для них отовсюду: из списков, отчетов, полей выбора. Они просто не смогут их увидеть или выбрать.
Важно понимать: RLS — мощный, но сложный в настройке и отладке инструмент. Он может влиять на производительность системы. Применять его стоит осознанно, когда требуется именно глобальное ограничение доступа, а не локальная фильтрация на одной форме.
Мы рассмотрели четыре способа запретить выбор помеченных на удаление элементов. Рекомендуем следующую иерархию их применения:
ПараметрыВыбора — используйте как основной метод. Он прост, надежен и решает 90% задач.АвтоПодбор, НачалоВыбора) — применяйте, если нужна нестандартная логика отбора или открытие кастомной формы выбора.ОбработкаПроверкиЗаполнения) — используйте как дополнительный, обязательный уровень контроля для обеспечения целостности данных перед записью.Комбинация этих подходов позволит создать удобный и надежный интерфейс, предотвращающий ошибки пользователей и поддерживающий порядок в данных.