Как ограничить доступ к определенной номенклатурной группе в 1С:Управление торговлей 11

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

В процессе работы с системой 1С:Управление торговлей (УТ 11) часто возникает задача ограничить возможность выбора определенных товаров или услуг для менеджеров по продажам. Типичный сценарий: существует определенный вид номенклатуры (например, «Услуги по закрытию периода» или «Служебные позиции»), который должен быть доступен только бухгалтерии или администраторам. Менеджеры не должны иметь возможности добавлять эти позиции в заказы или счета, чтобы не допускать ошибок в учете. Рассмотрим несколько способов решения этой задачи: от штатной настройки прав доступа до внесения изменений в логику работы форм через расширения.

Метод 1. Настройка ограничения доступа на уровне записей (RLS)

Проанализируем самый «правильный» с точки зрения архитектуры 1С способ — использование механизма RLS (Record Level Security). Вопреки распространенному заблуждению, RLS позволяет ограничивать не только редактирование, но и чтение данных. Если пользователь не имеет права на чтение определенной группы номенклатуры, он не увидит её ни в справочнике, ни в подборе, ни в отчетах.

Разберем по шагам процесс настройки:

  1. Включение RLS: Перейдем в раздел НСИ и администрирование — Настройка пользователей и прав. Установим флаг Ограничивать доступ на уровне записей.
  2. Создание группы доступа номенклатуры: В справочнике Группы доступа номенклатуры (находится в разделе НСИ) создадим новую группу, например, «Запрещенная к продаже».
  3. Привязка номенклатуры: Откроем карточку номенклатуры или вида номенклатуры и в поле «Группа доступа» укажем созданную нами группу. Это можно сделать массово через обработку «Редактирование реквизитов».
  4. Настройка профиля групп доступа:
    • Откроем Профиль групп доступа, назначенный менеджерам.
    • На закладке Ограничения доступа выберем вид доступа «Группы номенклатуры».
    • Установим значение «Все запрещены, исключения назначаются в группах доступа» или настроим конкретный список разрешенных групп.
  5. Настройка для бухгалтера: Для профиля бухгалтера, наоборот, установим вид доступа «Группы номенклатуры» в значение «Все разрешены».

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

Метод 2. Программное ограничение выбора в документах

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

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

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


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

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

Метод 3. Ограничение в форме подбора номенклатуры

В конфигурации «Управление торговлей 11» подбор номенклатуры — это сложный механизм. Чтобы скрыть позиции там, нужно внести изменения в обработку ПодборНоменклатурыДляПродажи или соответствующую форму выбора. Посмотрим, как можно программно вмешаться в динамический список подбора.

В форме подбора в методе ПриСозданииНаСервере мы можем добавить фиксированный отбор в компоновку данных динамического списка Список:


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

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

Метод 4. Валидация при записи (ОбработкаПроверкиЗаполнения)

Рассмотрим ситуацию, когда пользователь пытается обойти ограничения (например, копированием строк документа). Чтобы обеспечить стопроцентную защиту, необходимо добавить проверку в модуле объекта документа или в подписке на событие ОбработкаПроверкиЗаполнения.

Проанализируем пример реализации в расширении для модуля объекта:


&ВРасширении
Процедура Расш_ОбработкаПроверкиЗаполненияПосле(Отказ, ПроверяемыеРеквизиты)
    
    // Если бухгалтер - проверку пропускаем
    Если РольДоступна("ДобавлениеИзменениеДанныхБухгалтерии") Тогда
        Возврат;
    КонецЕсли;
    
    ЗапрещенныйВид = Справочники.ВидыНоменклатуры.НайтиПоНаименованию("Служебные услуги");
    
    Для Каждого СтрокаТЧ Из ЭтотОбъект.Товары Цикл
        
        Если СтрокаТЧ.Номенклатура.ВидНоменклатуры = ЗапрещенныйВид Тогда
            ТекстСообщения = СтрШаблон("Номенклатура %1 относится к служебному виду и запрещена к выбору менеджерами!", 
                                       СтрокаТЧ.Номенклатура);
            ОбщегоНазначенияКлиентСервер.СообщитьПользователю(ТекстСообщения, 
                                                            ЭтотОбъект, 
                                                            "Товары[" + Формат(СтрокаТЧ.НомерСтроки - 1, "ЧГ=0") + "].Номенклатура", 
                                                            , 
                                                            Отказ);
            Отказ = Истина;
        КонецЕсли;
        
    КонецЦикла;
    
КонецПроцедуры

Этот метод является самым надежным («жестким»), так как он не дает записать или провести документ, содержащий некорректные данные, независимо от того, как они туда попали.

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

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

Для реализации в УТ 11.4.6 оптимальным будет сочетание создания профилей доступа (для разделения менеджеров и бухгалтеров) и настройки RLS по группам доступа номенклатуры. Это стандартный функционал системы, который не снимает конфигурацию с поддержки и легко обновляется в будущем. Для упрощения работы со структурой прав можно воспользоваться обработкой для объединения профилей групп доступа в УТ 11.

← На главную