Подмена склада номенклатуры при формировании ОРП для УТ 11
У клиента было желание списывать товар в ОРП со склада, указанного в товаре.
Но в ОРП нет склада. Можно использовать помещения внутри склада, но это другое.
Однако было обнаружено, что в каждой строке есть аналитика номенклатуры, которая содержит склад. И эта аналитика не меняется при перезаписи ОРП.
Было решено использовать для хранения склада эту аналитику.
Однако склад нужно сохранять в документе ОРП, иначе если поменять поле склад в номенклатуре, при перепроведении склад в ОРП поменяется на новое значение из номенклатуры.
Доработки внесены в модуль менеджера регистра сведений АналитикаУчетаНоменклатуры:
&Вместо("ЗаполнитьВКоллекции") Процедура дрмк_ЗаполнитьВКоллекции(ИсхКоллекция, МестаУчета, ИменаПолей, ПараметрыЗаполнения) Если ТипЗнч(ИсхКоллекция) = Тип("ДокументТабличнаяЧасть.ОтчетОРозничныхПродажах.Товары") И МестаУчета.Свойство("Произвольный") И дрмк_С.ПолучитьКонстанту("дрмк_СкладПоНоменклатуре") Тогда ОбщийСклад = МестаУчета.Произвольный; МДРеквизиты = Метаданные.НайтиПоТипу(Тип(ИсхКоллекция)).Реквизиты; //Обрабатываем построчно строки табличной части товары ОРП ТЗКоллекция = Новый ТаблицаЗначений(); Для Каждого МДКолонка ИЗ МДРеквизиты Цикл ТЗКоллекция.Колонки.Добавить(МДКолонка.Имя, МДКолонка.Тип); КонецЦикла; ТЗКоллекция.Колонки.Добавить("Склад", Новый ОписаниеТипов("СправочникСсылка.Склады")); //без этой колонки не работает ТЗКоллекция.Колонки.Добавить("НомерСтроки", Новый ОписаниеТипов("Число")); НомерСтроки = 1; Для Каждого Строка ИЗ ИсхКоллекция Цикл НСтр = ТЗКоллекция.Добавить(); Для Каждого МДКолонка ИЗ МДРеквизиты Цикл ЗаполнитьЗначенияСвойств(НСтр, Строка); КонецЦикла; //Сохраняем склад в строке Если НЕ ЗначениеЗаполнено(Строка.дрмк_Склад) Тогда Строка.дрмк_Склад = дрмк_С.СкладНоменклатурыИлиОбщий(НСтр.Номенклатура, ОбщийСклад); КонецЕсли; НСтр.Склад = Строка.дрмк_Склад; НСтр.НомерСтроки = НомерСтроки; НомерСтроки = НомерСтроки + 1; КонецЦикла; //Указываем что склад товара берется из этой колонки ИменаПолей.Произвольный = "Склад"; //Вызываем стандартный метод ПродолжитьВызов(ТЗКоллекция, МестаУчета, ИменаПолей, ПараметрыЗаполнения); //Загружаем результаты стандартного метода в табличную часть НомерСтроки = 1; //Заполняем поля, кроме добавленного склада, он остается неизменным Для Каждого Строка ИЗ ИсхКоллекция Цикл ЗаполнитьЗначенияСвойств(Строка,ТЗКоллекция[НомерСтроки - 1],,"дрмк_Склад"); НомерСтроки = НомерСтроки + 1; КонецЦикла; Иначе ПродолжитьВызов(ИсхКоллекция, МестаУчета, ИменаПолей, ПараметрыЗаполнения); КонецЕсли; КонецПроцедуры
Как видно, 1С очень тонко привязана к типам, вплоть до того, что ожидает колонку НомерСтроки. Ну и типы в таблицы значений которой мы подменяем табличную часть, прописывать тоже надо.
Есть вероятность сбоя, если в ОРП будут добавлены другие поля расширениями, типовая процедура заполнения аналитик может их очистить. Надо иметь это ввиду.
Поле «Склад товара» я вывел в форму ОРП, оно фиксируется при создании ОРП, но его можно менять:

Эту задачу я пытался решить в статьях: «Много запросов для пересчета колонки временной таблицы» и «Мертвые ветки логики в логике 1С«.
Среда: УТ 11.5.24.68




Это похоже на студенческую поделку. Подаваны лучше пишут