Как предотвратить немедленную выгрузку цен на сайт при установке цен будущей датой в 1С:УТ 11.5

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

В практике работы с 1С:Управление торговлей 11.5 часто возникает ситуация, когда маркетинговый отдел готовит изменение цен заранее. Например, новые цены должны вступить в силу через неделю, и бухгалтер создает документ Установка цен номенклатуры с соответствующей будущей датой. Однако сразу после проведения документа цены «улетают» на сайт, что ломает текущие продажи. Проанализируем, почему так происходит и как заставить систему работать корректно.

Почему цены выгружаются сразу: разбираем механику системы

Чтобы найти решение, нам необходимо понять два фундаментальных механизма, которые работают «под капотом» 1С:

  1. Работа регистра «Цены номенклатуры 25»: В последних версиях УТ используется новый регистр. Когда модуль обмена (например, с Битрикс) запрашивает цену товара, он чаще всего использует метод СрезПоследних. Если в параметрах этого метода не указана конкретная дата, система выдает запись с самым поздним периодом из существующих. Таким образом, ваша цена, установленная на «через 10 дней», технически является самой «последней» и актуальной для базы данных, несмотря на то, что ее время еще не пришло.
  2. Регистрация изменений в Плане обмена: Как только вы нажимаете кнопку «Провести», срабатывает подписка на событие. Системе неважно, какая дата стоит внутри документа. Сам факт успешного проведения документа Установка цен номенклатуры является триггером для регистрации товара в очереди на обмен. При следующем сеансе обмена модуль видит, что данные по товару изменились, делает запрос к ценам (см. пункт 1) и отправляет будущую цену на сайт.

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

Способ 1: Использование механизма согласования цен

Проанализируем штатную возможность конфигурации, которая позволяет контролировать вступление документов в силу. В 1С:УТ 11.5 существует функциональная опция Согласование цен. Она добавляет документам статусы, которые могут блокировать их влияние на систему до определенного момента.

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

  1. Перейдем в раздел НСИ и администрирование — Настройка НСИ и разделов — CRM и маркетинг — Маркетинг.
  2. Активируем флаг Согласование цен.
  3. Теперь у документа Установка цен номенклатуры появится поле Статус с вариантами: Не согласован, Согласован, Действует.

Важный нюанс: Чтобы этот способ сработал для обмена, документ должен находиться в статусе Согласован, но не Действует. Однако стоит учитывать, что в некоторых типовых правилах обмена регистрация все равно происходит при любом проведении. Если это ваш случай, перейдем к более радикальным методам.

Способ 2: Корректировка запроса в модуле обмена (для программистов)

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

РегистрСведений.ЦеныНоменклатуры25.СрезПоследних(&ДатаСреза, ...)

Если параметр &ДатаСреза не передан или равен пустой дате, 1С берет самую позднюю запись. Нам необходимо принудительно установить этот параметр в значение текущего момента. Разберем по шагам, как модифицировать запрос:

  1. Найдем в модуле обмена функцию, отвечающую за получение цен для выгрузки.
  2. Убедимся, что в запрос передается текущая дата. Код должен выглядеть так:

Запрос = Новый Запрос;
Запрос.Текст = 
    "ВЫБРАТЬ
    |   Цены.Цена,
    |   Цены.Номенклатура
    |ИЗ
    |   РегистрСведений.ЦеныНоменклатуры25.СрезПоследних(&ТекущийМомент, ВидЦены = &ВидЦены) КАК Цены";

Запрос.УстановитьПараметр("ТекущийМомент", ТекущаяДата());
Запрос.УстановитьПараметр("ВидЦены", НужныйВидЦены);

В этом случае, даже если в базе есть цена на «через 10 дней», запрос СрезПоследних на ТекущаяДата() ее проигнорирует и выдаст ту цену, которая действует прямо сейчас.

Способ 3: Создание регламентного задания для отложенной регистрации

Посмотрим на ситуацию со стороны Плана обмена. Если мы не хотим менять логику запросов, мы можем управлять очередью выгрузки. Идея заключается в следующем: мы запрещаем автоматическую регистрацию изменений при проведении документа с будущей датой и перекладываем эту задачу на робота.

Алгоритм действий следующий:

  1. В расширении модифицируем процедуру регистрации изменений, чтобы она игнорировала документы, дата начала действия которых больше ТекущаяДата().
  2. Создаем новое РегламентноеЗадание, которое будет запускаться, например, раз в сутки в 00:01.
  3. Внутри задания прописываем код, который находит все документы Установка цен номенклатуры, дата начала действия которых наступила сегодня.
  4. Для найденных товаров программно вызываем регистрацию изменений на узле обмена с сайтом.

Пример кода для регистрации изменений вручную:

ПланыОбмена.ЗарегистрироватьИзменения(УзелСайта, СсылкаНаНоменклатуру);

Способ 4: Оперативное ручное управление (без программирования)

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

  1. Проведите документ с будущей датой.
  2. Перейдите в НСИ и администрирование — Обмен с сайтом.
  3. Откройте Настройки обмена и нажмите кнопку Показать зарегистрированные изменения (иконка с карандашом).
  4. Найдите в списке раздел «Номенклатура» или «Цены» и вручную удалите записи, которые не должны попасть на сайт сегодня.

Резюме: Проведение документа будущей датой в 1С — это штатный механизм, но он конфликтует с упрощенной логикой многих модулей обмена. Самым надежным решением является комбинация Способа 2 (ограничение среза последних датой) и Способа 3 (контроль момента регистрации изменений). Это гарантирует, что сайт всегда будет показывать только те цены, время которых действительно наступило.

← На главную