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

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