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




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