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

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

Причем руками установить документ-основание не дает, только через универсальный редактор документов.

Системы в этом сбое я не нашел.

Также поискал в общем модуле обмена МенеджерОбменаУРМКУНФ где может заполняться документ-основание, но не нашел, увы.

Поэтому сделал заплатку, которая ищет документ-основание:


&Вместо("ЗаписатьОбъектВИБ")
Процедура антид_ЗаписатьОбъектВИБ(КомпонентыОбмена, Объект, Тип, ЗаписатьОбъект, Знач ОтправкаНазад, УникальныйИдентификаторСтрокой)
	
	Попытка
		ЭтоРасходИзКассы = (Метаданные.НайтиПоТипу(Тип) = Метаданные.Документы.РасходИзКассы);
	Исключение             
		ЭтоРасходИзКассы = ложь;
	КонецПопытки;          

	Попытка
		ЭтоВнесениеНаличных = (Метаданные.НайтиПоТипу(Тип) = Метаданные.Документы.ВнесениеНаличных);
	Исключение             
		ЭтоВнесениеНаличных = ложь;
	КонецПопытки;
	
	Если ЭтоВнесениеНаличных И Не ЗначениеЗаполнено(Объект.ДокументОснование) Тогда
		//Если это внесение наличныех            
		
		ПроставитьДокументОснованиеУВнесенияВКассу(Объект);

		
	КонецЕсли; 
	
	
	ПродолжитьВызов(КомпонентыОбмена, Объект, Тип, ЗаписатьОбъект, ОтправкаНазад, УникальныйИдентификаторСтрокой);
КонецПроцедуры

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

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

Уже пришедшие документы без основания обработал групповой обработкой:

Использовал код для обработки:

ОбменДаннымиXDTOСервер.ПроставитьДокументОснованиеУВнесенияВКассу(ОбрабатываемыйОбъект);
ОбрабатываемыйОбъект.Записать(РежимЗаписиДокумента.Проведение);

UPD 26 мая 2026: Все же порядок оказался важным, видимо, документы иногда приходят не в том порядке, поэтому добавил в модуль документа расхода из кассы код, который при записи документа находит связанный документ внесения наличных без основания и прописывает основание, нужны оба кода, в зависимости от того, какой документ придет первым. Где вы очереди, когда Вас так не хватает:

//Модуль документа РасходИзКассы

&После("ПриЗаписи")
Процедура антид_ПриЗаписи(Отказ)
	антид_ПроставитьДокументОснованиеУВнесенияВКассу(ЭтотОбъект.Ссылка);
КонецПроцедуры


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

Среда: Розница 3.0.12.237 Объем: 1 час

image_pdfimage_print

fixin

Программирую на 1С с 1999 года. В 1С просто Гений. В 2020 году ушел из офиса на вольные хлеба фриланса. Принимаю заказы.

Вам может также понравиться...

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *