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