Как настроить автоматический подбор оптовых цен в документе «Реализация товаров» в 1С:Розница 2.2?

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

При ведении оптово-розничной торговли в конфигурации 1С:Розница 2.2 часто возникает задача разделения ценообразования. В то время как на кассовом узле (в документе Чек ККМ) продажи должны строго фиксироваться по розничным ценам магазина, в документе Реализация товаров требуется автоматическая подстановка оптовых цен. При этом оптовые цены должны отображаться не только при добавлении строк через кнопку добавления, но и непосредственно в окне обработки Подбор товаров.

Рассмотрим причины такого поведения типовой конфигурации, а также разберем административные и программные способы решения этой задачи.

Почему типовой подбор использует розничные цены магазина

Проанализируем типовую архитектуру подсистемы ценообразования. В конфигурации 1С:Розница каждый магазин жестко привязан к определенному Правилу ценообразования, в котором зафиксирован основной розничный вид цен. Обработка ПодборТоваров при открытии из любого документа получает в качестве контекста ссылку на Магазин.

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


Если РежимПодбораВЗакупки Тогда
    СтруктураИнформацииОТоваре = ПодборТоваровВызовСервера.ПолучитьЦенуЗакупки(ПодборТекущаяНоменклатура, ПодборТекущаяХарактеристика, Магазин, Контрагент, СсылкаНаПоступление);
Иначе
    СтруктураИнформацииОТоваре = ПодборТоваровВызовСервера.ПолучитьЦенуПродажи(ПодборТекущаяНоменклатура, ПодборТекущаяХарактеристика, Магазин, РежимПодбораСУчетомМинимальныхЦен);
КонецЕсли;

Так как по умолчанию функция ПолучитьЦенуПродажи ориентируется на правило ценообразования магазина, форма подбора всегда возвращает и отображает розничную цену, настроенную для торговой точки.

Вариант 1. Решение без изменения программного кода

Если требуется решить задачу типовыми средствами без внесения изменений в конфигурацию или создания расширений, разберем методику разделения складов:

  1. Создание отдельного элемента в справочнике «Магазины»: создадим виртуальный магазин (например, Оптовый склад или Оптовый отдел).
  2. Настройка правила ценообразования: для созданного оптового магазина укажем правило ценообразования, в котором основным видом цен является Оптовая цена.
  3. Разделение документооборота: кассиры в РМК и чеках выбирают розничный магазин, а менеджеры при выписке оптовых накладных в шапке документа Реализация товаров выбирают оптовый магазин.

В этом случае и добавление строк по кнопке, и форма подбора товаров будут автоматически работать с нужным видом цен без доработок конфигурации.

Вариант 2. Программная доработка подбора через передачу параметров

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

Разберем реализацию по шагам:

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

Важные технические нюансы

При реализации доработки обратим внимание на следующие особенности:

  1. Клиент-серверные ограничения: не следует модифицировать объект Магазин на клиенте перед передачей в параметры формы. Передавать необходимо только сериализуемые типы данных (ссылки, примитивные типы, структуры).
  2. Динамические списки: если в форме подбора цены выводятся непосредственно в колонке списка номенклатуры, необходимо также обновить параметр запроса динамического списка (Список.Параметры.УстановитьЗначениеПараметра("ВидЦены", НужныйВидЦен)).
  3. Контроль минимальных цен: при расчете оптовой цены важно сохранить типовой контроль минимальных цен, если он включен в программе, чтобы предотвратить ошибки при последующем проведении документа реализации.
← На главную