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