Книга знаний

1С:Предприятие / Объекты конфигурации

Штрихкодирование объектов ИБ

Часто возникает необходимость формировать штрихкоды для всяких разных объектов, таких как, например, документы и элементы различных справочников. Данная статья описывает успешно работающую методу для 1Сv7.7, однако, ее легко перенести и на v8.0.Автор статьи: Лёвыч | Редакторы: PVasili
Последняя редакция №10 от 20.12.07 | История
URL: http://kb.mista.ru/article.php?id=442

Ключевые слова: штрихкод, barcode, EAN128, штрихкодирование, штрихкод документа


Задача
Положим, перед нами стоит задача сделать так, чтобы можно было универсальным образом формировать штрихкод для документов разного вида или/и справочников с тем, чтобы в последствии, можно было при помощи сканера ШК найти некий конкретный документ или элемент справочника.
Это значит, что в ШК нужно помещать три единицы информации:
  1. Тип объекта

  2. Вид объекта
  3. Некоторый уникальный ИД обекта

  4. Какую-то информацию, по которой можно было бы однозначно определять, что данный ШК - это именно "хитрый универсальный штрихкод объектов"

Просто код объекта в ШК не поместишь, так как не существует пока двуменрых штрихкодов, которые бы поддерживали кириллические буквы, каковые почти навреняка рано или поздно появятся в кодах каких-то объектов. Следовательно, код элемента (или номер документа) не может быть идентификатором объекта в ШК. Кроме того, остается открытым вопрос о том, как кодировать вид объекта.
И решение
Но вспомним, что у нас есть такая замечательная функция ЗначениеВСтрокуВнутр(), которая возвращает строку вида
{"<Тип объекта>","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 штрихкода.
(подсказка: например, преобразовать в систему счисления с большим основанием :) )

Описание | Рубрикатор | Поиск | ТелепатБот | Захваченные статьи | Установки | Форум
© Станислав Митичкин (Волшебник), 2005-2024 | Mista.ru

Яндекс.Метрика