В Управлении торговлей 11.4 разработчики зачем-то сделали возможность делать "ЧекККМ на возврат" для Чеков ККМ сделанных прошлыми датами.
Причем чек на возврат создается и печатается, но потом при закрытии смены формируется "Отчет о розничных продажах", который ставит отрицательное количество по возвращенным позициям.
Это в свою очередь ведет к тому, что с включенным контролем остатков этот "Отчет о розничных продажах" не проводится.
Использовать напрямую стандартный механизм (Возврат товаров от клиента > Расходный кассовый ордер) бухгалтерия отказалась, так как в интерфейсе кассира много документов не выведено. А бухгалтерия старается по минимуму обучать кассиров. Хотят, чтобы даже ребенок мог за 20 минут научиться.
Поэтому сделал функционал, который с одной стороны не позволит кассиру создать Чек ККМ на возврат для товаров, проданных в прошлых сменах, а с другой стороны запустит правильный алгоритм формирования возврата.
К сожалению, совсем без написания кода я не смог обойтись, но сделал доработку несколькими строчками в расширении.
Итак:
1. Из формы документа ЧекККМ ОформлениеВозвратаДеньВДень добавить в расширение процедуру ОформитьВозврат с директивой "Вместо". В итоге в модуле этой формы в расширении будет следующий код:
&НаКлиенте
Процедура расш_ОформитьВозвратВместо(Команда)
Если ПодобраноПозиций = 0 Тогда
Возврат;
КонецЕсли;
ЧекККМ = Неопределено;
Для Каждого СтрокаТЧ Из ТаблицаТоваров Цикл
Если СтрокаТЧ.Выбран Тогда
ЧекККМ = СтрокаТЧ.ЧекККМ;
Прервать;
КонецЕсли;
КонецЦикла;
ПараметрыОткрытия = Новый Структура;
ПараметрыОткрытия.Вставить("Товары", АдресВоВременномХранилище(ВладелецФормы.УникальныйИдентификатор));
ПараметрыОткрытия.Вставить("ЧекККМ", ЧекККМ);
ДатаЧека = НачалоДня(ТекущаяДата());
Если ЧекККМ <> Неопределено Тогда
ДатаЧека = ПолучитьЗначениеНаСервере(ЧекККМ, "Дата");
КонецЕсли;
Если НачалоДня(ДатаЧека) = НачалоДня(ТекущаяДата()) Тогда
ОткрытьФорму("Документ.ЧекККМВозврат.Форма.ФормаДокументаРМК", Новый Структура("Основание", ПараметрыОткрытия), ВладелецФормы);
Иначе
ОткрытьФорму("Документ.ВозвратТоваровОтКлиента.Форма.ФормаДокумента", Новый Структура("Основание", ПараметрыОткрытия), ВладелецФормы);
КонецЕсли;
Закрыть();
КонецПроцедуры
&НаСервере
Функция ПолучитьЗначениеНаСервере(Объект, Реквизит)
Возврат Объект[Реквизит];
КонецФункции
*Для работы кода необходимо ещё добавить в расширение форму документа ВозвратТоваровОтКлиента "ФормаДокумента"
По факту тут из нового кода - это анализ даты чека и вызов в зависимости от даты разных документов
2. Добавить процедуру ОбработкаЗаполнения модуля документа ВозвратТоваровОтКлиента в расширение с директивой "Перед"
&Перед("ОбработкаЗаполнения")
Процедура расш_ОбработкаЗаполнения(ДанныеЗаполнения, СтандартнаяОбработка)
ТипДанныхЗаполнения = ТипЗнч(ДанныеЗаполнения);
Если ТипДанныхЗаполнения = Тип("Структура") Тогда
Если ДанныеЗаполнения.Свойство("Товары") Тогда
ЗаполнитьДокументНаОснованииЧекаККМ(ДанныеЗаполнения.ЧекККМ);
ЗаполненНаОснованииДокумента = Истина;
КонецЕсли;
КонецЕсли;
КонецПроцедуры