Подмена склада номенклатуры при формировании ОРП для УТ 11

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

Но в ОРП нет склада. Можно использовать помещения внутри склада, но это другое.

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

Было решено использовать для хранения склада эту аналитику.

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

Доработки внесены в модуль менеджера регистра сведений АналитикаУчетаНоменклатуры:


&Вместо("ЗаполнитьВКоллекции")
Процедура дрмк_ЗаполнитьВКоллекции(ИсхКоллекция, МестаУчета, ИменаПолей, ПараметрыЗаполнения)

	Если ТипЗнч(ИсхКоллекция) = Тип("ДокументТабличнаяЧасть.ОтчетОРозничныхПродажах.Товары") 
		И МестаУчета.Свойство("Произвольный")
		И дрмк_С.ПолучитьКонстанту("дрмк_СкладПоНоменклатуре")
		Тогда
		
		ОбщийСклад = МестаУчета.Произвольный;
		
		МДРеквизиты = Метаданные.НайтиПоТипу(Тип(ИсхКоллекция)).Реквизиты;
		
		//Обрабатываем построчно строки табличной части товары ОРП

		ТЗКоллекция = Новый ТаблицаЗначений();
		Для Каждого МДКолонка ИЗ МДРеквизиты Цикл
			ТЗКоллекция.Колонки.Добавить(МДКолонка.Имя, МДКолонка.Тип);
		КонецЦикла;
		ТЗКоллекция.Колонки.Добавить("Склад", Новый ОписаниеТипов("СправочникСсылка.Склады"));                                     
		//без этой колонки не работает
		ТЗКоллекция.Колонки.Добавить("НомерСтроки", Новый ОписаниеТипов("Число")); 

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

		//Заполняем поля, кроме добавленного склада, он остается неизменным
		Для Каждого Строка ИЗ  ИсхКоллекция Цикл
			ЗаполнитьЗначенияСвойств(Строка,ТЗКоллекция[НомерСтроки - 1],,"дрмк_Склад");
			НомерСтроки = НомерСтроки + 1;
		КонецЦикла;
		
	Иначе    
		
		ПродолжитьВызов(ИсхКоллекция, МестаУчета, ИменаПолей, ПараметрыЗаполнения);
		
	КонецЕсли;
КонецПроцедуры

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

Есть вероятность сбоя, если в ОРП будут добавлены другие поля расширениями, типовая процедура заполнения аналитик может их очистить. Надо иметь это ввиду.

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

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

Среда: УТ 11.5.24.68

image_pdfimage_print

fixin

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

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

1 комментарий

  1. rzd:

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

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

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