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