Не проставляется документ-основание в внесении наличных при обмене с РМК
При загрузке внесений наличными в Розницу из РМК не проставляется документ-основание у некоторых документов.

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

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




Свежие комментарии