При разработке интерфейсов на платформе 1С:Предприятие 7.7 с использованием внешней компоненты 1С++ и класса ПоставщикДанных часто возникает необходимость жестко ограничить права пользователя на изменение определенных фильтров. Например, если в системе ведется многофирменный учет или учет в разрезе нескольких филиалов, критически важно зафиксировать отбор по текущему филиалу пользователя, чтобы он не мог случайно или намеренно переключить фильтр и увидеть чужие данные.
В платформе 1С 8.x эта задача решается достаточно просто через коллекцию элементов формы и свойства настроек отбора. На платформе 1С 7.7 стандартный интерфейс не предоставляет такой гибкости «из коробки», однако механизмы 1С++ и класса ПоставщикДанных позволяют обойти это ограничение несколькими эффективными способами. Разберем подробно, как реализовать подобную блокировку на практике.
Если в вашем проекте используется современная версия класса ПоставщикДанных (ветка 5.x), разработчики библиотеки предусмотрели штатные свойства для запрета интерактивного изменения параметров фильтрации. Вы можете напрямую обратиться к нужному полю в коллекции отборов и заблокировать его изменение.
Рассмотрим пример кода, в котором мы устанавливаем жесткий отбор по текущему филиалу (хранящемуся в глобальной переменной глТочкаЛомбард) и полностью закрываем его от редактирования пользователем:
// Получаем объект отбора по конкретному полю
ОтборТочка = ПоставщикДанных.Данные.Отбор.Точка;
// Устанавливаем параметры фильтрации
ОтборТочка.ВидСравнения = ВидыСравнения.Равно;
ОтборТочка.Значение = глТочкаЛомбард;
ОтборТочка.Использование = 1;
// Блокируем интерактивное изменение для пользователя
ОтборТочка.ИзменятьИспользование = 0; // Запрещает снимать или ставить галочку активности отбора
ОтборТочка.Доступность = 0; // Запрещает менять само значение и вид сравнения
// Обновляем состояние поставщика данных для применения изменений
ПоставщикДанных.Обновить();
Важное примечание: Если вы используете старые версии класса (например, ветку 4.x, в частности релиз 4.1.2), эти свойства (ИзменятьИспользование и Доступность) могут игнорироваться формой настройки отборов из-за особенностей реализации ядра в тех версиях. В этом случае настоятельно рекомендуется обновить используемую версию класса ПоставщикДанных до актуального релиза ветки 5.x.
Если необходимо пойти еще дальше и полностью исключить возможность взаимодействия пользователя с полем отбора, мы можем применить методику скрытия элемента настройки или удаления его из списка полей, доступных для выбора в диалоговом окне.
Для скрытия поля из формы интерактивной настройки отборов используется свойство Видимость:
// Скрываем настройку отбора из интерфейса формы настройки
ПоставщикДанных.Данные.Отбор.Точка.Видимость = 0;
При установке видимости в значение 0 сам фильтр продолжит функционировать в фоновом режиме (если он был программно включен), но пользователь физически не увидит строку «Точка» в списке активных отборов и не сможет на нее повлиять.
Также можно управлять списком доступных полей через метод УстановитьДоступныеПоля. Этот метод позволяет переопределить состав полей, которые пользователь может добавлять в отбор интерактивно:
// Получаем коллекцию доступных полей
ПоляНастройки = ПоставщикДанных.Данные.Отбор.ПолучитьДоступныеПоля();
// Удаляем конфиденциальное или фиксированное поле из списка доступных для выбора
ПоляНастройки.Удалить("Точка");
// Записываем измененную коллекцию обратно в настройки отбора
ПоставщикДанных.Данные.Отбор.УстановитьДоступныеПоля(ПоляНастройки);
Если настройки отбора выводятся непосредственно на форму в виде интерактивной таблицы (например, с использованием объекта класса ТабличноеПоле из FormEx), мы можем заблокировать редактирование конкретной строки на уровне событий интерфейса.
Для этого используется предопределенное событие табличного поля ПередНачаломИзменения(ФСО). Переменная ФСО расшифровывается как Флаг Стандартной Обработки. Если присвоить ей значение 0, платформа прервет выполнение стандартного действия (в данном случае — переход в режим редактирования ячейки или строки).
Проанализируем пример реализации такого обработчика:
Процедура ТабличноеПолеОтборовПередНачаломИзменения(КонтекстТаблицы, ФСО)
// Определяем, какую именно строку пытается отредактировать пользователь
ТекущаяСтрока = КонтекстТаблицы.ТекущаяСтрока;
// Проверяем имя поля, привязанного к строке настройки отбора
Если ТекущаяСтрока.ПутьКДанным = "Точка" Тогда
// Сбрасываем флаг стандартной обработки, отменяя редактирование
ФСО = 0;
Предупреждение("Изменение фильтра по данной точке учета заблокировано администратором!");
КонецЕсли;
КонецПроцедуры
Этот способ крайне удобен тем, что позволяет гибко управлять доступом к полям динамически — например, в зависимости от роли текущего пользователя или других условий сеанса, проверяемых непосредственно в момент клика по таблице.
Для удобства работы и минимизации дублирования кода в модуле формы рекомендуется оформить универсальную процедуру для программной установки и обновления отборов. Посмотрим на практический пример такой процедуры:
Процедура ОбновитьОтбор(ИмяПоля, ЗначениеОтбора, ОбновлятьПД = 0)
// Получаем объект отбора из коллекции поставщика данных
НовОтбор = ПоставщикДанных.Данные.Отбор.Получить(ИмяПоля);
// Настраиваем параметры фильтрации
НовОтбор.ВидСравнения = ВидыСравнения.Равно;
НовОтбор.Значение = ЗначениеОтбора;
// Если значение не заполнено, отключаем использование отбора
НовОтбор.Использование = 1 - ПустоеЗначение(ЗначениеОтбора);
// При необходимости принудительно обновляем данные в списке
Если ОбновлятьПД = 1 Тогда
ПоставщикДанных.Обновить();
КонецЕсли;
// Обновляем визуальное представление формы
Форма.Обновить(0);
КонецПроцедуры
Использование данной вспомогательной процедуры позволяет централизованно управлять состоянием фильтров, своевременно обновляя экранные формы и кэш данных в соответствии с бизнес-логикой вашего прикладного решения на платформе 1С 7.7.