При ведении оптово-розничной торговли в конфигурации 1С:Розница 2.2 часто возникает задача разделения ценообразования. В то время как на кассовом узле (в документе Чек ККМ) продажи должны строго фиксироваться по розничным ценам магазина, в документе Реализация товаров требуется автоматическая подстановка оптовых цен. При этом оптовые цены должны отображаться не только при добавлении строк через кнопку добавления, но и непосредственно в окне обработки Подбор товаров.
Рассмотрим причины такого поведения типовой конфигурации, а также разберем административные и программные способы решения этой задачи.
Проанализируем типовую архитектуру подсистемы ценообразования. В конфигурации 1С:Розница каждый магазин жестко привязан к определенному Правилу ценообразования, в котором зафиксирован основной розничный вид цен. Обработка ПодборТоваров при открытии из любого документа получает в качестве контекста ссылку на Магазин.
В процессе работы формы подбора при активизации строки каталога товаров срабатывает обработчик ожидания, который вызывает серверную функцию получения цены:
Если РежимПодбораВЗакупки Тогда
СтруктураИнформацииОТоваре = ПодборТоваровВызовСервера.ПолучитьЦенуЗакупки(ПодборТекущаяНоменклатура, ПодборТекущаяХарактеристика, Магазин, Контрагент, СсылкаНаПоступление);
Иначе
СтруктураИнформацииОТоваре = ПодборТоваровВызовСервера.ПолучитьЦенуПродажи(ПодборТекущаяНоменклатура, ПодборТекущаяХарактеристика, Магазин, РежимПодбораСУчетомМинимальныхЦен);
КонецЕсли;
Так как по умолчанию функция ПолучитьЦенуПродажи ориентируется на правило ценообразования магазина, форма подбора всегда возвращает и отображает розничную цену, настроенную для торговой точки.
Если требуется решить задачу типовыми средствами без внесения изменений в конфигурацию или создания расширений, разберем методику разделения складов:
Оптовый склад или Оптовый отдел).Реализация товаров выбирают оптовый магазин.В этом случае и добавление строк по кнопке, и форма подбора товаров будут автоматически работать с нужным видом цен без доработок конфигурации.
Если для учета принципиально использовать один и тот же магазин, разберем программный способ переопределения цен. Чтобы сохранить стандартную логику работы для чеков ККМ и других розничных документов, доработку рекомендуется реализовать через расширение конфигурации.
Разберем реализацию по шагам:
РеализацияТоваров при открытии формы подбора добавим в структуру параметров признак оптовой продажи или ссылку на нужный вид цен.
ПараметрыФормы = Новый Структура;
ПараметрыФормы.Вставить("Магазин", Объект.Магазин);
ПараметрыФормы.Вставить("ПереопределитьВидЦен", Истина);
ПараметрыФормы.Вставить("НужныйВидЦен", Справочники.ВидыЦен.НайтиПоНаименованию("Оптовая"));
ОткрытьФорму("Обработка.ПодборТоваров.Форма", ПараметрыФормы, ЭтаФорма, УникальныйИдентификатор);
ПриСозданииНаСервере формы обработки ПодборТоваров прочитаем переданный параметр и сохраним его в реквизит формы (например, РежимОптовыхЦен).ПодборТаблицаПриАктивизацииСтрокиОбработчикОжидания и модифицируем получение цены продажи, добавив ветвление условий.
Если РежимПодбораВЗакупки Тогда
СтруктураИнформацииОТоваре = ПодборТоваровВызовСервера.ПолучитьЦенуЗакупки(ПодборТекущаяНоменклатура, ПодборТекущаяХарактеристика, Магазин, Контрагент, СсылкаНаПоступление);
Иначе
Если РежимОптовыхЦен Тогда
// Вызываем серверную функцию получения цены по конкретному виду цен
СтруктураИнформацииОТоваре = ПолучитьОптовыеЦеныТовара(ПодборТекущаяНоменклатура, ПодборТекущаяХарактеристика, НужныйВидЦен);
Иначе
СтруктураИнформацииОТоваре = ПодборТоваровВызовСервера.ПолучитьЦенуПродажи(ПодборТекущаяНоменклатура, ПодборТекущаяХарактеристика, Магазин, РежимПодбораСУчетомМинимальныхЦен);
КонецЕсли;
КонецЕсли;
Товары документа Реализация товаров в обработчике оповещения формы документа проверяем, чтобы рассчитанные оптовые цены корректно заполнили колонку Цена.При реализации доработки обратим внимание на следующие особенности:
Магазин на клиенте перед передачей в параметры формы. Передавать необходимо только сериализуемые типы данных (ссылки, примитивные типы, структуры).Список.Параметры.УстановитьЗначениеПараметра("ВидЦены", НужныйВидЦен)).