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

Публикация № 1200254

Разработка - Печать - Печатные формы документов

штрихкод Barcode штрихкодирование документов.

Эта статья будет полезна для тех, перед кем стоит задача нетипового штрихкодирования документов.

Раз, два, три!.. Проверка связи. Это моя первая статья на Инфостарте, причём с материалом, который частично был разработан не мной.
Но эта наработка уже не раз помогала мне быстро и весело внедрять штрихкодирование документов в любую конфигурацию на обычных формах.

Также у этой публикации есть ещё одна цель: скорее всего, мои алгоритмы не оптимизированы, поэтому публикация может вызвать шквал объективной критики, которую можно будет взять на вооружение.
Итак, мы хотим, чтобы печатные формы документов содержали штрихкод-ссылку на документ. 

1. Скачиваем шрифт Barcode.ttf, ставим его на все компы пользователей. Установить можно двумя способами: а) двойной клик на файле -> Установить; б) положить файл в директорию C:\Windows\Fonts.
2. В нужных макетах печатных форм документов завести ячейку под штрихкод, в качестве шрифта ячейки указать barcode. Размер я обычно ставлю 28, дело вкуса. Это будет наш параметр "ШтрихКод"
3. Простой регистр сведений "ШтрихкодыДокументов": Измерение: Штрихкод - строка, 13 (я обычно использую EAN13, просто и сердито), ресурсы: Документ - составной тип, состоящий из штрихкодируемых документов (или просто ДокументСсылка), GUID - УникальныйИдентификатор.
4. Подписка на событие при записи документа. В подписке на событие проверяем есть ли у документа штрихкод запросом к регистру, если нет генерируем новый, не забываем проверять его уникальность.
 

Результат = Ложь;
	
	// первое: получим штрихкод из GUID-а, чтобы сразу в запросе проверить его уникальность, дабы убрать лишний запрос к БД
	GUID = СсылкаНаОбъект.УникальныйИдентификатор();
	Штрихкод = ПодготовитьШтрихКодИзGIUDа(GUID);
	
	// второе: проверяем наличие штрихкода, а так же уникальность кода в пакетном запросе
	Запрос = Новый Запрос;
	Запрос.Текст = 
	"ВЫБРАТЬ
	|	ШтрихкодыДокументов.Штрихкод
	|ИЗ
	|	РегистрСведений.ШтрихкодыДокументов КАК ШтрихкодыДокументов
	|ГДЕ
	|	ШтрихкодыДокументов.Документ = &Документ
	|;
	|
	|////////////////////////////////////////////////////////////////////////////////
	|ВЫБРАТЬ
	|	ШтрихкодыДокументов.Штрихкод
	|ИЗ
	|	РегистрСведений.ШтрихкодыДокументов КАК ШтрихкодыДокументов
	|ГДЕ
	|	ШтрихкодыДокументов.Штрихкод = &Штрихкод";
	
	Запрос.УстановитьПараметр("Документ", СсылкаНаОбъект);
	Запрос.УстановитьПараметр("Штрихкод", Штрихкод);
	
	Результат = Запрос.ВыполнитьПакет();
	
	ВыборкаДетальныеЗаписи = Результат[0].Выбрать();
	
	Если ВыборкаДетальныеЗаписи.Следующий() Тогда 
		// штрихкод есть - возвращаем Истину
		Возврат Истина
	КонецЕсли;        
	
	// третье: штрихкода нет - запишем
	// сначала проверим ШК на основе GUID на уникальность:
	ВыборкаУникальность = Результат[1].Выбрать();
	Если ВыборкаУникальность.Следующий() Тогда 
		// ШК не уникален. генерируем новый
		КодУникален = Ложь;
		Пока НЕ КодУникален Цикл
			Штрихкод = ПодготовитьШтрихКодИзGIUDа(Новый УникальныйИдентификатор);
			
			Запрос = Новый Запрос;
			Запрос.Текст = 
			"ВЫБРАТЬ
			|	ШтрихкодыДокументов.Штрихкод
			|ИЗ
			|	РегистрСведений.ШтрихкодыДокументов КАК ШтрихкодыДокументов
			|ГДЕ
			|	ШтрихкодыДокументов.Штрихкод = &Штрихкод";
			
			Запрос.УстановитьПараметр("Штрихкод", Штрихкод);
			Результат = Запрос.Выполнить();
			КодУникален = Результат.Пустой();
		КонецЦикла;
	КонецЕсли;
	
	ЗаписьРегистра = РегистрыСведений.ШтрихкодыДокументов.СоздатьМенеджерЗаписи();
	ЗаписьРегистра.Документ		 = СсылкаНаОбъект;
	ЗаписьРегистра.Штрихкод		 = Штрихкод;
	ЗаписьРегистра.GUID			 = GUID;
	ЗаписьРегистра.Период		 = ТекущаяДата();
	ЗаписьРегистра.Ответственный = ПараметрыСеанса.ТекущийПользователь;
	Попытка
		ЗаписьРегистра.Записать();
		Результат = Истина;
	Исключение
		Сообщить(ОписаниеОшибки());
		Результат = Ложь;
	КонецПопытки;
	
	Возврат Результат;

Процедура ПодготовитьШтрихкодИзGUID
Суть проста - убираем из Уникального идентификатора все дефисы и буквы, если цифр не хватает - дополняем нулями. Здесь использован типовой справочник ФорматыШтрихКодов, в котором определяются префиксы для документов. Если такого нет в конфигурации, то я обычно добавляю свой, чтобы по префиксам различать типы документов.
 

фШтрихКод = фGIUD;
	
	фШтрихКод = СтрЗаменить(фШтрихКод, "-", "");
	фШтрихКод = СтрЗаменить(фШтрихКод, "a", "");
	фШтрихКод = СтрЗаменить(фШтрихКод, "b", "");
	фШтрихКод = СтрЗаменить(фШтрихКод, "c", "");
	фШтрихКод = СтрЗаменить(фШтрихКод, "d", "");
	фШтрихКод = СтрЗаменить(фШтрихКод, "e", "");
	фШтрихКод = СтрЗаменить(фШтрихКод, "f", "");
	
	фШтрихКод = Лев(фШтрихКод, фДлина);
	
	// на случай, если штрихкод оказался меньше нужной длины, дополняем его ведущими нулями
	Пока СтрДлина(фШтрихКод) < фДлина Цикл
		фШтрихКод = "0" + фШтрихКод;
	КонецЦикла;
	
	//фШтрихКод = фШтрихКод + КонтрольныйСимволEAN(фШтрихКод,13);
	фШтрихКод = Лев((""+Справочники.ФорматыШтрихКодов.ШКДокумента.Код + фШтрихКод), 12) + КонтрольныйСимволEAN(фШтрихКод,13);
	
	Возврат фШтрихКод;

На практике столкнулся с проблемой, что пометка удаления - это тоже запись, и алгоритм не работал, поэтому дописал удаление существующего штрихкода из регистра сведений при установке на документ пометки удаления.

5. У нас есть соответствие цифр и документов. Осталось превратить это в штрихкод на бумаге. Для этого в общий модуль добавляем следующие процедуры, на которые будем ссылаться при выводе на экран макета печатной формы. Здесь не нужно ничего менять и дописывать.
 

Функция Код128(A) Экспорт
 
	Перем BCode;
	Перем BInd;
	Перем CurMode;
	Перем Ch;
	Перем Ch2;
	Перем I;
	Перем LenA;
	Перем CCode;
	Перем S;
	Перем BarArray;
	СписокКБ = Новый Соответствие;
	СписокКБ.Вставить("0","0082");
	СписокКБ.Вставить("1","00:0");
	СписокКБ.Вставить("2","0802");
	СписокКБ.Вставить("3",":000");
	СписокКБ.Вставить("4","0280");
	СписокКБ.Вставить("5","2080");
	СписокКБ.Вставить("6","8002");
	СписокКБ.Вставить("7","8020");
	СписокКБ.Вставить("8","8200");
	СписокКБ.Вставить("9","2800");
	СписокКБ.Вставить("-","0802");
	СписокКБ.Вставить("$","0:00");
	СписокКБ.Вставить(":","2022");
	СписокКБ.Вставить("/","2202");
	СписокКБ.Вставить(".","2220");
	СписокКБ.Вставить("+","0222");
	СписокКБ.Вставить("a","0:00");
	СписокКБ.Вставить("b","8802");
	СписокКБ.Вставить("c","0882");
	СписокКБ.Вставить("d","08:0");
	СписокКБ.Вставить("t","0:80");
	СписокКБ.Вставить("n","8802");
	СписокКБ.Вставить("*","0882");
	СписокКБ.Вставить("e","08:0"); 	
	
	Список128 = Новый СписокЗначений;
	Список128.Добавить("212222");
    Список128.Добавить("222122");
    Список128.Добавить("222221");
    Список128.Добавить("121223");
    Список128.Добавить("121322");
    Список128.Добавить("131222");
    Список128.Добавить("122213");
    Список128.Добавить("122312");
    Список128.Добавить("132212");
    Список128.Добавить("221213");
    Список128.Добавить("221312");
    Список128.Добавить("231212");
    Список128.Добавить("112232");
    Список128.Добавить("122132");
    Список128.Добавить("122231");
    Список128.Добавить("113222");
    Список128.Добавить("123122");
    Список128.Добавить("123221");
    Список128.Добавить("223211");
    Список128.Добавить("221132");
    Список128.Добавить("221231");
    Список128.Добавить("213212");
    Список128.Добавить("223112");
    Список128.Добавить("312131");
    Список128.Добавить("311222");
    Список128.Добавить("321122");
    Список128.Добавить("321221");
    Список128.Добавить("312212");
    Список128.Добавить("322112");
    Список128.Добавить("322211");
    Список128.Добавить("212123");
    Список128.Добавить("212321");
    Список128.Добавить("232121");
    Список128.Добавить("111323");
    Список128.Добавить("131123");
    Список128.Добавить("131321");
    Список128.Добавить("112313");
    Список128.Добавить("132113");
    Список128.Добавить("132311");
    Список128.Добавить("211313");
    Список128.Добавить("231113");
    Список128.Добавить("231311");
    Список128.Добавить("112133");
    Список128.Добавить("112331");
    Список128.Добавить("132131");
    Список128.Добавить("113123");
    Список128.Добавить("113321");
    Список128.Добавить("133121");
    Список128.Добавить("313121");
    Список128.Добавить("211331");
    Список128.Добавить("231131");
    Список128.Добавить("213113");
    Список128.Добавить("213311");
    Список128.Добавить("213131");
    Список128.Добавить("311123");
    Список128.Добавить("311321");
    Список128.Добавить("331121");
    Список128.Добавить("312113");
    Список128.Добавить("312311");
    Список128.Добавить("332111");
    Список128.Добавить("314111");
    Список128.Добавить("221411");
    Список128.Добавить("431111");
    Список128.Добавить("111224");
    Список128.Добавить("111422");
    Список128.Добавить("121124");
    Список128.Добавить("121421");
    Список128.Добавить("141122");
    Список128.Добавить("141221");
    Список128.Добавить("112214");
    Список128.Добавить("112412");
    Список128.Добавить("122114");
    Список128.Добавить("122411");
    Список128.Добавить("142112");
    Список128.Добавить("142211");
    Список128.Добавить("241211");
    Список128.Добавить("221114");
    Список128.Добавить("413111");
    Список128.Добавить("241112");
    Список128.Добавить("134111");
    Список128.Добавить("111242");
    Список128.Добавить("121142");
    Список128.Добавить("121241");
    Список128.Добавить("114212");
    Список128.Добавить("124112");
    Список128.Добавить("124211");
    Список128.Добавить("411212");
    Список128.Добавить("421112");
    Список128.Добавить("421211");
    Список128.Добавить("212141");
    Список128.Добавить("214121");
    Список128.Добавить("412121");
    Список128.Добавить("111143");
    Список128.Добавить("111341");
    Список128.Добавить("131141");
    Список128.Добавить("114113");
    Список128.Добавить("114311");
    Список128.Добавить("411113");
    Список128.Добавить("411311");
    Список128.Добавить("113141");
    Список128.Добавить("114131");
    Список128.Добавить("311141");
    Список128.Добавить("411131");
    Список128.Добавить("211412");
    Список128.Добавить("211214");
    Список128.Добавить("211232");
    Список128.Добавить("2331112");   

	
	BCode = Новый Массив(1024);
	//Собираем строку кодов
	BInd = 0;
	CurMode = "";
	I = 1;
	LenA = СтрДлина(A);
	Пока (I <= LenA) Цикл
		//Текущий символ в строке
		Ch = КодСимвола(Сред(A, I, 1));
		I = I + 1;
		//Разбираем только символы от 0 до 127
		Если Ch <= 127 Тогда
			//Следующий символ
			Если I <= LenA Тогда
				Ch2 = КодСимвола(Сред(A, I, 1));
			Иначе
				Ch2 = 0;
			КонецЕсли;
			//'Пара цифр - режим С
			Если (48 <= Ch)И(Ch <= 57)И(48 <= Ch2)И(Ch2 <= 57) Тогда
				I = I + 1;
				Если BInd = 0 Тогда
					//Начало с режима С
					CurMode = "C";
					BCode[BInd] = 105;
					BInd = BInd + 1;
				ИначеЕсли CurMode <> "C" Тогда
					//Переключиться на режим С
					CurMode = "C";
					BCode[BInd] = 99;
					BInd = BInd + 1;
				КонецЕсли;
				//Добавить символ режима С
				BCode[BInd] = Число(""+Символ(Ch) + Символ(Ch2));
				BInd = BInd + 1;
			Иначе
				Если BInd = 0 Тогда
					Если Ch < 32 Тогда
						//Начало с режима A
						CurMode = "A";
						BCode[BInd] = 103;
						BInd = BInd + 1;
					Иначе
						//Начало с режима B
						CurMode = "B";
						BCode[BInd] = 104;
						BInd = BInd + 1;
					КонецЕсли;
				КонецЕсли;
				//Переключение по надобности в режим A
				Если (Ch < 32)И(CurMode <> "A") Тогда
					CurMode = "A";
					BCode[BInd] = 101;
					BInd = BInd + 1;
					//Переключение по надобности в режим B
				ИначеЕсли ((64 <= Ch)И(CurMode <> "B"))ИЛИ(CurMode = "C") Тогда
					CurMode = "B";
					BCode[BInd] = 100;
					BInd = BInd + 1;
				КонецЕсли;
				//Служебные символы
				Если (Ch < 32) Тогда
					BCode[BInd] = Ch + 64;
					BInd = BInd + 1;
					//Все другие символы
				Иначе
					BCode[BInd] = Ch - 32;
					BInd = BInd + 1;
				КонецЕсли;
			КонецЕсли;
		КонецЕсли;
	КонецЦикла;
	//Подсчитываем контрольную сумму 
	CCode = MOD(BCode[0],103);
	Для I = 1 По BInd - 1 Цикл
		CCode = MOD(CCode + BCode[I] * I,103);
	КонецЦикла;
	BCode[BInd] = CCode;
	BInd = BInd + 1;
	//Завершающий символ
	BCode[BInd] = 106;
	BInd = BInd + 1;
	//Собираем строку символов шрифта
	S = "";
	Для I = 0 По BInd - 1 Цикл
		S = S + Code_Char(Список128[BCode[I]].Значение);
	КонецЦикла;
	Возврат S;
 
КонецФункции

Процедура КонструкторШК()
	
	СписокКБ = Новый Соответствие;
	СписокКБ.Вставить("0","0082");
	СписокКБ.Вставить("1","00:0");
	СписокКБ.Вставить("2","0802");
	СписокКБ.Вставить("3",":000");
	СписокКБ.Вставить("4","0280");
	СписокКБ.Вставить("5","2080");
	СписокКБ.Вставить("6","8002");
	СписокКБ.Вставить("7","8020");
	СписокКБ.Вставить("8","8200");
	СписокКБ.Вставить("9","2800");
	СписокКБ.Вставить("-","0802");
	СписокКБ.Вставить("$","0:00");
	СписокКБ.Вставить(":","2022");
	СписокКБ.Вставить("/","2202");
	СписокКБ.Вставить(".","2220");
	СписокКБ.Вставить("+","0222");
	СписокКБ.Вставить("a","0:00");
	СписокКБ.Вставить("b","8802");
	СписокКБ.Вставить("c","0882");
	СписокКБ.Вставить("d","08:0");
	СписокКБ.Вставить("t","0:80");
	СписокКБ.Вставить("n","8802");
	СписокКБ.Вставить("*","0882");
	СписокКБ.Вставить("e","08:0"); 	
	
	Список128 = Новый СписокЗначений;
	Список128.Добавить("212222");
    Список128.Добавить("222122");
    Список128.Добавить("222221");
    Список128.Добавить("121223");
    Список128.Добавить("121322");
    Список128.Добавить("131222");
    Список128.Добавить("122213");
    Список128.Добавить("122312");
    Список128.Добавить("132212");
    Список128.Добавить("221213");
    Список128.Добавить("221312");
    Список128.Добавить("231212");
    Список128.Добавить("112232");
    Список128.Добавить("122132");
    Список128.Добавить("122231");
    Список128.Добавить("113222");
    Список128.Добавить("123122");
    Список128.Добавить("123221");
    Список128.Добавить("223211");
    Список128.Добавить("221132");
    Список128.Добавить("221231");
    Список128.Добавить("213212");
    Список128.Добавить("223112");
    Список128.Добавить("312131");
    Список128.Добавить("311222");
    Список128.Добавить("321122");
    Список128.Добавить("321221");
    Список128.Добавить("312212");
    Список128.Добавить("322112");
    Список128.Добавить("322211");
    Список128.Добавить("212123");
    Список128.Добавить("212321");
    Список128.Добавить("232121");
    Список128.Добавить("111323");
    Список128.Добавить("131123");
    Список128.Добавить("131321");
    Список128.Добавить("112313");
    Список128.Добавить("132113");
    Список128.Добавить("132311");
    Список128.Добавить("211313");
    Список128.Добавить("231113");
    Список128.Добавить("231311");
    Список128.Добавить("112133");
    Список128.Добавить("112331");
    Список128.Добавить("132131");
    Список128.Добавить("113123");
    Список128.Добавить("113321");
    Список128.Добавить("133121");
    Список128.Добавить("313121");
    Список128.Добавить("211331");
    Список128.Добавить("231131");
    Список128.Добавить("213113");
    Список128.Добавить("213311");
    Список128.Добавить("213131");
    Список128.Добавить("311123");
    Список128.Добавить("311321");
    Список128.Добавить("331121");
    Список128.Добавить("312113");
    Список128.Добавить("312311");
    Список128.Добавить("332111");
    Список128.Добавить("314111");
    Список128.Добавить("221411");
    Список128.Добавить("431111");
    Список128.Добавить("111224");
    Список128.Добавить("111422");
    Список128.Добавить("121124");
    Список128.Добавить("121421");
    Список128.Добавить("141122");
    Список128.Добавить("141221");
    Список128.Добавить("112214");
    Список128.Добавить("112412");
    Список128.Добавить("122114");
    Список128.Добавить("122411");
    Список128.Добавить("142112");
    Список128.Добавить("142211");
    Список128.Добавить("241211");
    Список128.Добавить("221114");
    Список128.Добавить("413111");
    Список128.Добавить("241112");
    Список128.Добавить("134111");
    Список128.Добавить("111242");
    Список128.Добавить("121142");
    Список128.Добавить("121241");
    Список128.Добавить("114212");
    Список128.Добавить("124112");
    Список128.Добавить("124211");
    Список128.Добавить("411212");
    Список128.Добавить("421112");
    Список128.Добавить("421211");
    Список128.Добавить("212141");
    Список128.Добавить("214121");
    Список128.Добавить("412121");
    Список128.Добавить("111143");
    Список128.Добавить("111341");
    Список128.Добавить("131141");
    Список128.Добавить("114113");
    Список128.Добавить("114311");
    Список128.Добавить("411113");
    Список128.Добавить("411311");
    Список128.Добавить("113141");
    Список128.Добавить("114131");
    Список128.Добавить("311141");
    Список128.Добавить("411131");
    Список128.Добавить("211412");
    Список128.Добавить("211214");
    Список128.Добавить("211232");
    Список128.Добавить("2331112");   

КонецПроцедуры //КонструкторШК()

////
Функция Кодабар(КодШК)   
	
	//Перем ШтрихКод;	
	//ШтрихКод = "";
	//Для Н = 1 По СтрДлина(КодШК) Цикл
	//    ШтрихКод = ШтрихКод + СписокКБ.Получить(Сред(КодШК, Н, 1));
	//КонецЦикла;   
	//ШтрихКод = СписокКБ.Получить("d") + ШтрихКод + СписокКБ.Получить("e");
	//
	//Возврат ШтрихКод;
	
КонецФункции //Кодабар()

//Функция получает остаток при делении
// Параметры:
//	Делимое  <число> - число, которое делим
//	Делитель <число> - число, на которое делим
// Возвращаемое значение:
//	Рез 	 <число> - остаток при делении
//
Функция MOD(Делимое,Делитель)
	
	Перем Рез;
	Рез=0;
	Частное=Цел(Делимое/Делитель);
	Рез=Делимое-Частное*Делитель;   
	Возврат Рез;
	
КонецФункции //MOD() 

//Штриховые символы шрифта iQs Code 128 по набору полос
//
Функция Code_Char(A)
	
	Перем S;
	Перем I;
	Перем B;
	Если A="211412" Тогда S = "A"; Возврат S; КонецЕсли;
	Если A="211214" Тогда S = "B"; Возврат S; КонецЕсли;
	Если A="211232" Тогда S = "C"; Возврат S; КонецЕсли;
	Если A="2331112"Тогда S = "@"; Возврат S; КонецЕсли;
	S = ""; 
	LenA=СтрДлина(A);
	Для I = 0 По (LenA/ 2 - 1) Цикл
		Стр=Сред(A, 2 * I + 1, 2); 
		Если Стр="11"      Тогда S = S+"0";Продолжить;
		ИначеЕсли Стр="21" Тогда S = S+"1";Продолжить;
		ИначеЕсли Стр="31" Тогда S = S+"2";Продолжить;
		ИначеЕсли Стр="41" Тогда S = S+"3";Продолжить;
		ИначеЕсли Стр="12" Тогда S = S+"4";Продолжить;
		ИначеЕсли Стр="22" Тогда S = S+"5";Продолжить;
		ИначеЕсли Стр="32" Тогда S = S+"6";Продолжить;
		ИначеЕсли Стр="42" Тогда S = S+"7";Продолжить;
		ИначеЕсли Стр="13" Тогда S = S+"8";Продолжить;
		ИначеЕсли Стр="23" Тогда S = S+"9";Продолжить;
		ИначеЕсли Стр="33" Тогда S = S+":";Продолжить; 
		ИначеЕсли Стр="43" Тогда S = S+";";Продолжить; 
		ИначеЕсли Стр="14" Тогда S = S+"<";Продолжить;     
		ИначеЕсли Стр="24" Тогда S = S+"=";Продолжить; 
		ИначеЕсли Стр="34" Тогда S = S+">";Продолжить; 
		ИначеЕсли Стр="44" Тогда S = S+"?";Продолжить; 
		КонецЕсли;
	КонецЦикла;
	
	Возврат S; 
	
КонецФункции //Code_Char()

6. В процедуре вывода табличного документа на экран нужно добавить только две строки кода:

ШтрихКод = ПолучитьШтрихКодДокумента(ЭтотОбъект.Ссылка);
ОбластьМакета.Параметры.ШтрихКод = [ИмяВашегоОбщегоМодуля].Код128(ШтрихКод);
ОбластьМакета.Параметры.Код = ШтрихКод;

ПолучитьШтрихКодДокумента - просто получает цифры штрихкода из регистра сведений "ШтрихкодыДокументов".
Всё! Штрихкод готов, я получаю профит, клиент доволен. В дальнейшем обрабатывать событие сканирования очень легко - просто подтягиваем по номеру ссылку на документ из регистра и делаем с ним что угодно.

Специальные предложения

Комментарии
Избранное Подписка Сортировка: Древо развёрнутое
Свернуть все
1. Tarlich 87 25.02.20 19:55 Сейчас в теме
зачем регистр ? встречал у клиента такое решение .он не только растет (для файловой у меня это критично) но и потом уже штатное пометка удаление зовут удалить ... в чем трудность гуид в еан 128 загнать ?
2. Mechanik21 21 26.02.20 10:31 Сейчас в теме
(1)Гуид в еан128 загнать можно, просто не требовалось.
если не регистр, то где хранить?
3. Serega-artem 14 26.02.20 11:54 Сейчас в теме
Все методы важны, все методы нужны, но как по мне тут уж невероятно заморочено. Предложу свой вариант (реально делал на одной из самописных конфигураций), чисто как алгоритм.

1. Берем шрифт штрих кода (тут на вкус и цвет), внедряем его в печатную форму.

2. Создаем общий модуль, в котором размещаем процедуру формирования штриха. Он у нас будет из трех параметров

- Код документа
-Номер документа
-Дата документа

С номером и датой всё понятно (убираем лидирующие нули, пробелы, точки и т.п.)

Код документа - Либо составить таблицу сопоставления кода документу (1-ПриходнаяНакладная, 2-РасходнаяНакладная), либо брать его из метаданных.

В итоге наш штрих будет вида:
КодДокумента+НомерДокумента+ДатаДокумента;

Сформированный штрих забиваем на форму.

3. Там же размещаем функцию разбора штриха. По коду документа получаем его имя, востанавливаем номер и дату (возвращаем лидирующие нули, ставим точки). Ну а далее:

НашДокумент = Документы[ИмяДокумента].Найти(Номер, Дата)
Возврат НашДокумент


4. Рисуем обработку с реквизитом для "вбивания штрих кода" и от туда запускаем процедуру поиска документа. Получаем ссылку, открываем.

5. Я бы еще константу добавил, ИспользоватьШтрихКодирование. А то сегодня надо, завтра нет.... Заказчики, они такие)

Всё.
Mechanik21; +1 Ответить
4. Mechanik21 21 26.02.20 11:56 Сейчас в теме
(3)Затем и писал, чтоб другие варианты решения задачи увидеть
5. Serega-artem 14 26.02.20 11:58 Сейчас в теме
(4) Да, делится опытом полезно. Всегда стараюсь работать по правилу: перед тем как создать алгоритм, который будет что-то записывать в БД, хорошо подумай, может быть там уже всё это есть, надо просто присмотреться.
6. IlyaSR 26.02.20 16:08 Сейчас в теме
Нда, зачем изобретать велосипед?

1) Берем GUID = СсылкаНаОбъект.УникальныйИдентификатор();
2) Преобразовываем в десятичную систему счисления
3) Формируем из получившегося числа штрихкод

для того, чтобы получить ссылку на документ - обратный порядок

1) отсканированный штрихкод
2) Преобразуем в шестнадцатиричную систему счисления (идентификатор)
3) Получаем ссылку по идентификатору
Mechanik21; +1 Ответить
7. Serega-artem 14 27.02.20 09:24 Сейчас в теме
(6) Метод хорош, но имеет один недостаток (на мой взгляд): Уникальный идентификатор - это техническая ссылка, у нее предназначение немного другое. Идентификация документа для пользователя это всё же номер и дата. Вот есть накладная № 20 от 27.02.2020 на бумаге и в 1с пользователь будет ее искать как накладную № 20 от 27.02.2020, в случае необходимости. в случае каких-то проблем с БД, выгрузкой в другие системы и т.п. номер и дата останутся, а вот ссылка с высокой долей вероятности может и поменяться.
9. Terve!R 09.03.20 19:49 Сейчас в теме
(7) GUID у объекта не может меняться, это противоречит всем принципам уникального идентификатора в 1С.
Если так нужно название, номер и дату документа, то просто вывести в печатной форме эту информацию по ссылке рядом, и все.

Но вот сейчас задумался о проблеме, что у одного документа есть две печатные формы, и мне их по штрихкоду надо как-то различить.
То есть метод формирования штрихкода ни по GUID, ни по типу/номеру/дате документа не подходят, нужно еще что-то придумывать..
10. rudnitskij 15.03.20 21:28 Сейчас в теме
(9)Зачем различать? Разве штрихкод не должен быть свойством документав базе, а не документа на бумажке? Штрихкод нужен зачем? Чтобы чтение кода сканером выдавало инфу о документе. А если у вас на один документ будут разные штрихкоды в зависимости от печатной формы - зачем он такой вообще нужен?
12. Terve!R 17.03.20 17:56 Сейчас в теме
(10) бумажки затем надо различать, чтобы отслеживать возврат каждой бумажки. Мало ли задач бывает?
Если фантазии не хватает, то не надо говорить, что это никому не нужно)
13. rudnitskij 17.03.20 19:50 Сейчас в теме
(12) кажется, люди стали забывать, зачем придумали автоматизацию учета вообще и 1С в частности. Чтоб не морочиться с бумажками...
И да, это не те неправы, кто такую систему придумал. Это у меня не хватает фантазии...
Греты Тунберг на вас всех нет...
8. Terve!R 09.03.20 19:40 Сейчас в теме
(6) согласен, вот код в типовой УТ 11

Функция ЧисловойКодПоСсылке(Ссылка) Экспорт
	ШестнадцатиричноеЧисло = СтрЗаменить(Строка(Ссылка.УникальныйИдентификатор()),"-","");
	Возврат ПреобразоватьИзШестнадцатиричнойСистемыСчисленияВДесятичноеЧ­исло(ШестнадцатиричноеЧисло);
КонецФункции

Функция ПреобразоватьИзШестнадцатиричнойСистемыСчисленияВДесятичноеЧ­исло(Знач Значение)
	
	Значение = НРег(Значение);
	ДлинаСтроки = СтрДлина(Значение);
	
	Результат = 0;
	Для НомерСимвола = 1 По ДлинаСтроки Цикл
		Результат = Результат * 16 + СтрНайти("0123456789abcdef", Сред(Значение, НомерСимвола, 1)) - 1;
	КонецЦикла;
	
	Возврат Формат(Результат, "ЧГ=0");
	
КонецФункции
Показать
11. rudnitskij 15.03.20 21:36 Сейчас в теме
Запрос = Новый Запрос;
	Запрос.Текст = 
	"ВЫБРАТЬ
	|	ШтрихкодыДокументов.Штрихкод
	|ИЗ
	|	РегистрСведений.ШтрихкодыДокументов КАК ШтрихкодыДокументов
	|ГДЕ
	|	ШтрихкодыДокументов.Документ = &Документ
	|;
	|
	|////////////////////////////////////////////////////////////­////////////////////
	|ВЫБРАТЬ
	|	ШтрихкодыДокументов.Штрихкод
	|ИЗ
	|	РегистрСведений.ШтрихкодыДокументов КАК ШтрихкодыДокументов
	|ГДЕ
	|	ШтрихкодыДокументов.Штрихкод = &Штрихкод";
	
	Запрос.УстановитьПараметр("Документ", СсылкаНаОбъект);
	Запрос.УстановитьПараметр("Штрихкод", Штрихкод);
	
	Результат = Запрос.ВыполнитьПакет();
	
	ВыборкаДетальныеЗаписи = Результат[0].Выбрать();
	
	Если ВыборкаДетальныеЗаписи.Следующий() Тогда 
		// штрихкод есть - возвращаем Истину
		Возврат Истина
	КонецЕсли;     
Показать

Вот это место хотел прокомментировать. Много раз читал рекомендации по оптимизации выполнения запросов, в основном все содержат следующее:
Если вы делаете запрос ради получения одной записи - пишите в его тексте не просто ВЫБРАТЬ, а ВЫБРАТЬ ПЕРВЫЕ 1, чтоб при нахождении записи по параметрам поиск прекращался, в больших таблицах он ведь продолжается дальше и чем больше таблица - тем больше времени это занимает.
Кроме того. когда вы пакет выполнили, вас интересует просто наличие в пакете записей. Проверить это можно с помощью функции
Результат[0].Пустой
. Оператор Выбрать() обращается в таблицу за самими записями, которые найдены запросом, но ведь они вам не нужны.
То есть, я предлагаю сделать так:
Запрос = Новый Запрос;
	Запрос.Текст = 
	"ВЫБРАТЬ ПЕРВЫЕ 1
	|	ШтрихкодыДокументов.Штрихкод
	|ИЗ
	|	РегистрСведений.ШтрихкодыДокументов КАК ШтрихкодыДокументов
	|ГДЕ
	|	ШтрихкодыДокументов.Документ = &Документ
	|;
	|
	|////////////////////////////////////////////////////////////­////////////////////
	|ВЫБРАТЬ
	|	ШтрихкодыДокументов.Штрихкод
	|ИЗ
	|	РегистрСведений.ШтрихкодыДокументов КАК ШтрихкодыДокументов
	|ГДЕ
	|	ШтрихкодыДокументов.Штрихкод = &Штрихкод";
	
	Запрос.УстановитьПараметр("Документ", СсылкаНаОбъект);
	Запрос.УстановитьПараметр("Штрихкод", Штрихкод);
	
	Результат = Запрос.ВыполнитьПакет();
	
	ЕстьЗаписи = НЕ Результат[0].Пустой();
	
	Если ЕстьЗаписи Тогда 
		// штрихкод есть - возвращаем Истину
		Возврат Истина
	КонецЕсли;        
Показать
Mechanik21; +1 Ответить
Оставьте свое сообщение

См. также

Сканируем без сканера или MXL to JPG Промо

Внешние источники данных Универсальные функции Печатные формы документов v8 1cv8.cf Бесплатно (free)

Хотите конвертировать документы в формат изображения менее чем за минуту, не имея сканера? Тогда эта статья для вас.

24.05.2012    33422    0    shakmaev    47    

Доработка печатных форм, построенных на отчетах (СКД)

Печатные формы документов v8 v8::СКД ЗУП3.x Бесплатно (free)

Особенности доработки печатных форм, построенных на отчетах, в ЗУП 3.1.

19.06.2020    1422    0    niko11s    14    

Простой способ добавить факсимильную подпись и печать в печатную форму

Печатные формы документов Практика программирования v8 1cv8.cf Бесплатно (free)

Актуальная задача добавить факсимильную печать и подпись в печатную форму.

08.04.2020    9123    0    John_d    15    

Новые возможности обработки Печать договоров по шаблонам для УТ 11, КА 2, ERP 2

Печатные формы документов Документооборот и делопроизводство v8 ERP2 УТ11 КА2 Бесплатно (free)

В публикации описаны возможности обработки, которые появились в новых релизах

19.12.2019    3794    0    pparshin    3    

[БСП] Внешняя печатная форма: как перед печатью выводить форму настроек

Печатные формы документов БСП (Библиотека стандартных подсистем) v8 КА2 Бесплатно (free)

Во внешней печатной форме перед печатью нужно выводить форму настроек. Для примера рассматриваю печатную форму "Акт сверки взаимных расчетов " .

19.12.2019    9467    0    John_d    8    

Универсальная Форма для внешней печатной формы документа

Печатные формы документов v8 1cv8.cf Бесплатно (free)

Универсальная форма вызова процедуры "Печать(МассивОбъектов, КоллекцияПечатныхФорм, ОбъектыПечати, ПараметрыПечати)", чтобы каждый раз не изобретать велосипед! Реализация протестирована на 1С 8.3.12.1714 (x64).

10.05.2019    7153    0    Eret1k    4    

Реализация интерактивного редактирования макета Microsoft WORD из 1С для пользователя

Печатные формы документов Практика программирования Разработка v8 1cv8.cf Бесплатно (free)

Пользователь сам сможет редактировать макет Microsoft Word и в последствии использовать его для печати документа, справочника и т.д. Реализация протестирована на 1С 8.3.12.1714 (x64).

23.04.2019    6048    0    Eret1k    6    

Добавление команд печати в конфигурациях на БСП 2.4.3 (в частности, в самописных документах в Бухгалтерии 3.0 после релиза 3.0.52.35)

Печатные формы документов Практика программирования БСП (Библиотека стандартных подсистем) v8 v8::БУ БП3.0 Россия Бесплатно (free)

В статье https://infostart.ru/public/237013/ пользователя nick max рассматривался список действий для подключения команд печати в Бухгалтерии 3.0, работающей на БСП 2.3.6. В новом релизе Бухгалтерии 3.0.52.35 от 15.09.2017г. стала использоваться БСП 2.4.3, из-за чего произошли изменения в процедурах общих модулей, связанных с механизмом печати, и в процедурах их вызова в формах документов и в формах списков. Рассмотрим их.

18.09.2017    64460    0    bugtester    49    

БСП. Настраиваемый комплект документов. Внешние печатные формы

Печатные формы документов v8::СПР v8::УФ ЗУП3.x Бесплатно (free)

В демо-конфигурации "БСП" есть пример реализации механизма "Настраиваемый комплект документов", использующий встроенные печатные формы. Эта статья - развитие темы в сторону использования в своей обработке других внешних печатных форм.

09.06.2017    21991    0    WhiteOwl    12    

Подход к организации печати одного макета документа из обычной и управляемой форм документа (интерфейс Такси)

Универсальные печатные формы Печатные формы документов Математика и алгоритмы v8 1cv8.cf Бесплатно (free)

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

10.10.2013    38399    0    RailMen    9    

Видео. Автозаполняемые шаблоны документов в «1С:Документооборот 8»

Печатные формы документов v8 ДО Бесплатно (free)

В этом видеокурсе будет рассмотрен пример подготовки автозаполняемых шаблонов документов в «1С:Документооборот». Автозаполняемые шаблоны могут существенно сократить время пользователей на подготовку печатных форм типовых документов за счет автоматического создания файлов с уже подставленными данными из карточки документа.

13.11.2012    21748    0    ИТ-Терминал    3    

Подписанты - "Указание в первичных документах подписывающих лиц"

Печатные формы документов v8 КА1 УПП1 БУ НУ УУ Бесплатно (free)

Хотелось бы обратить внимание, добавленный функционал. УПП Версия 1.3.29 и КА Версия 1.1.25 Указание в первичных документах подписывающих лиц, т.е. кто подписывает, на основании чего.

01.10.2012    28487    0    Константин С.    6    

Решение: Универсальный счет с логотипом, печатью и отправкой в формате PDF

Печатные формы документов Оптовая торговля Оптовая торговля v8 КА1 УТ10 Россия Бесплатно (free)

Внешняя печатная форма счета для Комплексная автоматизация, редакция 1.1 и Управление торговлей, редакция 10.3 с использованием дополнительного регистра сведений ЛоготипыИПечатиОрганизаций и возможностью оправки по email как PDF-вложение

08.08.2012    18074    0    Abadonna    11    

Простой способ экономии бумаги при работе с типовыми конфигурациями на примере "Бухгалтерии предприятия" 2.0

Печатные формы документов v8 БП2.0 Россия Бесплатно (free)

Предлагается простая альтернатива разработке дополнительных печатных форм, если стоит задача разместить на одном листе 2 экземпляра печатной формы

09.05.2012    16491    0    mrd2008    11    

Печать на больничных бланках

Печатные формы документов Управление персоналом (HRM) Внешние источники данных Управление персоналом (HRM) v8 УПП1 Бесплатно (free)

Печатная форма для печати на больничных листках с использованием "OpenOffice Writer". Применяется для УПП. Печатается из документа "Начисление по больничному листу", либо как внешняя обработка.

09.08.2011    11097    0    ialex2008    19    

Печатная форма КМ-3 для Управления торговлей 10.3

Печатные формы документов Кассовые операции Кассовые операции v8 УТ10 Бесплатно (free)

Внешняя печатная форма Акта возврата денежных сумм для Управления торговлей 10.3, подключается к Расходному кассовому ордеру

16.06.2011    8031    0    warbird88    4    

Акт выполненных работ за поставщика

Печатные формы документов Производство готовой продукции (работ, услуг) Производство готовой продукции (работ, услуг) v8 УТ10 Россия БУ Бесплатно (free)

Акт выполненных работ за поставщика. Печатная форма для документа "Поступление товаров, услуг"

09.02.2011    13539    0    antowka    4    

Сканирование, сохранение и печать документов

Сканер штрих-кода Печатные формы документов v8 1cv8.cf Россия Бесплатно (free)

Сканирование с использованием WIA, хранение в справочнике "Хранилище дополнительной информации" и печать из документов и справочников.

01.02.2011    30030    0    anig99    16    

Внешние печатные формы М-2, М-2а

Печатные формы документов v8 КА1 БП2.0 УПП1 Россия БУ Бесплатно (free)

Стандартные печатные формы. Модули без паролей. Могут использоваться как обработки (удобно для отладки) и могут как внешние печатные формы. Делалось под КА, скорее всего подойдет и для БП.

12.01.2011    5912    0    SergN77    1    

Внешние печатные формы кадровых документов Т-6, Т-6а

Печатные формы документов Управление персоналом (HRM) Управление персоналом (HRM) v8 КА1 ЗУП2.5 Россия Бесплатно (free)

Стандартные печатные формы. Модули без паролей. Могут использоваться как обработки (удобно для отладки) и могут как внешние печатные формы. Делалось под КА, скорее всего подойдет и для ЗУП.

12.01.2011    5566    0    SergN77    7    

Трудовой договор для ЗУП 2.5

Печатные формы документов Зарплата Управление персоналом (HRM) Зарплата Управление персоналом (HRM) v8 ЗУП2.5 Россия Бесплатно (free)

Внешняя печатная форма Трудового договора для ЗУП2.5, подключаемая типовым механизмом внешних печатных форм к справочнику Сотрудники.

23.12.2010    34956    0    milov.aleksey    18    

Справка А и Б

Печатные формы документов Оптовая торговля Оптовая торговля v8 УПП1 Россия БУ Бесплатно (free)

Справка А и Б для УПП 8.1 Добавлена возможность выбора подписывающего лица от продавца... правда, есть некоторые "корявые" аспекты, должность вводится руками...

13.12.2010    6954    0    spyryty-santyum    4    

ТОРГ-2 для документа "Возврат товаров от покупателя" (УПП)

Печатные формы документов Учет ТМЦ Учет ТМЦ v8 УПП1 Бесплатно (free)

ТОРГ-2 модерн, выводится на основании документа "Возврат товаров от покупателя".

07.12.2010    7115    0    spyryty-santyum    6    

АЦРК: Акт списания материалов для БП 2.0, БП 1.6 (Требование-накладная и Отчет производства за смену) - форма 0504230

Печатные формы документов Учет ТМЦ Учет ТМЦ v8 БП2.0 БП1.6 Россия БУ Бесплатно (free)

Внешняя печатная форма "Акт списания материалов" для конфигурации БП 1.6 подключается к документам "ТребованиеНакладная" и "ОтчетПроизводстваЗаСмену". Печатная форма предназначена для использования с обработкой "Актив-ИТ: Подписи".

28.11.2010    21201    0    acrk    10    

Ручная запись версии объекта (для снеговика)

Печатные формы документов Универсальные функции Документооборот и делопроизводство Документооборот и делопроизводство v8 1cv8.cf Бесплатно (free)

Печатная форма для УПП 1.3.6.1 и алгоритм создания для любых других конфигураций с существующей системой версионирования.

07.11.2010    16970    0    anig99    1    

Да, еще одна ТТН (1-Т) с сохранением

Печатные формы документов Учет ТМЦ Учет ТМЦ v8 УТ10 Россия Бесплатно (free)

Внешняя печатная форма ТТН для УТ 10.3 сохраняет введенных водителей во внешний файл в каталоге базы, что позволяет без изменений в базе вести список водителей и параметров автомобилей. Ориентирован на файловую базу.

28.10.2010    23018    0    lazy    24    

Акт об оказании услуг с товарами

Печатные формы документов Производство готовой продукции (работ, услуг) Производство готовой продукции (работ, услуг) v8 БП2.0 Россия БУ Бесплатно (free)

Внешняя печатная форма для реализации товаров и услуг для бухгалтерии редакции 1.6

19.10.2010    7999    0    Dunda    1    

Печатные формы для некоторых кадровых документов 8.1 ЗУП 2.5

Печатные формы документов Управление персоналом (HRM) Управление персоналом (HRM) v8 ЗУП2.5 Россия Бесплатно (free)

Печатные формы для кадровых документов "ОплатаПраздничныхИВыходныхДнейОрганизаций" и "ОплатаСверхурочныхЧасов" Самый новый вариант, все вылизано до запятой. :-) Спасибо кадровикам.

19.05.2010    7668    0    Sasha_1200    1    

Акт выполненных работ за поставщика

Печатные формы документов Производство готовой продукции (работ, услуг) Производство готовой продукции (работ, услуг) v8 БП2.0 БУ Бесплатно (free)

Акт выполненных работ за поставщика. Печатная форма для документа "Поступление товаров, услуг".

11.05.2010    21058    0    SvetaTsp    26    

Печать акта доработки на основании документа "Списание ТМЦ"

Печатные формы документов v8 БП2.0 БУ Бесплатно (free)

Многие производственные фирмы на ряду со "Списанием ТМЦ" оформляют и "Акт доработки", который бухгалтер подшивает вместе с накладной и счет-фактурой на реализацию товаров.

07.04.2010    8593    0    d_vit    2    

Печатная форма корректировки записей регистров

Печатные формы документов v8 УПП1 Россия БУ Бесплатно (free)

Печатная форма корректировки по типу бухгалтерской справки

02.04.2010    8510    0    AndrewUtkaev    11    

Возврат товара поставщику, форма Торг-2 сжатая

Печатные формы документов Учет ТМЦ Учет ТМЦ v8 УТ10 Россия БУ УУ Бесплатно (free)

Акт об установленном расхождении по количеству и качеству при приемке товарно-материальных ценностей. Форма ужата для печати на 2 стр.

25.03.2010    21191    0    Altez    9    

Формы Т-11, Т-11а

Печатные формы документов Зарплата Зарплата v8 ЗУП2.5 Бесплатно (free)

Внешние подключаемые печатные формы Т-11, Т-11а для ЗУП 8.

02.03.2010    18187    0    daulberg    9    

Внешняя форма платежного поручения с надписью "Вторая подпись не предусмотрена"

Печатные формы документов Банковские операции Банковские операции v8 БП2.0 Россия БУ Бесплатно (free)

Внешняя печатная форма платежного поручения с надписью "Вторая подпись не предусмотрена"

23.02.2010    20006    0    bb1962    5    

Внешняя печатная форма РКО Расходный Кассовый Ордер

Печатные формы документов Кассовые операции Кассовые операции v8 БП2.0 Россия БУ Бесплатно (free)

Готовая внешняя печатная форма для 1С Бухгалтерии 8.1 (1.6.23.2)

21.02.2010    9437    0    Grekk    15    

Внешняя печатная форма счет-фактуры и ТОРГ-12 для Бухгалтерии КОРП (Для филиалов)

Печатные формы документов Оптовая торговля Оптовая торговля v8 БП2.0 Россия БУ Бесплатно (free)

Исправлено несоответствие печатной формы счета-фактуры и ТОРГ-12, выписываемого обособленным подразделением, действующему законодательству.

11.02.2010    6269    0    kns    4    

Внешняя печатная форма счета на оплату покупателю для УТ 10.3

Печатные формы документов v8 УТ10 Бесплатно (free)

Создана на основе стандартной печатной формы с целью правки макета без изменения конфигурации.

21.01.2010    16332    0    skorin    15