В процессе повседневной эксплуатации торговых конфигураций на платформе 1С («Розница 1.0», «Управление торговлей 10.3») иногда возникает критическая ситуация: скидки по дисконтным картам внезапно перестают рассчитываться в чеках ККМ и документах продажи, при этом скидки без использования карт продолжают работать штатно. Программа не выдает синтаксических ошибок, тестирование и исправление информационной базы не приносит результата, а в отладчике механизм просто возвращает нулевую скидку. Разберем детально, из-за чего возникает такое поведение и как быстро локализовать и устранить сбой.
Проанализируем механику работы запросов, рассчитывающих автоматические скидки. При настройке маркетинговых акций или документов установки скидок часто задаются списки исключений (номенклатура или группы, на которые действие скидки не распространяется).
В типовых запросах конфигураций проверка исключений строится с использованием конструкции языка запросов НЕ В (&СписокИсключений). Если пользователь случайно добавил в табличную часть исключений новую строку и оставил реквизит незаполненным, в массив параметров передается Справочники.Номенклатура.ПустаяСсылка() или значение NULL.
В логике реляционных СУБД и языка запросов 1С предикат NOT IN при наличии в сравниваемом списке пустого значения возвращает отрицательный результат для всех проверяемых позиций. В результате запрос расчета скидки возвращает пустую таблицу, скидка не начисляется ни на один товар в чеке, а система не генерирует никаких ошибок в журнал регистрации.
Разберем по шагам, как проверить и исправить настройки действующих скидок:
Для предотвращения повторения подобных инцидентов со стороны пользователей рекомендуется добавить валидацию табличных частей перед записью документов скидок. Рассмотрим пример проверки в модуле объекта документа установки скидок:
Процедура ПередЗаписью(Отказ, РежимЗаписи, РежимПроведения)
// Очистим пустые строки в табличной части исключений перед проведением
Индекс = ТаблицаИсключений.Количество() - 1;
Пока Индекс >= 0 Цикл
Строка = ТаблицаИсключений[Индекс];
Если НЕ ЗначениеЗаполнено(Строка.Номенклатура) Тогда
ТаблицаИсключений.Удалить(Индекс);
КонецЕсли;
Индекс = Индекс - 1;
КонецЦикла;
КонецПроцедуры
Если пустых строк в исключениях не обнаружено, проанализируем другие типовые факторы, влияющие на расчет скидок по дисконтным картам:
Пороги накопительных скидок. Если для диапазона «свыше максимального» строка не заведена, скидка перестает рассчитываться.Продажи по дисконтным картам приводит к получению нулевой суммы накоплений. Решением является процедура пересчета итогов в режиме «Тестирование и исправление».Информационные карты следует проверить, активна ли карта, не установлена ли пометка аннулирования или блокировки, и корректно ли указан вид дисконтной карты.