В практике работы с торговыми решениями на базе 1С:Предприятие часто встречается ситуация: маркетинговая акция создана и активирована, на кассе товар пробивается по корректной сниженной цене, однако при попытке распечатать ценник из карточки номенклатуры система упорно выводит старую розничную цену. Особенно остро эта проблема проявляется в распределенных информационных базах (РИБ), где данные на сервере и на рабочих местах пользователей могут временно расходиться. Проанализируем причины этого явления и разберем по шагам методы устранения ошибки.
Если в вашей системе используется периферийная база, первым делом необходимо проверить полноту передачи данных. Часто случается так, что сам документ, устанавливающий скидки или акционные цены, успешно мигрировал в подчиненный узел, но записи в связанных регистрах сведений не обновились.
Рассмотрим, как это работает изнутри. Кассовый модуль часто обращается к механизму СкидкиНаценки, который вычисляет цену в момент добавления товара в чек. В то же время обработка печати ценников чаще всего делает прямой запрос к регистру сведений ЦеныНоменклатуры или его аналогам. Выясним причину возможного сбоя:
ЦеныНоменклатуры для узла периферийной базы. Если акция создана, но обмен еще не завершен или произошла ошибка в планах обмена, ценник будет печататься по старым данным.Часто проблема кроется не в программном коде, а в индивидуальных настройках сеанса. В 1С предусмотрена возможность закрепления за пользователем определенного типа цен по умолчанию. Проанализируем ситуацию: на сервере у администратора может быть выбран «динамический» поиск цены, а у рядового пользователя в настройках жестко прописан тип «Розничная».
Чтобы исправить это, выполним следующие действия:
Разберем важный технический нюанс. Печать из документа «Установка цен номенклатуры» или «Маркетинговая акция» всегда берет данные из самого документа. Однако печать «из карточки», о которой упоминает пользователь, обращается к функции получения среза последних цен на текущую дату.
Посмотрим на пример типичного запроса, который отрабатывает в фоновом режиме при формировании ценника:
ВЫБРАТЬ
ЦеныНоменклатурыСрезПоследних.Цена КАК АктуальнаяЦена,
ЦеныНоменклатурыСрезПоследних.ТипЦен КАК ТипЦен
ИЗ
РегистрСведений.ЦеныНоменклатуры.СрезПоследних(&Период, Номенклатура = &Номенклатура) КАК ЦеныНоменклатурыСрезПоследних
Если акция реализована через механизм скидок, а не через установку новых цен, то в регистре ЦеныНоменклатуры цена останется прежней. Касса увидит скидку (так как она работает с правилами ценообразования), а печатная форма, настроенная на чтение «чистых» цен из регистра, — нет. В таком случае необходимо дорабатывать шаблон ценника или использовать печать из чека/документа акции.
Проанализируем ситуацию, когда на одном компьютере всё отображается корректно, а на другом — нет. В 1С 8.3 локальный кэш пользователя может хранить старые значения или некорректные временные данные о структурах метаданных. Это особенно актуально при использовании расширений для управления акциями.
Для решения проблемы попробуем выполнить очистку кэша:
%AppData%\1C\1cv8 и %LocalAppData%\1C\1cv8.Выясним еще одну неочевидную причину. Метод СрезПоследних() крайне чувствителен к параметру даты. Если на рабочих станциях пользователей время спешит или отстает относительно сервера, запрос может выдавать разные результаты. Например, если акция начинается в 00:00:00, а на локальном ПК еще 23:55:00 предыдущего дня, ценник напечатает старую цену.
Рекомендуем всегда использовать серверное время для получения цен:
ТекущаяДатаСервера = ТекущаяДата(); // Выполнять на стороне сервера
Цена = РегистрыСведений.ЦеныНоменклатуры.СрезПоследних(ТекущаяДатаСервера, Новый Структура("Номенклатура", ВыбТовар));
Подводя итог, можно сказать: если касса «видит» цену, а ценник — нет, проблема почти всегда заключается в способе получения данных (регистр цен против механизма скидок) или в задержке синхронизации РИБ. Тщательная проверка настроек пользователя и актуальности данных в периферийном узле позволит быстро устранить это расхождение.