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