В типовой конфигурации «1С:Управление торговлей 11» (УТ 11) механизмы ценообразования опираются на предварительно установленные прайс-листы (документы «Установка цен номенклатуры») и соглашения с клиентами. Однако на практике часто встречается ситуация, когда менеджеры не ведут прайс-лист, а хотят, чтобы система при выборе товара автоматически подставляла цену из последней продажи этому же клиенту или последнюю цену продажи по организации в целом. Рассмотрим подробно, как реализовать этот функционал, разберем технические нюансы и проанализируем риски таких доработок.
Это самый оперативный метод для пользователя. Идея заключается в том, чтобы в момент выбора товара в табличную часть документа РеализацияТоваровУслуг система мгновенно находила последнюю цену и подставляла ее в колонку «Цена». Разберем, как это реализовать через расширение конфигурации.
Нам необходимо расширить модуль формы документа (например, ФормаДокумента или ФормаВыбораДинамическая) и создать процедуру-обработчик для события НоменклатураПриИзменении. Основная задача — написать запрос, который обратится к истории продаж.
Проанализируем структуру данных: в УТ 11 информацию о продажах лучше всего получать из регистра накопления ВыручкаИСебестоимостьПродаж или напрямую из документов РеализацияТоваровУслуг. Использование регистра предпочтительнее с точки зрения производительности.
Рассмотрим пример кода для получения цены:
&НаСервере
Функция ПолучитьПоследнююЦенуПродажи(Номенклатура, Партнер, Организация) Экспорт
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ ПЕРВЫЕ 1
| ДокументПродажи.Цена КАК Цена,
| ДокументПродажи.Валюта КАК Валюта
|ИЗ
| РегистрНакопления.ВыручкаИСебестоимостьПродаж КАК Выручка
|ГДЕ
| Выручка.АналитикаУчетаНоменклатуры.Номенклатура = &Номенклатура
| И Выручка.АналитикаУчетаПоПартнерам.Партнер = &Партнер
| И Выручка.Организация = &Организация
|УПОРЯДОЧИТЬ ПО
| Выручка.Период УБЫВ";
Запрос.УстановитьПараметр("Номенклатура", Номенклатура);
Запрос.УстановитьПараметр("Партнер", Партнер);
Запрос.УстановитьПараметр("Организация", Организация);
Выборка = Запрос.Выполнить().Выбрать();
Если Выборка.Следующий() Тогда
Возврат Выборка.Цена;
КонецЕсли;
Возврат 0;
КонецФункции
Важный нюанс: при реализации этого метода обязательно нужно учитывать характеристики номенклатуры. Если учет ведется в разрезе характеристик, запрос должен содержать условие по АналитикаУчетаНоменклатуры.Характеристика, иначе менеджер может получить неверную цену для другого исполнения товара.
Если клиент хочет остаться в рамках типового механизма (чтобы цены попадали в отчет «Прайс-лист»), можно автоматизировать создание документов установки цен. Проанализируем схему: при проведении документа РеализацияТоваровУслуг система должна проверять, отличается ли цена в документе от текущей цены в регистре. Если отличается — создается новый документ Установка цен номенклатуры.
Для реализации этого метода выполним следующие шаги:
Вид цены, например, «Цена последней реализации».РеализацияТоваровУслуг в процедуре ПередЗаписью или через подписку на событие ОбработкаПроведения добавим логику формирования нового документа установки цен.Этот подход позволяет использовать стандартные механизмы скидок и наценок УТ 11, так как в документе реализации цена будет считаться «официальной» ценой прайс-листа. Однако помните, что это приведет к лавинообразному росту количества документов в базе, если цены меняются часто.
Иногда автоматическая подстановка при каждом изменении строки мешает менеджеру (например, если он хочет ввести специфическую цену вручную, а система ее перебивает). В этом случае рассмотрим вариант с добавлением команды в меню «Заполнить» табличной части «Товары».
Выясним преимущества этого метода:
Для реализации используйте механизм дополнительных отчетов и обработок. В функции СведенияОВнешнейОбработке укажите тип ЗаполнениеОбъекта для документа РеализацияТоваровУслуг.
При написании программного кода для любого из способов, мы должны учесть несколько критических факторов, чтобы не допустить ошибок в учете:
1. Единицы измерения и упаковки. Выясним причину возможной ошибки: товар мог продаваться в коробках (по 10 штук), а в новом документе менеджер выбирает штуки. Если просто скопировать цену из старого документа, она будет завышена в 10 раз. Необходимо всегда проверять коэффициент упаковки:
ЦенаЗаЕдиницу = ЦенаИзПрошлогоДокумента / КоэффициентУпаковкиИзПрошлогоДокумента * КоэффициентТекущейУпаковки;
2. Валютный учет. Проанализируем ситуацию: прошлая реализация была в долларах, а текущая — в рублях. Необходимо использовать функции типовой конфигурации для пересчета валюты по курсу на дату нового документа. В УТ 11 для этого удобно использовать методы общего модуля РаботаСКурсамиВалют.
3. Флаг «Цена включает НДС». Проверьте, совпадает ли настройка налогообложения в старом и новом документах. Если в одном документе цена указана с НДС, а во втором — без, прямая подстановка приведет к потере или излишнему начислению налога.
Рассмотрим рекомендации, которые помогут избежать конфликтов с пользователями и руководством:
Индивидуальные соглашения с клиентами. Возможно, вместо доработки стоит обучить пользователей фиксировать спеццены именно там.Таким образом, задача заполнения цен по последней реализации в УТ 11 решается достаточно просто с технической стороны (через запрос к регистру выручки), но требует внимательного отношения к деталям: валютам, упаковкам и характеристикам номенклатуры.