почитала статью [необходимо зарегистрироваться для просмотра ссылки]
непонятно как они так лихо переходят от параметра структуры в массив параметров "ВыборкаДанныхПоСкладу" , если изначально "ПараметрыАлгоритмов" есть структура данных, а не массив структуры?
Как это?
Попробовала примерить на свои функции нечеткого поиска:
//для справки у меня в конфигурации приёмнике
два справочника Номенклатуры : Номенклатура () - который ведёт пользователь кладовщик и ей заполняет ТребованиеНакладная, и Номенклатура_бух, который выгружается вместе с СчетНаОплатуПоставщика из бухгалтерии, но СчетНаОплатуПоставщика в табличной части содержит и поле "Номенклатура" и "Номенклатура_бух", сам счет заносит запись в регистр сведений "Номенлатура_Сопоставление" по событию проведение. Нужно чтобы в момент выгрузки счета Номенклатура_бух сама находила подобную номенклатуру из Номенклатура (справочник который ведёт кладовщик)
Сопоставлять думаю в момент загрузки элемента Номенклатуры, который выгружается вместе с документами СчетНаОплатуПоставщика в базу приёмник в справочник Номенклатура_бух.
Но тут пока чего-то не хватает, нужно сразу из найденного массива выбрать наиболее подходящий элемент и ставить его в СчетНаОплатуПоставщика в поле "Номенклатура", напротив значения выгружаемого поля "Номенклатура_бух".
К сожалению, я только начала изучать "1С:Конвертация данных 2.1". Может кто-то может подсказать как оптимальнее это сделать? заранее спасибо.
//Функция_поиска
Номенклатура = Новый Структура;
Наименование_бух=Параметры.ПараметрыАлгоритмов["Строка_Номенклатуры"];
СтрокаШ= СокрЛП(Наименование_бух);
НоменклатурныйЭлемент = Новый Структура;
ВыходнойМассив = Новый Массив;
Запрос = Новый Запрос;
Запрос.УстановитьПараметр("Номенклатура_бух",(Наименование_бух));
Запрос.Текст =
"ВЫБРАТЬ
|Номенлатура_Сопоставление.Номенклатура.Наименование КАК Наименование,
|Номенлатура_Сопоставление.Номенклатура.Родитель.Наименование КАК РодительНаименование
|ИЗ
|РегистрСведений.Номенлатура_Сопоставление КАК Номенлатура_Сопоставление
|ГДЕ
|Номенлатура_Сопоставление.Номенклатура_бух.Наименование = &Номенклатура_бух
|";
Выборка0 = Запрос.Выполнить().Выбрать();
если Выборка0.Количество()=0 тогда
//если элемента ещё нет в таблице сопоставления, и мы не знаем что это
Параметры.ПараметрыАлгоритмов.Вставить("Строка_Номенклатуры",Наименование_бух);
Параметры.ПараметрыАлгоритмов.Вставить("Наименов_кор_руск",Неопределено);
Параметры.ПараметрыАлгоритмов.Вставить("Вид_номенклатуры",Неопределено);
Параметры.ПараметрыАлгоритмов.Вставить("Маркеровка_производ",Неопределено);
Параметры.ПараметрыАлгоритмов.Вставить("Размер",Неопределено);
Выполнить(Алгоритмы.ФункцияПреобразованияНоменклатуры); //разложим элемент на значимые части
Номенклатура.Вставить("Наименов_кор_руск",Параметры.ПараметрыАлгоритмов["Наименов_кор_руск"]);
Номенклатура.Вставить("Вид_номенклатуры",Параметры.ПараметрыАлгоритмов["Вид_номенклатуры"]);
Номенклатура.Вставить("Маркеровка_производ", Параметры.ПараметрыАлгоритмов["Маркеровка_производ"]);
Номенклатура.Вставить("Размер", Параметры.ПараметрыАлгоритмов["Размер"]);
Запрос = Новый Запрос;
Запрос.УстановитьПараметр("Наименов_кор_руск","%" + Номенклатура.Наименов_кор_руск+ "%"); //поищем элемент значимыми частями
Запрос.УстановитьПараметр("Вид_номенклатуры","%" + Номенклатура.Вид_номенклатуры+ "%"); //поищем элемент значимыми частями
Запрос.УстановитьПараметр("Маркеровка","%" + Номенклатура.Маркеровка_производ+ "%"); //поищем элемент значимыми частями
Запрос.УстановитьПараметр("Размер","%" + Номенклатура.Размер+ "%"); //поищем элемент значимыми частями
Запрос.Текст =
"ВЫБРАТЬ
|Номенклатура.Наименование КАК Наименование,
|Номенклатура.Родитель.Наименование КАК РодительНаименование
|ИЗ
|Справочник.Номенклатура КАК Номенклатура
|ГДЕ
| Номенклатура.Наименов_кор_руск ПОДОБНО &Наименов_кор_руск
| И Номенклатура.Размер ПОДОБНО &Размер
| И Номенклатура.Маркеровка_производ ПОДОБНО &Маркеровка
| И Номенклатура.Вид_номенклатуры ПОДОБНО &Вид_номенклатуры
|";
Выборка = Запрос.Выполнить().Выбрать();
если Выборка.Количество()>0 тогда
Пока Выборка.Следующий() Цикл
НоменклатурныйЭлемент.Вставить("Родитель", СокрЛП(Выборка.РодительНаименование));
НоменклатурныйЭлемент.Вставить("Наименование",СокрЛП(Выборка.Наименование));
//формируешь массив найденных элементов, подобных частями
ВыходнойМассив.Добавить(НоменклатурныйЭлемент);
КонецЦикла;
конецесли;
иначеесли Выборка0.Количество()>0 тогда //если элемент уже есть в таблице сопоставления
Пока Выборка0.Следующий() Цикл
//сверяешь маркировку и размер среди найденных в таблице соотвествий
НоменклатурныйЭлемент.Вставить("Родитель", СокрЛП(Выборка0.РодительНаименование));
НоменклатурныйЭлемент.Вставить("Наименование",СокрЛП(Выборка0.Наименование));
ВыходнойМассив.Добавить(НоменклатурныйЭлемент);
КонецЦикла;
конецесли;
Параметры.спЗначений_номенклатуры.ЗагрузитьЗначения(ВыходнойМассив);
//ФункцияПреобразованияНоменклатуры
Строка_Номенклатуры=Параметры.ПараметрыАлгоритмов["Строка_Номенклатуры"];
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,НоменклатурныйЭлемент.Размер,""));
конецесли;
КонецЕсли;
КонецЕсли;
КонецЦикла;
НоменклатурныйЭлемент.Вставить("Вид_номенклатуры", СокрЛП(ВидНоменкл));
НоменклатурныйЭлемент.Вставить("Маркеровка_производ",СокрЛП(Маркер));
//Возврат НоменклатурныйЭлемент;
Параметры.ПараметрыАлгоритмов.Вставить("Наименов_кор_руск", НоменклатурныйЭлемент.Наименов_кор_руск);
Параметры.ПараметрыАлгоритмов.Вставить("Вид_номенклатуры", НоменклатурныйЭлемент.Вид_номенклатуры);
Параметры.ПараметрыАлгоритмов.Вставить("Маркеровка_производ", НоменклатурныйЭлемент.Маркеровка_производ);
Параметры.ПараметрыАлгоритмов.Вставить("Размер", НоменклатурныйЭлемент.Размер);