Штрихкодирование объектов ИБЧасто возникает необходимость формировать штрихкоды для всяких разных объектов, таких как, например, документы и элементы различных справочников. Данная статья описывает успешно работающую методу для 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 штрихкода.
(подсказка: например, преобразовать в систему счисления с большим основанием :) ) |