Штрих-кодирование документов

1. Гость 24.10.13 13:44
Здр-те, хотела бы попросить: нет у вас ли какой либо готовой универсальной обработки по созданию штрих-кода на документах? очень надо, можно выслать на isa.masih@mail.ru
По теме из базы знаний
Ответы
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
2. AlekseySipaev 24.10.13 13:49 Сейчас в теме
УТ11 предлагает такое решение в качестве формирования ШК и вывода его на печать в таб.доке. Применить можно где угодно и как угодно, вплоть до поиска документа по ШК при помощи внешнего события (сканера штрихкода, например).
ЗЫ, код в чистом виде из общего модуля, лишнее убирать не стал, главное ведь алгоритм:
//Возвращает числовой код для печати штрихкода
//
//	Параметры:
//		Ссылка - ЛюбаяСсылка - ссылка на объект, по которому нужно получить код
//	Возвращаемое значение:
//		Строка - строка из чисел, соотвествующая переданной ссылке
//
Функция ЧисловойКодПоСсылке(Ссылка) Экспорт
	ШестнадчатиричноеЧисло = СтрЗаменить(Строка(Ссылка.УникальныйИдентификатор()),"-","");
	Возврат ПреобразоватьИзШестнадцатиричнойСистемыСчисленияВДесятичноеЧ­исло(ШестнадчатиричноеЧисло);
КонецФункции

Функция ПолучитьСсылкуПоШтрихкодуТабличногоДокумента(Штрихкод, Менеджеры = Неопределено) Экспорт
	
	Если Не СтроковыеФункцииКлиентСервер.ТолькоЦифрыВСтроке(Штрихкод, Ложь, Ложь) Тогда
		Возврат Новый Массив;
	КонецЕсли;
	
	ШтрихкодВШестнаднадцатиричномВиде = ПреобразоватьДесятичноеЧислоВШестнадцатиричнуюСистемуСчислен­ия(Число(Штрихкод));
	Пока СтрДлина(ШтрихкодВШестнаднадцатиричномВиде) < 32 Цикл
		ШтрихкодВШестнаднадцатиричномВиде = "0" + ШтрихкодВШестнаднадцатиричномВиде;
	КонецЦикла;
	
	Идентификатор =
	        Сред(ШтрихкодВШестнаднадцатиричномВиде, 1,  8)
	+ "-" + Сред(ШтрихкодВШестнаднадцатиричномВиде, 9,  4)
	+ "-" + Сред(ШтрихкодВШестнаднадцатиричномВиде, 13, 4)
	+ "-" + Сред(ШтрихкодВШестнаднадцатиричномВиде, 17, 4)
	+ "-" + Сред(ШтрихкодВШестнаднадцатиричномВиде, 21, 12);
	
	Если СтрДлина(Идентификатор) <> 36 Тогда
		Возврат Новый Массив;
	КонецЕсли;
	
	Если Менеджеры = Неопределено Тогда
		МенеджерыОбъектов = Новый Массив();
		Для Каждого ЭлементМетаданных Из Метаданные.Документы Цикл
			МенеджерыОбъектов.Добавить(Документы[ЭлементМетаданных.Имя]);
		КонецЦикла;
	Иначе
		МенеджерыОбъектов = Новый Массив();
		Для Каждого ПустаяСсылка Из Менеджеры Цикл
			ТипСсылки = ТипЗнч(ПустаяСсылка);
			
			Если Документы.ТипВсеСсылки().СодержитТип(ТипСсылки) Тогда
				МенеджерыОбъектов.Добавить(Документы[ПустаяСсылка.Метаданные().Имя]);
				
			ИначеЕсли Справочники.ТипВсеСсылки().СодержитТип(ТипСсылки) Тогда
				МенеджерыОбъектов.Добавить(Справочники[ПустаяСсылка.Метаданные().Имя]);
				
			ИначеЕсли Задачи.ТипВсеСсылки(ТипСсылки) Тогда	
				МенеджерыОбъектов.Добавить(Задачи[ПустаяСсылка.Метаданные().Имя]);
				
			ИначеЕсли БизнесПроцессы.ТипВсеСсылки(ТипСсылки) Тогда	
				МенеджерыОбъектов.Добавить(БизнесПроцессы[ПустаяСсылка.Метаданные().Имя]);
				
			ИначеЕсли ПланыВидовХарактеристик.ТипВсеСсылки(ТипСсылки) Тогда
				МенеджерыОбъектов.Добавить(ПланыВидовХарактеристик[ПустаяСсылка.Метаданные().Имя]);
				
			Иначе
				ТекстИсключения = НСтр("ru = 'Ошибка распознавания штрихкода: тип ""%Тип%"" не поддерживается.'");
				ТекстИсключения = СтрЗаменить(ТекстИсключения,"%Тип%",ТипСсылки);
				
				ВызватьИсключение ТекстИсключения;
			КонецЕсли;
			
		КонецЦикла;
	КонецЕсли;
	
	Запрос = Новый Запрос;
	
	МассивСсылок = Новый Массив;
	ПервыйЗапрос = Истина;
	Для Каждого Менеджер Из МенеджерыОбъектов Цикл
		
		Попытка
			Ссылка = Менеджер.ПолучитьСсылку(Новый УникальныйИдентификатор(Идентификатор));
		Исключение
			Продолжить;
		КонецПопытки;
		
		МетаданныеСсылки = Ссылка.Метаданные();
		Если Не ПравоДоступа("Чтение", МетаданныеСсылки) Тогда
			Продолжить;
		КонецЕсли;
		
		МассивСсылок.Добавить(Ссылка);
		
		Если НЕ ПервыйЗапрос Тогда
			Запрос.Текст = Запрос.Текст + 
			"ОБЪЕДИНИТЬ ВСЕ
			|";
		КонецЕсли;
		
		Запрос.Текст = Запрос.Текст +
		"ВЫБРАТЬ" + ?(ПервыйЗапрос," " + "РАЗРЕШЕННЫЕ" + " "," ") + "Таблица.Ссылка КАК Ссылка
		|ИЗ " + МетаданныеСсылки.ПолноеИмя() + " КАК Таблица
		|ГДЕ Ссылка В (&МассивСсылок)
		|";
		
		ПервыйЗапрос = Ложь;
		
	КонецЦикла;
	
	Если Не ПервыйЗапрос Тогда
		Запрос.Параметры.Вставить("МассивСсылок", МассивСсылок);
		Возврат Запрос.Выполнить().Выгрузить().ВыгрузитьКолонку("Ссылка");
	Иначе
		Возврат Новый Массив;
	КонецЕсли;
	
КонецФункции

Процедура ВывестиШтрихкодВТабличныйДокумент(ТабличныйДокумент, Макет, Знач ОбластьМакета, Ссылка) Экспорт
	
	ВыводитьШтрихкодВОтдельнуюОбласть = Ложь;
	Если Не ЕстьКартинкаШтрихкодаВОбластиМакета(ОбластьМакета) Тогда
		// Картинки штрихкода в этой области макета нет.
		
		Если Макет.Области.Найти("ОбластьШтрихкода") <> Неопределено Тогда
			
			// Проверить картинку штрихкода в области "Штрихкод"
			ОбластьМакетаШтрихкод = Макет.ПолучитьОбласть("ОбластьШтрихкода");
			Если ЕстьКартинкаШтрихкодаВОбластиМакета(ОбластьМакетаШтрихкод) Тогда
				ОбластьМакета = ОбластьМакетаШтрихкод;
				ВыводитьШтрихкодВОтдельнуюОбласть = Истина;
			Иначе
				Возврат;
			КонецЕсли;
		Иначе
			Возврат;
		КонецЕсли;
		
	КонецЕсли;
	
	Если Не ПолучитьФункциональнуюОпцию("ИспользоватьШтрихкодированиеПечатныхФормОбъектов") Тогда
		ОбластьМакета.Рисунки.Удалить(ОбластьМакета.Рисунки.КартинкаШтрихкода);
		Возврат;
	КонецЕсли;
	
	Эталон = Обработки.ПечатьЭтикетокИЦенников.ПолучитьМакет("Эталон");
	КоличествоМиллиметровВПикселе = Эталон.Рисунки.Квадрат100Пикселей.Высота / 100;
	
	ПараметрыШтрихкода = Новый Структура;
	ПараметрыШтрихкода.Вставить("Ширина",          Окр(ОбластьМакета.Рисунки.КартинкаШтрихкода.Ширина / КоличествоМиллиметровВПикселе));
	ПараметрыШтрихкода.Вставить("Высота",          Окр(ОбластьМакета.Рисунки.КартинкаШтрихкода.Высота / КоличествоМиллиметровВПикселе));
	ПараметрыШтрихкода.Вставить("Штрихкод",        СокрЛП(ЧисловойКодПоСсылке(Ссылка)));
	ПараметрыШтрихкода.Вставить("ТипКода",         4); // Code128
	ПараметрыШтрихкода.Вставить("ОтображатьТекст", Ложь);
	ПараметрыШтрихкода.Вставить("РазмерШрифта",    6);
	
	ОбластьМакета.Рисунки.КартинкаШтрихкода.Картинка = МенеджерОборудованияСервер.ПолучитьКартинкуШтрихкода(ПараметрыШтрихкода);
	
	Если ВыводитьШтрихкодВОтдельнуюОбласть Тогда
		ТабличныйДокумент.Вывести(ОбластьМакета);
	КонецЕсли;
	
КонецПроцедуры

////////////////////////////////////////////////////////////­////////////////////
// СЛУЖЕБНЫЕ ПРОЦЕДУРЫ И ФУНКЦИИ

Функция ПреобразоватьДесятичноеЧислоВШестнадцатиричнуюСистемуСчислен­ия(Знач ДесятичноеЧисло)
	
	Результат = "";
	
	Пока ДесятичноеЧисло > 0 цикл
		ОстатокОтДеления = ДесятичноеЧисло % 16;
		ДесятичноеЧисло  = (ДесятичноеЧисло - ОстатокОтДеления) / 16;
		Результат        = Сред("0123456789abcdef", ОстатокОтДеления + 1, 1) + Результат;
	КонецЦикла;
	
	Возврат Результат;
	
КонецФункции

Функция ПреобразоватьИзШестнадцатиричнойСистемыСчисленияВДесятичноеЧ­исло(Знач Значение)
	
	Значение = НРег(Значение);
	ДлинаСтроки = СтрДлина(Значение);
	
	Результат = 0;
	Для НомерСимвола = 1 По ДлинаСтроки Цикл
		Результат = Результат * 16 + Найти("0123456789abcdef", Сред(Значение, НомерСимвола, 1)) - 1;
	КонецЦикла;
	
	Возврат Формат(Результат, "ЧГ=0");
	
КонецФункции
Показать
3. asemr 25.10.13 07:09 Сейчас в теме
этот Код можно применить в любой конфигурации? например, нетиповой? и извиняюсь может быть за глупый вопрос: а куда вставлять этот Код?
4. AlekseySipaev 25.10.13 10:14 Сейчас в теме
(3) asemr, Ну в данном случае это чисто выдранный код из общего модуля типовой конфигурации УТ11 (тут присутствуют участки кода, которые затрагивают и иные общие модули этой конфигурации, которые можно просто исключить или переписать по-своему). Использование этого кода зависит напрямую от принадлежности и решения того или иного вопроса. У меня этот код использовался в УТ10.3, в розничной торговле.
Суть: оформляют продажу в розницу документом Чек ККМ. В печатную форму этого документа вношу изменения и помещаю штрихкод в одну из областей макета, по которому я буду искать именно этот документ по его ШК во время возврата.

Как происходит поиск документа по ШК? Ну ШК документа, судя по коду выше, формируется из ГУИДа документа, который преобразуется в последовательность символов, которая в свою очередь представляет у меня ШК с типом code128 или code39. Пользуясь сканером ШК обрабатываю внешнее событие, считав ШК с распечатанного чека. На входе получаю последовательность символов (тот самый code128), потом его преобразую в ГУИД и пытаюсь найти ссылку по этому ГУИДу на нужный мне документ.

Это одна из возможностей применения. Расширяйте диапазоны применения как захотите.
5. Гость 28.10.13 16:41
Зачем нужно выводить штрих-код на документах? в каких целях, и как это упрощает жизнь?
Внимание! Не забывайте отмечать решение на ваш вопрос, если оно найдено. Это повысит ваш рейтинг на форуме.
Оставьте свое сообщение

Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот