| Штрихкодирование объектов ИБ| Часто возникает необходимость формировать штрихкоды для всяких разных объектов, таких как, например, документы и элементы различных справочников. Данная статья описывает успешно работающую методу для 1Сv7.7, однако, ее легко перенести и на v8.0. |  | Автор статьи: Лёвыч | Редакторы: PVasili Последняя редакция №10 от 20.12.07 | История
 URL: http://kb.mista.ru/article.php?id=442
 |  | 
 Ключевые слова: штрихкод, barcode, EAN128, штрихкодирование, штрихкод документа
 
 
 Задача
 Положим, перед нами стоит задача сделать так, чтобы можно было универсальным образом формировать штрихкод для документов разного вида или/и справочников с тем, чтобы в последствии, можно было при помощи сканера ШК найти некий конкретный документ или элемент справочника.
 Это значит, что в ШК нужно помещать три единицы информации:
 
 Тип объекта
 Вид объектаНекоторый уникальный ИД обекта
 Какую-то информацию, по которой можно было бы однозначно определять, что данный ШК - это именно "хитрый универсальный штрихкод объектов"
 Просто код объекта в ШК не поместишь, так как не существует пока двуменрых штрихкодов, которые бы поддерживали кириллические буквы, каковые почти навреняка рано или поздно появятся в кодах каких-то объектов. Следовательно, код элемента (или номер документа) не может быть идентификатором объекта в ШК. Кроме того, остается открытым вопрос о том, как кодировать вид объекта.
 И решение
 Но вспомним, что у нас есть такая замечательная функция ЗначениеВСтрокуВнутр(), которая возвращает строку вида
 
 {"<Тип объекта>","0","0","<ИД таблицы>","0","0","<ИД объекта>"}т.е. она возвращает строку, содержащую всю необходимую нам информацию. Мало того, в данных значениях всегда только цифры и латинские буквы. Единственное требование к штрихкоду - он должен иметь тип как минимум EAN128, поскольку заранее угадать длину кода нельзя и в нем гарантированно будут присутствовать символы, отличные от цифр.
 Таким образом, для достижения поставленной задачи нам необходимо в глобальный моуль поместить функции такого вида:
 
 
//******************************************************************************
//  25.08.2005 12:49:24 Садовский Л.М.
// [in] 
//   Объект - объект любого типа
//  
// [retval]
//     Возвращает строку вида <тип объекта>#<внутренний ИД объекта>@<внутренний ИД таблицы объекта>
//   Например: O#547DL0@3315, 
//   где O - тип (в данном случае документ); 547DL0 - внутр. ИД объекта; 3315 - номер таблицы в БД
Функция глОбъект_СформироватьШтрихКод(Объект) Экспорт
    сПредставлениеОбъекта = СтрЗаменить(ЗначениеВСтрокуВнутр(Объект),"""","");
    сПредставлениеОбъекта = СтрЗаменить(сПредставлениеОбъекта,"{","");
    сПредставлениеОбъекта = СтрЗаменить(сПредставлениеОбъекта,"}","");
    сПредставлениеОбъекта = СтрЗаменить(сПредставлениеОбъекта,",",РазделительСтрок);
    
    сТипОбъекта = СокрЛП(СтрПолучитьСтроку(сПредставлениеОбъекта,1));
    сИДТаблицы  = СокрЛП(СтрПолучитьСтроку(сПредставлениеОбъекта,4));
    сИДОбъекта  = СокрЛ(СтрПолучитьСтроку(сПредставлениеОбъекта,7));
    сИДОбъекта    = СтрЗаменить(сИДОбъекта," ","_");
    
    Возврат Шаблон("[сТипОбъекта]#[сИДОбъекта]@[сИДТаблицы]");
    
КонецФункции    // глОбъект_СформироватьШтрихКод
//******************************************************************************
//  25.08.2005 12:51:04 Садовский Л.М.
// [in] 
//  сСтрока - проверяемая строка
// [retval]
//  Функция возвращает 1, если сСтрока сообтветствует шаблону <тип>#<ид объекта>@<ид таблицы>
Функция глСтрока_ЯвляетсяШтрихКодомОбъектаБД(сСтрока) Экспорт
    
    мнсСтрока = СтрЗаменить(сСтрока, "#", РазделительСтрок);
    мнсСтрока = СтрЗаменить(мнсСтрока, "@", РазделительСтрок);
    мнсСтрока = СокрЛП(мнсСтрока);    
    
    Если СтрКоличествоСтрок(мнсСтрока) <> 3 Тогда
        Возврат 0;
    КонецЕсли;             
    
    сТип         = СтрПолучитьСтроку(мнсСтрока,1);
    
    Если СтрДлина(сТип) <> 1 Тогда
        Возврат 0;
    КонецЕсли;  
    сИДОбъекта  = СтрПолучитьСтроку(мнсСтрока,2);
    сИДТаблицы  = СтрПолучитьСтроку(мнсСтрока,3);
    
    Возврат 1;    
    
КонецФункции    // глСтрока_ЯвляетсяШтрихКодомОбъектаБД
//******************************************************************************
//  25.08.2005 12:56:44 Садовский Л.М.
// [in] 
//  сШтрихКод строка вида <тип>#<ид объекта>@<ид таблицы> 
// [retval]
//  собирает из этой строки внут. представление объекта и конвертирует его в объект
Функция глОбъект_НайтиПоШтрихкоду(сШтрихКод) Экспорт                                       
    
    Если 0 = глСтрока_ЯвляетсяШтрихКодомОбъектаБД(сШтрихКод) Тогда
        Возврат "";//пустое значение
    КонецЕсли;
    
    мнсСтрока = СтрЗаменить(сШтрихКод, "#", РазделительСтрок);
    мнсСтрока = СтрЗаменить(мнсСтрока, "@", РазделительСтрок);
    мнсСтрока = СокрЛП(мнсСтрока);
    
    сТип        = СтрПолучитьСтроку(мнсСтрока,1);
    сИДОбъекта  = СтрПолучитьСтроку(мнсСтрока,2);
    сИДТаблицы  = СтрПолучитьСтроку(мнсСтрока,3);     
    
    сИДОбъекта = СтрЗаменить(сИДОбъекта, "_", " ");
    сВнутреннееПредставление = "{""";
    сВнутреннееПредставление = сВнутреннееПредставление + сТип + """,""0"",""0"",""";
    сВнутреннееПредставление = сВнутреннееПредставление + сИДТаблицы+""",""0"",""0"",""";
    сВнутреннееПредставление = сВнутреннееПредставление + Прав("             "+сИДОбъекта, 13) + """}"; // если база не распределенная, то надо делать так:
    // сВнутреннееПредставление = сВнутреннееПредставление +Прав("             "+сИДОбъекта+"   ", 13));
    
    Объект = ЗначениеИзСтрокиВнутр(сВнутреннееПредставление);
    
    Возврат Объект;
    
КонецФункции    // глОбъект_НайтиПоШтрихкоду
вот, собственно, и все, что нам было нужно 8)
 Пример использования.
 Предположим, что мы в печатную форму некоего документа добавили объект Active Barcode, теперь нам достаточно в свойствах этого объекта в поле "Текст" поместить вызов глобальной функции
 
 глОбъект_СформироватьШтрихКод(докТекущийДокумент) , где докТекущийДокумент - это ссылка на токумент, печатную форму которого мы хотим сформировать.
 Для получения объекта ИБ по штрихкоду следует выполнить такой код:
 
 
Процедура ОбработкаВнешнегоСобытия(Источник,Событие,Данные)
    
    Если Событие = "BarCodeValue" Тогда
        Объект = глОбъект_НайтиПоШтрихкоду(Данные);
        
        Если ТипЗначенияСтр(Объект) = "Документ там или справочник, алибо еще что, ежели надо" Тогда
            // ищем, открываем форму, в общем, что нам нужно, то и делаем
        КонецЕсли;
 Для 8
 Задача решается через GUID
 
 
  //  Создание символов ШК
  ПолеВвода1 = Документ1.УникальныйИдентификатор();
  // Вывод ШК ... 
 
 Поиск (например документа по GUID
 
 
Процедура ВнешнееСобытие(Источник, Событие, Данные)
  Если Не(ВводДоступен()) Тогда
    Возврат;
  КонецЕсли;
    
  ШК = СокрЛП(Данные);
  // все типы документов
  Для Каждого К Из Метаданные.Документы Цикл
    С = Документы[К.Имя].ПолучитьСсылку(Новый УникальныйИдентификатор(ШК));
    Если НЕ ПустаяСтрока(СокрЛП(С.Номер)) Тогда 
     Прервать; 
    КонецЕсли;
  КонецЦикла;
    
  // поиск документа
  Если НЕ ПустаяСтрока(СокрЛП(С.Номер)) Тогда 
    Объект = С.ПолучитьОбъект();
    Форма = Объект.ПолучитьФорму();
    Форма.Открыть();
  Иначе
      Сообщить("Документ не найден!");
  КонецЕсли;
      
КонецПроцедуры // ВнешнееСобытие()
Для поиска в справочниках (для уж совсем ленивых)
 
 
  Для Каждого К Из Метаданные.Документы Цикл 
  ...
  // и далее по тексту поменять на
  Для Каждого К Из Метаданные.Справочники Цикл
 Неплохо было бы сократить длину итогового GUID штрихкода.
 (подсказка: например, преобразовать в систему счисления с большим основанием :) )
 |