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

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

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

Однако на практике оптовые, дистрибьюторские и производственные компании часто сталкиваются с жесткой необходимостью вести учет индивидуально. Представьте задачу: 1000 клиентов и 1000 позиций номенклатуры, для каждого клиента на каждый товар установлена уникальная скидка или наценка от -20% до +20% с точностью до сотых долей процента (шаг 0,01%). Создавать под эту задачу миллион сегментов и правил совместного применения в типовом функционале — верный способ превратить базу данных в неработоспособный «долгострой». Давайте подробно разберем, как можно обойти это архитектурное ограничение и какие варианты решения существуют.

Решение 1: Укрупнение матрицы через ценовые группы и индивидуальные соглашения

Прежде чем переходить к доработке программы, проанализируем, можно ли решить задачу силами штатного функционала, слегка оптимизировав бизнес-процессы. Если мы не можем назначать скидки на каждую позицию индивидуально, мы можем сгруппировать товары.

Выполним следующие шаги для настройки:

  1. Создадим справочник ЦеновыеГруппы. Вместо 1000 отдельных товаров распределим номенклатуру по 10–30 ценовым группам (например: «Золото 585», «Серебро кольца», «Бюджетная фурнитура» и т.д.).
  2. Для каждого клиента создадим ИндивидуальноеСоглашение.
  3. Внутри индивидуального соглашения на вкладке «Условия продаж» настроим скидки (наценки) не для конкретной номенклатуры, а для созданных Ценовых групп.

В чем преимущество этого подхода? Количество связей сокращается в десятки раз. Вместо связки «1000 клиентов × 1000 товаров = 1 000 000 записей» мы получаем более управляемую модель «1000 клиентов × 20 ценовых групп = 20 000 записей». Если для какого-то конкретного товара все же требуется жестко зафиксировать цену в обход групповой скидки, это можно сделать в табличной части индивидуального соглашения в виде фиксированной цены.

Решение 2: Использование типового механизма «Внешних скидок»

В конфигурациях 1С на базе Библиотеки стандартных подсистем (БСП), включая УТ 11, заложен гибкий инструмент расширения логики без изменения самого кода конфигурации. Это механизм внешних скидок.

Выясним причину, почему это выгодно: при расчете скидок в документе система может передать управление внешней обработке. Нам не нужно снимать конфигурацию с поддержки. Алгоритм действий выглядит так:

  1. В справочнике «Скидки (наценки)» создается элемент с типом «Внешняя обработка».
  2. Программист разрабатывает внешнюю обработку (файл .epf), которая подключается через стандартное меню «Дополнительные отчеты и обработки».
  3. Внутри обработки описывается логика получения процента скидки. Сами проценты могут храниться где угодно: во внешнем файле Excel на сервере, в отдельной базе данных SQL или в специально созданном регистре сведений.
  4. В момент расчета скидок в документах «Заказ клиента» или «Реализация товаров и услуг» 1С автоматически передает табличную часть во внешнюю обработку, которая мгновенно рассчитывает и возвращает нужные проценты по паре клиент-номенклатура.

Решение 3: Реализация собственной матрицы скидок через расширение конфигурации

Если бизнес-процессы требуют, чтобы менеджеры видели и редактировали индивидуальные проценты скидок непосредственно в интерфейсе 1С, лучшим решением будет использование расширений конфигурации. Этот метод позволяет добавить собственный объект метаданных и встроить его в типовой расчет цен.

Рассмотрим по шагам реализацию этого решения:

  1. Создадим расширение конфигурации, в котором добавим новый периодический или непериодический регистр сведений. Назовем его, например, МатрицаСкидокПоПартнерам.
  2. Определим измерения регистра: Партнер (тип СправочникСсылка.Партнеры) и Номенклатура (тип СправочникСсылка.Номенклатура).
  3. Добавим ресурс регистра: ПроцентСкидки (тип Число, длина 5, точность 2).
  4. Разработаем простую обработку загрузки данных из Excel в этот регистр сведений, чтобы маркетологи или менеджеры могли обновлять миллионную матрицу скидок за пару кликов.
  5. Через механизм расширения (с помощью аннотации &После или &Вместо) переопределим процедуру расчета скидок в модуле менеджера документа или специализированном общем модуле ценообразования.

Для понимания технической стороны процесса, проанализируем пример кода на встроенном языке 1С, который может использоваться в расширении для быстрого получения процента скидки из нашего нового регистра:


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

Этот код работает чрезвычайно быстро благодаря использованию индексов регистра сведений и позволяет налету подставлять значения в строки заказов покупателей.

Решение 4: Динамические виды цен (как альтернатива скидкам)

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

Вместо назначения скидки мы создаем индивидуальный вид цен для каждого клиента или группы клиентов. Формула расчета такого вида цен будет выглядеть так:

[БазоваяЦена] * (1 - [ИндивидуальныйПроцент] / 100)

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

Решение 5: Загрузка скидок и наценок из Excel при выписке документов

Если бизнес-процессы компании завязаны на постоянное согласование цен «в полях», а итоговые калькуляции менеджеры традиционно ведут в таблицах Excel, можно использовать прагматичный полуавтоматический подход.

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

Преимущества данного решения:

Подведем итоги

Выбор оптимального метода зависит от ИТ-ресурсов вашей компании и готовности к доработкам. Если вы стремитесь сохранить конфигурацию полностью типовой, начните с Решения 1 (Ценовые группы) или внедрите Решение 5 (Импорт из Excel). Если же вам необходима полная автоматизация процесса «в один клик», наиболее надежным и современным вариантом будет разработка простого расширения со своим регистром сведений (Решение 3), что позволит системе работать быстро и без сбоев при любых нагрузках.

← На главную