Как реализовать автоматический отбор по подразделению пользователя в инвентарной карточке ОС-6

Программист 1С v8.3 (Управляемые формы) 1C:Бухгалтерия Бухгалтерский учет
← На главную

В крупных организациях, использующих 1С:Бухгалтерия 8.3 КОРП, часто возникает необходимость разграничения видимости данных. Одной из типичных задач является настройка отчета «Инвентарная карточка ОС» (форма ОС-6) таким образом, чтобы при открытии система автоматически подставляла подразделение, к которому прикреплен текущий пользователь. Это не только упрощает работу, избавляя от лишних кликов, но и снижает риск ошибок при формировании документов. Рассмотрим подробно, как реализовать этот функционал технически, используя возможности платформы и встроенного языка.

Определение подразделения текущего пользователя

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

  1. Через основные настройки пользователя: В плане видов характеристик «Настройки пользователей» часто существует предопределенный элемент ОсновноеПодразделение. Программный доступ к нему осуществляется через специализированные модули.
  2. Через связь с физическим лицом: Пользователь системы связан с элементом справочника ФизическиеЛица. В версии КОРП информация о месте работы (подразделении) может храниться в регистре сведений РабочиеМеста или получаться через кадровые данные.

Для программного получения основного подразделения в коде часто используется следующая конструкция:


ТекущееПодразделение = УправлениеНастройками.ПолучитьНастройку("ОсновноеПодразделение", Пользователи.ТекущийПользователь());

Разберем ситуацию, когда нам нужно программно внедрить этот параметр в процесс формирования отчета.

Способ 1: Использование фиксированных настроек СКД

Если инвентарная карточка построена на базе Системы компоновки данных (СКД), простым установлением значения в пользовательских настройках не обойтись, так как пользователь сможет легко удалить этот фильтр. Чтобы сделать отбор «жестким» или обязательным по умолчанию, мы будем использовать свойство ФиксированныеНастройки.

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


&НаСервере
Процедура УстановитьОтборПоПодразделению(Форма)
    
    // Получаем значение подразделения (логика получения может варьироваться)
    ЗначениеПодразделения = УправлениеНастройками.ПолучитьНастройку("ОсновноеПодразделение");
    
    Если ЗначениеЗаполнено(ЗначениеПодразделения) Тогда
        // Создаем новый элемент отбора в фиксированных настройках
        НовыйЭлемент = Отчет.КомпоновщикНастроек.ФиксированныеНастройки.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
        НовыйЭлемент.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("Подразделение");
        НовыйЭлемент.ВидСравнения = ВидСравненияКомпоновкиДанных.Равно;
        НовыйЭлемент.Использование = Истина;
        НовыйЭлемент.ПравоеЗначение = ЗначениеПодразделения;
    КонецЕсли;

КонецПроцедуры

Важный нюанс: Отборы, установленные в ФиксированныеНастройки, не отображаются в стандартном окне настроек отчета, доступном пользователю. Это гарантирует, что человек увидит данные только своего подразделения, если у него нет прав на изменение этого механизма.

Способ 2: Модификация логики печатной формы

Инвентарная карточка ОС-6 в 1С:Бухгалтерия часто вызывается как печатная форма из справочника «Основные средства». В этом случае она формируется не через классический отчет СКД, а через Менеджер печати. Выясним, как внедрить логику отбора здесь.

Нам потребуется найти модуль менеджера справочника ОсновныеСредства и процедуру, отвечающую за формирование печатной формы (обычно это ПечатьИнвентарнойКарточки). Если мы не хотим изменять типовую конфигурацию, используем Расширение с аннотацией &Вместо или &Перед.

Рассмотрим по шагам, что нужно сделать в коде:

  1. Найти запрос, который выбирает данные для формирования карточки.
  2. Добавить в условие ГДЕ проверку по подразделению.
  3. Передать параметр подразделения текущего пользователя в запрос.

Пример модификации запроса в коде:


Запрос.Текст = 
    "ВЫБРАТЬ
    |   ...
    |ИЗ
    |   РегистрСведений.МестонахождениеОСБухгалтерскийУчет.СрезПоследних(&Период, ) КАК МестонахождениеОС
    |ГДЕ
    |   МестонахождениеОС.Подразделение = &ПодразделениеПользователя";

Запрос.УстановитьПараметр("ПодразделениеПользователя", ПолучитьПодразделениеТекущегоСеанса());

Способ 3: Использование параметров сеанса

Для оптимизации работы системы, особенно в версии КОРП, рекомендуется вычислять подразделение пользователя один раз при входе в систему и записывать его в Параметр сеанса. Выясним причину, почему это удобно: вам не придется каждый раз обращаться к тяжелым запросам или настройкам при формировании каждой отдельной печатной формы.

Создадим параметр сеанса ТекущееПодразделениеПользователя. В модуле сеанса, в процедуре УстановкаПараметровСеанса, пропишем логику заполнения. После этого в любом отчете или печатной форме мы сможем обращаться к нему напрямую:


ОтборПодразделение = ПараметрыСеанса.ТекущееПодразделениеПользователя;

Риски использования RLS и почему это не всегда лучшее решение

В обсуждениях часто упоминается механизм RLS (Row Level Security) — ограничение доступа на уровне записей. Проанализируем ситуацию: если ваша цель — просто помочь пользователю быстрее формировать отчет, то RLS будет избыточным.

Минусы RLS для данной задачи:

Поэтому, если стоит задача именно «автоматического заполнения» или «отбора по умолчанию», лучше использовать программную установку параметров, описанную выше.

Рекомендации по реализации через расширение

Чтобы сохранить возможность беспрепятственного обновления конфигурации 1С:Бухгалтерия КОРП, настоятельно рекомендуем вносить все правки через Расширение конфигурации. Разберем, как это сделать правильно:

  1. Создаем новое расширение и заимствуем в него нужную форму отчета или модуль менеджера.
  2. Для формы используем процедуру-обработчик &После("ПриСозданииНаСервере").
  3. В этой процедуре вызываем свой код установки отборов.

Пример структуры кода в расширении:


&После("ПриСозданииНаСервере")
Процедура Расш1_ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
    // Устанавливаем значение по умолчанию для пользовательских настроек
    Для Каждого ЭлементОтбора Из Отчет.КомпоновщикНастроек.Настройки.Отбор.Элементы Цикл
        Если ТипЗнч(ЭлементОтбора) = Тип("ЭлементОтбораКомпоновкиДанных") 
            И ЭлементОтбора.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("Подразделение") Тогда
            
            ЭлементОтбора.ПравоеЗначение = ПараметрыСеанса.ТекущееПодразделениеПользователя;
            ЭлементОтбора.Использование = Истина;
        КонецЕсли;
    КонецЦикла;
КонецПроцедуры

Таким образом, мы обеспечиваем комфортную работу пользователей из разных подразделений, сохраняя при этом чистоту кода основной конфигурации и высокую производительность системы.

← На главную