Форум 1С
Программистам, бухгалтерам, администраторам, пользователям
Задай вопрос - получи решение проблемы
29 мар 2024, 00:29

Штрих-Код EAN13 на макете ТОРГ12

Автор agusikdeon, 05 мар 2011, 09:37

0 Пользователей и 1 гость просматривают эту тему.

agusikdeon

конфигурация: УТ 10.3
задача:создать внешнюю обработку которая распечатывала бы выбранный документ РеализацииТоваровИУслуг на макете ТОРГ12
также на макете должен присутствовать штрих-код типа EAN13 содержащий данные о номере документа, его принадлежности(расход)(в случае с некоторыми другими документами это был бы приход, возврат и т д) и имя организации.
вопрос:как понять что такое принадлежность документа и откуда это вытащить?
и как вообще работать со штрих-кодом? как перевести например все 3 параметры(номер, принадлежность, организация) в формат этого штрих-кода.
я так понял что после того как переведу в этот формат(13-значное число) то нужно просто распечатать это на форме определенным шрифтом.
вот нашел кое-что на эту тему но как воспользоваться не знаю.


// Используется шрифт BearRock (EanBwrP36Tt) - EAN13
Функция РазбСтроки(ИсхСтр)
В = "";
Поз = Найти(ИсхСтр, ";");
Если Поз <> 0 Тогда
В = Лев(ИсхСтр, Поз - 1);
ИсхСтр = Прав(ИсхСтр, СтрДлина(ИсхСтр) - Поз);
КонецЕсли;
Возврат В;
КонецФункции
//•••
Функция ДобавитьСлева(Стр1, Длн, Стр2)
Стр0 = Стр1;
Пока СтрДлина(Стр0) <= Длн
Цикл
Стр0 = Стр2 + Стр0;
КонецЦикла;
Стр0 = Прав(Стр0, Длн);
Возврат Стр0;
КонецФункции
//•••
Функция ЦифрыВБуквыВерхнегоРегистра(Цифра)
БуквыВерхнегоРегистра = "ABCDEFGHIJ";
Цифра = Число(Прав(Цифра,1));
Стр = Сред(БуквыВерхнегоРегистра, Цифра + 1, 1);
Возврат Стр;
КонецФункции
//•••
Функция ЦифрыВБуквыНижнегоРегистра(Цифра)
БуквыНижнегоРегистра = "abcdefghij";
Цифра = Число(Прав(Цифра,1));
Стр = Сред(БуквыНижнегоРегистра, Цифра + 1, 1);
Возврат Стр;
КонецФункции
//•••
Функция ПроверкаЧетности(Код)
четн = 0;
неч  = 0;
Для Поз = 1 По Окр(СтрДлина(Код) / 2 + 0.1,0)
Цикл
неч  = неч  + Сред(Код, Поз * 2 - 1, 1);
Если Поз * 2 <= СтрДлина(Код)
Тогда
четн = четн + Сред(Код, Поз * 2, 1);
КонецЕсли;
КонецЦикла;
КодЧетности = Число(Прав(Строка(1000 - четн - неч * 3), 1));
Возврат КодЧетности;
КонецФункции
//••• 
Функция EAN13(Код) Экспорт
// Вычисляет контрольную цифру EAN-13/EAN-8  GOAN
// Возвращает штрих-код с контрольной цифрой (с) 1С-Рарус
//ШтрКод=Формат(Число(Код),"Ч(0)"+?(СтрДлина(Код)<8,"7","12")); // для 1cv77
ШтрКод=Код;                                                     // для 1cv80
Четн = 0; Нечетн = 0;
Если СтрДлина(Код)=7 Тогда Итераций = 4; Иначе Итераций = 6; КонецЕсли;
Для Индекс=1 По Итераций Цикл
Четн=Четн+Сред(ШтрКод,2*Индекс,1);
Нечетн=Нечетн+Сред(ШтрКод,2*Индекс-1,1);
КонецЦикла;
Если СтрДлина(Код)=7 Тогда Нечетн=Нечетн*3; Иначе Четн=Четн*3; КонецЕсли;
КонтЦифра=10-(Четн+Нечетн)%10;
Если КонтЦифра=10 Тогда КонтЦифра=0;КонецЕсли;
Рез=Код+Строка(КонтЦифра);
Возврат Рез;

КонецФункции // EAN13

Функция EAN138(Код) Экспорт

ШтрКод = Код;
Нечетн = 0;
Четн   = 0;
Если СтрДлина(Код) = 7 Тогда
Для Индекс = 1 По 3 Цикл
Нечетн = Нечетн + Сред(ШтрКод, 2 * Индекс - 1, 1);
Четн = Четн + Сред(ШтрКод, 2 * Индекс, 1);
КонецЦикла;       
Нечетн = Нечетн + Сред(ШтрКод, 2 * 4 - 1, 1);
Нечетн = Нечетн * 3;
ИначеЕсли СтрДлина(Код) = 12 Тогда
Для Индекс = 1 По 6 Цикл
Нечетн = Нечетн + Сред(ШтрКод, 2 * Индекс - 1, 1);
Четн = Четн + Сред(ШтрКод, 2 * Индекс, 1);
КонецЦикла;
Четн = Четн * 3;
Иначе
Сообщить("Че то тут не так...");
КонецЕсли;
КонтЦифра = 10 - (Четн + Нечетн) % 10;
Если КонтЦифра = 10 Тогда КонтЦифра = 0;КонецЕсли;
Рез = Код + Строка(КонтЦифра);
Возврат Рез;

КонецФункции // EAN13
//•••
Функция СформироватьКодEAN13(код)

ПервыйФлаг = Число(Сред(код,1,1));
левстр     = Сред(код,2,6);
правстр    = Сред(код,8,6);
правкод = "";
Для Поз = 1 По 6
Цикл
правкод = правкод + ЦифрыВБуквыНижнегоРегистра(Сред(правстр,Поз,1));
КонецЦикла;
    //  Формируем левую часть кода в зависимости от значениа ПервыйФлаг
Если      ПервыйФлаг = 0
Тогда //••• 0 ••• AAAAA •••
левкод = "#!"+Лев(левстр,1)+Сред(левстр,2,1)+Сред(левстр,3,1)+Сред(левстр,4,1)+Сред(левстр,5,1)+Сред(левстр,6,1);
ИначеЕсли ПервыйФлаг = 1
Тогда //••• 1 ••• AABABB •••
левкод = "$!"+Лев(левстр,1)+Сред(левстр,2,1)+ЦифрыВБуквыВерхнегоРегистра(Сред(левстр,3,1))+Сред(левстр,4,1)+ЦифрыВБуквыВерхнегоРегистра(Сред(левстр,5,1))+ЦифрыВБуквыВерхнегоРегистра(Сред(левстр,6,1));
ИначеЕсли ПервыйФлаг = 2
Тогда //••• 2 ••• AABBAB •••
левкод = "%!"+Лев(левстр,1)+Сред(левстр,2,1)+ЦифрыВБуквыВерхнегоРегистра(Сред(левстр,3,1))+ЦифрыВБуквыВерхнегоРегистра(Сред(левстр,4,1))+Сред(левстр,5,1)+ЦифрыВБуквыВерхнегоРегистра(Сред(левстр,6,1));
ИначеЕсли ПервыйФлаг = 3
Тогда //••• 3 ••• AABBBA •••
левкод = "&!"+Лев(левстр,1)+Сред(левстр,2,1)+ЦифрыВБуквыВерхнегоРегистра(Сред(левстр,3,1))+ЦифрыВБуквыВерхнегоРегистра(Сред(левстр,4,1))+ЦифрыВБуквыВерхнегоРегистра(Сред(левстр,5,1))+Сред(левстр,6,1);
ИначеЕсли ПервыйФлаг = 4
Тогда //••• 4 ••• ABAABB •••
левкод = "'!"+Лев(левстр,1)+ЦифрыВБуквыВерхнегоРегистра(Сред(левстр,2,1))+Сред(левстр,3,1)+Сред(левстр,4,1)+ЦифрыВБуквыВерхнегоРегистра(Сред(левстр,5,1))+ЦифрыВБуквыВерхнегоРегистра(Сред(левстр,6,1));
ИначеЕсли ПервыйФлаг = 5
Тогда //••• 5 ••• ABBAAB •••
левкод = "(!"+Лев(левстр,1)+ЦифрыВБуквыВерхнегоРегистра(Сред(левстр,2,1))+ЦифрыВБуквыВерхнегоРегистра(Сред(левстр,3,1))+Сред(левстр,4,1)+Сред(левстр,5,1)+ЦифрыВБуквыВерхнегоРегистра(Сред(левстр,6,1));
ИначеЕсли ПервыйФлаг = 6
Тогда //••• 6 ••• ABBBAA •••
левкод = ")!"+Лев(левстр,1)+ЦифрыВБуквыВерхнегоРегистра(Сред(левстр,2,1))+ЦифрыВБуквыВерхнегоРегистра(Сред(левстр,3,1))+ЦифрыВБуквыВерхнегоРегистра(Сред(левстр,4,1))+Сред(левстр,5,1)+Сред(левстр,6,1);
ИначеЕсли ПервыйФлаг = 7
Тогда //••• 7 ••• ABABAB •••
левкод = "*!"+Лев(левстр,1)+ЦифрыВБуквыВерхнегоРегистра(Сред(левстр,2,1))+Сред(левстр,3,1)+ЦифрыВБуквыВерхнегоРегистра(Сред(левстр,4,1))+Сред(левстр,5,1)+ЦифрыВБуквыВерхнегоРегистра(Сред(левстр,6,1));
ИначеЕсли ПервыйФлаг = 8
Тогда //••• 8 ••• ABABBA •••
левкод = "+!"+Лев(левстр,1)+ЦифрыВБуквыВерхнегоРегистра(Сред(левстр,2,1))+Сред(левстр,3,1)+ЦифрыВБуквыВерхнегоРегистра(Сред(левстр,4,1))+ЦифрыВБуквыВерхнегоРегистра(Сред(левстр,5,1))+Сред(левстр,6,1);
ИначеЕсли ПервыйФлаг = 9
Тогда //••• 9 ••• ABBABA •••
левкод = ",!"+Лев(левстр,1)+ЦифрыВБуквыВерхнегоРегистра(Сред(левстр,2,1))+ЦифрыВБуквыВерхнегоРегистра(Сред(левстр,3,1))+Сред(левстр,4,1)+ЦифрыВБуквыВерхнегоРегистра(Сред(левстр,5,1))+Сред(левстр,6,1);
КонецЕсли;
// Возвращаем результат
кодстр = левкод + "-" + правкод + "!";
Возврат кодстр;
КонецФункции

Функция СформироватьКодEAN8(код)

// работает только если ШК начинается на 2, на остальных - надо подправлять код 1с
ПервыйФлаг = Число(Сред(код,1,1));
левстр     = Сред(код,1,4);
правстр    = Сред(код,5,4);
правкод = "";
Для Поз = 1 По 4 Цикл
правкод = правкод + ЦифрыВБуквыНижнегоРегистра(Сред(правстр,Поз,1));
КонецЦикла;
    //  Формируем левую часть кода в зависимости от значениа ПервыйФлаг
Если      ПервыйФлаг = 0
Тогда //••• 0 ••• AAAAA •••
левкод = "#!"+Лев(левстр,1)+Сред(левстр,2,1)+Сред(левстр,3,1)+Сред(левстр,4,1);
ИначеЕсли ПервыйФлаг = 1
Тогда //••• 1 ••• AABABB •••
левкод = "$!"+Лев(левстр,1)+Сред(левстр,2,1)+ЦифрыВБуквыВерхнегоРегистра(Сред(левстр,3,1))+Сред(левстр,4,1);
ИначеЕсли ПервыйФлаг = 2
Тогда //••• 2 ••• AABBAB •••
//левкод = "%!"+Лев(левстр,1)+Сред(левстр,2,1)+ЦифрыВБуквыВерхнегоРегистра(Сред(левстр,3,1))+ЦифрыВБуквыВерхнегоРегистра(Сред(левстр,4,1));
левкод = "%!"+Лев(левстр,1)+Сред(левстр,2,1)+Сред(левстр,3,1)+Сред(левстр,4,1);
ИначеЕсли ПервыйФлаг = 3
Тогда //••• 3 ••• AABBBA •••
левкод = "&!"+Лев(левстр,1)+Сред(левстр,2,1)+ЦифрыВБуквыВерхнегоРегистра(Сред(левстр,3,1))+ЦифрыВБуквыВерхнегоРегистра(Сред(левстр,4,1));
ИначеЕсли ПервыйФлаг = 4
Тогда //••• 4 ••• ABAABB •••
левкод = "'!"+Лев(левстр,1)+ЦифрыВБуквыВерхнегоРегистра(Сред(левстр,2,1))+Сред(левстр,3,1)+Сред(левстр,4,1);
ИначеЕсли ПервыйФлаг = 5
Тогда //••• 5 ••• ABBAAB •••
левкод = "(!"+Лев(левстр,1)+ЦифрыВБуквыВерхнегоРегистра(Сред(левстр,2,1))+ЦифрыВБуквыВерхнегоРегистра(Сред(левстр,3,1))+Сред(левстр,4,1);
ИначеЕсли ПервыйФлаг = 6
Тогда //••• 6 ••• ABBBAA •••
левкод = ")!"+Лев(левстр,1)+ЦифрыВБуквыВерхнегоРегистра(Сред(левстр,2,1))+ЦифрыВБуквыВерхнегоРегистра(Сред(левстр,3,1))+ЦифрыВБуквыВерхнегоРегистра(Сред(левстр,4,1));
ИначеЕсли ПервыйФлаг = 7
Тогда //••• 7 ••• ABABAB •••
левкод = "*!"+Лев(левстр,1)+ЦифрыВБуквыВерхнегоРегистра(Сред(левстр,2,1))+Сред(левстр,3,1)+ЦифрыВБуквыВерхнегоРегистра(Сред(левстр,4,1));
ИначеЕсли ПервыйФлаг = 8
Тогда //••• 8 ••• ABABBA •••
левкод = "+!"+Лев(левстр,1)+ЦифрыВБуквыВерхнегоРегистра(Сред(левстр,2,1))+Сред(левстр,3,1)+ЦифрыВБуквыВерхнегоРегистра(Сред(левстр,4,1));
ИначеЕсли ПервыйФлаг = 9
Тогда //••• 9 ••• ABBABA •••
левкод = ",!"+Лев(левстр,1)+ЦифрыВБуквыВерхнегоРегистра(Сред(левстр,2,1))+ЦифрыВБуквыВерхнегоРегистра(Сред(левстр,3,1))+Сред(левстр,4,1);
КонецЕсли;

левкод = Сред(левкод, 2);

// Возвращаем результат
кодстр = левкод + "-" + правкод + "!";
Возврат кодстр;

КонецФункции

//••••••••••••••••••••••••••••••••••••••••••••••••
Функция СформироватьШтрихкод(ШтрихКодНовый)

//ВремКод = EAN13(ШтрихКодНовый);
ВремКод = EAN138(ШтрихКодНовый);
Если Не Флажок1 Тогда
БарКод  = СформироватьКодEAN13(ВремКод);
Иначе
БарКод  = СформироватьКодEAN8(ВремКод);
КонецЕсли;
ШтрихКодНовый = ВремКод; // Возвращаем вместе с последним разрядом
Возврат БарКод;

КонецФункции

//только для целых чисел
Функция ПолучитьСлучайноеЧисло(Мин, Макс)
   
    //вместо Randomize
    Для н = 1 По 100 Цикл
        Уник = Новый УникальныйИдентификатор;
    КонецЦикла;
   
        //генерируем GUID
    Уник = СокрЛП(Новый УникальныйИдентификатор);

        //оставляем только цифры
    Уник = СтрЗаменить(Уник,"-","");
    Уник = СтрЗаменить(Уник,"a","");
    Уник = СтрЗаменить(Уник,"b","");
    Уник = СтрЗаменить(Уник,"c","");
    Уник = СтрЗаменить(Уник,"d","");
    Уник = СтрЗаменить(Уник,"e","");
    Уник = СтрЗаменить(Уник,"f","");

    //знаменатель должен иметь такое же количество нулей + 1
    Знаменатель = 10;
    Для н = 2 По (СтрДлина(СтрЗаменить(Уник,Символы.НПП,""))) Цикл
        Знаменатель = Знаменатель * 10;
    КонецЦикла;
   
    Случ = Число(Уник) / Знаменатель; //здесь получается дробное случайное число от 0 до 1
   
    //преобразуем его в случайное число из заданного интервала, округляем до целого
    ЧислоИзИнтервала = Мин(Макс(Окр(Мин + (Макс-Мин)*Случ),Мин),Макс);
   
    Возврат ЧислоИзИнтервала;

КонецФункции

Функция ПолучитьСлучайныйШК(ЧислоШК)

Если Не Флажок1 Тогда
ЧислоШК = Формат(ПолучитьСлучайноеЧисло(100000000000, 999999999999), "ЧГ=0"); // пока 12 разрядов
Иначе
ЧислоШК = Формат(ПолучитьСлучайноеЧисло(2800000, 2899999), "ЧГ=0"); // пока 7 разрядов
КонецЕсли;
ШК = СформироватьШтрихкод(ЧислоШК); // Теперь ЧислоШК - 13 (8) разрядное
    Возврат ШК;

КонецФункции

Процедура КнопкаВыполнитьНажатие(Кнопка)

Перем ЧислоШК;

ТабДокумент = Новый ТабличныйДокумент;
Если Не Флажок1 Тогда
Макет = ПолучитьМакет("Макет");
Иначе
Макет = ПолучитьМакет("EAN8");
КонецЕсли;
ОбластьМакета = Макет.ПолучитьОбласть("ШК");

Для К = 1 По КоличествоШК Цикл
ОбластьМакета.Параметры.ШК = ПолучитьСлучайныйШК(ЧислоШК);
Если Не Флажок1 Тогда
ОбластьМакета.Параметры.ЧислоШК = ЧислоШК;
КонецЕсли;
ТабДокумент.Вывести(ОбластьМакета);
КонецЦикла;

ТабДокумент.ОтображатьЗаголовки = Ложь;
ТабДокумент.ОтображатьСетку = Ложь;
ТабДокумент.Показать("Случайные ШК");

КонецПроцедуры

progmikon

Неужели, в типовой УТ нет печати штрих кода?

progmikon

Открываете макет. "Таблица" - "Рисунки" - "Вставить объект". Размещаете в макете. В появившемся окне выбираете "Элемент управления". 1Сv8. Печать штрих-кодов. (естественно его нужно предварительно установить).

ТабДок = Новый ТабличныйДокумент;
Макет = ПолучитьМакет("Макет");
ОбластьМакета = Макет.ПолучитьОбласть("Область1");
ОбластьМакета.Рисунки.D1.Объект.ТекстКода = "....";//здесь ваш код
ТабДок.Вывести(ОбластьМакета);
ТабДок.Показать();

agusikdeon

Цитата: progmikon от 05 мар 2011, 10:04
Открываете макет. "Таблица" - "Рисунки" - "Вставить объект". Размещаете в макете.
это где?
что-то я не нашел(

agusikdeon

Цитата: progmikon от 05 мар 2011, 10:04
Открываете макет. "Таблица" - "Рисунки" - "Вставить объект". Размещаете в макете.
простите за глупость) естественно нашел)

Теги:

Похожие темы (5)

Рейтинг@Mail.ru

Поиск