gifts2017

Стандартные доработки. Штрихкодирование документов.

Опубликовал Олег Молочников (milkers) в раздел Программирование - Практика программирования

Эта статья описывает процесс доработки типовых 1С конфигураций, для добавления функционала штрихкодирования   документов и быстрого их поиска по штрихкоду.  Метод работает для управляемых и неуправляемых печатных форм.

Молочников Олег 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:Заранее благодарен за любые замечания и исправления.

 

См. также

Подписаться Добавить вознаграждение

Комментарии

1. kingan (kingan) 15.12.10 09:08
При формировании штрих кода по дате и номеру нужно учитывать, что если после распечатки документа будет изменен его дата или номер, то вы его не найдете. Поэтому для этих целей лучше использовать УникальныйИдентификатор.
wolder; shalimski; asg.aleks; vasiliy_b; smit1c; YuriFm; Yakud3a; pumbaE; artbear; Sherlock_kmw; straus; +11 Ответить
2. Олег Молочников (milkers) 15.12.10 10:47
kingan пишет:
При формировании штрих кода по дате и номеру нужно учитывать, что если после распечатки документа будет изменен его дата или номер, то вы его не найдете. Поэтому для этих целей лучше использовать УникальныйИдентификатор.

Изменение даты в пределах переодичности нумератора документа (чаще всего это год) на поиск не влияют. Измение номера явление достаточно редкое. А уникальный идентификатор слишком большой.
3. Алексей (parcan) 15.12.10 11:40
EAN128 допускает наличие в штрих-коде символов кириллицы?
4. Олег Молочников (milkers) 15.12.10 12:01
5. Алексей Ситников (SiAl) 15.12.10 12:42
Плюс за работу. Советую изменить
Если ВнешняяКомпонента.НайтиШрифт("Tahoma") = Истина Тогда

на
Если ВнешняяКомпонента.НайтиШрифт("Tahoma") Тогда
6. Артур Аюханов (artbear) 15.12.10 14:52
Лично я юзаю штрихкод "УникальныйИД + сумма документа" для контроля печатной формы, чтобы сразу исключить поддельные печатные формы.
7. Олег Молочников (milkers) 15.12.10 15:39
(6) Хочу напомнить, что хотя в EAN128 длина штрихкода не ограниченна, остается еще и задача размещения штрихкода на печатных формах. И здесь чем он короче, тем это проще.
8. Сергей Тучин (SergeyT2006) 16.12.10 04:08
У Вас наверное только одна организация? Ибо может оказаться, а окажется обязательно, что существуют в одном году несколько документов одного типа, с одним номером, точнее с одной цифровой частью. Либо у Вас префикс номеров - латиница! Но об этом ограничении у Вас нигде не сказано.
Мне пришлось реализовывать механизм транслитерации для обхода этого ограничения.
ЗЫ Вроде у 1С есть стандартная компонента "1С:Печать штрихкодов", зачем такие сложности с подключением? ... или в 8.2 все иначе :oops:
9. Максим Полянский (yandextesting) 16.12.10 10:32
Из каких именно типовых конфигураций можно взять макеты КомпонентаПечатиШтрихкодов...? В УТ 11 - нет, в УПП 1.3 - нет, думал в библиотеке стандарных подсистем должны быть - тоже нет.
webfedor16; +1 Ответить 1
10. Сергей Тучин (SergeyT2006) 16.12.10 10:35
Можно взять на диске ИТС, на сайте 1С... Могу выслать на мыло.
11. Сергей Тучин (SergeyT2006) 16.12.10 10:36
Файл называется "1CBarCode.exe"
12. Максим Полянский (yandextesting) 16.12.10 12:25
Нашел макеты не в общих макетах, а в макетах обработки печати ценников и этикеток;
(11) - для 8.2 не покатит по-моему для тонкого и веб клиента
13. vladsol c (vladsol) 16.12.10 19:44
Модифицируем печатные формы документов следующим образом: Добавим на печатные формы требуемых документов изображение штрихкода как на рисунке с примером макета.

Обязательно имя рисунка должно начинаться на «Штрихкод”!!!!

В тело функции печати печатной формы добавляем:



Выполнял схожую задачу в рамках проекта электронного хранения документов, но на 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;
      КонецЦикла; 
КонецПроцедуры
...Показать Скрыть
m_005; milkers; +2 Ответить
14. Олег Молочников (milkers) 23.12.10 14:50
(9)(11)(12) Откройте конфигурацию "управление небольшой фирмой". Сделайте глобальный поиск "КомпонентаПечатиШтрихкодовWindows32" только по свойствам. Скопируйте через буфер обмена готовый макет (сначала встав на него в дереве конфигурации) и вставьте его в ветку "общие макеты" в своей конфигурации. Аналогично остальные макеты.
15. Игорь Л. (ilp06) 31.12.10 12:22
Я делал двумя путями.
Первый - перекодирование в бинарный формат уникального идентификатора, иначе картинка штрих-кода слишком длинная.
Второй - специальная перекодировочная табличка (регистр сведений) - объект->код.
Печать в обоих случаях без каких либо компонент шрифтом BarCode.
Естественно, макеты нужно менять. Но у меня не стандартная конфигурация, посему это не вызвало проблем.
17. Дмитрий Ткачев (Ткачев) 04.10.11 19:21
(0)>3. Модифицируем печатные формы документов следующим образом: Добавим на печатные формы требуемых документов изображение штрихкода как на рисунке с примером макета.
Где взять изображение штрихкода ?
18. Sardor Baboev (mugambi) 06.10.11 14:18
(8) SergeyT2006, компонента 1С:Печать штрихкодов не работает в Тонком клиенте
19. Владимир Буоц (vbuots) 31.01.12 13:47
Помогите разобраться, кусок этого модуля скопировал 1:1. Только, есть одно отличие, модуль находится во внешней обработке.
Ошибка:
{ВнешняяОбработка.ххх.МодульОбъекта(296)}: Поле объекта недоступно для записи (Картинка)
Рисунок.Картинка = Обработки.ПечатьЭтикетокИЦенников.ПолучитьКартинкуШтрихкода(ВнешняяКомпонента, ПараметрыШтрихкода);

Скрин из отладчика:
20. Олег Молочников (milkers) 31.01.12 13:53
(19) Почему Объект - ActiveX? Объект должен же быть просто картинкой.
21. Владимир Буоц (vbuots) 31.01.12 14:09
(20) milkers,
Обработки.ПечатьЭтикетокИЦенников.ПолучитьКартинкуШтрихкода(ВнешняяКомпонента, ПараметрыШтрихкода); - тут возвращается картинка, вот кусок модуля "ПолучитьКартинкуШтрихкода":
	// Сформируем картинку
	ДвоичныеДанныеКартинки = ВнешняяКомпонента.ПолучитьШтрихкод();
	
	// Если картинка сформировалась
	Если ДвоичныеДанныеКартинки <> Неопределено Тогда
		// Формируем из двоичных данных
		Возврат Новый Картинка(ДвоичныеДанныеКартинки);
	КонецЕсли;
...Показать Скрыть


вот из отладчика

все хорошо, но почему "Рисунок.Картинка " - не доступен для записи?
22. Олег Молочников (milkers) 31.01.12 14:21
(21) Внимательно посмотри тип объекта в шаблоне печатной форме. В режиме управляемых форм activex объекты не используются. Удали объект из шаблона и вставь, как в стандартной конфигурации, просто рисунок. Картинка этого рисунка и создается в Рисунок.Картинка = Обработки.ПечатьЭтикетокИЦенников.ПолучитьКартинкуШтрихкода(ВнешняяКомпонента, ПараметрыШтрихкода);
23. Владимир Буоц (vbuots) 31.01.12 15:08
(22) milkers,
Спасибо большое, я уже отчаялся, подставил обычную картинку, все заработало.
24. msv23 Иванов (msv23) 30.05.12 23:15
Рисунок.Картинка = ПолучитьКартинкуШтрихкода(ВнешняяКомпонента, 361, 50, ЗначениеШтрихкода, 3);

Последний параметр тип штрихкода. 3 это тип Code39.
25. Денис Стюров (pitbul) 17.07.12 21:33
А вазможно ли эту доработку реализовать в конфигурации УТ 10.3...
26. Олег Молочников (milkers) 17.07.12 21:37
27. Андрей Кодола (Apostol_Andrey) 09.08.12 18:41
при печати документа штрихкод есть, а на предварительном просмотре нет
в чем может быть проблема
28. Павел Арутюнов (Arutunov) 21.12.12 12:29
Конф УТ 10.3 Подскажите пожалуйста не сориентируюсь, как добавить в Общий журнал документов, обработку внешнего события, что-бы начать обрабатывать сигнал от сканера для поиска документа?
29. Олег Молочников (milkers) 21.12.12 12:56
(28) Arutunov, Скопируйте соответствующий код из любого документа или справочника. Например справочник номенклатура.
30. Павел Арутюнов (Arutunov) 21.12.12 14:17
(29)Я правильно понимаю, нужно скопировать процедуру
Процедура ВнешнееСобытие(Источник, Событие, Данные)


ПолучитьСерверТО().ОбработатьВнешнееСобытие(Источник, Событие, Данные, );

КонецПроцедуры // ВнешнееСобытие()
Или ещё что-то? И вставить в модуль формы Документа контрагентов или куда?
31. Валентин Елфимов (ratinc) 22.12.12 05:43
(29) Внешнее событие по какойто причине не срабатывает у журнала документов.
К форме привязано, в любых формах кроме журналов срабатывает.
Не подскажите как отловить событие именно в журнале?
32. Павел Арутюнов (Arutunov) 22.12.12 12:03
33. Олег Молочников (milkers) 22.12.12 12:21
(31)(32) Вы не правы, посмотрите формы списка номенклатуры например. Если будет время посмотрю, но сегодня не успеваю.
34. Валентин Елфимов (ratinc) 22.12.12 23:47
(33) Я ничего не утверждаю, посему не могу быть неправым. В моем посте содержится вопрос.
По поводу формы списка номенклатуры могу сказать, что наш с товарищем Арутюновым вопрос касается другого объекта конфигурации.
Форма списка номенклатуры относится к справочнику, а мы спрашиваем вас про журнал. Вобщем пока никаие источники информации не позволяют однозначно судить о возможности привязки внешнего события к журналу документов
35. Павел Арутюнов (Arutunov) 25.12.12 16:40
(34)ratinc это мы с тобой тормозим, а не программа. Просто в свойствах формы журнала документов нужно прописать процедуру Внешнее событие и процедуру при открытии, и все пойдет.
36. Валентин Елфимов (ratinc) 25.12.12 18:08
(35) Я конечно понимаю, что как всегда проблема в какой нибудь галочке.
Но у меня в данный момент воз и не сдвинулся.
Событие формы "Внешнее событие" привязано к одноименной процедуре. А что такого вы добавили в событие "При открытии"?
37. Павел Арутюнов (Arutunov) 26.12.12 12:03
В Процедуру ПриОткрытии надо всего навсего добавить ПолучитьСерверТО().ПодключитьКлиента(ЭтаФорма);
38. Павел Арутюнов (Arutunov) 26.12.12 12:06
А еще нужно добавить в модуль формы Функцию:

Функция ПоддерживаетсяВидТО(Вид) Экспорт

Результат = Ложь;

Если Вид = Перечисления.ВидыТорговогоОборудования.СканерШтрихКода Тогда
Результат = Истина;
КонецЕсли;

Возврат Результат;

КонецФункции // ПоддерживаетсяВидТО()
39. Валентин Елфимов (ratinc) 28.12.12 13:12
(38) Спасибо за совет.
Реально не хватало
Процедура ПриОткрытии()	
ПолучитьСерверТО().ПодключитьКлиента(ЭтаФорма);
КонецПроцедуры
...Показать Скрыть


Я ще вставлю свои пять копеек. Не заморачивайтесь с вариантом создания ШК с кодированием номеров документов. Используйте сразу GUID объекта. Шансов нарваться на кирилический символ в коде объекта очень много. Оно вам надо?
Если вы сильно ограничены областью в которую необходимо выводить ШК, и 36 символов у вас не влезают, то лучше вынести в константы или регистр сведений ту часть гуида, которая повторяется в объектах принадлежащих к одному типу данных. Нужно только помнить, что если вы пересоздадите базу, эти значения изменятся.
40. lesorubka (lesorubka) 09.04.13 14:02
Спасибо за код. все получилось! Вставляла в БП 2.0
Правда, не понятно, почему, но для толстого клиента функции работают из общего модуля (добавила в РаботаСТорговымОборудованием), а для тонкого клиента почему-то они не видны - Предприятие даже не загружается - сразу выдает ошибку. Пришлось их вставить в модуль менеджера документа, откуда идет печать.
Может я чего-то недопонимаю?
41. Роман С (Dach) 09.04.13 14:21
А мы штрихкод документа храним в доп. свойствах. Компонента печати лежит на сервере. Картинка штрихкода вместе с рисунком вставляется на макет печатной формы. Весь код, приведенный автором - просто встраивается в печатную форму. То есть никаких доработок конфигурации не требуется.

А вот как штрихкод попадает в доп. свойства документа и откуда он берется - об этом я, возможно тоже напишу статью.
42. Роман С (Dach) 09.04.13 14:26
Перем мКартинкаШтрихкода;
Перем мНадписьТекст;

//Получает данные о штрихкоде объекта. Если у объекта нет штрихкода, он присваивается
//Параметры: 
//			Объект - ссылка на объект, данные о штрихкоде которого собираются
//			ВысотаКартинкиВПроцентах - высота изображения штрихкода в процентах
//Возвращает:
//			структура
//				Штрихкод - значение штрихкода
//				ДвоичныеДанныеИзображенияШК - двоичные данные изображения штрихкода
//				ДвоичныеДанныеФайла - двоичные данные файла, если Объект - это файл
//				НеобходимостьВставкиВместоТэга - влаг, показывающий, что штрихкод только сформирован для файла 
//					и что необходимо выполнить попытку вставить изображение штрихкода вместо тэга в файле
//				ВставкаШКв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;
				Рисунок.Картинка = КартинкаШтрихкода;
				
				Надпись = Шапка.Область("НадписьЗаголовок");				
				Надпись.Текст = ВыборкаПоШапке.ОрганизацияПолучатель.Наименование;
				
				//Расположение элементов штампа относительно друг друга
				Надпись.Лево = Рисунок.Лево;
				Надпись.Верх = Рисунок.Верх - Надпись.Высота;
				
				мНадписьТекст = ВыборкаПоШапке.ОрганизацияПолучатель.Наименование;
				мКартинкаШтрихкода = КартинкаШтрихкода;
				
			КонецЕсли;
...Показать Скрыть
43. Mark Genuine (markgenuine) 03.10.13 16:41
Как данный код подстроить под Code39? Как данный код Code39 уменьшить в длинну?
44. Елена Ситникова (lesenoklenok) 26.02.14 14:41
Спасибо за статью, очень много интересного узнала.
45. Мария Маленко (sweety-twetty) 26.02.15 17:23
Подскажите, пожалуйста, при попытке печати внешней печ. формы со штрих-кодом в управляемых формах, получаю ошибку "Значение не является значением объектного типа (Сообщение)" из строки

ОбластьМакета.Рисунки.ШтрихКод.Объект.Сообщение = ВРег(СокрЛП(СсылкаНаОбъект[0].Ссылка.УникальныйИдентификатор()))


В обычном приложении печ.форма формируется правильно(в об.приложении ОбластьМакета.Рисунки.ШтрихКод.Объект=ActiveX, а в управл.приложении ОбластьМакета.Рисунки.ШтрихКод.Объект=Null). Подскажите,в чем может быть проблема? Заранее спасибо
46. Иван Одинескин (odineskin2) 26.06.16 12:10
решение рабочее, но для более "мудреного" использования штрих-кодирования предлагаю попробовать наш модуль http://infostart.ru/public/527954/
встраивание штрих-кодов идёт не через стандартный функционал, а через более функциональную библиотеку.
Для написания сообщения необходимо авторизоваться
Прикрепить файл
Дополнительные параметры ответа