В процессе работы с программами на платформе 1С:Предприятие 8 часто возникает необходимость отфильтровать данные в журнале документов не по одному значению, а по списку. Например, кассиру, работающему с определенной группой торговых точек, нужно видеть документы только по «Кассе №2» и «Кассе №5», игнорируя остальные. Стандартный поиск по CTRL+F не всегда справляется с такой задачей, так как он обычно рассчитан на поиск одного конкретного значения.
В данной статье мы разберем несколько эффективных способов реализации этой задачи: от простых манипуляций в интерфейсе до программного кода и настройки прав доступа. Мы проанализируем ситуацию как для современных управляемых форм, так и для классического интерфейса обычных форм.
Если задача стоит перед конечным пользователем и не требует жесткого закрепления прав, проще всего воспользоваться встроенным механизмом настройки Динамического списка. В современных конфигурациях 1С (УТ 11, БП 3.0, ERP) журналы документов строятся именно на этом механизме.
Разберем по шагам, как это сделать:
Касса (или Банковский счет / Касса) и перетащим его в правую часть окна или дважды щелкнем по нему.После этих действий в журнале останутся только те документы, которые соответствуют выбранному набору касс. Этот отбор будет сохраняться для пользователя при закрытии и открытии формы.
Иногда требуется, чтобы отбор устанавливался автоматически при открытии формы или по нажатию специальной кнопки, созданной программистом. В этом случае мы будем работать с объектом КомпоновщикНастроек.
Проанализируем ситуацию: нам нужно программно добавить элемент отбора, который пользователь не сможет случайно отключить через обычные настройки. Для этого лучше всего использовать Фиксированные настройки.
Пример кода для реализации такого отбора:
// Создаем массив с нужными ссылками на кассы
СписокКасс = Новый Массив;
СписокКасс.Добавить(СсылкаНаКассу2);
СписокКасс.Добавить(СсылкаНаКассу5);
// Находим или создаем элемент отбора
НовыйОтбор = Список.КомпоновщикНастроек.ФиксированныеНастройки.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
НовыйОтбор.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("Касса");
НовыйОтбор.ВидСравнения = ВидСравненияКомпоновкиДанных.ВСписке;
НовыйОтбор.ПравоеЗначение = СписокКасс;
НовыйОтбор.Использование = Истина;
Разберем подробнее, что здесь происходит. Мы используем свойство ЛевоеЗначение, чтобы указать имя поля в метаданных (в данном случае это Касса). Ключевым моментом является установка ВидСравнения в значение ВидСравненияКомпоновкиДанных.ВСписке. В качестве ПравогоЗначения мы передаем массив или СписокЗначений. Если вы используете ФиксированныеНастройки, данный фильтр будет накладываться поверх любых пользовательских настроек и не будет виден в стандартном окне отборов, что гарантирует чистоту данных.
Выясним причину, по которой иногда требуется более сложный подход. Если ваша задача — не просто «помочь пользователю», а запретить ему видеть чужие кассы из соображений безопасности, необходимо использовать RLS (Record Level Security).
Рассмотрим алгоритм настройки через роли:
ПраваПользователейНаКассы), где в измерениях будут Пользователь и Касса.ДоступныеКассы с типом ФиксированныйМассив или СписокЗначений. При старте системы (в модуле сеанса) этот параметр должен заполняться списком касс, к которым текущий пользователь имеет доступ, исходя из данных регистра.
ГДЕ Касса В (&ДоступныеКассы)
Важный нюанс: Использование RLS может влиять на производительность системы. Если документов миллионы, а список разрешенных касс постоянно меняется, платформа будет тратить дополнительные ресурсы на построение сложных SQL-запросов. Проанализируем ситуацию: для стабильной работы убедитесь, что поле Касса проиндексировано в метаданных документа.
Несмотря на популярность управляемых интерфейсов, многие предприятия все еще используют старые конфигурации. В обычных формах работа с отборами в табличном поле строится иначе. Посмотрим на пример программной реализации:
// Предположим, СписокДокументов - это основная переменная формы (тип ДокументСписок)
СписокДокументов.Отбор.Касса.ВидСравнения = ВидСравнения.ВСписке;
ДоступныеКассы = Новый СписокЗначений;
ДоступныеКассы.Добавить(Справочники.Кассы.НайтиПоНаименованию("Касса №2"));
ДоступныеКассы.Добавить(Справочники.Кассы.НайтиПоНаименованию("Касса №5"));
СписокДокументов.Отбор.Касса.Значение = ДоступныеКассы;
СписокДокументов.Отбор.Касса.Использование = Истина;
В обычных формах объект Отбор напрямую содержит поля документа. Важно помнить, что если вы хотите разрешить пользователю менять этот список, то нужно предоставить ему интерфейс для заполнения объекта СписокЗначений.
Если ваша конфигурация разработана на базе БСП, вы можете использовать готовые интерфейсные решения. Подсистема «Работа с отборами» позволяет выносить на форму журналов быстрые фильтры. Рассмотрим, как это работает в типовых решениях:
В верхней части журнала часто располагается гиперссылка или поле выбора. Программист может настроить так называемые «Множественные фильтры». Это позволяет пользователю нажать на ссылку «Кассы: Все», отметить галочками нужные элементы, и список мгновенно перестроится. Это наиболее современный и дружелюбный к пользователю подход, так как он не требует заходить в глубокие настройки «Еще -> Настроить список».
Проанализируем, какой метод выбрать в зависимости от условий задачи:
ПриСозданииНаСервере для установки программного отбора.Посмотрим на типичную ошибку при реализации: использование ВидСравнения.Равно вместо ВидСравнения.ВСписке. Если вы попытаетесь передать массив в условие «Равно», система выдаст ошибку или просто не найдет ни одной записи. Всегда проверяйте тип сравнения перед передачей коллекции значений.
Мы надеемся, что эти рекомендации помогут вам эффективно настроить работу в журналах документов 1С, обеспечив пользователям удобный доступ к нужной информации.