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