Как исправить ошибку "Товар отгружен и оплачен" при оформлении возврата в 1С:Розница

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

При работе с конфигурацией 1С:Розница (особенно версии 2.2.12.30) пользователи часто сталкиваются с неожиданным поведением системы при попытке оформить возврат товара от покупателя. Ошибка с текстом "Товар отгружен и оплачен" возникает в самый неподходящий момент — при попытке сделать возврат "день в день" на основании ранее пробитого чека. Разберем подробно причины этого явления и методы его устранения.

Анализируем ситуацию: когда возникает ошибка

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

  1. Используется релиз конфигурации 2.2.12.30.
  2. Возврат оформляется в ту же кассовую смену, когда была совершена продажа.
  3. Продажа была осуществлена обычным способом (наличные или банковская карта), без использования кредитов или рассрочек.

Интересно, что при выборе способа оплаты "в рассрочку" ошибка не проявляется. Это наводит на мысль о программной недоработке в логике проверки условий оплаты.

Технический разбор программного кода

Для того чтобы понять корень проблемы, обратимся к конфигуратору и найдем процедуру ПроверитьВозможностьВводаНаОснованииЧекаККМ. Именно здесь заложена логика, которая анализирует данные исходного чека перед созданием возврата. Рассмотрим фрагмент кода, который вызывает исключение:


Процедура ПроверитьВозможностьВводаНаОснованииЧекаККМ(ДанныеЗаполнения)
    // Проверить возможность ввода чека на возврат на основании чека ККМ.
    
    СтатусЧекаККМЗнач = ДанныеЗаполнения.СтатусЧекаККМ;
    Если СтатусЧекаККМЗнач = Перечисления.СтатусыЧековККМ.Аннулированный
         ИЛИ СтатусЧекаККМЗнач = Перечисления.СтатусыЧековККМ.Отложенный Тогда
        ТекстИсключения = НСтр("ru='Ввод чека на основании чека со статусом: ""%СтатусЧекаККМ%"" не допускается.'");
        ТекстИсключения = СтрЗаменить(ТекстИсключения, "%СтатусЧекаККМ%", СтатусЧекаККМЗнач);
        ВызватьИсключение ТекстИсключения;
    КонецЕсли;
    
    Если НЕ ДанныеЗаполнения.ОперацияСДенежнымиСредствами Тогда
        Запрос = Новый Запрос;
        Запрос.Текст = "ВЫБРАТЬ
        |    ЧекККМОплата.Ссылка КАК Ссылка,
        |    ЧекККМОплата.НомерСтроки КАК НомерСтроки
        |ИЗ
        |    Документ.ЧекККМ.Оплата КАК ЧекККМОплата
        |ГДЕ
        |    ЧекККМОплата.Ссылка = &Ссылка
        |    И ЧекККМОплата.ВидОплаты.ТипОплаты = &ТипОплаты";
        
        Запрос.УстановитьПараметр("Ссылка", ДанныеЗаполнения);
        Запрос.УстановитьПараметр("ТипОплаты", Перечисления.ТипыОплатЧекаККМ.ВРассрочку);
        
        Результат = Запрос.Выполнить();
        Если Результат.Пустой() Тогда
            ТекстИсключения = НСтр("ru='Товар отгружен и оплачен.'");
            ВызватьИсключение ТекстИсключения;
        КонецЕсли;
    КонецЕсли;
КонецПроцедуры

Проанализируем логику запроса. Программа обращается к табличной части Оплата документа ЧекККМ и ищет строки, где ТипОплаты соответствует значению ВРассрочку. Далее следует критическое условие: Если Результат.Пустой() Тогда. Это означает, что если в чеке нет оплаты в рассрочку, система вызывает исключение с текстом "Товар отгружен и оплачен".

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

Способ 1: Обновление конфигурации (рекомендуемый)

Выясним причину выпуска такого обновления. Ошибка была признана критической, и фирма "1С" оперативно выпустила исправления. Самым правильным и надежным способом решения проблемы является обновление программы до актуального релиза.

Рассмотрим шаги для исправления:

  1. Создадим резервную копию информационной базы (обязательный этап перед любым обновлением).
  2. Проверим наличие обновлений через сервис интернет-поддержки или на портале ИТС.
  3. Выполним обновление до версии 2.2.12.33 или выше. В этих версиях ошибочная проверка была удалена или скорректирована.

Способ 2: Установка исправления (патча)

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

Разберем процесс установки патча:

  1. Перейдем в раздел "Администрирование" — "Обслуживание" — "Обновление программы".
  2. Выберем пункт "Установка исправлений (патчей)".
  3. Если настроена интернет-поддержка, программа сама найдет нужный патч. Если нет — скачаем файл патча с портала ИТС и укажем путь к нему вручную.
  4. После установки потребуется перезагрузка сеанса 1С.

Способ 3: Ручная правка кода (для программистов)

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

Создадим расширение и добавим в него процедуру ПроверитьВозможностьВводаНаОснованииЧекаККМ с аннотацией &Вместо или &ИзменениеИКонтроль. В коде расширения нам необходимо убрать блокирующую проверку пустого результата запроса по рассрочке.

Пример корректировки логики в расширении:


&Вместо("ПроверитьВозможностьВводаНаОснованииЧекаККМ")
Процедура Расш1_ПроверитьВозможностьВводаНаОснованииЧекаККМ(ДанныеЗаполнения)
    // Стандартные проверки статуса чека оставляем
    СтатусЧекаККМЗнач = ДанныеЗаполнения.СтатусЧекаККМ;
    Если СтатусЧекаККМЗнач = Перечисления.СтатусыЧековККМ.Аннулированный
         ИЛИ СтатусЧекаККМЗнач = Перечисления.СтатусыЧековККМ.Отложенный Тогда
        // ... (код формирования исключения остается прежним)
    КонецЕсли;

    // Ошибочный блок с проверкой рассрочки просто исключаем из выполнения
    // Это позволит системе беспрепятственно создавать чеки на возврат
КонецПроцедуры

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

Почему сообщение об ошибке именно такое?

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

Таким образом, мы выяснили, что проблема не связана с неправильными действиями пользователя или сбоем в базе данных. Это "чистый" баг релиза, который лечится либо обновлением, либо точечным программным вмешательством.

← На главную