Почему при расчете скидок в ЧекеККМ пропадают коды маркировки?

Программист 1С v7.7 1С:Розница Управленческий учет Торговля и дистрибуция
← На главную

В процессе автоматизации работы с маркированными товарами в 1С:Предприятие 7.7 часто возникает проблема, при которой данные кодов маркировки (КМ) исчезают после выполнения процедур расчета скидок. Рассмотрим подробно, почему это происходит и как правильно организовать обработку данных, чтобы сохранить уникальность каждой единицы товара.

Анализ причин возникновения проблемы

Основная причина потери данных кроется в архитектуре стандартных процедур обработки табличных частей. В конфигурациях 1С 7.7 механизмы расчета скидок часто используют временные таблицы значений для пересчета сумм и применения акций. Рассмотрим ключевые факторы, ведущие к ошибкам:

  1. Свертка таблиц: Метод Свернуть() является губительным для маркированного товара. Он объединяет строки с идентичными параметрами (Номенклатура, Цена и т.д.), суммируя количество. Поскольку каждый код маркировки уникален, свертка по номенклатуре физически удаляет информацию о конкретных единицах товара.
  2. Отсутствие хранения в БД: Если код маркировки существует только в переменной формы и не является реквизитом табличной части документа, он неизбежно теряется при любом обновлении или перезаполнении табличной части методом ЗагрузитьТабличнуюЧасть().
  3. Логика копирования данных: Процедуры перерасчета часто пересоздают структуру таблицы, «забывая» перенести пользовательские колонки с кодами в рабочую таблицу значений.

Шаг 1: Обеспечение постоянного хранения кодов

Первым делом необходимо пересмотреть подход к хранению данных. Код маркировки должен стать полноценным реквизитом табличной части документа ЧекККМ (например, типа Строка достаточной длины). Это позволит данным сохраняться при записи документа и корректно считываться при любых последующих операциях.

Шаг 2: Модификация алгоритма расчета скидок

Чтобы исключить потерю данных в коде процедуры РасчетСкидокПоАкциям(), разберем необходимые корректировки. Если вы используете временную таблицу для расчетов, необходимо проследить, чтобы колонка КодМаркировки проходила через все этапы трансформации данных.

Рассмотрим пример правильного подхода к обмену данными с временной таблицей:


// В начале процедуры выгружаем текущие данные, включая коды
ТЗКоды = СоздатьОбъект("ТаблицаЗначений");
ВыгрузитьТабличнуюЧасть(ТЗ);
// ... логика расчетов ...
// После завершения расчетов, перед загрузкой обратно,
// мы должны гарантировать, что каждая строка сохранила свой код:
Для А = 1 по ТЗ.КоличествоСтрок() Цикл
    ТЗ.ПолучитьСтрокуПоНомеру(А);
    // Восстанавливаем код из временного хранилища по связующим полям
    ТЗ.КодМаркировки = ПолучитьКодИзМассиваИлиСправочника(ТЗ.Номенклатура);
КонецЦикла;
ЗагрузитьТабличнуюЧасть(ТЗ);

Шаг 3: Отказ от свертки для маркированных позиций

Самое важное изменение — необходимо ограничить использование метода Свернуть(). Для маркированного товара свертка недопустима, так как это нарушает принцип уникальности КМ.

Проанализируйте ваш код и внесите изменения в логику формирования итоговой таблицы:


// Вместо глобальной свертки всей таблицы
// ТЗ.Свернуть("ШтрихКод,Номенклатура,Единица,Коэффициент,Цена,Акция,СкидкаПоСтроке","Количество,Сумма");

// Используйте более избирательный подход или исключите маркированные товары из свертки
// через проверку признака маркировки у товара:
Если ТоварМаркирован(ТЗ.Номенклатура) = 0 Тогда
    ТЗ.Свернуть(...);
КонецЕсли;

Практические советы по работе с кодами маркировки

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

← На главную