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

Хранилище

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

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



> как функцию вставить в алгоритмы          
svetas_l Подменю пользователя
сообщение 02.01.19, 22:52
Сообщение #1

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

Добрый День!
Вроде бы накатала алгоритм для поиска сопоставлений номенклатуры , получилось 2-ве функции, причем одна вызывает другую, в обычной базе вроде бы отрабатывает, но как вставить их в алгоритмы конвертации, как к ним обратиться и как задать параметры?
а главное, как выгрузить результат в событие "после загрузки"?

Функции описаны здесь.

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

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

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

почитала статью [необходимо зарегистрироваться для просмотра ссылки]
непонятно как они так лихо переходят от параметра структуры в массив параметров "ВыборкаДанныхПоСкладу" , если изначально "ПараметрыАлгоритмов" есть структура данных, а не массив структуры?
Как это?
Попробовала примерить на свои функции нечеткого поиска:
//для справки у меня в конфигурации приёмнике
два справочника Номенклатуры : Номенклатура () - который ведёт пользователь кладовщик и ей заполняет ТребованиеНакладная, и Номенклатура_бух, который выгружается вместе с СчетНаОплатуПоставщика из бухгалтерии, но СчетНаОплатуПоставщика в табличной части содержит и поле "Номенклатура" и "Номенклатура_бух", сам счет заносит запись в регистр сведений "Номенлатура_Сопоставление" по событию проведение. Нужно чтобы в момент выгрузки счета Номенклатура_бух сама находила подобную номенклатуру из Номенклатура (справочник который ведёт кладовщик)
Сопоставлять думаю в момент загрузки элемента Номенклатуры, который выгружается вместе с документами СчетНаОплатуПоставщика в базу приёмник в справочник Номенклатура_бух.
Но тут пока чего-то не хватает, нужно сразу из найденного массива выбрать наиболее подходящий элемент и ставить его в СчетНаОплатуПоставщика в поле "Номенклатура", напротив значения выгружаемого поля "Номенклатура_бух".
К сожалению, я только начала изучать "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,НоменклатурныйЭлемент.Размер,""));
                        конецесли;
                          
                  КонецЕсли;
               КонецЕсли;
          
                  
          
          
       КонецЦикла;
      
             НоменклатурныйЭлемент.Вставить("Вид_номенклатуры", СокрЛП(ВидНоменкл));
             НоменклатурныйЭлемент.Вставить("Маркеровка_производ",СокрЛП(Маркер));

            
    //Возврат НоменклатурныйЭлемент;
   Параметры.ПараметрыАлгоритмов.Вставить("Наименов_кор_руск", НоменклатурныйЭлемент.Наименов_кор_руск);
   Параметры.ПараметрыАлгоритмов.Вставить("Вид_номенклатуры", НоменклатурныйЭлемент.Вид_номенклатуры);
   Параметры.ПараметрыАлгоритмов.Вставить("Маркеровка_производ", НоменклатурныйЭлемент.Маркеровка_производ);
   Параметры.ПараметрыАлгоритмов.Вставить("Размер", НоменклатурныйЭлемент.Размер);

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

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

Цитата(svetas_l @ 07.01.19, 13:34) *
как они так лихо переходят от параметра структуры в массив параметров "ВыборкаДанныхПоСкладу" , если изначально "ПараметрыАлгоритмов" есть структура данных, а не массив структуры?


ВыборкаданныхПоСкладу - элемент структуры ПараметрыАлгоритмов, заполняется в Алгоритме СоздатьВыборкуПоСкладу и может быть любым значением, которое можно поместить в структуру.

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


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

 

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