При попытке реализовать учет дополнительных товаров, таких как бумажные пакеты, в РМК через создание отдельной табличной части и принудительную запись движений, разработчики часто сталкиваются с ошибкой: При выполнении операции резервирования не удалось записать документ. Разберем, почему возникает эта проблема и как решить задачу «малой кровью», не нарушая логику работы типовой конфигурации.
Конфигурация УТ 11 — это сложная система, где процесс проведения документа разбит на множество этапов: расчет цен, применение скидок, проверка остатков, контроль резервов и запись движений. Когда мы принудительно добавляем записи в регистры через обработчик ОбработкаПроведения, мы нарушаем целостность этого процесса:
deadlock (взаимную блокировку).Записать() внутри процедуры проведения документа, которая сама по себе является частью более крупной транзакции записи, часто приводит к исключениям платформы.Самый правильный способ сделать товар бесплатным для клиента, сохранив при этом стандартную логику движения остатков — это использование штатных инструментов ценообразования. В УТ 11 есть встроенный механизм Автоматические скидки.
Разберем алгоритм реализации:
CRM и маркетинг.Чек ККМ система автоматически пересчитает цену до нуля, при этом номенклатура останется в стандартной табличной части Товары.Таким образом, для системы это будет выглядеть как обычная продажа товара со скидкой. Типовые механизмы УТ 11 самостоятельно спишут остатки со склада, сформируют нужные проводки и не выдадут никаких ошибок, так как они работают в рамках своей штатной логики.
Если задача требует строгого отделения пакетов от обычного товара (например, для специфической печати чеков или раздельного учета), вместо добавления записей в регистры необходимо вмешаться в процесс проведения чуть раньше — на этапе подготовки табличной части Товары.
Вместо создания отдельной табличной части через расширение, вы можете в момент проведения документа программно добавить строку в стандартную ТЧ Товары документа ЧекККМ. Тогда стандартный алгоритм проведения «подхватит» ваш пакет как обычную позицию номенклатуры.
Важные рекомендации по реализации:
Движения.ТоварыНаСкладах.Записать(). Если вы правильно заполнили коллекцию Движения, платформа запишет их автоматически при завершении транзакции проведения.Записывать, чтобы указать системе, какие наборы записей необходимо сохранить.ОбработкаПроведения, но не вызывайте Записать() вручную.Посмотрим на пример логики работы с движениями, если вы решили идти по пути самостоятельного заполнения коллекции:
// В обработчике события перед проведением
Движения.ТоварыНаСкладах.Записывать = Истина;
// Добавляем движение, но не вызываем Записать()!
Движение = Движения.ТоварыНаСкладах.Добавить();
Движение.ВидДвижения = ВидДвиженияНакопления.Расход;
Движение.Период = Дата;
Движение.Номенклатура = ВыбранныйПакет;
Движение.Склад = Склад;
Движение.ВНаличии = Количество;
Рассмотренные варианты показывают, что вмешательство в «потроха» проведения УТ 11 — задача рискованная. Чтобы избежать ошибок записи и проблем с отчетностью, всегда отдавайте предпочтение типовым настройкам (скидки 100%). Если это невозможно, интегрируйте свои данные непосредственно в типовые таблицы документа до начала процесса проведения. Это позволит вам избежать конфликтов с механизмом резервирования и обеспечит стабильную работу системы.