Как ограничить видимость данных в документе «Акт сверки взаиморасчетов» для нового пользователя в 1С?

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

При настройке прав доступа для новых сотрудников часто возникает задача ограничить их область видимости определенным сегментом партнеров. Типичный пример — менеджер по закупкам, который должен работать исключительно с поставщиками и не должен видеть операции по покупателям (дебиторскую задолженность) в документе Акт сверки взаиморасчетов. На форумах часто предлагают быстрые "косметические" решения, которые на практике оказываются неэффективными или небезопасными. В этой статье мы подробно разберем, как правильно реализовать такое разграничение на уровне интерфейса и на уровне базы данных.

Анализ проблемы: почему простое скрытие колонок не работает

В ходе обсуждения на форумах часто предлагают использовать свойство Видимость = Ложь для нежелательных колонок на форме документа. Рассмотрим, почему этот подход содержит критические уязвимости:

  1. Обход ограничений: Если у пользователя есть полные права на чтение документа Акт сверки взаиморасчетов, скрытие колонок на форме элемента защитит данные только от случайного взгляда. Пользователь все равно сможет получить доступ к суммам по дебету и кредиту через отчеты (например, Оборотно-сальдовая ведомость, Ведомость расчетов), через универсальный отчет или просто выгрузив список документов в Excel.
  2. Проблема списков: Ограничение формы самого документа не мешает пользователю видеть общие суммы документов в списке (журнале), где контрагенты-покупатели будут отображаться без каких-либо ограничений.
  3. Технологическая ошибка: В старых обсуждениях приводится код формата ЭлементыФормы.Таблица.Колонки.Имя.Видимость = Ложь. Этот синтаксис предназначен для устаревших обычных форм (платформа 1С 8.2) и вызовет критическую ошибку в современных конфигурациях на управляемых формах (платформа 1С 8.3).

Решение 1: Использование типового механизма RLS (Ограничение на уровне записей)

Самым надежным и архитектурно верным способом является ограничение прав на уровне базы данных с использованием встроенного механизма RLS (Row-Level Security), который входит в состав Библиотеки стандартных подсистем (БСП). В современных конфигурациях, таких как 1С:ERP, Комплексная автоматизация или Управление торговлей, этот функционал настраивается без программирования:

  1. Перейдем в раздел администрирования прав доступа и включим опцию Ограничивать доступ на уровне записей.
  2. Разделим контрагентов на две группы доступа: Поставщики и Покупатели.
  3. Создадим для нового пользователя профиль групп доступа, в котором для вида доступа Группы контрагентов разрешим работу только с группой Поставщики.

При таком подходе платформа 1С автоматически отфильтрует все документы, отчеты и справочники. Пользователь физически не сможет прочитать записи, связанные с покупателями, даже при попытке сформировать универсальный отчет.

Решение 2: Программное скрытие элементов на управляемых формах

Если архитектура решения требует доработки интерфейса формы через механизм расширения конфигурации, мы должны использовать правильные методы работы с управляемыми формами. Нам понадобится обработчик события ПриСозданииНаСервере. Разберем по шагам, как написать безопасный код.

Для начала создадим в расширении новую роль, например, Расш1_ДоступТолькоКПоставщикам, и назначим ее нашему пользователю. Затем перенесем форму документа в расширение и добавим следующий код в процедуру-перехватчик:


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

Обратите внимание, что мы проверяем существование элементов на форме перед изменением их свойств с помощью метода Найти(). Это защитит ваш код от сбоев при обновлении основной конфигурации поставщика, если имена элементов изменятся.

Решение 3: Фильтрация в форме списка (Динамический список)

Чтобы пользователь не видел документы по покупателям в общем списке (журнале) документов Акт сверки взаиморасчетов, необходимо наложить неотключаемый фильтр на динамический список формы. Выясним причину: если этого не сделать, пользователь увидит контрагентов-покупателей прямо в списке актов сверки.

Для этого в расширении переопределим форму списка документов и в обработчике ПриСозданииНаСервере программно добавим отбор по виду договора:


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

Этот код гарантирует, что при открытии журнала документов пользователь с ролью Расш1_ДоступТолькоКПоставщикам будет видеть исключительно документы, созданные по договорам с поставщиками. Покупатели будут скрыты на уровне динамического списка.

Решение 4: Ограничение выбора договоров в документе

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


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

Вызов данной процедуры следует поместить в конец обработчика ПриСозданииНаСервере формы документа. Теперь при попытке выбора договора в новом акте сверки пользователю будут показаны только договоры с видом С поставщиком.

Резюме и рекомендации

Мы детально рассмотрели проблему разграничения видимости данных по актам сверки в 1С. Подведем итоги совместной работы и определим наилучший подход:

  1. Безопасность превыше всего: Если критически важно защитить коммерческую информацию от утечки, всегда используйте механизмы RLS на уровне ролей или групп доступа БСП. Программное скрытие полей формы — это лишь вспомогательный интерфейсный инструмент.
  2. Комплексный подход: Если вы все же выбрали путь кастомизации через расширение, обязательно ограничивайте видимость не только в форме самого документа, но и накладывайте неотключаемые фильтры на форму списка (динамический список) и настраивайте параметры выбора реквизитов.
  3. Соблюдение стандартов разработки: Пишите код в расширениях исключительно с использованием современных стандартов платформы 1С:Предприятие 8.3 (управляемые формы, обработчики на сервере, безопасное обращение к элементам формы через метод Найти).
← На главную