В конфигурации 1С:Управление торговлей, редакция 11 (УТ 11) разработчики кардинально изменили концепцию ценообразования и предоставления скидок по сравнению с УТ 10.3. Вместо привычной прямой матрицы «клиент — номенклатура — процент скидки» система предлагает использовать маркетинговый подход: объединять клиентов в сегменты, товары — в сегменты номенклатуры, и назначать скидки на пересечении этих областей.
Однако на практике оптовые, дистрибьюторские и производственные компании часто сталкиваются с жесткой необходимостью вести учет индивидуально. Представьте задачу: 1000 клиентов и 1000 позиций номенклатуры, для каждого клиента на каждый товар установлена уникальная скидка или наценка от -20% до +20% с точностью до сотых долей процента (шаг 0,01%). Создавать под эту задачу миллион сегментов и правил совместного применения в типовом функционале — верный способ превратить базу данных в неработоспособный «долгострой». Давайте подробно разберем, как можно обойти это архитектурное ограничение и какие варианты решения существуют.
Прежде чем переходить к доработке программы, проанализируем, можно ли решить задачу силами штатного функционала, слегка оптимизировав бизнес-процессы. Если мы не можем назначать скидки на каждую позицию индивидуально, мы можем сгруппировать товары.
Выполним следующие шаги для настройки:
ЦеновыеГруппы. Вместо 1000 отдельных товаров распределим номенклатуру по 10–30 ценовым группам (например: «Золото 585», «Серебро кольца», «Бюджетная фурнитура» и т.д.).ИндивидуальноеСоглашение.В чем преимущество этого подхода? Количество связей сокращается в десятки раз. Вместо связки «1000 клиентов × 1000 товаров = 1 000 000 записей» мы получаем более управляемую модель «1000 клиентов × 20 ценовых групп = 20 000 записей». Если для какого-то конкретного товара все же требуется жестко зафиксировать цену в обход групповой скидки, это можно сделать в табличной части индивидуального соглашения в виде фиксированной цены.
В конфигурациях 1С на базе Библиотеки стандартных подсистем (БСП), включая УТ 11, заложен гибкий инструмент расширения логики без изменения самого кода конфигурации. Это механизм внешних скидок.
Выясним причину, почему это выгодно: при расчете скидок в документе система может передать управление внешней обработке. Нам не нужно снимать конфигурацию с поддержки. Алгоритм действий выглядит так:
Если бизнес-процессы требуют, чтобы менеджеры видели и редактировали индивидуальные проценты скидок непосредственно в интерфейсе 1С, лучшим решением будет использование расширений конфигурации. Этот метод позволяет добавить собственный объект метаданных и встроить его в типовой расчет цен.
Рассмотрим по шагам реализацию этого решения:
МатрицаСкидокПоПартнерам.Партнер (тип СправочникСсылка.Партнеры) и Номенклатура (тип СправочникСсылка.Номенклатура).ПроцентСкидки (тип Число, длина 5, точность 2).&После или &Вместо) переопределим процедуру расчета скидок в модуле менеджера документа или специализированном общем модуле ценообразования.Для понимания технической стороны процесса, проанализируем пример кода на встроенном языке 1С, который может использоваться в расширении для быстрого получения процента скидки из нашего нового регистра:
// Функция возвращает индивидуальный процент скидки для клиента по конкретному товару
Функция ПолучитьИндивидуальнуюСкидку(АктуальныйПартнер, АктуальнаяНоменклатура, ДатаДокумента) Экспорт
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| МатрицаСкидокСрезПоследних.ПроцентСкидки КАК ПроцентСкидки
|ИЗ
| РегистрСведений.МатрицаСкидокПоПартнерам.СрезПоследних(&Период, Партнер = &Партнер И Номенклатура = &Номенклатура) КАК МатрицаСкидокСрезПоследних";
Запрос.УстановитьПараметр("Период", ?(ЗначениеЗаполнено(ДатаДокумента), ДатаДокумента, ТекущаяДата()));
Запрос.УстановитьПараметр("Партнер", АктуальныйПартнер);
Запрос.УстановитьПараметр("Номенклатура", АктуальнаяНоменклатура);
УстановитьПривилегированныйРежим(Истина);
Выборка = Запрос.Выполнить().Выбрать();
УстановитьПривилегированныйРежим(Ложь);
Если Выборка.Следующий() Тогда
Возврат Выборка.ПроцентСкидки;
КонецЕсли;
Возврат 0; // Если индивидуальной скидки нет, возвращаем ноль
КонецФункции
Этот код работает чрезвычайно быстро благодаря использованию индексов регистра сведений и позволяет налету подставлять значения в строки заказов покупателей.
В случаях, когда базовый прайс-лист часто меняется (например, из-за изменения курса валют или стоимости сырья), фиксировать проценты скидок бывает неудобно. Альтернативным вариантом является использование механизма динамических видов цен.
Вместо назначения скидки мы создаем индивидуальный вид цен для каждого клиента или группы клиентов. Формула расчета такого вида цен будет выглядеть так:
[БазоваяЦена] * (1 - [ИндивидуальныйПроцент] / 100)
При этом базовую цену мы можем менять ежедневно, а индивидуальные цены клиентов в документах продажи будут автоматически пересчитываться «на лету» без необходимости ручного вмешательства менеджеров.
Если бизнес-процессы компании завязаны на постоянное согласование цен «в полях», а итоговые калькуляции менеджеры традиционно ведут в таблицах Excel, можно использовать прагматичный полуавтоматический подход.
Мы можем не хранить всю матрицу скидок внутри 1С:УТ 11, чтобы не перегружать базу данных историческими записями. Вместо этого в документ «Заказ клиента» добавляется кнопка загрузки табличной части из Excel. Менеджер, согласовав с клиентом индивидуальный заказ на 100 позиций со своими скидками, загружает файл в документ. В процессе загрузки код 1С сопоставляет номенклатуру по артикулу или штрихкоду и автоматически заполняет колонку ПроцентРучнойСкидки.
Преимущества данного решения:
Выбор оптимального метода зависит от ИТ-ресурсов вашей компании и готовности к доработкам. Если вы стремитесь сохранить конфигурацию полностью типовой, начните с Решения 1 (Ценовые группы) или внедрите Решение 5 (Импорт из Excel). Если же вам необходима полная автоматизация процесса «в один клик», наиболее надежным и современным вариантом будет разработка простого расширения со своим регистром сведений (Решение 3), что позволит системе работать быстро и без сбоев при любых нагрузках.