Имя: Пароль:
1C
1С v8
КД2: Поля поиска
,
0 Demasiado
 
16.11.22
13:22
Коллеги, всем привет. Подскажите, знающие люди, по КД2.
Перегоняю из УТ11 заказ поставщику в Бух3 счет поставщика, из УТ11 нужно выгружать номенклатуру поставщика и конвертировать ее в просто Номенклатуру Бух3. Поиск номенклатуру нужно реализовать так – 1) ищем по идентификатору; 2) ищем по артикулу номенклатуры поставщика, если заполнено; 3) ищем по нахождению артикула номенклатуры поставщика в названии номенклатуры; 4) ищем по названию.
Сам документ конвертировать в ПКО сложностей не возникло, а вот с номенклатурой уперся в странность. Было создано ПКО «НоменклатураПоставщиков_Номенклатура», в настройках стоят галки 1) Искать по внутреннему идентификатору, 3) Не замещать существующие объекты при загрузке, а только создавать новые и заполнять их.
Для реализации такой стратегии поиска в обработчике «Поля поиска» у ПКО, прописан такой код

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

В ПКС у ПКО настроенная передача реквизитов: Артикул (галка Поле поиска), Наименование (галка Поле поиска), Наименование -> Наименование (галка Поле поиска), Наименование -> НаименованиеПолное и еще ряд реквизитов.
При выгрузке Номенклатуры из УТ, в XML файле, все реквизиты элементы справочника выгружаются. При загрузке – если элемент новый (не был найден по условиям поиска), создается новый элемент на стороне бухгалтерии, но реквизиты, которые в КД2 помечены галками «Поле поиска» - не заполняются (напомню, в выгрузке они есть); реквизиты которые без полей поиска – заполняются корректно. Если в КД2 поля поиска убираем (например, у реквизитов Артикул и Наименование), то они даже в XML не выгружаются и обработчик «Поля поиска» отрабатывает некорректно.
Подскажите, что нужно еще настроить в ПКС и ПКО, чтобы у нового элемента в бухгалтерии все было настроено?
1 Demasiado
 
16.11.22
13:22
Поправка В ПКС у ПКО настроенная передача реквизитов: Артикул (галка Поле поиска), Наименование -> Наименование (галка Поле поиска), Наименование -> НаименованиеПолное и еще ряд реквизитов.
2 mistеr
 
16.11.22
13:27
Наверное в этом дело:

    УстанавливатьУОбъектаВсеСвойстваПоиска = Ложь;
3 Demasiado
 
16.11.22
13:36
(2) сейчас попробую, проблема была что затирались реквизиты у найденного элемента, реквизитами из УТ (хотя возможно в тот момент не стояла галка "не замещать, а создавать только новые и заполнять")
4 Demasiado
 
16.11.22
13:37
+ (3), в смысле когда я так пробовал сделать
5 Demasiado
 
16.11.22
14:22
(2) Спасибо, помогло) Видимо у меня глаз замылился и я эту комбинацию не пробовал (убрать ключевое слово + галку "не замещать а создавать") и меня постоянно все затирало. Можешь еще подсказать - если объект не найден и создается новый, в каком обработчике можно отлавить, чтобы программно еще какие - реквизиты заполнить? Или эти реквизиты прописываем в новых ПКС, источник не указываем, а в обработчике "При выгрузке" прописываем свой код. Но это при выгрузке, а при загрузке, чтобы значения заполнения дергать из базы приемника? (хотя я понимаю что можно например прописывать Значение = xmlid; из базы приемника и поиск будет по идентификатору уже из базы приемника)
6 boozin
 
16.11.22
14:23
А галку "Продолжить поиск по полям поиска.." поставил?
7 Demasiado
 
16.11.22
14:25
(6) (2) помогло, "Продолжить по полям поиска не ставил", в инете в примерах говорят что если поставить то будет искать по галкам в ПКС, а обработчик "Поля поиска" - игнорируется
8 boozin
 
16.11.22
14:27
Если хочешь после идентификатора искать по полям поиска галку надо обязательно ставить
9 Demasiado
 
16.11.22
14:30
(8) понял, я думал она не совместима с обработчиком. Спасибо
10 mistеr
 
16.11.22
14:36
(5) При загрузке
11 mistеr
 
16.11.22
14:40
(10) После загрузки, ошибся.
Требовать и эффективности, и гибкости от одной и той же программы — все равно, что искать очаровательную и скромную жену... по-видимому, нам следует остановиться на чем-то одном из двух. Фредерик Брукс-младший