Как исправить некорректный расчет и перерасход бонусных баллов с истекающим сроком действия в 1С:УТ 11?

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

В процессе эксплуатации 1С:Управление торговлей 11 (УТ 11) у пользователей может возникнуть ситуация, когда остаток бонусных баллов у клиента оказывается значительно больше, чем должен быть по логике накоплений и списаний. Эта проблема особенно часто проявляется при использовании программ лояльности, предусматривающих начисление бонусных баллов с ограниченным сроком действия, например, бонусов за день рождения. Давайте подробно разберем, почему возникает такая некорректность в учете и как мы можем подойти к ее решению.

Выявление корневой проблемы: некорректные движения в регистре "Бонусные баллы"

Мы выяснили, что основная причина проблемы кроется в некорректном формировании движений в регистре накопления "Бонусные баллы". Этот регистр использует два ключевых ресурса для учета бонусных баллов: Начислено и Ксписанию. Первый ресурс отражает общее количество начисленных баллов, а второй — количество баллов, которые по определенным условиям (например, истечение срока действия) должны быть списаны.

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

  1. Документ начисления бонусных баллов со сроком действия (например, "Начисление бонусных баллов") создает две записи в регистре "Бонусные баллы".
  2. Обе эти записи, парадоксально, могут формироваться с видом движения "Приход". Одна запись увеличивает ресурс Начислено, а вторая, предназначенная для учета баллов "к списанию", также формируется как приход, но по ресурсу Ксписанию.
  3. Критический момент: если по каким-то причинам ресурс Ксписанию, который по своей сути должен служить счетчиком для уменьшения будущих остатков, начинает участвовать в расчете текущих остатков с видом "Приход", это приводит к двойному завышению бонусов. Более того, при определенных условиях, когда в запросах учитывается отрицательное значение этого ресурса, возникает ситуация "минус на минус", которая дает "плюс", еще больше искажая реальный остаток.

Например, в одном из сообщений форума было указано, что запись Ксписанию на 5000 баллов, сформированная 28.01.2019, посчиталась в плюс, имея признак "Приход". Это является явной логической ошибкой, поскольку списания всегда должны формироваться с признаком "Расход" и корректно заполненными колонками.

Анализ работы регистра накопления "Бонусные баллы"

Для понимания проблемы необходимо глубже рассмотреть структуру и логику работы регистра накопления "Бонусные баллы". Этот регистр предназначен для хранения информации о движении бонусных баллов клиентов.

Его основные ресурсы:

И измерения:

А также вид движения ВидДвиженияНакопления (Приход или Расход).

Ожидаемое поведение при начислении срочных бонусов:

  1. Начисление баллов: Документ должен создать движение Приход по ресурсу Начислено.
  2. Учет срока действия: Параллельно или в рамках того же движения, система должна регистрировать эти баллы как потенциальные к списанию, используя ресурс Ксписанию. Логически, это также может быть Приход, но его учет в отчетах или при расчете доступных баллов должен быть особым – как "резерв", который будет уменьшен при списании или истечении срока. То есть, этот ресурс Ксписанию нужен для того, чтобы регламентное задание знало, какие бонусы и когда списать.

Фактическое (проблемное) поведение:

Проблема возникает, когда система при расчете текущих доступных баллов некорректно интерпретирует движения по ресурсу Ксписанию. Вместо того чтобы использовать его как индикатор будущих списаний, он может быть ошибочно учтен как прямое увеличение доступных баллов. Особенно это проявляется, когда ресурс Ксписанию формируется как Приход, а затем в запросах отчетов или алгоритмах учета происходит некорректная операция, превращающая его в виртуальный "плюс", даже если логически он должен был бы быть вычтен.

Важно понимать, что любые фактические списания баллов должны генерировать движения с видом Расход по соответствующим ресурсам. Если документ начисления баллов создает приходы по Ксписанию, и при этом нет механизма, который бы адекватно эти приходы учитывал для последующего уменьшения остатков (через регламентное задание или другой механизм списания), или если эти приходы влияют на текущий доступный остаток, то это неизбежно приведет к завышению баллов.

Значение регламентных заданий для срочных бонусов

Особую роль в работе с бонусными баллами, имеющими срок действия, играют регламентные задания. Часто пользователи ошибочно полагают, что если при начислении бонусов указан срок действия, то система автоматически позаботится об их списании по истечении этого срока. Однако это не всегда так.

В большинстве конфигураций 1С, включая УТ 11, для корректного списания просроченных бонусных баллов необходимо настроить и регулярно выполнять специальное правило списания бонусных баллов с типом "Регламентное списание". Это правило задает условия, при которых баллы будут считаться просроченными и подлежащими списанию.

Без такого правила регламентное задание не будет иметь указаний, какие баллы и когда нужно списывать. В результате, даже если в регистре накопления имеются записи, свидетельствующие о том, что баллы должны быть списаны (например, ресурс Ксписанию), без активного регламентного задания они так и останутся "висеть" на балансе клиента, искажая общую картину.

Для обеспечения точности учета, регламентные задания, отвечающие за списание просроченных баллов, должны запускаться ежедневно. Это гарантирует своевременную обработку всех баллов, срок действия которых истек за предыдущий день. Для контроля оборотов и своевременного выявления сгоревших бонусов можно использовать отчет по движению и списанию бонусных баллов.

Пошаговая диагностика и поиск решения

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

  1. Шаг 1: Проверка настроек программ лояльности

    Начнем с фундамента – с настроек вашей программы лояльности. Это первое, что нам нужно тщательно проверить.

    • Правила начисления: Убедитесь, что условия начисления баллов (за покупки, за день рождения и т.д.) настроены корректно. Обратите внимание на базу для начисления (например, сумма до скидки или после скидки), ограничения по товарам, клиентам или периодам.
    • Правила списания: Критически важно проверить наличие и корректность настройки правила списания бонусных баллов с типом "Регламентное списание". Это правило должно быть активно и иметь адекватные условия для определения просроченных баллов. Если такого правила нет или оно настроено некорректно, просроченные баллы не будут списываться автоматически.
    • Срок действия баллов: Проверьте, как именно задается срок действия баллов в программе лояльности и в документах начисления.
  2. Шаг 2: Анализ движений документов

    Далее мы углубимся в движения, которые формируют документы начисления бонусных баллов. Для быстрого анализа движений и остатков с детализацией по документам можно использовать отчет по бонусным баллам с расшифровкой до регистратора.

    1. Определите проблемный документ: Найдите конкретный документ "Начисление бонусных баллов", который, по вашим предположениям, вызвал некорректное начисление. В примере автора это документ, начисливший бонусы за день рождения.
    2. Просмотрите движения регистра: Откройте этот документ и перейдите в его движения по регистрам (обычно это кнопка "Действия" -> "Движения документа" или значок лупы рядом с надписью "Движения"). Особое внимание уделите регистру "Бонусные баллы".
      • Проанализируйте, сколько записей было создано.
      • Какой ВидДвиженияНакопления (Приход или Расход) имеют эти записи.
      • Какие значения записаны в ресурсы Начислено и Ксписанию.

      Мы ожидаем увидеть, что начисление формирует Приход по Начислено, а для баллов со сроком действия, возможно, также Приход по Ксписанию. Но если Ксписанию отражается как приход, это может быть источником проблемы.

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

      Алгоритм отладки:

      1. Откройте конфигуратор.
      2. Найдите процедуру проведения документа "Начисление бонусных баллов" (обычно это метод ОбработкаПроведения() модуля объекта документа).
      3. Установите точку останова в месте формирования движений по регистру БонусныеБаллы.
      4. Запустите 1С:Предприятие в режиме отладки.
      5. Распроведите и проведите проблемный документ.
      6. Когда отладчик остановится на точке останова, пошагово выполните код, чтобы увидеть, какие значения присваиваются полям движения, особенно ВидДвижения, Начислено и Ксписанию.

      Пример кода, на который нам следует обратить внимание в отладчике:

      
      // Примерный фрагмент кода формирования движений в модуле документа
      Для Каждого СтрокаТабличнойЧасти Из Объект.ТабличнаяЧастьНачисления Цикл
          // Движение по начислению баллов
          Движение = Движения.БонусныеБаллы.Добавить();
          Движение.Период = Объект.Дата;
          Движение.Клиент = СтрокаТабличнойЧасти.Клиент;
          Движение.ПрограммаЛояльности = СтрокаТабличнойЧасти.ПрограммаЛояльности;
          Движение.Начислено = СтрокаТабличнойЧасти.КоличествоБаллов;
          Движение.Списано = 0;
          Движение.Ксписанию = 0; // Или другое значение, если нет срока действия
      
          // Если баллы со сроком действия, формируем движение по Ксписанию
          Если СтрокаТабличнойЧасти.ЕстьСрокДействия Тогда
              // Возможно, здесь формируется отдельное движение или
              // заполняется ресурс Ксписанию текущего движения.
              // Если это отдельное движение, оно должно быть логически
              // связано с целью списания, а не прибавления к доступному остатку.
              ДвижениеКсписанию = Движения.БонусныеБаллы.Добавить();
              ДвижениеКсписанию.Период = Объект.Дата;
              ДвижениеКсписанию.Клиент = СтрокаТабличнойЧасти.Клиент;
              ДвижениеКсписанию.ПрограммаЛояльности = СтрокаТабличнойЧасти.ПрограммаЛояльности;
              // ... Заполнение других измерений
              ДвижениеКсписанию.Начислено = 0;
              ДвижениеКсписанию.Списано = 0;
              ДвижениеКсписанию.Ксписанию = СтрокаТабличнойЧасти.КоличествоБаллов;
              ДвижениеКсписанию.ВидДвижения = ВидДвиженияНакопления.Приход; // <= !!! Вот здесь может быть ошибка !!!
              ДвижениеКсписанию.ДатаНачалаДействия = СтрокаТабличнойЧасти.ДатаНачалаДействия;
              ДвижениеКсписанию.ДатаОкончанияДействия = СтрокаТабличнойЧасти.ДатаОкончанияДействия;
              // Возможно, должно быть другое логическое поле или ресурс,
              // или запрос отчета должен иначе обрабатывать Ксписанию.
          КонецЕсли;
          Движение.ВидДвижения = ВидДвиженияНакопления.Приход;
      КонецЦикла;
      

      Особое внимание уделите строке, где присваивается ДвижениеКсписанию.ВидДвижения = ВидДвиженияНакопления.Приход;. Если этот приход по Ксписанию затем учитывается как фактическое увеличение доступных баллов, то это и есть источник проблемы.

  3. Шаг 3: Проверка регламентных заданий

    Если с движениями документа все кажется логичным (хотя бы с точки зрения того, что они формируются), переходим к регламентным заданиям.

    • Список регламентных заданий: Откройте список регламентных заданий (обычно через "Администрирование" -> "Обслуживание" -> "Регламентные и фоновые задания").
    • Найдите связанные с бонусами: Найдите задания, связанные с программами лояльности, начислением и списанием баллов.
    • Проверьте расписание и статус: Убедитесь, что они включены, имеют корректное расписание (например, ежедневное) и выполняются без ошибок. Просмотрите журнал выполнения заданий на наличие сбоев.
    • Проверьте процедуру: Если вы программист, изучите код процедуры, которую вызывает регламентное задание по списанию просроченных баллов. Убедитесь, что она корректно выбирает баллы для списания, формирует движения Расход и учитывает все необходимые условия.
  4. Шаг 4: Ручной пересчет и сверка

    Чтобы подтвердить проблему, выполните ручной пересчет остатка бонусных баллов для одного из клиентов, у которого наблюдается перерасход.

    • Соберите все начисления и списания баллов для этого клиента за определенный период.
    • Посчитайте ожидаемый остаток вручную, учитывая сроки действия баллов.
    • Сравните полученное значение с тем, что показывает отчет "Остатки бонусных баллов" или информация в карточке клиента. Значительное расхождение подтвердит наличие проблемы.
  5. Шаг 5: Анализ запросов, формирующих отчеты

    Иногда сами движения в регистре могут быть корректными с точки зрения логики сохранения данных, но запросы, которые используются для формирования отчетов (например, отчет "Остатки бонусных баллов" или данные в чеке), могут некорректно агрегировать эти данные.

    • Если вы программист, найдите запросы, которые используются для получения остатков бонусных баллов. Это может быть в модулях отчетов, общих модулях, функциях получения данных.
    • Особое внимание уделите тому, как в этих запросах обрабатываются ресурсы Начислено и Ксписанию, а также ВидДвижения.

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

      
      // Примерный запрос для получения остатков (может быть упрощен)
      ВЫБРАТЬ
          БонусныеБаллыОстатки.Клиент,
          СУММА(БонусныеБаллыОстатки.НачисленоОстаток) КАК ДоступноНачислено,
          СУММА(БонусныеБаллыОстатки.КсписаниюОстаток) КАК Ксписанию
      ИЗ
          РегистрНакопления.БонусныеБаллы.Остатки(&НаДату, ) КАК БонусныеБаллыОстатки
      СГРУППИРОВАТЬ ПО
          БонусныеБаллыОстатки.Клиент
      // Здесь может быть проблема, если КсписаниюОстаток учитывается
      // как положительный актив, вместо того чтобы быть маркером
      // для уменьшения или коррекции доступного остатка.
      

Возможные пути решения проблемы

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

  1. Настройка правил списания просроченных бонусов

    Это самый простой и первый шаг, который мы должны предпринять, если еще не сделали этого. Убедитесь, что в вашей системе настроено и активно правило "Регламентное списание" для бонусных баллов. Мы должны задать условия, по которым баллы считаются просроченными, и убедиться, что соответствующее регламентное задание запускается ежедневно. Если регламентное задание настроено, но не работает, выясните причину сбоев (например, ошибки в коде, нехватка прав, проблемы с сервером).

    Рассмотрим шаги по настройке (общие для УТ 11):

    1. Перейдите в раздел "Маркетинг" -> "Программы лояльности".
    2. Откройте нужную программу лояльности или создайте новую.
    3. Перейдите на вкладку "Правила начисления/списания".
    4. Создайте новое правило с типом "Регламентное списание".
    5. Настройте условия списания:
      • Укажите период, по истечении которого баллы считаются просроченными (например, "Через N дней после начисления").
      • Укажите, какие баллы списывать (например, "Все баллы", "Баллы за акции" и т.д.).
      • Убедитесь, что правило активно.
    6. Проверьте, что регламентное задание, отвечающее за выполнение этих правил, включено и регулярно запускается.
  2. Корректировка движений регистра через доработку конфигурации

    Если проблема вызвана некорректным формированием движений в документе начисления бонусных баллов (как это было описано в ходе диагностики, когда Ксписанию формируется как Приход и это приводит к завышению), то наиболее эффективным решением может быть доработка кода модуля объекта документа "Начисление бонусных баллов".

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

    Возможные варианты доработки:

    • Изменение ВидДвиженияНакопления: Если ресурс Ксписанию ошибочно формируется как Приход и при этом учитывается в общей сумме доступных баллов, возможно, необходимо пересмотреть этот подход. В некоторых случаях, логичнее было бы, чтобы движения по Ксписанию были своего рода "отрицательным приходом" или чтобы они формировались только регламентным заданием. Однако, в типовых регистрах 1С такой гибкости нет, и Ксписанию обычно является положительным приходом, который затем уменьшается регламентным заданием. Проблема, скорее, в том, как этот Приход по Ксписанию интерпретируется в отчетах до момента фактического списания.
    • Использование дополнительных регистров: В некоторых случаях, для более тонкого учета срочных баллов, программисты создают дополнительные регистры сведений или накопления, которые более детально отслеживают срок действия и статус баллов, а затем уже на основе этих данных формируются движения в основном регистре. Это более сложная доработка.
    • Исправление логики запросов в отчетах: Если движения в регистре формируются корректно (т.е., Ксписанию - это действительно "к списанию"), но отчеты показывают неверные данные, то проблема в запросах. Нам нужно будет скорректировать запросы отчетов, чтобы они правильно учитывали ресурс Ксписанию, возможно, вычитая его из общей суммы или учитывая только те баллы, которые не относятся к "к списанию" на определенную дату.

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

  3. Перепроведение документов и корректировка данных

    После внесения изменений в настройки программ лояльности или в код, влияющий на расчет бонусных баллов, может потребоваться перепроведение документов за период, в котором были обнаружены некорректные начисления. Это позволит системе пересчитать движения по регистру "Бонусные баллы" в соответствии с новой логикой.

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

  4. Тестирование

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

Таким образом, проблема перерасхода бонусных баллов в 1С:УТ 11, особенно при использовании срочных бонусов, часто связана с некорректной настройкой правил списания, логическими ошибками в движениях регистров накопления или неправильной интерпретацией данных в отчетах. Для успешного решения требуется комплексный подход, включающий проверку настроек, анализ движений документов с возможной доработкой кода, а также регулярный контроль работы регламентных заданий. Только так мы сможем обеспечить точный и надежный учет бонусных баллов в вашей системе.

← На главную