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