Как добавить бесплатные пакеты в РМК в 1С:Управление торговлей 11?

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

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

Почему ручное формирование движений приводит к ошибке?

Конфигурация УТ 11 — это сложная система, где процесс проведения документа разбит на множество этапов: расчет цен, применение скидок, проверка остатков, контроль резервов и запись движений. Когда мы принудительно добавляем записи в регистры через обработчик ОбработкаПроведения, мы нарушаем целостность этого процесса:

  1. Конфликт блокировок: Платформа уже установила блокировки на объекты. Попытка записи набора записей регистра из кода расширения в середине транзакции может вызвать deadlock (взаимную блокировку).
  2. Нарушение контроля остатков: Типовой механизм «не знает» о ваших манипуляциях с регистрами, пока не будет выполнена полная процедура проведения.
  3. Повторный вызов записи: Вызов метода Записать() внутри процедуры проведения документа, которая сама по себе является частью более крупной транзакции записи, часто приводит к исключениям платформы.

Решение 1: Использование автоматических скидок (рекомендуемый путь)

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

Разберем алгоритм реализации:

  1. Создайте новую скидку (наценку) в разделе CRM и маркетинг.
  2. Установите тип скидки «Скидка (процент)» в размере 100%.
  3. В условиях предоставления укажите, что скидка действует только для конкретной номенклатуры (ваших пакетов).
  4. При добавлении пакета в Чек ККМ система автоматически пересчитает цену до нуля, при этом номенклатура останется в стандартной табличной части Товары.

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

Решение 2: Программное добавление в табличную часть «Товары»

Если задача требует строгого отделения пакетов от обычного товара (например, для специфической печати чеков или раздельного учета), вместо добавления записей в регистры необходимо вмешаться в процесс проведения чуть раньше — на этапе подготовки табличной части Товары.

Вместо создания отдельной табличной части через расширение, вы можете в момент проведения документа программно добавить строку в стандартную ТЧ Товары документа ЧекККМ. Тогда стандартный алгоритм проведения «подхватит» ваш пакет как обычную позицию номенклатуры.

Важные рекомендации по реализации:

Посмотрим на пример логики работы с движениями, если вы решили идти по пути самостоятельного заполнения коллекции:


// В обработчике события перед проведением
Движения.ТоварыНаСкладах.Записывать = Истина;
// Добавляем движение, но не вызываем Записать()!
Движение = Движения.ТоварыНаСкладах.Добавить();
Движение.ВидДвижения = ВидДвиженияНакопления.Расход;
Движение.Период = Дата;
Движение.Номенклатура = ВыбранныйПакет;
Движение.Склад = Склад;
Движение.ВНаличии = Количество;

Итог: что выбрать?

Рассмотренные варианты показывают, что вмешательство в «потроха» проведения УТ 11 — задача рискованная. Чтобы избежать ошибок записи и проблем с отчетностью, всегда отдавайте предпочтение типовым настройкам (скидки 100%). Если это невозможно, интегрируйте свои данные непосредственно в типовые таблицы документа до начала процесса проведения. Это позволит вам избежать конфликтов с механизмом резервирования и обеспечит стабильную работу системы.

← На главную