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

25.02.20

Учетные задачи - Печатные формы

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

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

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

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(ШтрихКод);
ОбластьМакета.Параметры.Код = ШтрихКод;

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

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

См. также

SALE! 25%

Infostart PrintWizard

Пакетная печать Печатные формы Инструментарий разработчика Платформа 1С v8.3 Запросы 1С:Зарплата и кадры бюджетного учреждения 1С:Конвертация данных 1С:ERP Управление предприятием 2 1С:Управление торговлей 11 Платные (руб)

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

18000 15300 руб.

06.10.2023    7281    21    6    

39

Универсальная печать по шаблонам Word (Печать договоров из 1С БП 3, УНФ 1.6, ЗУП 3, УТ 11, КА 2, ERP 2, ДО 3)

Печатные формы Платформа 1С v8.3 Управляемые формы Конфигурации 1cv8 1С:ERP Управление предприятием 2 Платные (руб)

Научите вашу 1C печатать из 1С в файл Word (Например: трудовые договоры, договоры с контрагентами, спецификации, дополнительные соглашения, приказы, коммерческие предложения, акты, накладные, карточки партнера или любого справочника и многие другие). Универсальная печать предназначена для формирования печатных форм на основе шаблонов в формате Word из любой конфигурации 1С. С помощью данного инструмента можно самостоятельно заполнить шаблон реквизитами справочника или документа 1С и сформировать печатные формы на основании ссылки на любой объект.

5400 руб.

08.10.2019    42683    144    88    

134

SALE! 25%

УТ 11, КА 2, ERP 2: Настраиваемые под каждую организацию печать и подпись ответственных лиц в печатных формах (ТОРГ-12, Счёт-фактура, УПД, УКД, Заказ клиента, Акт сверки, М-15 и др.)

Печатные формы Взаиморасчеты Оптовая торговля Производство готовой продукции (работ, услуг) Акт сверки Оперативный учет Управляемые формы 1С:Управление торговлей 11 Россия Бухгалтерский учет Управленческий учет Платные (руб)

Задайте для каждой организации свою печать и для каждого физического лица свою подпись. Выберите в документе печатную форму "... с печатью и подписью" - и автоматически сформируется табличный документ с печатью и подписями той организации и ответственных лиц, которые указаны в документе.

12000 9000 руб.

13.03.2018    56439    179    76    

112

Печатные формы КС-2 и КС-3 в "1С:Бухгалтерия 3.0"

Печатные формы Производство готовой продукции (работ, услуг) Платформа 1С v8.3 Бухгалтерский учет Оперативный учет 1С:Бухгалтерия 3.0 Строительство Россия Бухгалтерский учет Платные (руб)

Откройте для себя заполнение КС-2 и КС-3 в "1С:Бухгалтерия 3.0". Вы получаете удобство, скорость и систему, чтобы заполнить, распечатать и сохранить формы КС-2 и КС-3 из документов "Оказание производственных услуг" или "Реализация товаров услуг". Вы можете заполнить дополнительную информацию о материалах из документов "Требование-накладная" и указать сведения, которые не предусмотрены типовой конфигурацией "1С:Бухгалтерия 3.0". Так же доступно множество настроек для формирования КС-2 и КС-3.

3240 руб.

13.02.2019    87998    388    44    

371

Печать актов МХ-1, МХ-3 в 1С:Бухгалтерия 3.0

Печатные формы Логистика, склад и ТМЦ Платформа 1С v8.3 Бухгалтерский учет 1С:Бухгалтерия 3.0 Россия Бухгалтерский учет Платные (руб)

Обработки для "1С:Бухгалтерия 3.0", которые формируют акты МХ-1 и МХ-3 для документов "ПоступлениеТоваровУслуг", "Реализация товаров услуг", "Возврат товаров поставщику", "Передача материалов в эксплуатацию" соответственно. Так же можно сформировать акты с факсимиле, которая загружена в 1С:Бухгалтерия 3.0.

2520 руб.

18.02.2019    61104    170    14    

139

Путевые листы (расширение)

Печатные формы Платформа 1С v8.3 Бухгалтерский учет 1С:Бухгалтерия 3.0 1С:Управление торговлей 11 1С:Комплексная автоматизация 2.х Транспорт, автопарки, такси Бухгалтерский учет Платные (руб)

Учет путевых листов выполнен в виде расширения. Предназначен для учета путевых листов в конфигурации Бухгалтерия предприятия 3.0. и Комплексная автоматизация 2. Печатная форма: Типовая межотраслевая форма № 3. Утверждена постановлением Госкомстата России от 28.11.97 № 78. Типовая межотраслевая форма № 4-П от 18.09.2008 г. N 152 с учетом изменений указанных в Приказе Министерства транспорта Российской Федерации №368 от 11 сентября 2020 г. №368, Типовая межотраслевая форма № ЭСМ-7, и др. ЭСМ-2, 4-С, 3 спец., 6 спец., ПЛ для Автомобильного крана. .

2000 руб.

14.10.2019    36518    224    215    

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

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

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

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

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

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

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

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

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

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


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

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

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

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

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

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

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

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

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

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

фДлина переменная как определяется?) В коде ее нет.
15. Mechanik21 24 16.09.21 04:33 Сейчас в теме
(14)больше года спустя трудно вспоминать)
по-моему там просто число 13 в этой переменной
16. user1012996 16.09.21 09:34 Сейчас в теме
Доброго утра!)

Ясно, спасибо за ответ! Подскажите, пожалуйста, справочник "ФорматыШтрихКодов" какую структуру имеет, какие реквизиты?
17. user1012996 16.09.21 13:38 Сейчас в теме
Без этого справочника сделал, только почему-то создает запись со ШК в регистре сведений только для одного документа подчинения, для втрого - уже нет. Если выбрать другой документ, подчиненный своему - все хорошо, добавляет сформированный ШК и для него. Сделал в обработке проведения для вида документов Этап производства, который подчинен документу Заказ на производство, вернее для конкретного этапа производства заказ на производство является распоряжением. В чем может быть причина?
18. user1012996 17.09.21 13:01 Сейчас в теме
Добрый день!

И вот по этому пункту:

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

У меня получилась ситуация, что для двух разных документов одного вида после удаления всех дефисов и букв сформировался одинаковый штрихкод. Вы это момент не учитывали? Как можно его обойти?
19. Mechanik21 24 17.09.21 13:25 Сейчас в теме
(18)организовать проверку на то, есть такой штрихкод уже в базе или нет. Если есть привести к числу прибавить 1 и снова проверить.
Было такое, дорабатывал.
Не самый лучший вариант, конечно. Но на тот момент лучше не требовалось
20. user1012996 17.09.21 13:35 Сейчас в теме
Это у Вас второй запрос в пакете как раз?
21. Mechanik21 24 17.09.21 14:49 Сейчас в теме
22. user1012996 17.09.21 23:36 Сейчас в теме
Сделал проще!)

Начало как у Вас с проверкой существующего кода по ссылке на документ объект., если ШК есть, то ничего не делаем == результат Истина, если новый объект, то ШК всегда из Нового уникальногоидентификатора(). Таки образом уникальность ШК сохраняется и без всяких проверок на уникальность. Верно,)
Оставьте свое сообщение