При работе в 1С:Управление производственным предприятием (УПП) версии 8.2 (редакция 1.3) часто возникает необходимость контролировать действия пользователей, в частности, ограничивать максимальный процент ручной скидки, который они могут применять в документах продажи, таких как «Заказ Покупателя» и «Реализация товаров и услуг». Стандартные механизмы, например, установка скидок для номенклатуры или распределение по ценовым группам, зачастую не помогают, поскольку ручной ввод может перекрывать эти настройки. Давайте рассмотрим, как решить эту задачу, используя как доработки конфигурации, так и анализируя возможности типовых решений.
Один из наиболее эффективных способов установить жесткий лимит на ручную скидку — это программная доработка конфигурации. Мы будем вмешиваться в процедуру, отвечающую за ценообразование, чтобы контролировать процент скидки до его окончательного применения. Этот метод позволит нам не только ограничить, но и принудительно скорректировать процент скидки, если он превышает установленный максимум.
Разберем процесс по шагам:
Прежде всего, нам необходимо убедиться, что в настройках управленческого учета включена возможность использования любых автоматических скидок. Это важно, поскольку процедура, в которую мы будем вносить изменения, может не вызываться, если система считает, что скидки не используются вообще. Проверьте настройки, чтобы функция ценообразования работала коррессивно.
Для того чтобы хранить максимальный процент ручной скидки, который можно устанавливать для каждого пользователя или группы, мы добавим новое свойство в ПланыВидовХарактеристик.НастройкиПользователей. Назовем его, например, ОграничениеРучнойСкидки. Это позволит нам гибко управлять лимитами для разных сотрудников, не изменяя код каждый раз.
Ключевым шагом является внесение изменений в процедуру Ценообразование.ПолучитьСуммуДокументаБезСкидки. Эта процедура вызывается в обоих интересующих нас документах — «Заказ Покупателя» и «Реализация товаров и услуг», что гарантирует централизованный контроль. Мы добавим наш код в самое начало этой процедуры.
Вот пример кода, который необходимо вставить:
// { Обработаем ограничение на макс % ручной скидки
МаксПроцент = УправлениеПользователями.ПолучитьЗначениеПоУмолчанию("ОграничениеРучнойСкидки");
Если ЗначениеЗаполнено(МаксПроцент) И ТабличнаяЧасть.ВыгрузитьКолонки.Колонки.Найти("ПроцентСкидкиНаценки") <> Неопределено Тогда
ЕстьНарушение = Ложь;
Для каждого СтрокаТабличнойЧасти Из ТабличнаяЧасть Цикл
Если СтрокаТабличнойЧасти.ПроцентСкидкиНаценки > МаксПроцент Тогда
СтрокаТабличнойЧасти.ПроцентСкидкиНаценки = МаксПроцент;
ЕстьНарушение = Истина;
КонецЕсли;
КонецЦикла;
Если ЕстьНарушение Тогда
Сообщить("Максимальный процент Ручной скидки установлен = " + МаксПроцент);
КонецЕсли;
КонецЕсли;
// }
Давайте разберем, что делает этот код:
УправлениеПользователями.ПолучитьЗначениеПоУмолчанию("ОграничениеРучнойСкидки"). Если это значение не установлено, то ограничение не применяется.ПроцентСкидкиНаценки в табличной части документа. Это обеспечивает универсальность кода для различных документов.ПроцентСкидкиНаценки установленный МаксПроцент. Если превышает, мы принудительно устанавливаем ПроцентСкидкиНаценки равным МаксПроцент.Изначально мы предложили хранить параметр в НастройкахПользователя, но для более гибкого управления и возможности назначать ограничения целым группам пользователей, мы можем рассмотреть вариант хранения этого параметра в ПравахПользователей. Этот подход обеспечивает более централизованное и удобное управление политикой скидок для различных категорий сотрудников.
Стоит отметить, что данное ограничение, как и многие другие, часто не работает для пользователей, которые имеют полные права в системе. Если вам необходимо контролировать даже таких пользователей, потребуется дополнительная, более глубокая доработка или изменение их профилей доступа, чтобы исключить роль "Полные права" и настроить индивидуальные роли с нужными ограничениями.
Существует более простой, но менее гибкий вариант программной доработки, который был предложен в обсуждении. Он заключается во внесении кода непосредственно в процедуру обработки поля ввода процента ручной скидки.
В документе, для поля, отвечающего за процент ручной скидки (например, ПроцентРучнойСкидки), можно дописать процедуру, которая будет срабатывать при изменении значения в этом поле.
Пример кода:
Если СтрокаТабличнойЧасти.ПроцентРучнойСкидки > 30 Тогда
СтрокаТабличнойЧасти.ПроцентРучнойСкидки = 0;
КонецЕсли;
Этот код проверяет, если введенный процент ручной скидки превышает 30%, и в этом случае сбрасывает его до 0. Вы можете настроить логику сброса на желаемое значение, например, до максимального разрешенного (30%).
Чтобы это ограничение действовало только для определенных пользователей, вам необходимо установить флажок напротив соответствующих ролей в доступных ролях, для которых применяется данная доработка.
Недостатки этого подхода:
На форуме обсуждалась идея использования типового механизма, который позволяет контролировать минимальную цену продажи, чтобы косвенно ограничить скидку. Давайте рассмотрим эту идею и почему она не всегда работает так, как ожидается, особенно для ограничения именно процента ручной скидки.
Суть идеи заключалась в следующем: создать специальный тип цен, который бы отражал минимально допустимую цену товара после применения максимальной скидки (например, розничная цена минус 30%). Затем в правах пользователя установить настройку "Не отпускать товар с ценой ниже определенного типа", привязав ее к этому новому типу цен.
Шаги для реализации:
Розничная цена * (1 - 0.30) или Розничная цена - 30%.Пользователь в обсуждении сообщил, что этот подход у него не сработал. Мы выясним причину. Механизм "Не отпускать товар с ценой ниже определенного типа" в 1С:УПП 8.2 предназначен для контроля итоговой цены продажи, а не для прямого ограничения процента ручной скидки. Он срабатывает на этапе проведения документа или при фиксации цены, проверяя, не опустилась ли конечная цена ниже заданного порога. Однако, он не предотвращает сам ввод большого процента скидки в соответствующее поле. Пользователь все равно может ввести 50% скидки, и лишь потом при попытке сохранить или провести документ система выдаст ошибку, что цена ниже разрешенной. Кроме того, взаимодействие этой функциональности с автоматическими и ручными скидками может быть нетривиальным и требовать специфических настроек, которые не всегда очевидны или доступны в старых версиях конфигурации. Таким образом, этот метод не является прямым решением для ограничения именно процента, а служит скорее инструментом контроля минимальной прибыльности.
Еще один вариант, упомянутый в дискуссии, представляет собой вариацию программной доработки:
Когда мы вносим изменения непосредственно в конфигурацию, возникает закономерный вопрос: что будет при очередном обновлении? Давайте проанализируем ситуацию:
Важно понимать, что в более современных конфигурациях 1С (таких как 1С:ERP, 1С:Комплексная автоматизация 2, 1С:Управление торговлей 11.5) многие из описанных выше задач решаются без доработок конфигурации благодаря встроенным типовым механизмам. Рассмотрим их, чтобы понять, как эволюционировал подход к управлению скидками:
В современных системах можно напрямую задать максимальный процент ручной скидки для конкретного пользователя или группы пользователей. Это позволяет гибко управлять полномочиями сотрудников. Например, в профилях групп доступа можно установить флажок "Ограничивать ручные скидки" и указать максимальное значение. Если флажок установлен, а значение обнулено, пользователь вообще не сможет применять ручные скидки. Путь для настройки обычно находится в разделе "НСИ и администрирование" → "Настройки пользователей и прав" → "Пользователи", где в карточке пользователя есть кнопка "Правила продаж" для установки лимитов.
Ручные скидки могут быть ограничены в типовых или индивидуальных соглашениях с клиентами. В индивидуальных соглашениях мы можем активировать флаг "Ограничивать ручные скидки" и установить пороговые значения процентов скидок и наценок. Эти ограничения будут автоматически действовать при оформлении документов продажи по данному соглашению, обеспечивая соответствие ценовой политике для конкретного клиента.
Современные конфигурации позволяют уточнять скидки не только по пользователям или соглашениям, но и по ценовым группам номенклатуры. Это значит, что для разных категорий товаров можно установить разные максимальные проценты скидок, что еще больше повышает гибкость и детализацию управления.
Если ручные скидки не должны использоваться вовсе, предусмотрена возможность их полного отключения в разделе "НСИ и администрирование" → "Настройка НСИ и разделов" → "CRM и маркетинг", что позволяет работать только с автоматическими скидками.
В современных системах существует четкая иерархия и приоритет ограничений. Например, ограничения, установленные на уровне документа (скажем, в соглашении с клиентом), обычно имеют более высокий приоритет по сравнению с общими настройками для пользователя.
Как и в УПП 8.2, в современных версиях ограничения ручных скидок обычно не действуют для пользователей с ролями "Полные права" или аналогичными, которые позволяют обходить проверки. Для контроля таких пользователей необходимо либо пересмотреть их профили доступа, либо реализовать дополнительные механизмы аудита.
Современные версии 1С позволяют настроить сложные автоматические скидки, которые срабатывают по заданным условиям (сумма, количество, комплекты, категории, ценовые группы, получатели, расписание) и при этом могут быть "назначаемыми вручную". Это дает менеджерам выбор из предопределенных, контролируемых вариантов скидок, минимизируя потребность в полностью произвольном ручном вводе.
Основное преимущество использования типовых механизмов заключается в минимизации или полном отсутствии необходимости в доработках конфигурации. Это значительно упрощает процесс обновлений, снижает риски возникновения ошибок и сокращает затраты на сопровождение системы.
Таким образом, хотя в 1С:УПП 8.2 для ограничения ручной скидки часто требуются программные доработки, современные конфигурации 1С предлагают комплексные и гибкие типовые механизмы, которые позволяют эффективно управлять этим процессом без вмешательства в код.