В процессе настройки оперативного учета в 1С:Управление нашей фирмой (УНФ) часто возникает управленческая задача: ограничить полномочия менеджеров по продажам таким образом, чтобы они не могли произвольно менять установленные в прайс-листе цены, но при этом сохраняли право предоставлять клиенту скидку. Стандартная настройка прав доступа «Редактирование цен в документах» работает достаточно жестко — если ее отключить, менеджер теряет возможность менять и цену, и процент скидки, что парализует гибкость продаж. В данной статье мы подробно разберем, как обойти это ограничение программными средствами и настроить интерфейс документа «Заказ покупателя» под конкретные нужды бизнеса.
Рассмотрим ситуацию, с которой сталкивается большинство администраторов УНФ. В конфигурации существует роль РедактированиеЦенВДокументах. Если мы снимем этот флаг у профиля доступа менеджера, система автоматически установит свойство ТолькоПросмотр для всей группы колонок, связанных с ценообразованием в табличной части Запасы. Проанализируем последствия: менеджер не может изменить цену, но он также не может ввести процент ручной скидки. Это вынуждает искать более гибкие способы настройки через конфигуратор или механизм расширений.
Самый корректный и безопасный способ решения задачи в современных версиях 1С:УНФ (1.6 и 3.0) — это использование расширений конфигурации. Мы не будем менять основную программу, а лишь «допишем» логику поведения формы документа. Нам необходимо принудительно установить доступность поля ПроцентСкидкиНаценки и заблокировать Цена и Сумма.
Разберем по шагам, как это реализовать. В расширении необходимо перехватить процедуру ПриСозданииНаСервере формы документа ЗаказПокупателя. Пропишем код, который будет проверять права текущего пользователя и устанавливать нужные свойства колонок табличной части.
&НаСервере
&После("ПриСозданииНаСервере")
Процедура Расш1_ПриСозданииНаСервереПосле(Отказ, СтандартнаяОбработка)
// Определяем, нужно ли ограничивать права текущего пользователя
// Например, если у пользователя нет роли "ПолныеПрава"
Если НЕ РольДоступна("ПолныеПрава") Тогда
// Блокируем цену и итоговую сумму строки для ручного ввода
Элементы.ЗапасыЦена.ТолькоПросмотр = Истина;
Элементы.ЗапасыСумма.ТолькоПросмотр = Истина;
// Разрешаем редактирование скидки, если оно было заблокировано системой
Элементы.ЗапасыПроцентСкидкиНаценки.ТолькоПросмотр = Ложь;
Элементы.ЗапасыПроцентСкидкиНаценки.Доступность = Истина;
КонецЕсли;
КонецПроцедуры
Важный нюанс: при установке свойства ТолькоПросмотр = Истина для колонки Цена, программные механизмы 1С все равно смогут изменять значение в этом поле при выборе номенклатуры или изменении вида цен. Это именно то, что нам нужно: цена подтягивается из прайс-листа автоматически, менеджер не может ее поправить руками, но при вводе процента скидки сумма пересчитывается программно.
Если вы работаете в старой версии УНФ (например, 1.5) и не используете расширения, или если первый метод не дает результата из-за внутренних обработчиков конфигурации, проанализируем ситуацию глубже. В форме документа ЗаказПокупателя часто вызываются служебные процедуры, которые принудительно обновляют доступность полей при каждом изменении строки (например, при выборе товара).
Выясним причину, почему поле скидки может становиться недоступным. Обычно это происходит в процедурах типа УстановитьДоступностьЭлементов(). Вам необходимо найти строки, где устанавливается доступность реквизита ЗапасыПроцентСкидкиНаценки, и убедиться, что они не блокируются вместе с ценой. Посмотрим на пример правки кода непосредственно в форме документа:
// В модуле формы документа ЗаказПокупателя
&НаСервере
Процедура УстановитьДоступностьПолейЗапасов()
ПравоРедактированияЦен = ПравоДоступа("Редактирование", Метаданные.РегистрыСведений.ЦеныНоменклатуры);
Для Каждого СтрокаТЧ Из Элементы.Запасы.ПодчиненныеЭлементы Цикл
Если СтрокаТЧ.Имя = "ЗапасыЦена" Или СтрокаТЧ.Имя = "ЗапасыСумма" Тогда
СтрокаТЧ.ТолькоПросмотр = НЕ ПравоРедактированияЦен;
КонецЕсли;
// Специально оставляем скидку доступной всегда
Если СтрокаТЧ.Имя = "ЗапасыПроцентСкидкиНаценки" Тогда
СтрокаТЧ.ТолькоПросмотр = Ложь;
КонецЕсли;
КонецЦикла;
КонецПроцедуры
Иногда задача «запретить менять цену» на самом деле означает «запретить продавать слишком дешево». В 1С:УНФ есть штатный механизм контроля минимальных цен, который позволяет избежать ошибок менеджеров без внесения изменений в программный код. Рассмотрим этот алгоритм:
Проанализируем результат: менеджер по-прежнему может редактировать поле Цена или ПроцентСкидки, однако при попытке провести документ, где итоговая цена (с учетом всех скидок) окажется ниже минимальной, система выдаст ошибку и заблокирует проведение. Это более гибкий подход, позволяющий контролировать маржинальность сделок.
Выясним, как предотвратить ручной ввод цены, если мы не хотим блокировать интерфейс полностью. Мы можем использовать событие ПриИзменении для поля цены. Если менеджер попытается ввести значение вручную, система будет сбрасывать его к значению из прайс-листа.
&НаКлиенте
Процедура ЗапасыЦенаПриИзменении(Элемент)
ТекущаяСтрока = Элементы.Запасы.ТекущиеДанные;
// Вызываем серверную функцию для получения актуальной цены из базы
АктуальнаяЦена = ПолучитьЦенуИзПрайса(ТекущаяСтрока.Номенклатура, Объект.ВидЦен);
Если ТекущаяСтрока.Цена <> АктуальнаяЦена Тогда
ТекстСообщения = "Вы не можете менять базовую цену. Используйте поле Скидка!";
ОбщегоНазначенияКлиентСервер.СообщитьПользователю(ТекстСообщения);
ТекущаяСтрока.Цена = АктуальнаяЦена;
// Принудительно пересчитываем строку
ПересчитатьСтрокуТЧ(ТекущаяСтрока);
КонецЕсли;
КонецПроцедуры
Этот метод хорош тем, что он наглядно объясняет менеджеру правила работы в системе, не просто блокируя поле, а возвращая корректное значение при попытке нарушения регламента.
Подводя итоги нашего анализа, можно выделить следующие рекомендации:
ТолькоПросмотр = Истина для колонок цены и суммы в процедуре ПриСозданииНаСервере.Реализация данных методов позволит вам выстроить четкую ценовую политику компании, исключив человеческий фактор и злоупотребления при установке цен в документах отгрузки.