Стандартные доработки. Штрихкодирование документов.
Задачи пользователя - Адаптация типовых решений
Молочников Олег Spb. 2010.
Стандартные доработки. Штрихкодирование документов.
Эта статья описывает процесс доработки типовых 1С конфигураций, для добавления функционала штрихкодирования документов и быстрого их поиска по штрихкоду. Метод работает для управляемых и неуправляемых печатных форм.
В этом примере рассматривается генерация штрихкода EAN128 следующей структуры: 3 символа – для идентификации типа документа + 6 символов для даты + номер документа. Из ограничений метода : в области макета где печатается штрихкод возможна печать только одного штрихкода. Название рисунка для штрихкода должно начинаться на «Штрихкод”. Метод не работает без изменений, если есть кириллические символы в префиксах документах.
1. В общий модуль, выполняемый на сервере добавьте следующие функции:
Функция ПодключитьВнешнююКомпонентуПечатиШтрихкода() Экспорт
// В зависимости от типа платформы подключим соответствующую внешнюю компоненту
ПодключениеВыполнено = Неопределено;
СистемнаяИнформация = Новый СистемнаяИнформация;
Если СистемнаяИнформация.ТипПлатформы = ТипПлатформы.Windows_x86 Тогда
ПодключениеВыполнено = ПодключитьВнешнююКомпоненту("ОбщийМакет.КомпонентаПечатиШтрихкодовWindows32", "КартинкаШтрихкода", ТипВнешнейКомпоненты.Native);
ИначеЕсли СистемнаяИнформация.ТипПлатформы = ТипПлатформы.Windows_x86_64 Тогда
ПодключениеВыполнено = ПодключитьВнешнююКомпоненту("ОбщийМакет.КомпонентаПечатиШтрихкодовWindows64", "КартинкаШтрихкода", ТипВнешнейКомпоненты.Native);
ИначеЕсли СистемнаяИнформация.ТипПлатформы = ТипПлатформы.Linux_x86 Тогда
ПодключениеВыполнено = ПодключитьВнешнююКомпоненту("ОбщийМакет.КомпонентаПечатиШтрихкодовLinux32", "КартинкаШтрихкода", ТипВнешнейКомпоненты.Native);
Иначе
ПодключениеВыполнено = ПодключитьВнешнююКомпоненту("ОбщийМакет.КомпонентаПечатиШтрихкодовLinux64", "КартинкаШтрихкода", ТипВнешнейКомпоненты.Native);
КонецЕсли;
// Создадим объект внешней компоненты
Если ПодключениеВыполнено Тогда
ВнешняяКомпонента = Новый("AddIn.КартинкаШтрихкода.Barcode");
Иначе
Возврат Неопределено;
КонецЕсли;
// Если нет возможности рисовать
Если НЕ ВнешняяКомпонента.ГрафикаУстановлена Тогда
// То картинку сформировать не сможем
Возврат Неопределено;
Иначе
// Установим основные параметры компоненты
// Если в системе установлен шрифт Tahoma
Если ВнешняяКомпонента.НайтиШрифт("Tahoma") Тогда
// Выбираем его как шрифт для формирования картинки
ВнешняяКомпонента.Шрифт = "Tahoma";
Иначе
// Шрифт Tahoma в системе отсутствует
// Обойдем все доступные компоненте шрифты
Для Сч = 0 По ВнешняяКомпонента.КоличествоШрифтов -1 Цикл
// Получим очередной шрифт, доступный компоненте
ТекущийШрифт = ВнешняяКомпонента.ШрифтПоИндексу(Сч);
// Если шрифт доступен
Если ТекущийШрифт <> Неопределено Тогда
// Они и будет шрифтом для формирования штри-кода
ВнешняяКомпонента.Шрифт = ТекущийШрифт;
Прервать;
КонецЕсли;
КонецЦикла;
КонецЕсли;
// Утановим размер шрифта
ВнешняяКомпонента.РазмерШрифта = 12;
Возврат ВнешняяКомпонента;
КонецЕсли;
КонецФункции
// Функция выполняет формирование изображения штрихкода.
//
// Параметры:
// ТипКода число от 0 до 16
// EAN8, EAN13, EAN128, Code39, Code128, Code16k, PDF417, Standart (Industrial) 2 of 5, Interleaved 2 of 5, Расширение Code39, Code93, ITF14, RSS14, CodaBar, EAN13 AddOn 2, EAN13 AddOn 5
Функция ПолучитьКартинкуШтрихкода(ВнешняяКомпонента, Ширина, Высота, Штрихкод, ТипКода = 0) Экспорт
// Зададим размер картинки
ВнешняяКомпонента.Ширина = Окр(Ширина);
ВнешняяКомпонента.Высота = Окр(Высота);
// Разрешим компоненте самой определять тип кода
ВнешняяКомпонента.АвтоТип = Ложь;
ВнешняяКомпонента.ТипКода = ТипКода;
// Если код содержит контрольный символ, обязательно указываем
ВнешняяКомпонента.СодержитКС = СтрДлина(Штрихкод) = 13;
ВнешняяКомпонента.ОтображатьТекст=Ложь;
// Если отображать контрольный символ не нужно
// ВнешняяКомпонента.ВидимостьКС = Ложь;
// Формируем картинку штрихкода
ВнешняяКомпонента.ЗначениеКода = Штрихкод;
// Если установленная нами ширина меньше минимально допустимой для этого штрихкода
Если ВнешняяКомпонента.Ширина < ВнешняяКомпонента.МинимальнаяШиринаКода Тогда
// Скорректируем ширину
ВнешняяКомпонента.Ширина = ВнешняяКомпонента.МинимальнаяШиринаКода + 10;
КонецЕсли;
// Сформируем картинку
ДвоичныеДанныеКартинки = ВнешняяКомпонента.ПолучитьШтрихкод();
// Если картинка сформировалась
Если ДвоичныеДанныеКартинки <> Неопределено Тогда
// Формируем из двоичных данных
Возврат Новый Картинка(ДвоичныеДанныеКартинки);
КонецЕсли;
Возврат Неопределено;
КонецФункции
Функция ВывестиШтрихкодДокументаВОбластьМакета(ВнешняяКомпонента,ОбластьМакета,ЗначениеШтрихкода) Экспорт
Для каждого Рисунок Из ОбластьМакета.Рисунки Цикл
Если Лев(Рисунок.Имя,8) = "Штрихкод" Тогда
Если ВнешняяКомпонента = Неопределено Тогда
ВызватьИсключение НСтр("ru = 'Ошибка подключения внешней компоненты печати штрихкода!'");
КонецЕсли;
Если ЗначениеЗаполнено(ЗначениеШтрихкода) Тогда
Рисунок.Картинка = ПолучитьКартинкуШтрихкода(ВнешняяКомпонента, 361, 50, ЗначениеШтрихкода, 3);
КонецЕсли;
КонецЕсли;
КонецЦикла;
КонецФункции
2. Проверим наличие в общих макетах компонент: КомпонентаПечатиШтрихкодовWindows32, КомпонентаПечатиШтрихкодовWindows64, КомпонентаПечатиШтрихкодовLinux32, КомпонентаПечатиШтрихкодовLinux64
Если их там нет, возьмем из типовых конфигураций.
3. Модифицируем печатные формы документов следующим образом: Добавим на печатные формы требуемых документов изображение штрихкода как на рисунке с примером макета.
Обязательно имя рисунка должно начинаться на «Штрихкод”!!!!
4. В тело функции печати печатной формы добавляем:
В начало функции:
ВнешняяКомпонента = ИМЯОБЩЕГОМОДУЛЯ.ПодключитьВнешнююКомпонентуПечатиШтрихкода();
Перед выводом макета области со штрихкодом:
ИМЯОБЩЕГОМОДУЛЯ.ВывестиШтрихкодДокументаВОбластьМакета(ВнешняяКомпонента,ОбластьМакета,"PER"+СтрЗаменить(Формат(Шапка.Дата,"ДФ=dd.MM.yy"),".","")+Шапка.Номер);
"PER» - заменяем на уникальное обозначение типа печатаемого документа. (В моем случае, это перемещение).
5. В обработку ТОСервер в модуль объекта в тело функции “ОбработатьСобытиеСШК» вставляете следующий код:
Если СтрДлина(ШК)=20 Тогда
Попытка
Если Лев(ШК,3)="RTU" Тогда
ТипДокумента="РеализацияТоваровУслуг";
ИначеЕсли Лев(ШК,3)="PTU" Тогда
ТипДокумента="ПоступлениеТоваровУслуг";
ИначеЕсли Лев(ШК,3)="PER" Тогда
ТипДокумента="ПеремещениеТоваров";
Иначе
Обработка.СобытиеОбработано(Объект);
Возврат Результат;
КонецЕсли;
Дата=Дата(2000+Число(Сред(ШК,8,2)), //Год
Число(Сред(ШК,6,2)), //Месяц
Число(Сред(ШК,4,2))); //День
НомерДок=Сред(ШК,10);
Результат = Документы[ТипДокумента].НайтиПоНомеру(НомерДок, Дата);
Если Результат.Пустая() Тогда
Предупреждение("Документ не найден!");
Иначе
Результат.ПолучитьФорму().Открыть();
КонецЕсли;
Обработка.СобытиеОбработано(Объект);
Возврат Результат;
Исключение
Обработка.СобытиеОбработано(Объект);
Возврат Результат;
КонецПопытки;
КонецЕсли;
6. Дальнейшее развитие идеи (по комментариям читателей):
А) Вместо привязки к номеру, дате и типу документа можно использовать уникальный идентификатор документа. Это более универсальный метод.
Б) Если печатных форм много, то можно не менять макеты печатных форм, а сделать механизм хранения координат места в макете, в котором создавать динамический рисунок и в него выводить штрихкод. Требует экспериментов, но выигрыш в реализации очевиден: минимизация изменений конфигурации, простота добавления штрихкодов.
PS:Заранее благодарен за любые замечания и исправления.
Вступайте в нашу телеграмм-группу Инфостарт
Вы можете заказать платную адаптацию этой статьи под ваши задачи на «Бирже заказов».
- 0% комиссии — оплата напрямую исполнителю;
- Исполнители любого масштаба — от отдельных специалистов до команд под проект;
- Прямой обмен контактами между заказчиком и исполнителем;
- Безопасная сделка — при необходимости;
- Рейтинги, кейсы и прозрачная система откликов.
См. также
Разработка Адаптация типовых решений Производство готовой продукции (работ, услуг) Розничная торговля 1С:Управление торговлей 10 Россия Платные (руб)
Доработка для 1С:Управление торговлей 10.3 (релиз 10.3.88.3) добавляет поддержку маркировки новых категорий товаров согласно постановлениям Правительства РФ 2025–2026 гг. Конфигурация УТ 10.3 снята с поддержки — новые маркируемые категории в типовую поставку больше не попадают. Доработка закрывает этот пробел: новые виды номенклатуры, обмен с ГИС МТ «Честный Знак». Поставляется в виде файла .cf
14640 руб.
23.04.2026 5534 49 13
Банковские операции Адаптация типовых решений Бухгалтер Пользователь 1С:Предприятие 8 1С:Бухгалтерия 3.0 Россия Бухгалтерский учет Платные (руб)
Решение позволяет автоматически заполнять отдельные реквизиты загружаемых банковских документов, основываясь на известных значениях реквизитов и тексте назначения платежа. Простая настройка, широкие возможности анализа назначения платежа без написания кода и сложных шаблонов.
12200 руб.
17.06.2025 5386 16 0
Печатные формы Адаптация типовых решений Бухгалтер Пользователь 1С:Предприятие 8 1С:ERP Управление предприятием 2 1С:Управление торговлей 11 1С:Комплексная автоматизация 2.х 1С:Управление нашей фирмой 3.0 1С:Розница 3.0 Платные (руб)
Расширение позволяет вывести в табличном документе факсимиле печати и подписей и/или вывести произвольную картинку из прикреплённых файлов организации для 1С УТ 11.5, КА 2.5, ERP 2.5, УНФ 3, Розница 3. Вывод факсимиле возможен в табличные документы УПД, УКД, Счёт-фактура, ТОРГ-12 и другие. Возможно настроить вывод для любых типовых макетов (Акт сверки, М-15, ТТН), для этого потребуется отредактировать макет и разместить на нём картинки с соответствующими именами, при выводе на печать в размещённые картинки будут выводиться факсимиле из прикреплённых рисунков. Редактирование осуществляется через типовой механизм в пользовательском интерфейсе.
6000 руб.
07.02.2023 14539 123 25
Адаптация типовых решений 1С:Предприятие 8 1С:Документооборот Россия Платные (руб)
Расширение конфигурации для «1С:Документооборот КОРП», редакция 3.0. позволяет: 1.использовать произвольные табличные части в качестве дополнительных реквизитов к документу; 2 использовать произвольные табличные части в шаблонах в формате docx для автоматического заполнения таблиц.
32330 руб.
29.06.2023 13341 36 15
Логистика, склад и ТМЦ Адаптация типовых решений Пользователь 1С:Предприятие 8 1С:Управление нашей фирмой 1.6 1С:Управление нашей фирмой 3.0 Россия Управленческий учет Платные (руб)
Чтобы не допустить путаницы с обещаниями клиентам и для четкого контроля исполнения заказов мы используем резервирование товаров. Расширение для УНФ, чтобы автоматически отменять старые резервы и не мешалть эффективно продавать.
9150 руб.
02.08.2023 8998 27 5
Адаптация типовых решений Создание на основании Пользователь 1С:Предприятие 8 1С:ERP Управление предприятием 2 1С:Управление торговлей 11 1С:Комплексная автоматизация 2.х Россия Управленческий учет Платные (руб)
Расширение позволяет в 1 клик поставить весь состав заказа клиента в отгрузку и открыть заполненные формы документов отгрузки по заказу.
4880 руб.
25.08.2023 4336 9 0
Адаптация типовых решений 1С 8.3 1С:ERP Управление предприятием 2 1С:Управление торговлей 11 1С:Комплексная автоматизация 2.х Платные (руб)
Расширение, которое в форму списка и форму выбора справочника «Номенклатура» добавляет табличную часть в виде дерева, в которую выводится информация об остатках и доступности выбранной номенклатурной позиции.
6710 руб.
20.04.2026 1006 1 0
Адаптация типовых решений БСП (Библиотека стандартных подсистем) Кадровый учет ЭДО и ОФД 1C:Бухгалтерия 1С:Зарплата и кадры 7.7 1C:ERP 1С:ЗУП 1С:УТ 1С:ДО Платные (руб)
Наше расширение 1С Госключ обеспечивает интеграцию любой конфигурации 1С на базе БСП с мобильным приложением «Госключ», позволяя сотрудникам подписывать кадровые документы (КЭДО) и документы материальной ответственности (МОЛ, ПБ) усиленной электронной подписью прямо со смартфона. Решение автоматизирует формирование и отправку документов на подпись, отслеживает статусы подписания и хранит подписанные файлы непосредственно в базе 1С
25000 руб.
06.03.2026 2791 4 0
При формировании штрих кода по дате и номеру нужно учитывать, что если после распечатки документа будет изменен его дата или номер, то вы его не найдете. Поэтому для этих целей лучше использовать УникальныйИдентификатор.
Изменение даты в пределах переодичности нумератора документа (чаще всего это год) на поиск не влияют. Измение номера явление достаточно редкое. А уникальный идентификатор слишком большой.
см.
Теорию можно почитать на
//>>>>>>>>>>>>>>>>>>>>>>>>> Хеш
#Область РасчетХешКодов
#Область ПолиномиальныйХеш
//////////////////////////////////////////////////////////// ///// - Полиномиальный хеш (главная функция, с разбивкой по блокам)
// Для ускорения работы с большими текстами, текст разбивается на блоки
// Данная функция разбивает исходный текст (Параметр "Строка") на блоки длиной <ДлинаБлока>, по умолчанию длина блока 64 символа
// и вычисляет хэш результат для всего текста (возвращая ХешКод, по умолчанию 20-значный, как остаток от деления на 64-битное число) .
// == Основу взято из
// == Теорию можно почитать на
Функция Хэш_Полиномиальный (Строка, ДлинаБлока = 64, hash = 0, M = 31, TABLE_SIZE = 18446744073709551615)
НачПозиция = 1;
ДлинаСтроки = СтрДлина(Строка);
Пока НачПозиция<=ДлинаСтроки цикл
hash = Хэш_Полиномиальный_ОдинБлок(Сред(Строка, НачПозиция, ДлинаБлока), hash, M);
НачПозиция = НачПозиция + ДлинаБлока;
КонецЦикла;
возврат hash%TABLE_SIZE;
КонецФункции
//////////////////////////////////////////////////////////// ///// - Полиномиальный хеш - для однго блока
//СтрокаХэш - исходный текст
//hash- начальное значение hash
// М - множитель (влияет накачество хэш и производительность)
// TABLE_SIZE - размер получаемого ключа, как Максимальная величина + 1
//TABLE_SIZE = 18446744073709551616-1; 64 бита
//TABLE_SIZE = 67108864-1; 26 бита 8 разрядов
//TABLE_SIZE = 8388608-1; 23 бита 7 разрядов
//M = 31; Умножитель
Функция Хэш_Полиномиальный_ОдинБлок(СтрокаХэш, hash = 0, M = 31, TABLE_SIZE = 18446744073709551615)
ДлинаСтроки = СтрДлина(СтрокаХэш);
Для к=1 по ДлинаСтроки цикл
hash = M * hash + КодСимвола(Сред(СтрокаХэш,к,1));
конеццикла;
возврат hash;
КонецФункции
#КонецОбласти
//////////////////////////////////////////////////////////// ///// - Символьный хеш или "Хеш-функция для строковых ключей" источник
//СтрокаХэш - исходный текст
// Парам_М - основа, определяет длину Хеш (по умолчанию = 909 091):
// 909 091 -простое число для расчета по 6 разрядного хеш (еще есть М= 8388607, надо было брать 999983, но его поздно нашел, но в других алгоритмах рекомендую...)
// 9 999 907 -простое число для расчета по 7 разрядного хеш
// 99 999 827 -простое число для расчета по 8 разрядного хеш
// Парам_а - множитель, по умолчанию простое число = 127 для ANSI ( для UTF8 рекомендуеться 65537)
Функция Хэш_Символьный(СтрокаХэш, Парам_М=909091, Парам_а=127)
ДлинаСтроки = СтрДлина(СтрокаХэш);
hash=0;
Для к=1 по ДлинаСтроки цикл
hash = (Парам_а * hash + КодСимвола(Сред(СтрокаХэш,к,1)))%Парам_М;
конеццикла;
возврат hash;
КонецФункции
#КонецОбласти ПоказатьМне пришлось реализовывать механизм транслитерации для обхода этого ограничения.
ЗЫ Вроде у 1С есть стандартная компонента "1С:Печать штрихкодов", зачем такие сложности с подключением? ... или в 8.2 все иначе :oops:
(11) - для 8.2 не покатит по-моему для тонкого и веб клиента
Обязательно имя рисунка должно начинаться на «Штрихкод”!!!!
В тело функции печати печатной формы добавляем:
Выполнял схожую задачу в рамках проекта электронного хранения документов, но на 8.1 для УПП. Когда штрихкодировать нужно не один документ, а много. И решил
задачу вывода штрихкода без изменения типовых макетов и модулей печатных форм.
Дело в том, что вывод типовых печатных форм идет через функцию общего модуля, в ней "ловится"
выводимый документ и пристыковывается снизу к общему макету, на котором единственно что есть - штрихкод.
Ниже код (честно признаюсь, часть кода я позаимствовал), может кому пригодится.
Мое решение не самое лучшее, так как штрихкод смещает документ при выводе. Я у коллег видел красивое решение в котором место вывода штрихкода задается интерактивно с помощью приблуды для
каждой печатной формы, макеты при этом не меняется. Подозреваю, что они при выводе также рисуют картинку в указанных для печатной формы координатах.
Процедура НапечататьДокумент(ПечДокумент, КоличествоЭкземпляров = 1, НаПринтер = Ложь, Заголовок = "", Ссылка = Неопределено, ИсточникМакета = Неопределено) Экспорт
Если ПечДокумент = Неопределено тогда
Возврат;
КонецЕсли;
Если ЗначениеЗаполнено(Ссылка) и ИнтеграцияЭХД_ИТ.ПроверитьВхождениеДокументаВПереченьЭХД(Ссылка) и ИнтеграцияЭХД_ИТ.ПолучитьВидДокументаЭХД(Ссылка) = 2 Тогда
МакетОбщ = ПолучитьОбщийМакет("ШтрихКод");
Область = МакетОбщ.ПолучитьОбласть("Штрихкод");
ОбщМаскаКода = "000000000000";
Код = ИнтеграцияЭХД_ИТ.ВернутьШтрихКодДокументаЭХД(Ссылка);
ТипКода = ПланыВидовХарактеристик.ТипыШтрихкодов.Code128;
ТипКодаЗнч = УправлениеРозничнойТорговлей.ПолучитьЗначениеТипаШтрихкодаДляЭУ(ТипКода);
Если УправлениеРозничнойТорговлей.ПроверитьШтрихКод(Код,ТипКода) Тогда
Попытка
Область.Рисунки.ШтрихКодТО.Объект.ТипКода = ТипКодаЗнч;
Область.Рисунки.ШтрихКодТО.Объект.Сообщение = Код;
Исключение
Сообщить("Для вывода штрихкода на печатную форму необходимо установать ""1С:Печать штрихкодов"" ");
КонецПопытки;
КонецЕсли;
табт = новый ТабличныйДокумент;
табт.Вывести(Область);
табт.ИмяПараметровПечати = ПечДокумент.ИмяПараметровПечати;
табт.ОриентацияСтраницы = ПечДокумент.ОриентацияСтраницы;
ДобавитьТабличныйДокумент(табт, ПечДокумент);
ПечДокумент = табт;
ПечДокумент.ТолькоПросмотр = истина;
КонецЕсли;
...
КонецПроцедуры
Функция СтрокаТабличногоДокументаИмеетФормат(ТабличныйДокумент, НомерСтроки)
тбФормата = Новый ТабличныйДокумент;
ШиринаКолонки = ТабличныйДокумент.Область("R"+НомерСтроки+"C1").ШиринаКолонки + 1;
тбФормата.Область("R1C1").ШиринаКолонки = ШиринаКолонки;
тбФормата.ВставитьОбласть(ТабличныйДокумент.Область("R"+НомерСтроки),тбФормата.Область("R1C1"));
Если НЕ тбФормата.Область("R1C1").ШиринаКолонки = ШиринаКолонки Тогда
Возврат Истина;
Иначе
Возврат Ложь;
КонецЕсли;
КонецФункции
Функция ПолучитьНомерСтрокиКонцаФормата(ПечДокумент,НомерНачальнойСтроки)
фл = СтрокаТабличногоДокументаИмеетФормат(ПечДокумент, НомерНачальнойСтроки);
Для i = НомерНачальнойСтроки + 1 По ПечДокумент.ВысотаТаблицы Цикл
Если СтрокаТабличногоДокументаИмеетФормат(ПечДокумент, i) <> фл Тогда
Возврат (i-1);
КонецЕсли;
Для j = 1 По ПечДокумент.ШиринаТаблицы Цикл
Если НЕ ПечДокумент.Область("R"+НомерНачальнойСтроки+"C"+j).ШиринаКолонки = ПечДокумент.Область("R"+i+"C"+j).ШиринаКолонки Тогда
Возврат (i-1);
КонецЕсли;
КонецЦикла;
КонецЦикла;
Возврат ПечДокумент.ВысотаТаблицы;
КонецФункции
Процедура ДобавитьТабличныйДокумент(ВыходнойДокумент, ПечДокумент)
i = 1;
Пока i < ПечДокумент.ВысотаТаблицы Цикл
k = ПолучитьНомерСтрокиКонцаФормата(ПечДокумент,i);
ОбластьСтроки = ПечДокумент.Область(i,,k,);
ОбластьСтроки.СоздатьФорматСтрок();
ВыходнойДокумент.ВставитьОбласть(ОбластьСтроки, ВыходнойДокумент.Область(ВыходнойДокумент.ВысотаТаблицы + 1, , ВыходнойДокумент.ВысотаТаблицы + 1+(k-i), ));
i = k + 1;
КонецЦикла;
КонецПроцедуры ПоказатьПервый - перекодирование в бинарный формат уникального идентификатора, иначе картинка штрих-кода слишком длинная.
Второй - специальная перекодировочная табличка (регистр сведений) - объект->код.
Печать в обоих случаях без каких либо компонент шрифтом BarCode.
Естественно, макеты нужно менять. Но у меня не стандартная конфигурация, посему это не вызвало проблем.
{ВнешняяОбработка.ххх.МодульОбъекта(296)}: Поле объекта недоступно для записи (Картинка)
Рисунок.Картинка = Обработки.ПечатьЭтикетокИЦенников.ПолучитьКартинкуШтрихкода(ВнешняяКомпонента, ПараметрыШтрихкода);
Скрин из отладчика:
Обработки.ПечатьЭтикетокИЦенников.ПолучитьКартинкуШтрихкода(ВнешняяКомпонента, ПараметрыШтрихкода); - тут возвращается картинка, вот кусок модуля "ПолучитьКартинкуШтрихкода":
// Сформируем картинку
ДвоичныеДанныеКартинки = ВнешняяКомпонента.ПолучитьШтрихкод();
// Если картинка сформировалась
Если ДвоичныеДанныеКартинки <> Неопределено Тогда
// Формируем из двоичных данных
Возврат Новый Картинка(ДвоичныеДанныеКартинки);
КонецЕсли;
Показатьвот из отладчика
все хорошо, но почему "Рисунок.Картинка " - не доступен для записи?
в чем может быть проблема
Процедура ВнешнееСобытие(Источник, Событие, Данные)
ПолучитьСерверТО().ОбработатьВнешнееСобытие(Источник, Событие, Данные, );
КонецПроцедуры // ВнешнееСобытие()
Или ещё что-то? И вставить в модуль формы Документа контрагентов или куда?
По поводу формы списка номенклатуры могу сказать, что наш с товарищем Арутюновым вопрос касается другого объекта конфигурации.
Форма списка номенклатуры относится к справочнику, а мы спрашиваем вас про журнал. Вобщем пока никаие источники информации не позволяют однозначно судить о возможности привязки внешнего события к журналу документов
Но у меня в данный момент воз и не сдвинулся.
Событие формы "Внешнее событие" привязано к одноименной процедуре. А что такого вы добавили в событие "При открытии"?
Функция ПоддерживаетсяВидТО(Вид) Экспорт
Результат = Ложь;
Если Вид = Перечисления.ВидыТорговогоОборудования.СканерШтрихКода Тогда
Результат = Истина;
КонецЕсли;
Возврат Результат;
КонецФункции // ПоддерживаетсяВидТО()
Реально не хватало
Процедура ПриОткрытии()
ПолучитьСерверТО().ПодключитьКлиента(ЭтаФорма);
КонецПроцедуры
Я ще вставлю свои пять копеек. Не заморачивайтесь с вариантом создания ШК с кодированием номеров документов. Используйте сразу GUID объекта. Шансов нарваться на кирилический символ в коде объекта очень много. Оно вам надо?
Если вы сильно ограничены областью в которую необходимо выводить ШК, и 36 символов у вас не влезают, то лучше вынести в константы или регистр сведений ту часть гуида, которая повторяется в объектах принадлежащих к одному типу данных. Нужно только помнить, что если вы пересоздадите базу, эти значения изменятся.
Правда, не понятно, почему, но для толстого клиента функции работают из общего модуля (добавила в РаботаСТорговымОборудованием), а для тонкого клиента почему-то они не видны - Предприятие даже не загружается - сразу выдает ошибку. Пришлось их вставить в модуль менеджера документа, откуда идет печать.
Может я чего-то недопонимаю?
А вот как штрихкод попадает в доп. свойства документа и откуда он берется - об этом я, возможно тоже напишу статью.
Перем мКартинкаШтрихкода;
Перем мНадписьТекст;
//Получает данные о штрихкоде объекта. Если у объекта нет штрихкода, он присваивается
//Параметры:
// Объект - ссылка на объект, данные о штрихкоде которого собираются
// ВысотаКартинкиВПроцентах - высота изображения штрихкода в процентах
//Возвращает:
// структура
// Штрихкод - значение штрихкода
// ДвоичныеДанныеИзображенияШК - двоичные данные изображения штрихкода
// ДвоичныеДанныеФайла - двоичные данные файла, если Объект - это файл
// НеобходимостьВставкиВместоТэга - влаг, показывающий, что штрихкод только сформирован для файла
// и что необходимо выполнить попытку вставить изображение штрихкода вместо тэга в файле
// ВставкаШКвMSнаСервере - флаг, показывающий, что вставка изображения в файл MS Word выполняется на сервере
// НастройкиШтрихкода - структура из персональных настроек
// ПоказыватьФормуНастройкиШтрихкода - показывать форму настройки положения штрихкода
// ПоложениеШтрихкодаНаСтранице - значение из перечисления ВариантыРасположенияШтрихкода
// СмещениеПоГоризонтали - расстояние от левого края страницы
// СмещениеПоВертикали - расстояние от верха страницы
//
// Неопределено, если объект - это файл в папке ШаблоныФайлов
&НаСервере
Функция ПолучитьДанныеДляВставкиШтрихкодаВОбъект(Ссылка,НеобходимоПередаватьСодержимоеФайла = Истина)
ДанныеШК = Новый Структура;
ДанныеШК.Вставить("ДвоичныеДанныеИзображенияШК", Неопределено);
НеобходимостьВставкиВместоТэга = Ложь;
Штрихкод = Неопределено;
//Пытаемся найти штрихкод у объекта
ЗначениеШтрихкода = ПолучитьШтрихКод(Ссылка);
Если ЗначениеШтрихкода = Неопределено ИЛИ ПустаяСтрока(ЗначениеШтрихкода) Тогда
Сообщить("Штрихкод для данного документа не сформирован");
Иначе
Штрихкод = ЗначениеШтрихкода;
КонецЕсли;
Если НЕ Штрихкод = Неопределено Тогда
//Вставим значение ШК
ДанныеШК.Вставить("Штрихкод", Штрихкод);
//получаем изображение штрихкода
ДвоичныеДанныеИзображенияШК = ПолучитьКартинкуШтрихкода(Штрихкод,,21,Истина);
ДанныеШК.ДвоичныеДанныеИзображенияШК = ДвоичныеДанныеИзображенияШК;
Возврат ДанныеШК;
Иначе
Возврат Неопределено;
КонецЕсли;
КонецФункции
&НаСервере
Функция ПолучитьШтрихКод(Ссылка)
НаборЗаписей = РегистрыСведений.ДополнительныеСведения.СоздатьНаборЗаписей();
НаборЗаписей.Отбор.Объект.Установить(Ссылка);
НаборЗаписей.Отбор.Свойство.Установить(ПланыВидовХарактеристик.ДополнительныеРеквизитыИСведения.НайтиПоНаименованию("Штрихкод"));
НаборЗаписей.Прочитать();
Для Каждого Запись Из НаборЗаписей Цикл
Возврат Запись.Значение;
КонецЦикла;
Возврат Неопределено;
КонецФункции //ПолучитьШтрихКод()
//Получает изображение штрихкода
//Параметры:
// Код - значение штрихкода
// ТипКода - формат штрихкода. По умолчанию EAN-13
// ВысотаВПроцентах - высота штрихкода в процентах
//Возвращает:
// Картинка с изображением штрихкода
&НаСервере
Функция ПолучитьКартинкуШтрихкода(Код, ТипКода = 1, ВысотаВМиллиметрах, ВставлятьЦифры) Экспорт
// В зависимости от типа платформы подключим соответствующую внешнюю компоненту
ИнформацияОСистеме = Новый СистемнаяИнформация;
Если ИнформацияОСистеме.ТипПлатформы = ТипПлатформы.Windows_x86 Тогда
СтрокаАдресаКомпонентыПечатиШК = "\\192.168.0.18\tmplts\ExternalComponentOfThePressOfBarcode\КомпонентаПеч атиШтрихкодовВин32.dll";
ИначеЕсли ИнформацияОСистеме.ТипПлатформы = ТипПлатформы.Windows_x86_64 Тогда
СтрокаАдресаКомпонентыПечатиШК = "\\192.168.0.18\tmplts\ExternalComponentOfThePressOfBarcode\КомпонентаПеч атиШтрихкодовВин32.dll";
КонецЕсли;
ПодключитьВнешнююКомпоненту(СтрокаАдресаКомпонентыПечатиШК, "КартинкаШтрихкода", ТипВнешнейКомпоненты.Native);
// Создадим объект внешней компоненты
Компонент = Новый("AddIn.КартинкаШтрихкода.Barcode");
Компонент.ОтображатьТекст = ВставлятьЦифры;
// Если нет возможности рисовать
Если НЕ Компонент.ГрафикаУстановлена Тогда
// То картинку сформировать не сможем
Возврат Неопределено;
КонецЕсли;
Если ИнформацияОСистеме.ТипПлатформы = ТипПлатформы.Linux_x86
ИЛИ ИнформацияОСистеме.ТипПлатформы = ТипПлатформы.Linux_x86_64 Тогда
Если Компонент.НайтиШрифт("DejaVu-Serif-Book") = Истина Тогда
Компонент.Шрифт = "DejaVu-Serif-Book";
Иначе
Возврат Неопределено;
КонецЕсли;
Иначе
// Если в системе установлен шрифт Arial
Если Компонент.НайтиШрифт("Arial") Тогда
// Выбираем его как шрифт для формирования картинки
Компонент.Шрифт = "Arial";
Иначе
// Шрифт Arial в системе отсутствует
// Обойдем все доступные компоненте шрифты
Для Сч = 0 По Компонент.КоличествоШрифтов -1 Цикл
// Получим очередной шрифт, доступный компоненте
ТекущийШрифт = Компонент.ШрифтПоИндексу(Сч);
// Если шрифт доступен
Если ТекущийШрифт <> Неопределено Тогда
// Они и будет шрифтом для формирования штрихкода
Компонент.Шрифт = ТекущийШрифт;
Прервать;
КонецЕсли;
КонецЦикла;
КонецЕсли;
КонецЕсли;
// Установим размер шрифта
Компонент.РазмерШрифта = 12;
Компонент.ОриентацияТекста = 3;
// Зададим размер картинки
Если НЕ ЗначениеЗаполнено(ВысотаВМиллиметрах) Тогда
ВысотаВМиллиметрах = 21;
КонецЕсли;
Компонент.Высота = Число(Формат((ВысотаВМиллиметрах/35.3) * 100, "ЧДЦ=0"));
//EAN-13 по умолчанию
Компонент.ТипКода = ТипКода;
// Если код содержит контрольный символ, обязательно указываем
Компонент.СодержитКС = Истина;
// Формируем картинку штрихкода
Компонент.ЗначениеКода = Код;
Компонент.Ширина = Компонент.МинимальнаяШиринаКода + 5;
// Сформируем картинку
ДвоичныеДанныеКартинки = Компонент.ПолучитьШтрихкод();
// Если картинка сформировалась
Если НЕ ДвоичныеДанныеКартинки = Неопределено Тогда
// Формируем из двоичных данных
Картинка = Новый Картинка(ДвоичныеДанныеКартинки);
Возврат Картинка;
КонецЕсли;
Возврат Неопределено;
КонецФункции
____________________________________________________________ _______________________________________
а вот этот кусочек встроить там, где выводится область с рисунком ШК:
ДанныеОШтрихкоде = ПолучитьДанныеДляВставкиШтрихкодаВОбъект(ВыборкаПоШапке.Ссылка, Ложь);
Если ДанныеОШтрихкоде <> Неопределено
И ДанныеОШтрихкоде.Свойство("ДвоичныеДанныеИзображенияШК") Тогда
КартинкаШтрихкода = ПолучитьКартинкуШтрихкода(ДанныеОШтрихкоде.Штрихкод,,21,Истина);
Если ДанныеОШтрихкоде.Свойство("СообщениеОбОшибке") Тогда
ВызватьИсключение(ДанныеОШтрихкоде.СообщениеОбОшибке);
КонецЕсли;
Если НЕ КартинкаШтрихкода = Неопределено Тогда
ОриентацияПортрет = Истина;
ОриентацияПортрет = Истина;
Рисунок = Шапка.Область("Картинка");
Рисунок.Высота = 19;
Рисунок.Ширина = 37;
Рисунок.Картинка = КартинкаШтрихкода;
Надпись = Шапка.Область("НадписьЗаголовок");
Надпись.Текст = ВыборкаПоШапке.ОрганизацияПолучатель.Наименование;
//Расположение элементов штампа относительно друг друга
Надпись.Лево = Рисунок.Лево;
Надпись.Верх = Рисунок.Верх - Надпись.Высота;
мНадписьТекст = ВыборкаПоШапке.ОрганизацияПолучатель.Наименование;
мКартинкаШтрихкода = КартинкаШтрихкода;
КонецЕсли; ПоказатьОбластьМакета.Рисунки.ШтрихКод.Объект.Сообщение = ВРег(СокрЛП(СсылкаНаОбъект[0].Ссылка.УникальныйИдентификатор()))В обычном приложении печ.форма формируется правильно(в об.приложении ОбластьМакета.Рисунки.ШтрихКод.Объект=ActiveX, а в управл.приложении ОбластьМакета.Рисунки.ШтрихКод.Объект=Null). Подскажите,в чем может быть проблема? Заранее спасибо
встраивание штрих-кодов идёт не через стандартный функционал, а через более функциональную библиотеку.
Перед выводом макета области со штрихкодом:
ИМЯОБЩЕГОМОДУЛЯ.ВывестиШтрихкодДокументаВОбластьМакета(ВнешняяКомпонента,ОбластьМакета,"PER"+СтрЗаменить(Формат(Шапка.Дата,"ДФ=dd.MM.yy"),".","")+Шапка.Номер);
Куда это вставлять можно более детально?
ПередВыводомМакетаОбластиСоШтрихкодом<<?>>: (Проверка: Толстый клиент (обычное приложение))
Дает что неопознанный оператор
Перед <<?>>Выводом Макета Области Со Штрихкодом: (Проверка: Толстый клиент (обычное приложение))
Точнее так!
Пробую сделать как в статье, но в печатной форме выводится как на скрине.
В переменную "ЗначениеШтрихкода" я передаю строку ГУИДа документа.
На макете картинка как у вас. Код не трогал.
Что я делаю не так?
UPD
Изменил ТипКода на 4 (тип кода - CODE128), выводится ШК
// Параметры:
// ТипКода число от 0 до 16
// EAN8, EAN13, EAN128, Code39, Code128, Code16k, PDF417, Standart (Industrial) 2 of 5, Interleaved 2 of 5, Расширение Code39, Code93, ITF14, RSS14, CodaBar, EAN13 AddOn 2, EAN13 AddOn 5
Нужно было посмотреть как оно работает и как выглядит (в частности мне нужен был PDF417)
написал обработку для демонстрации возможностей всех типов штрихкодов (во вложении)
так же можно посмотреть по ссылке
в конфигурации обязательно должен быть компонент ОбщийМакет.КомпонентаПечатиШтрихкодов (можно загрузить в свою конфу из указанной папки)
ОбщийМакет_КомпонентаПечатиШтрихкодов
Сам его использую. После последнего обновления БПО с 2.1.1.12 на 2.1.1.32 штрихкод стал нечитабельным. 1С заявляет что проблема с
Компонент.Высота = Компонент.МинимальнаяВысотаКода+50;
Компонент.Ширина = Компонент.МинимальнаяШиринаКода;Собственно если раньше ШК состоял из 7 строк, а остальное было забито пустыми символами, то теперь компонента забивает его целиком. Непойму как корректно высчитывать высоту и ширину, если не указывать то получаешь ошибку.
я не совсем понял в чем проблема (нечитабильность сканером?)
я использую PDF417, с ним следующие нюансы:
1) много проблем было при использовании внешнего компонента 1cbarcode_8.0... подбирал опытным путем:
ОбластьБирка.Рисунки.ШтрихКод_PDF417.Объект.ТипКода = 6;
ОбластьБирка.Рисунки.ШтрихКод_PDF417.Объект.Сообщение = Парам_ДанныеДляПечати.СерийныйНомер;
ОбластьБирка.Рисунки.ШтрихКод_PDF417.Объект.Пропорции = "1:4";
ОбластьБирка.Рисунки.ШтрихКод_PDF417.Объект.УровеньКоррекции = 4;
ОбластьБирка.Рисунки.ШтрихКод_PDF417.Объект.ВыравниваниеКода = 2;
вариативность была для Пропорции, УровеньКоррекции, ВыравниваниеКода
(проверял телефоном считывание, сканер почти всегда читал)
2) при использовании компонент ОбщийМакет.КомпонентаПечатиШтрихкодов проблем не было, сразу как-то пошло (но проверял только сканером, на телефоне нет автофокуса, а тот что раньше проверял "ушел")
параметры высоты и ширины целесообразно рассчитывать с использованием эталонного рисунка (Макет "Эталон"), это подобранный рисунок (100пикселей вроде в 10х10 мм, но точно уже не помню), брал из конфы УТ, можно взять из моей обработки (см. рисунок и комментарий раньше)
#Область Рис_Штрихкода
м_КоличествоМиллиметровВПикселе=Получить_КоличествоМиллиметр овВПикселе();
Рисунок_ШК=ОбластьБирка.Рисунки.Рис_ШК_Партии;
ПараметрыШтрихкода = Новый Структура;
ПараметрыШтрихкода.Вставить("Ширина", Окр( 180 / м_КоличествоМиллиметровВПикселе));
ПараметрыШтрихкода.Вставить("Высота", Окр( 20 / м_КоличествоМиллиметровВПикселе));
ПараметрыШтрихкода.Вставить("Штрихкод", СокрЛП(Парам_ДанныеДляПечати.Серия_Номер));
ПараметрыШтрихкода.Вставить("ТипКода", 6); // Штрихкод PDF417
ПараметрыШтрихкода.Вставить("ОтображатьТекст", Ложь);
ПараметрыШтрихкода.Вставить("РазмерШрифта", 12);
м_Картинка = МенеджерОборудованияВызовСервера_ПолучитьКартинкуШтрихкода(ПараметрыШтрихкода);
Если ЗначениеЗаполнено(м_Картинка) Тогда
Рисунок_ШК.Картинка = м_Картинка ;
Рисунок_ШК.ВыводитьНаПечать = Истина;
иначе
Рисунок_ШК.ВыводитьНаПечать = Ложь;
КонецЕсли;
#КонецОбласти
//..............
Функция Получить_КоличествоМиллиметровВПикселе()
Эталон = ПолучитьМакет("Эталон");
Возврат Эталон.Рисунки.Квадрат100Пикселей.Высота / 100;
КонецФункции // ()
ПоказатьP.S. Редко захожу, так что ответы обычно с задержкой :(
В связи с последними оптимизациями 8.3.18 при сохранении печатной формы в PDF, картинка заменяется на черный прямоугольник. При замене картинки на изображение png сохранение происходит корректно.
Вы можете заказать платную консультацию или разработку у автора. Будет создан приватный заказ на «Бирже заказов» для автора.
№ 79415
Создание 14.12.10 17:36
Обновление 23.12.10 13:07
Просмотры 78311
Загрузки 0
Рейтинг
133
Комментарии 63
Код открыт Не указано
Рубрики Адаптация типовых решений
Кому Разработчик
Тип файла Нет файла
Платформа 1С:Предприятие 8
Конфигурация 1C:Бухгалтерия
Операционная система Не имеет значения
Страна Россия
Отрасль Не имеет значения
Налоги Не имеет значения
Вид учета Не имеет значения
Доступ к файлу Бесплатно (free)