gifts2017

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

Опубликовал Олег (mov68) в раздел Оборудование - Сканер штрих-кода

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

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

Некоторые пояснения:

Штрих-код  у меня состоит из полей: 2 символа - код документа (вряд ли в базе свыше 99 видов документов)-задает разработчик, 2 символа - код фирмы (вряд ли в одной базе ведут свыше 99 своих фирм)- я беру его из кода карточки фирмы, дата-пояснений не нужно, номер документа - поставлен в конец, т.к. в моей базе есть документы с разной длиной номера, плавает длина-номер в конце - проще разбор. Еще момент - от номера отсекается префикс документов (у нас префикс задается по фирме) для универсальности - некоторые виды штрих-кодов не понимают литер, а так - только цифры. Префикс однозначно восстанавливается (у меня) по фирме. Если применяются более сложные префиксы (пр-р по подразделениям), то проще перед номером добавить 2 символа с кодировкой префиксов.

Вторая функция позволяет найти документ по сканированному штрих-коду, а дальше по фантазии...

//формирование штрих-кода
Функция мирПолучитьШтрихКодПоДокументу(ДокСсылка) Экспорт
	стрНомерДокумента=Прав(СокрП(ДокСсылка.Номер),7);
	стрДата=""+Формат(ДокСсылка.Дата,"ДФ=yyyy")+?(Месяц(ДокСсылка.Дата)<10,"0"+Месяц(ДокСсылка.Дата),Месяц(ДокСсылка.Дата))+Лев(ДокСсылка.Дата,2);
	ВидДок=ТипЗнч(ДокСсылка);
	Если ВидДок=Тип("ДокументСсылка.ЗаказНаряд") Тогда  // для заказ-наряда
		КодДокумента="01";
	ИначеЕсли ВидДок=Тип("ДокументСсылка.РеализацияАвтомобилей") Тогда    
		КодДокумента="02";
	ИначеЕсли ВидДок=Тип("ДокументСсылка.СчетНаОплатуЗаАвтомобили") Тогда    
		КодДокумента="03";     
	ИначеЕсли ВидДок=Тип("ДокументСсылка.ПриходныйКассовыйОрдер") Тогда    
		КодДокумента="04";    
	ИначеЕсли ВидДок=Тип("ДокументСсылка.РасходныйКассовыйОрдер") Тогда    
		КодДокумента="05";
	ИначеЕсли ВидДок=Тип("ДокументСсылка.СчетНаОплату") Тогда    
		КодДокумента="06";    
	ИначеЕсли ВидДок=Тип("ДокументСсылка.РеализацияТоваров") Тогда    
		КодДокумента="07";    
	Иначе
		Возврат  "";
	КонецЕсли;
	КодФирмы=Число(Прав(СокрП(ДокСсылка.Организация.Код),2));
	СтрФирма=?(КодФирмы<10,"0"+КодФирмы, Строка(КодФирмы));
	ШтрихКод=КодДокумента+СтрФирма+стрДата+стрНомерДокумента;
	Возврат ШтрихКод;
КонецФункции

//получение документа
Функция мирПолучитьДокументПоШтрихКоду(ШтрихКод) Экспорт
	ШтрихКод=СокрЛ(ШтрихКод);
	КодДокумента=Лев(ШтрихКод,2);
	Если КодДокумента="01" Тогда
		ВидДок="ЗаказНаряд";
	ИначеЕсли КодДокумента="02" Тогда   
		ВидДок="РеализацияАвтомобилей";
	ИначеЕсли КодДокумента="03" Тогда   
		ВидДок="СчетНаОплатуЗаАвтомобили";
	ИначеЕсли КодДокумента="04" Тогда   
		ВидДок="ПриходныйКассовыйОрдер";
	ИначеЕсли КодДокумента="05" Тогда   
		ВидДок="РасходныйКассовыйОрдер";
	ИначеЕсли КодДокумента="06" Тогда   
		ВидДок="СчетНаОплату";
	ИначеЕсли КодДокумента="07" Тогда   
		ВидДок="РеализацияТоваров";
	Иначе 
		Возврат Неопределено;   
	КонецЕсли;   
	ДатаДок=Дата(Сред(ШтрихКод,5,4),Сред(ШтрихКод,9,2),Сред(ШтрихКод,11,2));
	КодФирмы="000000"+Сред(ШтрихКод,3,2);
	Организация=Справочники.Организации.НайтиПоКоду(КодФирмы);
	Префикс=Организация.Префикс;
	НомерДок=Префикс+Сред(ШтрихКод,13);
	Запрос=Новый Запрос;
	Запрос.Текст="ВЫБРАТЬ
	|    Документ.Ссылка
	|ИЗ
	|    Документ."+ВидДок+" КАК Документ
	|ГДЕ
	|    Документ.Номер = &Номер
	|    И Документ.Дата >= &ДатаНач";
	Запрос.УстановитьПараметр("ДатаНач",НачалоДня(ДатаДок));             
	Запрос.УстановитьПараметр("Номер",НомерДок);
	Выборка=Запрос.Выполнить().Выбрать();
	Если Выборка.Следующий() Тогда
		Возврат Выборка.Ссылка;
	КонецЕсли;    
	Возврат Неопределено;
КонецФункции

См. также

Подписаться Добавить вознаграждение
Комментарии
1. VVV (V_V_V) 11.08.10 17:42
А загнать в штрих-код Уникальный идентификатор документа не проще? И хранить нигде не надо, и кода пару строк... :D
Spacer; mov68; Asdam; Tarlich; qwest; +5 Ответить 2
2. mirco brons (mirco) 11.08.10 18:03
(1) я бы тоже использовал именно идентификатор...
3. Дмитрий Глух (IronDemon) 11.08.10 18:17
А Уникальный идентификатор зачем?
4. Александр Цегельников (markers) 11.08.10 20:43
Мысль хорошая, покурим её!
5. Андрей Тарлыков (Tarlich) 11.08.10 21:15
(1) полностью согласен , видел используется еан128
6. VVV (V_V_V) 11.08.10 22:34
(5) У меня с EAN128 не пошло ни в какую. Зато с Code93 и Code128 - на ура. И с дефисами, и без. Хотя есть у способа с Уникальным идентификатором большой минус - громадная ширина штрих-кода, почти на весь А4 формат (в портрете) при использовании стандартной 1С:Печать штрих-кодов, так что он не для гурманов. Но у автора статьи не намного меньше 36-ти символов получается - разница по-идее будет незначительна.
7. Олег (mov68) 12.08.10 14:34
Загнать в штрих-код Уникальный идентификатор документа проще.
Но делалось под свою специфику: штрих-кодами помечаются и купоны на скидку (автосервис) - суммы порой весьма приличные и зависят от суммы прошлых работ, при этом купон хранит номер документа, по которому он распечатан. Физически его в базе нет.
Есть также ряд видов документов, по которым печатаются несколько типов печатных документов (для заказ-наряда их больше 20). Поэтому <Код документа> это скорее код печатной формы, что позволяет при сканировании автоматом выполнять нужные действия.
Тогда уж использовать Код документа и идентификатор.
Другой случай - вовремя не провели расходную накладную, смены сменились, посчитали что клиент отказался, пометили на удаление и благополучно удалили. Недели через 2 бухгалтерия забила тревогу - подписанная накладная есть, деньги пришли, а документа в системе нет. Документ был восстановлен по печатной форме (ессно все кому положено по шапке получили), соответственно уникальный идентификатор изменился, а номер, дата и прочее - нет. Это из реального...
8. Александр Медведев (anig99) 13.08.10 09:54
Можно попробовать двухмерное штрихкодирование... Тогда можно будет туда кучу инфы ещё записать
9. Инесса (ign) 12.10.11 19:31
Спасибо за идею. Использовала Code128 (он ооочень длинный)при штрихкодировании готовой продукции на выходе из цеха. Оператору создала рабочий стол для печати ярлыков со штрихкодами по заказу покупателя или заказу на производство, в штрихкод засунула:
1.Код номенклатуры
2.Номер заказа
3.год, месяц и день, т.е. дату заказа
4.Количество в упаковке
уникальность обеспечена и код нигде не храниться.
(это печатается на ярлыке в виде текста и ввиде штрихкода)
Ежедневный огромный объем отгрузки и невозможность идентифицировать зрительно наименование номенклатуры правильно не позволяет вручную обеспечить скорость и точность создания документов "Отчет производства за смену", поэтому на продукцию клеят ярлыки со щтрихкодом и принимают продукцию собирая штрихкоды терминалом сбора данных. Затем загружают большие списки в "Отчет производства за смену" с расчетом количества в упаковке и сворачивание одинаковой номенклатуры. Заказы стали закрываться без потерь, и при отгрузке тоже меньше в разы. Склад ГП тоже маслит терминалом каждую коробку для док. реализация.
Altertego11; Rustig; +2 Ответить
10. Jamil Galeev (JamilRG) 17.10.11 11:30
Очень надо шрихкодирование Заказ-Нарядов, подойдет ли эта обработка?
11. Алексей Марченко (Alexez) 29.12.11 11:44
супер замечательный пример штрих кодирования, позволяет без труда найти в базе нужный документ. Будем пользоваться. Спасибо!!!!Спасибо!!!!Спасибо!!!!Спасибо!!!!Спасибо!!!!Спасибо!!!!Спасибо!!!!Спасибо!!!!Спасибо!!!!Спасибо!!!!
12. Сергей Сергеев (Рамзес) 06.04.12 12:37
А если после штрихкодирования документа пользователь по какой-либо причине изменил дату документа на более раннюю? Запрос в функции поиска документа по штрихкоду такой документ отбросит.
Может лучше идентифицировать документ по году? Типовые документы имеют периодичность "В пределах года".

Запрос.Текст = "ВЫБРАТЬ
| Документ.Ссылка
|ИЗ
| Документ." + ВидДок + " КАК Документ
|ГДЕ
| Документ.Номер = &Номер
| И ГОД(Документ.Дата) = &ГодДокумента";
psa247; Shakronya; Rustig; +3 Ответить
Для написания сообщения необходимо авторизоваться
Прикрепить файл
Дополнительные параметры ответа