Создание штрих-кода в 1с 8.3. УФ. в самописной конфигурации. Проблема! Что делаю не так?

Тема в разделе "Общие вопросы "1С:Предприятие 8"", создана пользователем kaaasteeen, 10 авг 2017.

  1. TopicStarter Overlay
    kaaasteeen
    Offline

    kaaasteeen

    Регистрация:
    5 июл 2017
    Сообщения:
    17
    Симпатии:
    0
    Баллы:
    1
    Добрый день. Имеется самописная конфа( 8.3. УФ).
    Нужно было присвоить штрих код на каждый документ, чтобы в последующем искать документ "По штрих-коду".
    На данный момент имеется две проблемы.
    1. Штрих-код считывается очень плохо т.е. нужно в определенное положение попасть сканером.Теряешь много времени.(Проверял другие (не мои) штрих-кода считываются мгновенно).
    Теперь сам код:

    -----------------------------
    Этот кусок кода я вставляю в Модуль Менеджера документа.
    Для Того, чтобы формировать штрих-код внешней компонентой. Само собой вставил объект ОбщийМакет.

    Код:
    /////////////////////Заготовка для штриха к общему макету/////////////
    Функция ПодключитьВнешнююКомпонентуПечатиШтрихкода() Экспорт
      
        ПодключениеВыполнено = ПодключитьВнешнююКомпоненту("ОбщийМакет.Штрих", "КартинкаШтрихкода", ТипВнешнейКомпоненты.Native);
      
        // Создадим объект внешней компоненты.
        Если ПодключениеВыполнено Тогда
            ВнешняяКомпонента = Новый("AddIn.КартинкаШтрихкода.Barcode");
        Иначе
            Возврат Неопределено;
        КонецЕсли;
      
        // Если нет возможности рисовать.
        Если НЕ ВнешняяКомпонента.ГрафикаУстановлена Тогда
            // То картинку сформировать не сможем.
            Возврат Неопределено;
        Иначе
            // Установим основные параметры компоненты.
            // Если в системе установлен шрифт Tahoma.
            Если ВнешняяКомпонента.НайтиШрифт("Tahoma") Тогда
                // Выбираем его как шрифт для формирования картинки.
                ВнешняяКомпонента.Шрифт = "Tahoma";
            Иначе
                // Шрифт Tahoma в системе отсутствует.
                // Обойдем все доступные компоненте шрифты.
                Для Сч = 0 По ВнешняяКомпонента.КоличествоШрифтов -1 Цикл
                    // Получим очередной шрифт, доступный компоненте.
                    ТекущийШрифт = ВнешняяКомпонента.ШрифтПоИндексу(Сч);
                    // Если шрифт доступен
                    Если ТекущийШрифт <> Неопределено Тогда
                        // Они и будет шрифтом для формирования штрихкода.
                        ВнешняяКомпонента.Шрифт = ТекущийШрифт;
                        Прервать;
                    КонецЕсли;
                КонецЦикла;
            КонецЕсли;
            // Установим размер шрифта
            ВнешняяКомпонента.РазмерШрифта = 12;
          
            Возврат ВнешняяКомпонента;
        КонецЕсли;
      
    КонецФункции
    
    Функция ПолучитьКартинкуШтрихкода(ПараметрыШтрихкода) Экспорт
      
        ВнешняяКомпонента = ПодключитьВнешнююКомпонентуПечатиШтрихкода();
      
        Если ВнешняяКомпонента = Неопределено Тогда
            ВызватьИсключение НСтр("ru = 'Ошибка подключения внешней компоненты печати штрихкода!'");
        КонецЕсли;
      
        // Зададим размер картинки
    //    ВнешняяКомпонента.Ширина = Окр(ПараметрыШтрихкода.Ширина);
        //ВнешняяКомпонента.Высота = Окр(ПараметрыШтрихкода.Высота);
      
        ВнешняяКомпонента.АвтоТип = Ложь;
      
        Если ПараметрыШтрихкода.ТипКода = 99 Тогда
            ТипШтрихкодаВрем = ОпределитьТипШтрихкода(ПараметрыШтрихкода.Штрихкод);
            Если ТипШтрихкодаВрем = "EAN8" Тогда
                ВнешняяКомпонента.ТипКода = 0;
            ИначеЕсли ТипШтрихкодаВрем = "EAN13" Тогда
                ВнешняяКомпонента.ТипКода = 1;
                // Если код содержит контрольный символ, обязательно указываем.
                ВнешняяКомпонента.СодержитКС = СтрДлина(ПараметрыШтрихкода.Штрихкод) = 13;
            ИначеЕсли ТипШтрихкодаВрем = "EAN128" Тогда
                ВнешняяКомпонента.ТипКода = 2;
            ИначеЕсли ТипШтрихкодаВрем = "CODE39" Тогда
                ВнешняяКомпонента.ТипКода = 3;
            ИначеЕсли ТипШтрихкодаВрем = "CODE128" Тогда
                ВнешняяКомпонента.ТипКода = 4;
            ИначеЕсли ТипШтрихкодаВрем = "ITF14" Тогда
                ВнешняяКомпонента.ТипКода = 11;
            Иначе
                ВнешняяКомпонента.АвтоТип = Истина;
            КонецЕсли;
        Иначе
            ВнешняяКомпонента.АвтоТип = Ложь;
            ВнешняяКомпонента.ТипКода = ПараметрыШтрихкода.ТипКода;
        КонецЕсли;
      
        Если ПараметрыШтрихкода.Свойство("ПрозрачныйФон") Тогда
            ВнешняяКомпонента.ПрозрачныйФон = ПараметрыШтрихкода.ПрозрачныйФон;
        КонецЕсли;
    
        ВнешняяКомпонента.ОтображатьТекст = ПараметрыШтрихкода.ОтображатьТекст;
      
        // Формируем картинку штрихкода.
        ВнешняяКомпонента.ЗначениеКода = ПараметрыШтрихкода.Штрихкод;
      
        Если ПараметрыШтрихкода.Свойство("УголПоворота") Тогда
            ВнешняяКомпонента.УголПоворота = ПараметрыШтрихкода.УголПоворота;
        Иначе
            ВнешняяКомпонента.УголПоворота = 0;
        КонецЕсли;
      
        // Если установленная нами ширина меньше минимально допустимой для этого штрихкода.
        Если ВнешняяКомпонента.Ширина < ВнешняяКомпонента.МинимальнаяШиринаКода Тогда
            ВнешняяКомпонента.Ширина = ВнешняяКомпонента.МинимальнаяШиринаКода;
        КонецЕсли;
      
        // Если установленная нами высота меньше минимально допустимой для этого штрихкода.
        Если ВнешняяКомпонента.Высота < ВнешняяКомпонента.МинимальнаяВысотаКода Тогда
            ВнешняяКомпонента.Высота = ВнешняяКомпонента.МинимальнаяВысотаКода;
        КонецЕсли;
    
        Если ПараметрыШтрихкода.Свойство("РазмерШрифта") И (ПараметрыШтрихкода.РазмерШрифта > 0)
            И (ПараметрыШтрихкода.ОтображатьТекст) И (ВнешняяКомпонента.РазмерШрифта <> ПараметрыШтрихкода.РазмерШрифта) Тогда
            ВнешняяКомпонента.РазмерШрифта = ПараметрыШтрихкода.РазмерШрифта;
        КонецЕсли;
        ВнешняяКомпонента.Пропорции="1:1";
        ВнешняяКомпонента.ВидимостьКС=Ложь;
        ВнешняяКомпонента.ПрозрачныйФон =Истина;
        // Сформируем картинку
        ДвоичныеДанныеКартинки = ВнешняяКомпонента.ПолучитьШтрихкод();
      
        // Если картинка сформировалась.
        Если ДвоичныеДанныеКартинки <> Неопределено Тогда
            // Формируем из двоичных данных.
            Возврат Новый Картинка(ДвоичныеДанныеКартинки);
        КонецЕсли;
      
        Возврат Неопределено;
    
    КонецФункции
    
    Функция ОпределитьТипШтрихкода(Штрихкод) Экспорт
      
        ТипШтрихкода = "";  
        ДлинаШтрихкода = СтрДлина(Штрихкод);
      
        Если ДлинаШтрихкода = 0 Тогда
            Возврат ТипШтрихкода;
        КонецЕсли;
      
        Сумма = 0;
      
        Если ДлинаШтрихкода = 14 Тогда // ITF14
          
            Коэффициент = 1;
            Для Сч = 1 По 13 Цикл
                ВремКодСимвола = КодСимвола(Штрихкод, Сч);
                Если ВремКодСимвола < 48 Или ВремКодСимвола > 57 Тогда
                    Прервать;
                КонецЕсли;
                Сумма       = Сумма + Коэффициент * (ВремКодСимвола - 48);
                Коэффициент = 4 - Коэффициент;
            КонецЦикла;
            Сумма = (10 - Сумма % 10) % 10;
            Если КодСимвола(Штрихкод, 14) = Сумма + 48 Тогда
                ТипШтрихкода = "ITF14";
             КонецЕсли;
          
        ИначеЕсли ДлинаШтрихкода = 13 Тогда // EAN13
          
            EAN13 = Истина;
            Коэффициент = 1;
            Для Сч = 1 По 12 Цикл
                ВремКодСимвола = КодСимвола(Штрихкод, Сч);
                Если ВремКодСимвола < 48 Или ВремКодСимвола > 57 Тогда
                    EAN13 = Ложь;
                    Прервать;
                КонецЕсли;
                Сумма  = Сумма + Коэффициент * (ВремКодСимвола - 48);
                Коэффициент = 4 - Коэффициент;
            КонецЦикла;
            Сумма = (10 - Сумма % 10) % 10;
            ПроверочныйСимвол = Символ(Сумма + 48);
            Если EAN13 И ПроверочныйСимвол = Прав(Штрихкод, 1) Тогда
                ТипШтрихкода = "EAN13";
            КонецЕсли;
          
        ИначеЕсли ДлинаШтрихкода = 8 Тогда // EAN8
          
            EAN8 = Истина;
            Коэффициент = 3;
            Для Сч = 1 По 7 Цикл
                ВремКодСимвола = КодСимвола(Штрихкод, Сч);
                Если ВремКодСимвола < 48 Или ВремКодСимвола > 57 Тогда
                    EAN8 = Ложь;
                    Прервать;
                КонецЕсли;
                Сумма       = Сумма + Коэффициент * (ВремКодСимвола - 48);
                Коэффициент = 4 - Коэффициент;
            КонецЦикла;
            Сумма = (10 - Сумма % 10) % 10;
            Если EAN8 И (КодСимвола(Штрихкод, 8) = Сумма + 48) Тогда
                ТипШтрихкода = "EAN8";
            КонецЕсли;
          
        КонецЕсли;
      
        Если ТипШтрихкода= "" Тогда // CODE39
          
            CODE39 = Истина;
            Для Сч = 1 По ДлинаШтрихкода Цикл
                ВремКодСимвола = КодСимвола(Штрихкод, Сч);
                Если (ВремКодСимвола <> 32)
                    И (ВремКодСимвола < 36 Или ВремКодСимвола > 37)
                    И (ВремКодСимвола <> 43)
                    И (ВремКодСимвола < 45 Или ВремКодСимвола > 57)
                    И (ВремКодСимвола < 65 Или ВремКодСимвола > 90) Тогда
                    CODE39 = Ложь;
                    Прервать;
                КонецЕсли;
            КонецЦикла;
          
            Если CODE39 Тогда
                ТипШтрихкода = "CODE39";
            КонецЕсли                                                   
          
        КонецЕсли;
      
        Если ТипШтрихкода= ""  Тогда // CODE128
            // CODE128 символы ASCII от 0 до 127 (цифры от «0» до «9», буквы от «A» до «Z» и от «a» до «z») и специальные символы;
            CODE128 = Истина;
            Для Сч = 1 По ДлинаШтрихкода Цикл
                ВремКодСимвола = КодСимвола(Штрихкод, Сч);
                Если (ВремКодСимвола > 127) Тогда
                    CODE128 = Ложь;
                Прервать;
                КонецЕсли;
            КонецЦикла;
          
            Если CODE128 Тогда
                ТипШтрихкода = "CODE128";
            КонецЕсли                                                   
          
        КонецЕсли;
      
        Если ТипШтрихкода= "CODE128"  Тогда // EAN128
            // В коде EAN128 регламентирован словарь CODE128 но регламентированы группы кодов.
            Если КодСимвола(Штрихкод, 1) = 40 Тогда
                ТипШтрихкода = "EAN128";
            КонецЕсли;
        КонецЕсли;
      
        Возврат ТипШтрихкода;
      
    КонецФункции
    
    Далее в процедуре я добавляю кусок текста со структорой для формирования штрих-кода, там же идет генерация.
    Код:
    Процедура ПечатьНаПрием(ТабДок, Ссылка) Экспорт
        //{{_КОНСТРУКТОР_ПЕЧАТИ(ПечатьНаПрием)
        Макет = Документы.ПриходНаРемонт.ПолучитьМакет("ПечатьНаПрием");
        Запрос = Новый Запрос;
        Запрос.Текст =
        "ВЫБРАТЬ
        |    ПриходНаРемонт.ИНН,
        |    ПриходНаРемонт.Контрагент,
        |    ПриходНаРемонт.Мастер,
        |    ПриходНаРемонт.Номенклатура,
        |    ПриходНаРемонт.НомерТелефона,
        |    ПриходНаРемонт.ОписаниеНеисправностей,
        |    ПриходНаРемонт.СерийныйНомер,
        |    ПриходНаРемонт.Состояние,
        |    ПриходНаРемонт.Статус,
        |    ПриходНаРемонт.Номер,
        |    ПриходНаРемонт.Дата
        |ИЗ
        |    Документ.ПриходНаРемонт КАК ПриходНаРемонт
        |ГДЕ
        |    ПриходНаРемонт.Ссылка В(&Ссылка)";
        Запрос.Параметры.Вставить("Ссылка", Ссылка);
        Выборка = Запрос.Выполнить().Выбрать();
    
        ОбластьЗаголовок = Макет.ПолучитьОбласть("Заголовок");
        Шапка = Макет.ПолучитьОбласть("Шапка");
        Подвал = Макет.ПолучитьОбласть("Подвал");
        Акция = Макет.ПолучитьОбласть("Акция");
        ТабДок.Очистить();
    
        ВставлятьРазделительСтраниц = Ложь;
        Пока Выборка.Следующий() Цикл
          
            ПараметрыШтрихкода = Новый Структура;
            ПараметрыШтрихкода.Вставить("Ширина", 100);
            ПараметрыШтрихкода.Вставить("Высота", 10);
            ПараметрыШтрихкода.Вставить("Штрихкод","1"+Прав(Выборка.Номер,5) +(Формат(ДЕНЬ(Выборка.Дата),"ЧЦ=2; ЧВН=; ДЛФ=D")+Формат(МЕСЯЦ(Выборка.Дата),"ЧЦ=2; ЧВН=; ДЛФ=D")
                                                  + Формат(Прав(ГОД(Выборка.Дата),2),"ЧЦ=4; ЧГ=0; ДЛФ=D")));
            ПараметрыШтрихкода.Вставить("ТипКода",1);
            ПараметрыШтрихкода.Вставить("ОтображатьТекст", Ложь);
            ПараметрыШтрихкода.Вставить("РазмерШрифта", 12);
           Шапка.Рисунки.Штрих.Картинка = ПолучитьКартинкуШтрихкода(ПараметрыШтрихкода);
          
            Если ВставлятьРазделительСтраниц Тогда
                ТабДок.ВывестиГоризонтальныйРазделительСтраниц();
            КонецЕсли;
            ОбластьЗаголовок.Параметры.Номер = Выборка.Номер;
            ОбластьЗаголовок.Параметры.Дата = Формат(Выборка.Дата,"ДЛФ=DD") ;
          
            ТабДок.Вывести(ОбластьЗаголовок);
    
            Шапка.Параметры.Заполнить(Выборка);
            ТабДок.Вывести(Шапка, Выборка.Уровень());
    
            Подвал.Параметры.Заполнить(Выборка);
            ТабДок.Вывести(Подвал);
            ТабДок.Вывести(Акция);
    
            ВставлятьРазделительСтраниц = Истина;
        КонецЦикла;
    
    После этого добавляю картинку на макет, даю ей имя и при печати из этой картинки получается штрих код.

    Прикрепляю две фото.
    1. Как выглядит штрих-код перед распечтакой
    [​IMG]

    2. Как выглядит в макете( картинку, которую я вставлял является рандомная пикча со штрих-кодом из инет).

    Может я использую некорректный способ формирования штрих-кода?

    Вложения:

  2. LordMaverick
    Online

    LordMaverick Профессионал в 1С

    Регистрация:
    17 мар 2014
    Сообщения:
    3.921
    Симпатии:
    459
    Баллы:
    104
    сравните с тем что в типовых конфигурация

    и оно очень плохо переносит произвольное маштабирование, на на это наталкивает -"Штрих-код считывается очень плохо т.е. нужно в определенное положение попасть сканером.Теряешь много времени.(Проверял другие (не мои) штрих-кода считываются мгновенно)."
  3. TopicStarter Overlay
    kaaasteeen
    Offline

    kaaasteeen

    Регистрация:
    5 июл 2017
    Сообщения:
    17
    Симпатии:
    0
    Баллы:
    1
    Перенес картинку из типовой, сохранив масштаб, написал свое имя. Распечатал - вообще не считывает этот штрих-код сканер...

Поделиться этой страницей