gifts2017

Штрих-код для любых объектов, в том числе и на Документы!

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

Формирование Штрих-Кода для любого объекта, с дальнейшим его считыванием сканером


1. Формируем код для объекта, с помощью ЗначениеВСтрокуВнутр
2. Делаем расшифровку с помощью ЗначениеИзСтрокиВнутр
3. В процедуру ОбработкаВнешнегоСобытия(Источник, Событие, Данные) Добавляем проверку-расшифровку кода и, в зависимости от полученного объекта, делаем с ним что хотим.

Например, я использовал для Документов.

1)

Функция глОбъект_СформироватьШтрихКод(Объект) Экспорт

сПредставлениеОбъекта = СтрЗаменить(ЗначениеВСтрокуВнутр(Объект),"""","");
сПредставлениеОбъекта = СтрЗаменить(сПредставлениеОбъекта,"{","");
сПредставлениеОбъекта = СтрЗаменить(сПредставлениеОбъекта,"}","");
сПредставлениеОбъекта = СтрЗаменить(сПредставлениеОбъекта,",",РазделительСтрок);

сТипОбъекта = СокрЛП(СтрПолучитьСтроку(сПредставлениеОбъекта,1));
сИДТаблицы = СокрЛП(СтрПолучитьСтроку(сПредставлениеОбъекта,4));
сИДОбъекта = СокрЛ(СтрПолучитьСтроку(сПредставлениеОбъекта,7));
сИДОбъекта = СтрЗаменить(сИДОбъекта," ","_");

Возврат Шаблон("[сТипОбъекта]#[сИДОбъекта]@[сИДТаблицы]");

КонецФункции // глОбъект_СформироватьШтрихКод




2)

Функция глОбъект_НайтиПоШтрихкоду(сШтрихКод) Экспорт 

Если 0 = глСтрока_ЯвляетсяШтрихКодомОбъектаБД(сШтрихКод) Тогда
Возврат "";//пустое значение
КонецЕсли;

мнсСтрока = СтрЗаменить(сШтрихКод, "#", РазделительСтрок);
мнсСтрока = СтрЗаменить(мнсСтрока, "@", РазделительСтрок);
мнсСтрока = СокрЛП(мнсСтрока);

сТип = СтрПолучитьСтроку(мнсСтрока,1);
сИДОбъекта = СтрПолучитьСтроку(мнсСтрока,2);
сИДТаблицы = СтрПолучитьСтроку(мнсСтрока,3); 

сИДОбъекта = СтрЗаменить(сИДОбъекта, "_", " ");

сВнутреннееПредставление = "{""";
сВнутреннееПредставление = сВнутреннееПредставление + сТип + """,""0"",""0"",""";
сВнутреннееПредставление = сВнутреннееПредставление + сИДТаблицы+""",""0"",""0"",""";
сВнутреннееПредставление = сВнутреннееПредставление + Прав(" "+сИДОбъекта, 13) + """}"; // если база не распределенная, то надо делать так:
// сВнутреннееПредставление = сВнутреннееПредставление +Прав(" "+сИДОбъекта+" ", 13));
// Сообщить(сВнутреннееПредставление);
Объект = ЗначениеИзСтрокиВнутр(сВнутреннееПредставление);

Возврат Объект;

КонецФункции // глОбъект_НайтиПоШтрихкоду 

Функция глСтрока_ЯвляетсяШтрихКодомОбъектаБД(сСтрока) Экспорт

мнсСтрока = СтрЗаменить(сСтрока, "#", РазделительСтрок);
мнсСтрока = СтрЗаменить(мнсСтрока, "@", РазделительСтрок);
мнсСтрока = СокрЛП(мнсСтрока); 

Если СтрКоличествоСтрок(мнсСтрока) <> 3 Тогда
Возврат 0;
КонецЕсли; 

сТип = СтрПолучитьСтроку(мнсСтрока,1);

Если СтрДлина(сТип) <> 1 Тогда
Возврат 0;
КонецЕсли; 

сИДОбъекта = СтрПолучитьСтроку(мнсСтрока,2);
сИДТаблицы = СтрПолучитьСтроку(мнсСтрока,3);

Возврат 1; 

КонецФункции // глСтрока_ЯвляетсяШтрихКодомОбъектаБД




3)

Процедура ОбработкаВнешнегоСобытия(Источник, Событие, Данные)

Если Событие = "BarCodeValue" Тогда
Если глСканерВключен() = 1 Тогда
глСканерПосылкаДанных(1);
КонецЕсли; 


Объект = глОбъект_НайтиПоШтрихкодуК(Данные);

Если ТипЗначенияСтр(Объект) = "Документ" Тогда
// ищем, открываем форму, в общем, что нам нужно, то и делаем
ОткрытьФорму(Объект);
КонецЕсли; 
Иначе
глОбработкаВнешнегоСобытия(Источник, Событие, Данные); 
КонецЕсли;

КонецПроцедуры // ОбработкаВнешнегоСобытия()



4)
Далее вставляем ШК в табличную часть дока, к примеру, (EAN128), пишем там, глОбъект_СформироватьШтрихКод(Объект), и все работает.

См. также

Подписаться Добавить вознаграждение
Комментарии
1. Poppy (poppy) 05.05.08 00:14
Хм...
Функция глОбъект_НайтиПоШтрихкодуК(глОбъект_СформироватьШтрихКодК(Объект)) должна вернуть тот же объект, или ничего не вернуть?
В типовых (демо) бухии и ТиС'е возвращает нечто, но не исходный объект...
Бяка... ;-)
2. Олег Пономаренко (O-Planet) 05.05.08 03:01
любит же народ лезть рукой в туда, куда не надо лазить руками ;)
3. Аркадий Кучер (Abadonna) 05.05.08 09:53
Добавляем в Функция глОбъект_СформироватьШтрихКодК
строчку Сообщить(ЗначениеВСтрокуВнутр(Объект));
добавляем в Функция глОбъект_НайтиПоШтрихкодуК
строчку Сообщить(сВнутреннееПредставление);
Выбираем конкретный документ, имеем:
{"O","0","0","0","0","0"," 1611 471813 "} // как оно есть на самом деле
{"O","0","0","8130","0","0"," 1611 "} // как вернулось после обратного преобразования
Ну и чего ж оно найдет?
Ты сам-то проверял?
4. Олег Пономаренко (O-Planet) 05.05.08 11:01
Эх, студенты...

Код
Функция глФормироватьШтрихКодДокумента(Д)
   Ч=глДополнитьСтрокуЛ(Строка(ДатаЧисло(Д.ДатаДок)),"0",2);
   М=глДополнитьСтрокуЛ(Строка(ДатаМесяц(Д.ДатаДок)),"0",2);
   Г=Прав(Строка(ДатаГод(Д.ДатаДок)),2);
   Для К=1 По Метаданные.Документ() Цикл
      Если Метаданные.Документ(К).Идентификатор=Д.Вид() Тогда
         Прервать;
      КонецЕсли;   
   КонецЦикла;   
   ДопКод=Строка(К)+Ч+М+Г+глДополнитьСтрокуЛ(Строка(Д.Код), "0", 12);
   Штрихкод=глДополнитьСтрокуЛ(СокрЛП(Константа.ПрефиксШтрихКодаДокумента),"0",2)+глДополнитьСтрокуЛ(ДопКод,"0",24);
   Возврат Штрихкод+глКонтрольныйСимволEAN(Штрихкод,25);
КонецФункции // СформироватьШтрихкод()

Функция глНайтиДокумент(ШтрихКод)
   Если СтрДлина(ШтрихКод)<>20 Тогда
      Возврат "";
   КонецЕсли;
   НомТипДок=Число(Сред(ШтрихКод,3,4));
   СтрДата=Сред(ШтрихКод,7,6);
   НомерДок=Прав(ШтрихКод,12);
   ДатаДок=Дата(Число(Прав(СтрДата,2)),Число(Сред(СтрДата,3,2)),Число(Лев(СтрДата,2)));
   ТипДок=Метаданные.Документ(НомТипДок).Идентификатор;
   Док=СоздатьОбъект("Документ."+ТипДок);
   Док.Новый();      
   Док.НомерДок="00000000000000000000000000000";
   ДлНомера=СтрДлина(Док.НомерДок);
   НомерДок=Прав(НомерДок,ДлНомера);
   Рез=Док.НайтиПоНомеру(НомерДок,ДатаДок);
   Возврат ?(ПустоеЗначение(Рез)=1,"",Рез);
КонецФункции   
Показать полностью


Правда, не проверял, но, думаю, работает. Длину кода определяю не совсем красиво, но что-то не помню, как это через метаданные, а искать лень.

В ОбработкаВнешнегоСобытия проверяем штихкод на префикс. Если он соответствует Константа.ПрефиксШтрихКодаДокумента, то вызываем глНайтиДокумент(Данные). Воть...
5. Poppy (poppy) 05.05.08 11:12
(3)
Напиши Сообщить(ЗначениеВСтрокуВнутр(Объект.ТекущийДокумент()));

И ты получишь другой результат.
6. Shraik (shraik) 07.05.08 09:07
При внедрении этой штуки, не забудьте проверить, что в распределенной базе не используются русские буквы в коде периферийной инф. базы.
иначе процедура ЗначениеВСтрокуВнутр(Объект) вернет еще и русские буквы, а сканеры их не любят.
И еще я упаковываю полученный код до 60 разрядного представления с помощью _IdToStr()
7. Сергей Генералов (serg1c) 07.05.08 12:28
8. Сергей Генералов (serg1c) 07.05.08 13:46
С документами это работает проверил
//---------------
//Дополняет передаваемую строку Стр символами Чем до строки длиной Длина
//справа или слева в зависимости от значения переменной Режим (1-слева, 2-справа)
Функция ДополнитьСтроку(Стр,Чем,Длина,Режим=1)
Добавить=Длина-СтрДлина(Стр);
Если Добавить>0 Тогда
Добавок="";
Для Сч = 1 По Добавить Цикл
Добавок=Добавок+Чем
КонецЦикла;
Возврат ?(Режим=1,Добавок+Стр,Стр+Добавок);
Иначе
Возврат Стр;
КонецЕсли;
КонецФункции
//---------------
Функция глОбъект_СформироватьШтрихКодК(Объект) Экспорт

сПредставлениеОбъекта = СтрЗаменить(ЗначениеВСтрокуВнутр(Объект),"""","");
сПредставлениеОбъекта = СтрЗаменить(сПредставлениеОбъекта,"{","");
сПредставлениеОбъекта = СтрЗаменить(сПредставлениеОбъекта,"}","");
//сПредставлениеОбъекта = СтрЗаменить(сПредставлениеОбъекта,"0","");
сПредставлениеОбъекта = СтрЗаменить(сПредставлениеОбъекта,",",РазделительСтрок);

сТипОбъекта = СокрЛП(СтрПолучитьСтроку(сПредставлениеОбъекта,1));
сИДТаблицы = СокрЛП(СтрПолучитьСтроку(сПредставлениеОбъекта,4));
сИДОбъекта = СтрПолучитьСтроку(сПредставлениеОбъекта,7);
КодБазы = СокрЛП(Прав(сИДОбъекта,3));
КодБазы = КодБазы + СтрДлина(КодБазы);
ИДОбъекта = СокрЛП(Лев(сИДОбъекта,СтрДлина(сИДОбъекта)-3));

Штрих = Шаблон("[сТипОбъекта][ИДОбъекта][сИДТаблицы][КодБазы]");
Возврат Шаблон("[сТипОбъекта][ИДОбъекта][сИДТаблицы][КодБазы]");

КонецФункции // глОбъект_СформироватьШтрихКод//*******************************************
//----------------------------------------------------------------------------------------
Функция глОбъект_НайтиПоШтрихкодуК(сШтрихКод) Экспорт

ДлинаКодаБазы = Число(Прав(сШтрихКод,1));
КодБазы = Прав(сШтрихКод,ДлинаКодаБазы+1);
КодБазы = Лев(КодБазы,СтрДлина(КодБазы)-1);
сИДОбъекта = СокрЛП(Сред(сШтрихКод,2,Число(СтрДлина(сШтрихКод)-(6+СтрДлина(КодБазы)))));
сИДТаблицы = СокрЛП(Прав(сШтрихКод,6));
сИДТаблицы = Лев(сИДТаблицы,4);
КодБазы = ДополнитьСтроку(КодБазы," ",3,2);
сИДОбъекта = сИДОбъекта+КодБазы;
сИДОбъекта = ДополнитьСтроку(сИДОбъекта," ",13,1);


сТип = СокрЛП(Лев(сШтрихКод,1));

сВнутреннееПредставление = "{""";
сВнутреннееПредставление = сВнутреннееПредставление + сТип + """,""0"",""0"",""";
сВнутреннееПредставление = сВнутреннееПредставление + сИДТаблицы+""",""0"",""0"",""";
сВнутреннееПредставление = сВнутреннееПредставление + сИДОбъекта + """}"; // если база не распределенная, то надо делать так:
// сВнутреннееПредставление = сВнутреннееПредставление +Прав(" "+сИДОбъекта+" ", 13));

Объект = ЗначениеИзСтрокиВнутр(сВнутреннееПредставление);

Возврат Объект;

КонецФункции // глОбъект_НайтиПоШтрихкоду
9. vau (vau) 19.08.08 10:49
//----------------------------------------------------------------------
Функция СтрокаПробелов(Кво)
Возврат Формат("","С"+Кво);
КонецФункции
//----------------------------------------------------------------------
Функция ВыровнятьСтроку(Стр,Длина,Слева=0) Экспорт
СДлина = СтрДлина(Стр);
Если СДлина < Длина Тогда
Стр = ?(Слева=0,Стр+СтрокаПробелов(Длина-СДлина),СтрокаПробелов(Длина-СДлина)+Стр);
ИначеЕсли СДлина > Длина Тогда
Стр = Лев(Стр,Длина);
КонецЕсли;
Возврат Стр;
КонецФункции
//----------------------------------------------------------------------------------------
Функция ОтрезатьСПрава(Стр,Кво)
ЛД=СтрДлина(Стр)-Кво;
ЛД=?(ЛД<0,0,ЛД);

Рез=Прав(Стр,Кво);
Стр=Лев(Стр,ЛД);

Возврат Рез;
КонецФункции
//----------------------------------------------------------------------------------------
Функция глОбъект_СформироватьШтрихКод(Объект) Экспорт

//функция ЗначениеВСтрокуВнутр(),возвращает строку вида
//{"<Тип объекта>","0","0","<ИД таблицы>","0","0","<ИД объекта>"}
//
//ИД объекта: " 19 62193921 ".
//Оно состоит из следующих полей:
//- Первые 10 байт - идентификатор типа (в десятичной форме)
//- Вторые 10 байт - идентификатор объекта (в десятичной форме)
//- Последние 3 байта - описатель базы УРБД (по умолчанию - 3 пробела).

//Сообщить(ЗначениеВСтрокуВнутр(Объект));

сПредставлениеОбъекта = СтрЗаменить(ЗначениеВСтрокуВнутр(Объект),"""","");
сПредставлениеОбъекта = СтрЗаменить(сПредставлениеОбъекта,"{","");
сПредставлениеОбъекта = СтрЗаменить(сПредставлениеОбъекта,"}","");
сПредставлениеОбъекта = СтрЗаменить(сПредставлениеОбъекта,",",РазделительСтрок);

ИдОбъекта = СтрПолучитьСтроку(сПредставлениеОбъекта,7);

сКодБазы = СокрЛ(ОтрезатьСПрава(ИдОбъекта,3));
сКодБазы = сКодБазы + СокрЛП(СтрДлина(сКодБазы));

сИДОбъекта = СокрЛП(_IdToStr(СокрЛП(ОтрезатьСПрава(ИдОбъекта,10))));
сИДОбъекта = сИДОбъекта + СокрЛП(_IdToStr(СтрДлина(сИДОбъекта)));

сВидОбъекта = СокрЛП(ОтрезатьСПрава(ИдОбъекта,10));
сВидОбъекта = ?(сВидОбъекта="","",СокрЛП(_IdToStr(сВидОбъекта)));
сВидОбъекта = сВидОбъекта + СокрЛП(_IdToStr(СтрДлина(сВидОбъекта)));

сИДТаблицы = Строка(СокрЛП(_IdToStr(СокрЛП(СтрПолучитьСтроку(сПредставлениеОбъекта,4)))));
сИДТаблицы = сИДТаблицы + СокрЛП(_IdToStr(СтрДлина(сИДТаблицы)));

сТипОбъекта = СокрЛП(СтрПолучитьСтроку(сПредставлениеОбъекта,1));
сТипОбъекта = сТипОбъекта + СокрЛП(_IdToStr(СтрДлина(сТипОбъекта)));

Штрих = Шаблон("[сТипОбъекта][сИДТаблицы][сВидОбъекта][сИДОбъекта][сКодБазы]");
Возврат Штрих;

КонецФункции // глОбъект_СформироватьШтрихКод
//----------------------------------------------------------------------------------------
Функция глОбъект_НайтиПоШтрихкоду(сШтрихКод) Экспорт
тШтрихКод = СокрЛП(сШтрихКод);

Д=СокрЛ(ОтрезатьСПрава(тШтрихКод,1));
сКодБазы = ВыровнятьСтроку(ОтрезатьСПрава(тШтрихКод,Д),3,1);

Д=_StrToId(СокрЛ(ОтрезатьСПрава(тШтрихКод,1)));
сИДОбъекта = ВыровнятьСтроку(_StrToId(ОтрезатьСПрава(тШтрихКод,Д)),10,1);

Д=_StrToId(СокрЛ(ОтрезатьСПрава(тШтрихКод,1)));
Если Д>0 Тогда
сВидОбъекта = ВыровнятьСтроку(_StrToId(ОтрезатьСПрава(тШтрихКод,Д)),10,1);
Иначе
сВидОбъекта ="";
КонецЕсли;

Д=_StrToId(СокрЛ(ОтрезатьСПрава(тШтрихКод,1)));
сИДТаблицы = СокрЛП(_StrToId(ОтрезатьСПрава(тШтрихКод,Д)));

Д=_StrToId(СокрЛ(ОтрезатьСПрава(тШтрихКод,1)));
сТипОбъекта = ОтрезатьСПрава(тШтрихКод,Д);

сВнутреннееПредставление = "{""" + сТипОбъекта + """,""0"",""0"",""" +сИДТаблицы+""",""0"",""0"","""+ сВидОбъекта+сИДОбъекта+сКодБазы+ """}";
Объект = ЗначениеИзСтрокиВнутр(сВнутреннееПредставление);

Сообщить(сВнутреннееПредставление);
Сообщить("Тип значения :"+ТипЗначенияСтр(Объект));
Сообщить("Вид значение :"+Объект.Вид());
Сообщить(" Значение:"+Строка(Объект));

Возврат Объект;
КонецФункции // глОбъект_НайтиПоШтрихкоду
//----------------------------------------------------------------------------------------

Мой Вариант.
Vamp1rk0; +1 Ответить