Заказы на доработку 1С (сервис удаленной работы)

Хранилище

База знаний
Бесплатные отчеты, обработки, конфигурации, внешние компоненты для 1С Статьи, описание работы, методики по работе с 1С

Здравствуйте, гость ( Вход | Зарегистрироваться )



> Конвертация данных 2.1+ нечеткий поиск          
svetas_l Подменю пользователя
сообщение 27.12.18, 20:45
Сообщение #1

Говорящий
***
Группа: Пользователи
Сообщений: 68
Спасибо сказали: 0 раз
Рейтинг: 0

Добрый День!
Кто-то использовал в конфигурации Конвертация данных 2.1 (2.1.8.2) нечеткий поиск для сопоставления данных объекта со справочником базы приёмника, в событии после выгрузки? как обратиться к вызову библиотеки
1. в варианте к StrMatch = Новый(«AddIn.StrMatch.StrMatchExtension») в случае с файл StrMatch.dll
или
2. в варианте к RegExp = Новый COMОбъект("VBScript.RegExp"); rex32.dll /rex64.dll для
Заранее спасибо.

Vofka Подменю пользователя
сообщение 28.12.18, 9:33
Сообщение #2

У нас здесь своя атмосфера...
***********
Группа: Основатель
Сообщений: 13948
Из: Киев
Спасибо сказали: 4514 раз
Рейтинг: 3635.6

Обращайтесь к тому компоненту, который нужен. Я про первый вариант ничего не знаю, вторым пользовался. Но честно говоря, не совсем понимаю чем вам помогут указанные компоненты, если, скорее всего, нечеткий поиск нужно выполнить по базе данных, а не просто в какой-то конкретной заранее известной строке. Опишите задачу.

Сообщение отредактировал Vofka - 28.12.18, 9:34

svetas_l Подменю пользователя
сообщение 28.12.18, 10:13
Сообщение #3

Говорящий
***
Группа: Пользователи
Сообщений: 68
Спасибо сказали: 0 раз
Рейтинг: 0

Vofka @ Сегодня, 9:33 * ,
задача = из базы источника выгружается номенклатура в счетах (база бухгалтерская, где номенклатура ведется по счетам поставщиков), в базу приёмник УПП, в базе приёмнике ведется движение по складу товарными накладными и приходом товаров /услуг, но по номенклатуре, которая в ручную заменяется на складскую ( т.е. не так как пишет бухгалтерия контрагентов в счетах, а так как уже есть аналоги на складе, чтобы физически не хранить дублекаты одной номенклатуры под разными названиями в справочнике). Задача :
нужно выгружать счета с номенклатурой, подставляя номенклатуру справочника склада, чтобы потом в создающиеся приход товаров услуг (который делается по факту кладовщиком), подтянуть цены из выгруженного ранее счета (который был выгружен с бухгалтерской базы с номенклатурой поставщиков).
Т.е. в момент выгрузки счета, его нужно выгружать уже в аналогичной номенклатуре , согласно справочника номенклатуры кладовщика, а не так как ведет бухгалтерия с наименованиями номенклатуры по полученным документам контрагентов....


sava1 Подменю пользователя
сообщение 28.12.18, 10:23
Сообщение #4

Живет на форуме
Иконка группы
Группа: Местный
Сообщений: 2684
Из: Проскуров
Спасибо сказали: 678 раз
Рейтинг: 656.7

а Вы уверены, что нечеткий поиск Вам что-то даст ?
лепите регистр соответствий и ищите по нему.

svetas_l Подменю пользователя
сообщение 28.12.18, 10:25
Сообщение #5

Говорящий
***
Группа: Пользователи
Сообщений: 68
Спасибо сказали: 0 раз
Рейтинг: 0

svetas_l @ Сегодня, 10:13 * ,
вопрос был как обратиться из конвертора к объекту нечеткого поиска , чтобы произвести замену номенклатуры и вставить в счета нужную номенклатуру, оставив лишь цены ?

sava1 Подменю пользователя
сообщение 28.12.18, 10:26
Сообщение #6

Живет на форуме
Иконка группы
Группа: Местный
Сообщений: 2684
Из: Проскуров
Спасибо сказали: 678 раз
Рейтинг: 656.7

послеЗагрузки - создавайте объект и ищите.

svetas_l Подменю пользователя
сообщение 28.12.18, 10:28
Сообщение #7

Говорящий
***
Группа: Пользователи
Сообщений: 68
Спасибо сказали: 0 раз
Рейтинг: 0

sava1 @ Сегодня, 10:26 * ,
как обратиться к объекту?

sava1 Подменю пользователя
сообщение 28.12.18, 10:41
Сообщение #8

Живет на форуме
Иконка группы
Группа: Местный
Сообщений: 2684
Из: Проскуров
Спасибо сказали: 678 раз
Рейтинг: 656.7

какому ?

RegExp

svetas_l Подменю пользователя
сообщение 28.12.18, 10:43
Сообщение #9

Говорящий
***
Группа: Пользователи
Сообщений: 68
Спасибо сказали: 0 раз
Рейтинг: 0

svetas_l @ Сегодня, 10:28 * ,
чтобы составить реестр соответствий его нужно кому-то заполнять, а таких физически нет, вот и требуется нечеткий поиск....нет людей для заполнения реестра соответствий.. Задача программы ускорить труд пользователей, а не увеличить его, сэкономив на зарплате сотрудников, не увеличивая рабочее время и оплату труда...
поэтому его нужно заполнить автоматом с помощью нечеткого поиска....

sava1 Подменю пользователя
сообщение 28.12.18, 10:48
Сообщение #10

Живет на форуме
Иконка группы
Группа: Местный
Сообщений: 2684
Из: Проскуров
Спасибо сказали: 678 раз
Рейтинг: 656.7

т.е. с помощью нечеткого поиска Вы хотите установить четкое соответствие объектов?
Мудрено.
А если появится что-то типа Товар1, товар2...? любой поиск по товар Вам ничего вменяемого не даст.

Vofka Подменю пользователя
сообщение 28.12.18, 11:43
Сообщение #11

У нас здесь своя атмосфера...
***********
Группа: Основатель
Сообщений: 13948
Из: Киев
Спасибо сказали: 4514 раз
Рейтинг: 3635.6

svetas_l, как именно вы хотите искать? У вас есть понимание как этот "нечеткий поиск" должен работать? Если вы сами не представляете, но думаете, что есть волшебная палочка, которая за вас это сделает и даст результат, который вы ожидаете, у меня для вас плохие новости smile.gif

svetas_l Подменю пользователя
сообщение 28.12.18, 11:51
Сообщение #12

Говорящий
***
Группа: Пользователи
Сообщений: 68
Спасибо сказали: 0 раз
Рейтинг: 0

Vofka @ Сегодня, 11:43 * ,
хотя бы 60% сработает. вопрос как обратиться к
StrMatch = Новый(«AddIn.StrMatch.StrMatchExtension»);
или к другому объекту представляющего библиотеку нечеткого поиска или к RegExp , но обратится из конвертации

Vofka Подменю пользователя
сообщение 28.12.18, 11:54
Сообщение #13

У нас здесь своя атмосфера...
***********
Группа: Основатель
Сообщений: 13948
Из: Киев
Спасибо сказали: 4514 раз
Рейтинг: 3635.6

svetas_l, вы ж написали как.

RegExp = Новый COMОбъект("VBScript.RegExp");

svetas_l Подменю пользователя
сообщение 28.12.18, 11:59
Сообщение #14

Говорящий
***
Группа: Пользователи
Сообщений: 68
Спасибо сказали: 0 раз
Рейтинг: 0

Vofka @ Сегодня, 11:54 * ,
так это из обычной конфигурации, а из конвертации как?

sava1 Подменю пользователя
сообщение 28.12.18, 12:01
Сообщение #15

Живет на форуме
Иконка группы
Группа: Местный
Сообщений: 2684
Из: Проскуров
Спасибо сказали: 678 раз
Рейтинг: 656.7

а в чем отличие ?
загрузка выполняется в контексте приложения

Vofka Подменю пользователя
сообщение 28.12.18, 12:26
Сообщение #16

У нас здесь своя атмосфера...
***********
Группа: Основатель
Сообщений: 13948
Из: Киев
Спасибо сказали: 4514 раз
Рейтинг: 3635.6

Цитата(svetas_l @ 28.12.18, 11:59) *
так это из обычной конфигурации, а из конвертации как?

Конвертация, в данном контексте, такая же "обычная конфигурация".

TipsyKID Подменю пользователя
сообщение 29.12.18, 15:04
Сообщение #17

Оратор
Иконка группы
Группа: Местный
Сообщений: 413
Из: Киев
Спасибо сказали: 161 раз
Рейтинг: 0

Vofka @ Вчера, 12:26 * ,
А можно примерчиков насыпать с номенклатурой:
Я просто не сильно понял..
Как я понял
Есть номенклатура с наименованием:
Источник _______________________________Приемник
Номенклатура 1 Счет фактура 1002" ----------- Номенклатура 1
Номенклатура 1 Счет фактура 1003" ----------- Номенклатура 1

Просто, данный случай легко решается: "перед выгрузкой" от наименования отсекается все лишнее и вуаля по определенным маркерам "Счет фактура", "Реализация" и т.д..
Но, я думаю ТС имеет ввиду что - то совершенно другое.

Если отвечать на вопрос конкретно, нет никакой разницы Конвертация это или обработка, напишите конкретную функцию на 1С (без глобальных параметров), которая получает на входе строку (например "Номенклатура 1 Счет фактура 1002 " потом, в базе приемнике) делает запрос к номенклатуре, получает список наименований номенклатуры, применяете библиотеку, находите соответствие (если оно одно - ура, если их много, а с нечетким поиском как раз перевес будет к много). Все, данную функцию в конвертацию можно вставить в алгоритмы и использовать (есть в конвертации отдельная вкладочка с алгоритмами).

Сообщение отредактировал TipsyKID - 29.12.18, 15:06


Signature
Специалист : Технологическая платформа 8.х, Бухгалтерия для Украины, Управление торговлей для Украины, Зарплата и Управление Персоналом для Украины

svetas_l Подменю пользователя
сообщение 02.01.19, 23:01
Сообщение #18

Говорящий
***
Группа: Пользователи
Сообщений: 68
Спасибо сказали: 0 раз
Рейтинг: 0

Добрый День!
Задача сопоставить номенклатуру 2-ух разных баз (1-база по документам бухгалтерским, 2-ая база по фактическому товару склада, обе изначально заполняли справочник номенклатуры параллельно , в 1-ой базе - заполнял бухгалтер по документам контрагентов, во 2-базе заполнял кладовщик по физическому соответствию)
вот вроде бы накатала 2-ве функции, которые призваны сопоставить номенклатуру этих баз (в ручную сопоставлять некому, коды номенклатуры пока не ведутся, при сопоставлении в екселе сходится 20%, в бухгалтерской базе номенклатура на украинском в основном, в базе кладовщика на русском в основном).

Функция ФункцияПреобразованияНоменклатуры(Строка_Номенклатуры)
    RegExp = Новый COMОбъект("VBScript.RegExp");// создаем объект для работы с регулярными
    RegExp.MultiLine = ложь;  // истина — текст многострочный, ложь — одна строка
    RegExp.Global = Истина;     // истина — поиск по всей строке, ложь — до первого совпадения
    RegExp.IgnoreCase = Истина; // истина — игнорировать регистр строки при поиске
    Разделитель=" ";
    RegExp.Pattern = "[^\" + Разделитель + "]+";
    Matches = RegExp.Execute(Строка_Номенклатуры);

    ВидНоменкл="";
    Маркер="";
    
    НоменклатурныйЭлемент = Новый Структура;
    // пара ключ (имя переменной) - значение (произв. типа)
              
         //выделяем размер -параметры числовые      
    СтрокаЧисел = "";
         Для Индекс = 1 По СтрДлина(Строка_Номенклатуры) Цикл
            Символ = Сред((Строка_Номенклатуры), Индекс, 1); // Перебираем все сиволы из нашей строки
            Если ((КодСимвола(Символ) >= 42 И КодСимвола(Символ) <= 59) или   (КодСимвола(Символ)=92)или   (КодСимвола(Символ)=1093)или (КодСимвола(Символ)=32)) Тогда // Код нуля - 48, код 9-ки - 57
                Если (СтрДлина(СтрокаЧисел) = 0) и ((КодСимвола(Символ) >= 48 И КодСимвола(Символ) <= 57)) тогда
                    СтрокаЧисел = СтрокаЧисел + Символ;
                иначеесли (СтрДлина(СтрокаЧисел)> 0)    тогда
                    СтрокаЧисел = СтрокаЧисел + Символ;
                конецесли;      
             КонецЕсли;
          КонецЦикла;
        kk= СтрДлина(СтрокаЧисел);
        Пока   kk >= 0 Цикл
           Символ = Сред((СтрокаЧисел), kk, 1); // Перебираем все сив
             если ((КодСимвола(Символ) >= 48 И КодСимвола(Символ) <= 57)) тогда
                 прервать
             конецесли;
        kk = kk - 1;
       КонецЦикла;
       Если СтрДлина(СтрокаЧисел) > 0 Тогда
            
             НоменклатурныйЭлемент.Вставить("Размер", Лев(СокрЛП(СтрокаЧисел), kk));
          КонецЕсли;
        СтрокаЧисел = "";

          
       Для Сч = 0 По Matches.Count()-1 Цикл
        
           Если Сч=0 Тогда
                  
                   НоменклатурныйЭлемент.Вставить("Наименов_кор_руск",(Matches.Item(Сч).Value));

           Иначе
                 СтрокаМаркировки = "";    
                  СтрокаЧис  = "";
                  Символ2 =  "";
                  Индекс1 = 0;
                  Для Индекс1 = 1 По СтрДлина(Matches.Item(Сч).Value) Цикл
                      Символ2 = Сред((Matches.Item(Сч).Value), Индекс1, 1); // Перебираем все сиволы из нашей строки
                      Если      (КодСимвола(Символ2) >= 48 И КодСимвола(Символ2) <= 57) тогда      //не содержит цифр
                                  СтрокаЧис=  СтрокаЧис  + Символ2;

                      иначеЕсли      ((КодСимвола(Символ2) >= 65 И КодСимвола(Символ2) <= 90)      //англ рег
                             или   (КодСимвола(Символ2) >= 97 И КодСимвола(Символ2) <= 122)      //англ м
                             или   (КодСимвола(Символ2) >= 1040 И КодСимвола(Символ2) <= 1071)      //руск рег
                             ) тогда        //руск рег
                                 СтрокаМаркировки = СтрокаМаркировки  + Символ2;
                      конецесли;      
                      
                  КонецЦикла;//по символьный цикл разбора слова
                  
                  Если СтрДлина(СтрокаМаркировки) >= 1 Тогда
                              Маркер= Маркер+" "+СокрЛП(СтрЗаменить(Matches.Item(Сч).Value,НоменклатурныйЭлемент.Размер,""));
                  ИначеЕсли (СтрДлина(СтрокаЧис) = 0) и (СтрДлина(СтрокаМаркировки) = 0) Тогда
                        если   СтрДлина(СокрЛП(Matches.Item(Сч).Value)) >=1 тогда
                             ВидНоменкл=ВидНоменкл+" "+СокрЛП(СтрЗаменить(Matches.Item(Сч).Value,НоменклатурныйЭлемент.Размер,""));
                        конецесли;
                          
                  КонецЕсли;
               КонецЕсли;
          
                  
          
          
       КонецЦикла;
      
    
             НоменклатурныйЭлемент.Вставить("Вид_номенклатуры", СокрЛП(ВидНоменкл));
             НоменклатурныйЭлемент.Вставить("Маркеровка_производ",СокрЛП(Маркер));

    
    Возврат НоменклатурныйЭлемент;
КонецФункции


    
    Номенклатура = Новый Структура;
      СтрокаШ= СокрЛП(ПолеВвода1);
      
            Запрос = Новый Запрос;        
            Запрос.УстановитьПараметр("Номенклатура_бух",(ПолеВвода1));
            Запрос.Текст =
             "ВЫБРАТЬ
             |Номенлатура_Сопоставление.Номенклатура.Наименование КАК Наименование,
             |Номенлатура_Сопоставление.Номенклатура.Родитель.Наименование КАК РодительНаименование
             |ИЗ
             |РегистрСведений.Номенлатура_Сопоставление КАК Номенлатура_Сопоставление
             |ГДЕ
             |Номенлатура_Сопоставление.Номенклатура_бух.Наименование = &Номенклатура_бух
             |";

            Выборка0 = Запрос.Выполнить().Выбрать();
         если Выборка0.Количество()=0 тогда

      
      
           Номенклатура = ФункцияПреобразованияНоменклатуры(СокрЛП(ПолеВвода1));
          
           Сообщить("Наименов_кор_руск"+" "+Номенклатура.Наименов_кор_руск);
           Сообщить("Вид_номенклатуры"+" "+Номенклатура.Вид_номенклатуры);

           Сообщить("Маркеровка_производ"+" "+Номенклатура.Маркеровка_производ);

           Сообщить("Размер"+" "+Номенклатура.Размер);

            Запрос = Новый Запрос;                              
            Запрос.УстановитьПараметр("Наименов_кор_руск","%" + Номенклатура.Наименов_кор_руск+ "%");
            Запрос.УстановитьПараметр("Вид_номенклатуры","%" + Номенклатура.Вид_номенклатуры+ "%");
            Запрос.УстановитьПараметр("Маркеровка","%" + Номенклатура.Маркеровка_производ+ "%");
            Запрос.УстановитьПараметр("Размер","%" + Номенклатура.Размер+ "%");

            Запрос.Текст =
            "ВЫБРАТЬ
            |Номенклатура.Наименование КАК Наименование,
            |Номенклатура.Родитель.Наименование КАК РодительНаименование
            |ИЗ
            |Справочник.Номенклатура КАК Номенклатура
            |ГДЕ
            |   Номенклатура.Наименов_кор_руск ПОДОБНО &Наименов_кор_руск
            | И Номенклатура.Размер  ПОДОБНО &Размер
            | И Номенклатура.Маркеровка_производ  ПОДОБНО &Маркеровка
            | И Номенклатура.Вид_номенклатуры  ПОДОБНО &Вид_номенклатуры
            |";

            Выборка = Запрос.Выполнить().Выбрать();
          
            если Выборка.Количество()>0 тогда
                Пока Выборка.Следующий() Цикл
                    //сверяешь маркировку и размер среди найденных
                    Сообщить("родитель"+" "+Выборка.РодительНаименование);
                    Сообщить("наименование"+" "+Выборка.Наименование);
                КонецЦикла;
             конецесли;

         иначеесли Выборка0.Количество()>0 тогда
                Пока Выборка0.Следующий() Цикл
                    //сверяешь маркировку и размер среди найденных
                    Сообщить("родитель"+" "+Выборка0.РодительНаименование);
                    Сообщить("наименование"+" "+Выборка0.Наименование);
                КонецЦикла;
             конецесли;

вроде бы работает , правда в конвертации пока не тестировала.
Может у кого-то есть более оптимальные предложения?

sava1 Подменю пользователя
сообщение 03.01.19, 9:46
Сообщение #19

Живет на форуме
Иконка группы
Группа: Местный
Сообщений: 2684
Из: Проскуров
Спасибо сказали: 678 раз
Рейтинг: 656.7

Стесняюсь спросить - а зачем в первой функции РегЕксп ?
1. В любой типой есть функция разбора строки в массив.
2. Если уж есть РегЕксп - зачем парсить строку по символам ? результат можно получить одним выражением через РегЕксп - только написать нормально паттерн.

Не нашли ответа на свой вопрос?
Зарегистрируйтесь и задайте новый вопрос.


Ответить Новая тема
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 

RSS Текстовая версия Сейчас: 28.03.24, 20:50
1С Предприятие 8.3, 1С Предприятие 8.2, 1С Предприятие 8.1, 1С Предприятие 8.0, 1С Предприятие 7.7, Литература 1С, Общие вопросы по администрированию 1С, Методическая поддержка 1С - всё в одном месте: на Украинском 1С форуме!