Добавление номенклатуры поставщика с артикулом УТ 11.5

Когда клиент оформляет заказ поставщика, то в него в колонку «Номенклатура поставщика» подставляется номенклатура без артикула. Дело в том, что ЭДО создает новые позиции без артикула. Логично было бы иметь возможность пользователю выбирать основную номенклатуру поставщика, но 1с дает первую попавшуюся.

Текст запроса по номенклатуре партнеров находится тут: НоменклатураПартнеровСервер.ТекстыЗапросовЗаполнитьНоменклатуруПартнераПакетнаяОбработка

Но оказалось, что проще вмешаться в процедуру установки номенклатуры партнера:

// Заполняет номенклатуру партнера (НоменклатураПартнера) в строке табличной части.
//
// 1. Если в строке указана бракованная номенклатура, то в качестве значения для поиска берется
// 	соответствующая номенклатура с качеством Новый.
// 2. Производится поиск номенклатуры партнера по найденному значению. Вариант выбирается с приоритетом:
// 	1) НоменклатураПартнера, уже заполненная в строке, с подходящими значениями реквизитов {Номенклатура, Характеристика, Упаковка};
// 	2) найденный вариант номенклатуры партнеров, существующий в единственном экземпляре,
// 		с подходящими значениями реквизитов {Номенклатура, Характеристика, Упаковка}.
//
// Параметры:
// 	ТекущаяСтрока - Структура - текущая строка табличной части.
// 	СтруктураДействий - см. ОбработатьСтрокиТЧ.СтруктураДействий.
// 	КэшированныеЗначения - см. ПакетнаяОбработкаТабличнойЧастиКлиентСервер.ПолучитьСтруктуруКэшируемыеЗначения.
//
Процедура ЗаполнитьНоменклатуруПартнераПоНоменклатуре(ТекущаяСтрока, СтруктураДействий, КэшированныеЗначения) Экспорт
	
	ДанныеПоСтроке = ДанныеДляОбработкиСтроки("ЗаполнитьНоменклатуруПартнераПоНоменклатуре", КэшированныеЗначения);
	Если ДанныеПоСтроке <> Неопределено Тогда
		
		ТекущаяСтрока.НоменклатураПартнера = ДанныеПоСтроке[0].НоменклатураПартнера;
		
	КонецЕсли;
	
КонецПроцедуры

Увы, здесь в данных по строке всегда одна позиция, поэтому приходится писать свою функцию замены номенклатуры поставщика:


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

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

Работает одинаково хорошо и в подборе номенклатуры и при выборе номенклатуры в строке документа.

Среда: УТ 11.5.22.83. Платформа: 8.3.27.1644

image_pdfimage_print

fixin

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

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

комментария 2

  1. rzd:

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

    • там с артикулом только один, проверенный. А те, что приходят из ЭДО, без артикула. Гарантия 100%, как в банке.

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

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