Долгая генерация штрих-кода

Внимание! Данный форум является модерируемым.
Для получения к нему доступа необходимо зарегистрироваться или авторизоваться на сайте.

Интересующийся
RSS
Здравствуйте.

При использовании ААА 4.1 столкнулись с проблемой, что проводка некоторых документов стала занимать неприлично много времени (в среднем 30-40 секунд). С помощью отладчика выяснили, что практически все оно тратится на генерацию штрих-кода, которая происходит не совсем очевидным, на мой взгляд, способом: основная часть штрих-кода формируется рандомно, затем добавляется вся необходимая служебная информация, и, наконец, полученный таким образом штрих-код проверяется на уникальность. Процедура повторяется до тех пор, пока не будет найден уникальный штрих-код. Проведя еще несколько замеров, выяснили, что таким способом нужный (т. е. уникальный) штрих-код получается после примерно 8 000 итераций. И вполне очевидно, что с течением времени ситуация будет отнюдь не улучшаться.

Собственно, вопрос заключается в том, чем обусловлен выбор именно такого метода генерации? Ведь поиск свободной позиции среди уже имеющихся штрих-кодов на первый взгляд выглядит более производительным. Или я ошибаюсь?
Декоративное изображение 124
Партнер
Немного не по теме.
Это сколько же у Вас штрихкодов заведено?
Получается что свободных скоро и не будет...
Сотрудник 1С-Рарус
Добрый день.
Уточните номер релиза конфигурации.
В релизе 4.1.01.23 алгоритмы формирования ШК были переработаны именно для ускорения генерации уникальных ШК. Можно взять оттуда только саму обработку ШтрихКоды.
Интересующийся
Цитата
Дуганов Александр Юрьевич пишет:
Это сколько же у Вас штрихкодов заведено?
Чуть меньше 25 000, что вроде бы не кажется критичной величиной.

Цитата
Александр Яблочкин пишет:
Уточните номер релиза конфигурации.
У нас используется 4.1.01.22.
Интересующийся
Александр, еще один вопрос... С момента внедрения мы ни разу не сталкивались с процедурой обновления. Каким образом мы можем получить новую версию и, соответственно, нужную нам обработку?
Интересующийся
Подтверждаю, была точно такая же проблема до 22 релиза, после обновления до 23 все "полетело". лично я считал что это связано с переходом на последнюю платформу 1С, оказалось что дело в самой конфигурации. Зато сейчас сотрудники безумно счастливы от скорости работы Альфа-Авто ;)
Сотрудник 1С-Рарус
Цитата
Алексей Веревочников пишет:
С момента внедрения мы ни разу не сталкивались с процедурой обновления. Каким образом мы можем получить новую версию
Должна быть зарегистрирована анкета ПП. По данной регистрации открывается доступ к обновлениям. Напишите на адрес alfa@rarus.ru

Цитата
IGE IGE пишет:
после обновления до 23 все "полетело"
Полетело в кавычках или ... ?
Что касается генерации ШК то вся проблема была в генерации случайных чисел для нового ШК. А с этим в 1С не разбежаться. Пробовали разные варианты ... но гонялось все на синтетических тестах. Если помогло на реальных базах это хорошо.
Интересующийся
Цитата
Александр Яблочкин пишет:
Полетело
Всмысле скорость работы стала просто огромной, заказ-наряд, и другие документы создаются моментально, а еще несколько дней назад, на 22 релизе приходилось сидеть и .... ждать..... секунд тридцать-сорок ждать каждую операцию, и это при том что используется мощный сервер и оптическая гигабитная сеть везде...
За скорость работы, пришедшую с 23 релизом всем разработчикам огромная благодарность.
Хотя, с другой стороны, ребят... уже 23 релиз...
Интересующийся
В обработке ШтрихКоды есть процедура СформироватьПроизвольныйКод
Я ее переписал вот так

Код
   Стр = "";
   
   ГСЧ = Новый ГенераторСлучайныхЧисел((Год(ТекущаяДата())*31536000+ДеньГода(ТекущаяДата())*86400+Час(ТекущаяДата())*3600 + Минута(ТекущаяДата())*60+Секунда(ТекущаяДата()))*КодСимвола(Новый УникальныйИдентификатор(),Лев(КодСимвола(Новый УникальныйИдентификатор(),1),1)));
   Если АлфавитноЦифровой = 0 Тогда // Только числа
      Для К = 1 по ОкрВверх(КоличествоЗнаков / 4) Цикл
         Стр = Стр + Формат(ГСЧ.СлучайноеЧисло(0,9999),"ЧЦ=4; ЧН=; ЧВН=; ЧГ=0");
      КонецЦикла;
      Возврат Лев(Стр, КоличествоЗнаков);
   Иначе                         // Числа и символы A - Z
      Пока СтрДлина(Стр) < КоличествоЗнаков Цикл
         Ч = ГСЧ.СлучайноеЧисло(0,2);
         Если Ч % 2 = 0 Тогда
            // Берем цифру
            Стр = Стр + Строка(ГСЧ.СлучайноеЧисло(0,9));
         Иначе
            // Берем букву
            Стр = Стр + Символ(65 + (ГСЧ.СлучайноеЧисло(1,26) % 26)); // A - Z
         КонецЕсли;
      КонецЦикла;
      Возврат Стр;
   КонецЕсли;

Можете попробовать.
Интересующийся
А я нахожу последний подходящий штрихкод и увеличиваю на единицу. А смысл написанного в Альфа-Авто: Автосервис+Автозапчасти. Редакция 4.1 (4.1.01.17) маразма я так и не понял
Пользователь ПП
Извините, но не вижу отличий в обработках 11 релиза и 23:
11 релиз
Функция СформироватьШтрихКодТовара(Весовой=Ложь) Экспорт
СчПопыток=0;

Если Весовой Тогда
   К = 5; //Для весового товара длина штрихкода 7 (2 - префикс)
ПрефиксКода = Строка(ПрефиксВесовогоШК);
НовыйКод = ПрефиксКода + СтрокаПривести(СформироватьПроизвольныйКод(К), "0", 4, 2);
Пока Не ШтрихКодУникален(НовыйКод) ИЛИ ШтрихКодЗапрещен(НовыйКод) Цикл
НовыйКод = ПрефиксКода + СтрокаПривести(СформироватьПроизвольныйКод(К), "0", 4, 2);
СчПопыток=СчПопыток+1;
Если СчПопыток=50 Тогда
СчПопыток=0;
КонецЕсли;
КонецЦикла;
Иначе
К = 10; //Для невесового товара длина штрихкода 12 (2 - префикс)
ПрефиксКода = ПрефиксШтучногоШК;
НовыйКод = EAN13(Строка(ПрефиксКода) + СтрокаПривести(СформироватьПроизвольныйКод(К), "0", 10, 2));
Пока Не ШтрихКодУникален(НовыйКод) ИЛИ ШтрихКодЗапрещен(НовыйКод) Цикл
НовыйКод = EAN13(Строка(ПрефиксКода) + СтрокаПривести(СформироватьПроизвольныйКод(К), "0", 10, 2));
СчПопыток=СчПопыток+1;
Если СчПопыток=50 Тогда
СчПопыток=0;
КонецЕсли;
КонецЦикла;
КонецЕсли;
Возврат НовыйКод;    
КонецФункции // СформироватьШтрихКод()


23 релиз
Функция СформироватьШтрихКодТовара(Весовой=Ложь) Экспорт
СчПопыток=0;

Если Весовой Тогда
   К = 5; //Для весового товара длина штрихкода 7 (2 - префикс)
ПрефиксКода = Строка(ПрефиксВесовогоШК);
НовыйКод = ПрефиксКода + СтрокаПривести(СформироватьПроизвольныйКод(К), "0", 4, 2);
Пока НЕ ШтрихКодУникален(НовыйКод) ИЛИ ШтрихКодЗапрещен(НовыйКод) Цикл
НовыйКод = ПрефиксКода + СтрокаПривести(СформироватьПроизвольныйКод(К), "0", 4, 2);
СчПопыток=СчПопыток+1;
Если СчПопыток=50 Тогда
СчПопыток=0;
КонецЕсли;
КонецЦикла;
Иначе
К = 10; //Для невесового товара длина штрихкода 12 (2 - префикс)
ПрефиксКода = ПрефиксШтучногоШК;
НовыйКод = EAN13(Строка(ПрефиксКода) + СтрокаПривести(СформироватьПроизвольныйКод(К), "0", 10, 2));
Пока НЕ ШтрихКодУникален(НовыйКод) ИЛИ ШтрихКодЗапрещен(НовыйКод) Цикл
НовыйКод = EAN13(Строка(ПрефиксКода) + СтрокаПривести(СформироватьПроизвольныйКод(К), "0", 10, 2));
СчПопыток=СчПопыток+1;
Если СчПопыток=50 Тогда
СчПопыток=0;
КонецЕсли;
КонецЦикла;
КонецЕсли;
Возврат НовыйКод;    
КонецФункции // СформироватьШтрихКод()


в чем улучшилось быстродействие???
Партнер
Для ОСОБЫХ, поменялся МЕХАНИЗМ создания, а вы привели пример функции формирования ШК. Внимательнее сравнивайте,перед тем как задавать вопросы и доказывать чтото. Тоже подтверждаю,что с 23 релиза работать стало намного легче, хотя мы полностью уходим EAN13,но это другая песня.

Было:
Код
Функция СформироватьПроизвольныйКод(КоличествоЗнаков = 22, АлфавитноЦифровой = 0) Экспорт
   Стр = "";
   Если АлфавитноЦифровой = 0 Тогда // Только числа
      Для К = 1 по ОкрВверх(КоличествоЗнаков / 4) Цикл
         Стр = Стр + Формат(СлучайноеЧисло(4),"ЧЦ=4; ЧН=; ЧВН=; ЧГ=0");
      КонецЦикла;
      Возврат Лев(Стр, КоличествоЗнаков);
   Иначе                         // Числа и символы A - Z
      Пока СтрДлина(Стр) < КоличествоЗнаков Цикл
         Ч = СлучайноеЧисло(1);
         Если Ч % 2 = 0 Тогда
            // Берем цифру
            Стр = Стр + Строка(СлучайноеЧисло(1));
         Иначе
            // Берем букву
            Стр = Стр + Символ(65 + (СлучайноеЧисло(2) % 26)); // A - Z
         КонецЕсли;
      КонецЦикла;
      Возврат Стр;
   КонецЕсли;
КонецФункции // СформироватьПроизвольныйКод()


Стало:
Код
Функция СформироватьПроизвольныйКод(КоличествоЗнаков = 22, АлфавитноЦифровой = 0) Экспорт

   Стр = "";
   Если АлфавитноЦифровой = 0 Тогда // Только числа
      Для К = 1 По ОкрВверх(КоличествоЗнаков / 10) Цикл
         Стр = Стр + Формат(СлучайноеЧисло(10),"ЧЦ=10; ЧН=; ЧВН=; ЧГ=0");
      КонецЦикла;
      Возврат Лев(Стр, КоличествоЗнаков);
   Иначе                         // Числа и символы A - Z
      Возврат СформироватьПроизвольныйКод_МетодСлП(КоличествоЗнаков, АлфавитноЦифровой);
   КонецЕсли;
   
КонецФункции // СформироватьПроизвольныйКод()
Пользователь ПП
спасибо за ответ.
но никто никому ничего не доказывал.
у всех бывает, не заметила при сравнении отличий, у нас только числа в штрих-коде

после замены обработки, бысьродействие действительно улучшилось.большое спасибо
Интересующийся
Здравствуйте. Заранее прошу прощения за поднятие старой темы. Хотел спросить, нельзя ли выложить здесь или направить по почте полный код обработки из 23-го релиза? Дело в том, что продление подписки на обновления, похоже, займет некоторое время, а пользователи, как говорится, негодуют.
Сотрудник 1С-Рарус
Алексей Веревочников  - проблема решена?
Интересующийся
Цитата
Владимир Гаврилов пишет:
Алексей Веревочников - проблема решена?
Да, спасибо, пока доработали своими силами, чуть позже обновимся до нового релиза.
Читают тему
Поддержка отраслевых решений «1С-Рарус»
Услуги 1С