Подмена склада при проведении ОРП в УТ 11.5

Клиенту нужно чтобы склад проставлялся из поля дрмк_Склад номенлатуры, а не из склада документа ОРП.

Отталкиваемся от кода ДанныеДокументаДляПроведения в методе модуля менеджера ОРП:

Модуль СкладыСервер:


&Вместо("ОформитьОтгрузкуВРозницу")
Процедура дрмк_ОформитьОтгрузкуВРозницу(Запрос, ТекстыЗапроса, Регистры, ТекстЗапросаДанныхДокумента, ОбъектМетаданных, ПараметрыМетода)
	Для Каждого ТекстЗапроса ИЗ ТекстыЗапроса Цикл         
		дрмк_ОбработатьТекстЗапроса(ТекстЗапроса);
	КонецЦикла;
	дрмк_ОбработатьТекстЗапроса(ТекстЗапросаДанныхДокумента);
	ПродолжитьВызов(Запрос, ТекстыЗапроса, Регистры, ТекстЗапросаДанныхДокумента, ОбъектМетаданных, ПараметрыМетода);
КонецПроцедуры                                    

Процедура дрмк_ОбработатьТекстЗапроса(ТекстЗапроса) Экспорт      
	
	ТекстЗапроса = СтрЗаменить(ТекстЗапроса, Символы.Таб, " ");
	дрмк_С.УдалитьЛишниеПробелы(ТекстЗапроса);
	
	Если Найти(ТекстЗапроса, "Документ.ОтчетОРозничныхПродажах") <> 0 Тогда
		//Если Найти(ТекстЗапроса, "&Склад КАК Склад") <> 0 
		//	И  Тогда
		//	
		//КонецЕсли;
		
		Если Найти(ТекстЗапроса, "ТоварыДокумента.Ссылка.Склад КАК Склад") <> 0 
			Тогда 
			ТекстЗапроса = СтрЗаменить(ТекстЗапроса, 
			"ТоварыДокумента.Ссылка.Склад КАК Склад", 
			"ТоварыДокумента.Номенклатура.дрмк_Склад КАК Склад"); 
		КонецЕсли;  
		
	КонецЕсли;
	
	
КонецПроцедуры 

Модуль менеджера документа ОРП:


&Вместо("ТекстЗапросаВтВидыЗапасов")
Функция дрмк_ТекстЗапросаВтВидыЗапасов(Запрос, ТекстыЗапроса)
	
	ТекстЗапроса = ПродолжитьВызов(Запрос, ТекстыЗапроса);  
	
	
	ТекстЗапроса = СтрЗаменить(ТекстЗапроса, Символы.Таб, " ");
	дрмк_С.УдалитьЛишниеПробелы(ТекстЗапроса);
	
	Если Найти(ТекстЗапроса, "ТоварыДокумента.Ссылка.Склад КАК Склад") <> 0 
		Тогда 
		ТекстЗапроса = СтрЗаменить(ТекстЗапроса, 
		"ТаблицаВидыЗапасов.АналитикаУчетаНоменклатуры.МестоХранения КАК Склад", 
		"ТаблицаВидыЗапасов.АналитикаУчетаНоменклатуры.Номенклатура.дрмк_Склад КАК Склад"); 
	КонецЕсли;

	Возврат ТекстЗапроса;
КонецФункции

Общий модуль РаспределениеЗапасовДвижения:


&Вместо("РасходЗапаса")
Процедура дрмк_РасходЗапаса(Запрос, ТекстыЗапроса, Регистры, ТекстЗапросаТабЧасть, ТекстыШаблоновВременныхТаблиц)
	
	ТекстЗапросаТабЧасть = СтрЗаменить(ТекстЗапросаТабЧасть, Символы.Таб, " ");
	ТекстЗапросаТабЧасть = СтрЗаменить(ТекстЗапросаТабЧасть, Символы.ПС, " ");
	дрмк_С.УдалитьЛишниеПробелы(ТекстЗапросаТабЧасть);
	
	Маркер = "ВЫБОР КОГДА ТабЧасть.Номенклатура.ТипНоменклатуры = ЗНАЧЕНИЕ(Перечисление.ТипыНоменклатуры.Работа) ТОГДА"
		+ " ТабЧасть.Ссылка.Подразделение"
		+ " ИНАЧЕ"
		+ " ТабЧасть.Ссылка.Склад"
		+ " КОНЕЦ КАК Склад";
	дрмк_С.УдалитьЛишниеПробелы(Маркер);
		
		
	//Сообщить(ТекстЗапросаТабЧасть);
	//Сообщить("----------------");
	Сообщить(Маркер);
	Если Найти(ТекстЗапросаТабЧасть, Маркер) <> 0 
		Тогда 
		//Сообщить("Найден");
		ТекстЗапросаТабЧасть = СтрЗаменить(ТекстЗапросаТабЧасть, 
		Маркер, 
		"ВЫБОР КОГДА ТабЧасть.Номенклатура.ТипНоменклатуры = ЗНАЧЕНИЕ(Перечисление.ТипыНоменклатуры.Работа) ТОГДА"
		+ " ТабЧасть.Ссылка.Подразделение"
		+ " ИНАЧЕ"
		+ " ТабЧасть.Номенклатура.дрмк_Склад"
		+ "	КОНЕЦ КАК Склад");

	КонецЕсли;
	
	ПродолжитьВызов(Запрос, ТекстыЗапроса, Регистры, ТекстЗапросаТабЧасть, ТекстыШаблоновВременныхТаблиц);
КонецПроцедуры

Использую функцию для удаления лишних пробелов из текста запроса:

Процедура УдалитьЛишниеПробелы(ИсходнаяСтрока) Экспорт
    
    Пока СтрНайти(ИсходнаяСтрока, "  ") > 0 Цикл
        ИсходнаяСтрока = СтрЗаменить(ИсходнаяСтрока, "  ", " ");
    КонецЦикла;
    
КонецПроцедуры

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

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

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

Позже немного поправил замены, чтобы в случае, если у товара не заполнен склад, подставлялся склад из документа ОРП, а то не сворачивались чеки:

ТекстЗапроса = СтрЗаменить(ТекстЗапроса, 
"ТаблицаВидыЗапасов.АналитикаУчетаНоменклатуры.МестоХранения КАК Склад", 
"ВЫБОР КОГДА ТаблицаВидыЗапасов.АналитикаУчетаНоменклатуры.Номенклатура.дрмк_Склад = ЗНАЧЕНИЕ(Справочник.Склады.ПустаяСсылка) ТОГДА ТаблицаВидыЗапасов.АналитикаУчетаНоменклатуры.МестоХранения ИНАЧЕ  ТаблицаВидыЗапасов.АналитикаУчетаНоменклатуры.Номенклатура.дрмк_Склад КОНЕЦ КАК Склад"); 


ТекстЗапроса = СтрЗаменить(ТекстЗапроса, 
"ТоварыДокумента.Ссылка.Склад КАК Склад", 
"ВЫБОР КОГДА ТоварыДокумента.Номенклатура.дрмк_Склад = ЗНАЧЕНИЕ(Справочник.Склады.ПустаяСсылка) ТОГДА ТоварыДокумента.Ссылка.Склад ИНАЧЕ  ТоварыДокумента.Номенклатура.дрмк_Склад КОНЕЦ КАК Склад"); 

ТекстЗапросаТабЧасть = СтрЗаменить(ТекстЗапросаТабЧасть, 
Маркер, 
"ВЫБОР КОГДА ТабЧасть.Номенклатура.ТипНоменклатуры = ЗНАЧЕНИЕ(Перечисление.ТипыНоменклатуры.Работа) ТОГДА"
+ " ТабЧасть.Ссылка.Подразделение"
+ " ИНАЧЕ"
+ " ВЫБОР КОГДА ТабЧасть.Номенклатура.дрмк_Склад = ЗНАЧЕНИЕ(Справочник.Склады.ПустаяСсылка) ТОГДА  ТабЧасть.Ссылка.Склад ИНАЧЕ ТабЧасть.Номенклатура.дрмк_Склад КОНЕЦ "
+ "	КОНЕЦ КАК Склад");

Среда: УТ 11.5.24.57 Объем: 1 час

image_pdfimage_print

fixin

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

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

комментариев 6

  1. rzd:

    Теперь в регистрах измерение АналитикаУчетаНоменклатуры не соответствует складу?

    • соответствует нужному складу, заданному в номенклатуре. За то и боролись.

      • rzd:

        Я не знаю, за что боролись и зачем, но измерение АналитикаУчетаНоменклатуры не соответствует складу

        • где не соответствует? в движениях соответствует

          • Виталий:

            В движениях, возможно, и соответствует, но реквизит «Склад» в шапке документа остаётся другим — именно в этом и возникает несоответствие документа его движениям.

          • и? так и задумано клиентом согласно его ТЗ и велению.

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

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