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