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

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

Страницы: 1
RSS
Долгая генерация штрих-кода
 
Здравствуйте.

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

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

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

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

Код
   Стр = "";
   
   ГСЧ = Новый ГенераторСлучайныхЧисел((Год(ТекущаяДата())*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
      Возврат СформироватьПроизвольныйКод_МетодСлП(КоличествоЗнаков, АлфавитноЦифровой);
   КонецЕсли;
   
КонецФункции // СформироватьПроизвольныйКод()
Изменено: Максим Максимович - 25.07.2012 08:54:37
 
спасибо за ответ.
но никто никому ничего не доказывал.
у всех бывает, не заметила при сравнении отличий, у нас только числа в штрих-коде

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