Добрый День! Кто-то использовал в конфигурации Конвертация данных 2.1 (2.1.8.2) нечеткий поиск для сопоставления данных объекта со справочником базы приёмника, в событии после выгрузки? как обратиться к вызову библиотеки 1. в варианте к StrMatch = Новый(«AddIn.StrMatch.StrMatchExtension») в случае с файл StrMatch.dll или 2. в варианте к RegExp = Новый COMОбъект("VBScript.RegExp"); rex32.dll /rex64.dll для Заранее спасибо.
У нас здесь своя атмосфера...
Группа: Основатель
Сообщений: 13955
Из: Киев
Спасибо сказали: 4520 раз
Рейтинг: 3642.8
Обращайтесь к тому компоненту, который нужен. Я про первый вариант ничего не знаю, вторым пользовался. Но честно говоря, не совсем понимаю чем вам помогут указанные компоненты, если, скорее всего, нечеткий поиск нужно выполнить по базе данных, а не просто в какой-то конкретной заранее известной строке. Опишите задачу.
Vofka @ Сегодня, 9:33
, задача = из базы источника выгружается номенклатура в счетах (база бухгалтерская, где номенклатура ведется по счетам поставщиков), в базу приёмник УПП, в базе приёмнике ведется движение по складу товарными накладными и приходом товаров /услуг, но по номенклатуре, которая в ручную заменяется на складскую ( т.е. не так как пишет бухгалтерия контрагентов в счетах, а так как уже есть аналоги на складе, чтобы физически не хранить дублекаты одной номенклатуры под разными названиями в справочнике). Задача : нужно выгружать счета с номенклатурой, подставляя номенклатуру справочника склада, чтобы потом в создающиеся приход товаров услуг (который делается по факту кладовщиком), подтянуть цены из выгруженного ранее счета (который был выгружен с бухгалтерской базы с номенклатурой поставщиков). Т.е. в момент выгрузки счета, его нужно выгружать уже в аналогичной номенклатуре , согласно справочника номенклатуры кладовщика, а не так как ведет бухгалтерия с наименованиями номенклатуры по полученным документам контрагентов....
svetas_l @ Сегодня, 10:13
, вопрос был как обратиться из конвертора к объекту нечеткого поиска , чтобы произвести замену номенклатуры и вставить в счета нужную номенклатуру, оставив лишь цены ?
svetas_l @ Сегодня, 10:28
, чтобы составить реестр соответствий его нужно кому-то заполнять, а таких физически нет, вот и требуется нечеткий поиск....нет людей для заполнения реестра соответствий.. Задача программы ускорить труд пользователей, а не увеличить его, сэкономив на зарплате сотрудников, не увеличивая рабочее время и оплату труда... поэтому его нужно заполнить автоматом с помощью нечеткого поиска....
Живет на форуме
Группа: Местный
Сообщений: 2688
Из: Проскуров
Спасибо сказали: 681 раз
Рейтинг: 659.7
т.е. с помощью нечеткого поиска Вы хотите установить четкое соответствие объектов? Мудрено. А если появится что-то типа Товар1, товар2...? любой поиск по товар Вам ничего вменяемого не даст.
У нас здесь своя атмосфера...
Группа: Основатель
Сообщений: 13955
Из: Киев
Спасибо сказали: 4520 раз
Рейтинг: 3642.8
svetas_l, как именно вы хотите искать? У вас есть понимание как этот "нечеткий поиск" должен работать? Если вы сами не представляете, но думаете, что есть волшебная палочка, которая за вас это сделает и даст результат, который вы ожидаете, у меня для вас плохие новости
Vofka @ Вчера, 12:26
, А можно примерчиков насыпать с номенклатурой: Я просто не сильно понял.. Как я понял Есть номенклатура с наименованием: Источник _______________________________Приемник Номенклатура 1 Счет фактура 1002" ----------- Номенклатура 1 Номенклатура 1 Счет фактура 1003" ----------- Номенклатура 1
Просто, данный случай легко решается: "перед выгрузкой" от наименования отсекается все лишнее и вуаля по определенным маркерам "Счет фактура", "Реализация" и т.д.. Но, я думаю ТС имеет ввиду что - то совершенно другое.
Если отвечать на вопрос конкретно, нет никакой разницы Конвертация это или обработка, напишите конкретную функцию на 1С (без глобальных параметров), которая получает на входе строку (например "Номенклатура 1 Счет фактура 1002 " потом, в базе приемнике) делает запрос к номенклатуре, получает список наименований номенклатуры, применяете библиотеку, находите соответствие (если оно одно - ура, если их много, а с нечетким поиском как раз перевес будет к много). Все, данную функцию в конвертацию можно вставить в алгоритмы и использовать (есть в конвертации отдельная вкладочка с алгоритмами).
Сообщение отредактировал TipsyKID - 29.12.18, 15:06
Специалист : Технологическая платформа 8.х, Бухгалтерия для Украины, Управление торговлей для Украины, Зарплата и Управление Персоналом для Украины
Добрый День! Задача сопоставить номенклатуру 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 Тогда
Иначе СтрокаМаркировки = ""; СтрокаЧис = ""; Символ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,НоменклатурныйЭлемент.Размер,"")); конецесли;
Запрос.Текст = "ВЫБРАТЬ |Номенклатура.Наименование КАК Наименование, |Номенклатура.Родитель.Наименование КАК РодительНаименование |ИЗ |Справочник.Номенклатура КАК Номенклатура |ГДЕ | Номенклатура.Наименов_кор_руск ПОДОБНО &Наименов_кор_руск | И Номенклатура.Размер ПОДОБНО &Размер | И Номенклатура.Маркеровка_производ ПОДОБНО &Маркеровка | И Номенклатура.Вид_номенклатуры ПОДОБНО &Вид_номенклатуры |";
Выборка = Запрос.Выполнить().Выбрать();
если Выборка.Количество()>0 тогда Пока Выборка.Следующий() Цикл //сверяешь маркировку и размер среди найденных Сообщить("родитель"+" "+Выборка.РодительНаименование); Сообщить("наименование"+" "+Выборка.Наименование); КонецЦикла; конецесли;
иначеесли Выборка0.Количество()>0 тогда Пока Выборка0.Следующий() Цикл //сверяешь маркировку и размер среди найденных Сообщить("родитель"+" "+Выборка0.РодительНаименование); Сообщить("наименование"+" "+Выборка0.Наименование); КонецЦикла; конецесли;
вроде бы работает , правда в конвертации пока не тестировала. Может у кого-то есть более оптимальные предложения?
Живет на форуме
Группа: Местный
Сообщений: 2688
Из: Проскуров
Спасибо сказали: 681 раз
Рейтинг: 659.7
Стесняюсь спросить - а зачем в первой функции РегЕксп ? 1. В любой типой есть функция разбора строки в массив. 2. Если уж есть РегЕксп - зачем парсить строку по символам ? результат можно получить одним выражением через РегЕксп - только написать нормально паттерн.
1С Предприятие 8.3, 1С Предприятие 8.2, 1С Предприятие 8.1, 1С Предприятие 8.0, 1С Предприятие 7.7, Литература 1С, Общие вопросы по администрированию 1С, Методическая поддержка 1С - всё в одном месте: на Украинском 1С форуме!