Когда надо вывести (короткий) штрихкод ссылки

13.06.17

Разработка - Универсальные функции

Недавно поставили задачу - в документах печать штрихкод ссылки на элемент справочника. Все знают функцию XMLСтрока(); -  с ее помощью можно получить текстовое представление ссылки и вывести на штрихкод (типа d8cecae7-aee2-11de-bd70-00151716f9f5 ). Но результат получается аж из 36 символов! Такие штрихкоды понимал не каждый сканер.

Файлы

ВНИМАНИЕ: Файлы из Базы знаний - это исходный код разработки. Это примеры решения задач, шаблоны, заготовки, "строительные материалы" для учетной системы. Файлы ориентированы на специалистов 1С, которые могут разобраться в коде и оптимизировать программу для запуска в базе данных. Гарантии работоспособности нет. Возврата нет. Технической поддержки нет.

Наименование Скачано Купить файл
Когда надо вывести (короткий) штрихкод ссылки:
.epf 11,57Kb ver:1.0.0
3 2 500 руб. Купить

Подписка PRO — скачивайте любые файлы со скидкой до 85% из Базы знаний

Оформите подписку на компанию для решения рабочих задач

Оформить подписку и скачать решение со скидкой

Тогда я сел и подумал: Что есть эта самая строка? - это всего лишь представление 128 бит в 16-ричной системе счисления.

Если представить их, например, в 64-ричной системе счисления, то результат будет всего 22 символа.
Что я и сделал.
Может, кому алгоритм пригодится.
Функция ПреобразоватьСсылку16_64_(СтрокаИсх, ОбратноеПреобразование = Ложь) Экспорт
	РезСтрока = ""; 
	сДлина = СтрДлина(СтрокаИсх);
	МассивСИ = ИнициироватьМассивСистемыСчисления(); // как-нибудь создать массив с 64 разными символами
	ПолныеЦиклы = 11;
	
	Если ОбратноеПреобразование = Истина Тогда
		//64-16  (циклы 2 симв - 3 симв)
		Для Итерратор = 0 по ПолныеЦиклы - 1 Цикл
			Симв1 = Сред(СтрокаИсх, Итерратор*2+1, 1);
			Симв2 = Сред(СтрокаИсх, Итерратор*2+2, 1);
			
			Число1 = МассивСИ.Найти(Симв1);
			Число2 = МассивСИ.Найти(Симв2);
			
			ИтогоЧисло = Число1*64+Число2;
			
			Число1_ = Цел(ИтогоЧисло/16/16);
			Число2_ = Цел((ИтогоЧисло-Число1_*16*16)/16);
			Число3_ = ИтогоЧисло - Число1_*16*16-Число2_*16;
			
			Симв1_ = МассивСИ[Число1_];
			Симв2_ = МассивСИ[Число2_];
			Симв3_ = МассивСИ[Число3_];
			
			РезСтрока = РезСтрока + Симв1_ + Симв2_ + Симв3_;
		КонецЦикла;
		РезСтрока = Лев(РезСтрока,8)+"-"+Сред(РезСтрока,9,4)+"-"+Сред(РезСтрока,13,4)+"-"+Сред(РезСтрока,17,4)+"-"+Сред(РезСтрока,21);
	Иначе
		//16-64 (циклы 3 симв - 2 симв)
		СтрокаИсх = СтрЗаменить(СтрокаИсх,"-","") + "0";
		Для Итерратор = 0 по ПолныеЦиклы - 1 Цикл
			Симв1 = Сред(СтрокаИсх, Итерратор*3+1, 1);
			Симв2 = Сред(СтрокаИсх, Итерратор*3+2, 1);
			Симв3 = Сред(СтрокаИсх, Итерратор*3+3, 1);
			
			Число1 = МассивСИ.Найти(врег(Симв1));
			Число2 = МассивСИ.Найти(врег(Симв2));
			Число3 = МассивСИ.Найти(врег(Симв3));
			
			ИтогоЧисло = (Число1*16+Число2)*16+Число3;
			
			Число1_ = Цел(ИтогоЧисло/64);
			Число2_ = ИтогоЧисло - Число1_*64;
			
			Симв1_ = МассивСИ[Число1_];
			Симв2_ = МассивСИ[Число2_];
			
			РезСтрока = РезСтрока + Симв1_ + Симв2_;
		КонецЦикла;
		
	КонецЕсли;
	
	Возврат РезСтрока;
КонецФункции

Пример вызова:

	БылТип = ТипЗнч( Товар1 );
	СтрСсылка = XMLСтрока(Товар1);
	КороткаяСсылка = ПреобразоватьСсылку16_64_(XMLСтрока(Товар1));
	СтрСсылка2 = Лев(ПреобразоватьСсылку16_64_(КороткаяСсылка,Истина),36);
	Товар2 = XMLЗначение(БылТип,СтрСсылка2);

Вступайте в нашу телеграмм-группу Инфостарт

обработка штрихкод штрих код печать ссылка архивация

См. также

Загрузка и выгрузка в Excel Универсальные функции Программист 1С:Предприятие 8 Россия Бесплатно (free)

Описанный ниже подход позволяет в три шага заполнять формулы в Excel файлы, вне зависимости от ОС сервера (MS Windows Server или Linux). Подход подразумевает отказ от работы с COM-объектом в пользу работы через "объектную модель документа" (DOM).

30.10.2025    4098    Abysswalker    10    

46

Универсальные функции Работа с интерфейсом Программист 1С:Предприятие 8 Бесплатно (free)

Порой необходимо временно отключить расширение 1С, не удаляя его, чтобы не потерять данные. Но в этом случае при каждом запуске всем будет лезть уведомление о неактивном расширении, хотя очевидно, это техническая информация, которой не стоит лишний раз пугать пользователей.

14.05.2025    7650    DeerCven    15    

61

Универсальные функции Программист 1С:Предприятие 8 1C:Бухгалтерия Бесплатно (free)

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

21.05.2024    52597    dimanich70    84    

174

Универсальные функции Программист 1С:Предприятие 8 1C:Бухгалтерия Абонемент ($m)

Задача: вставить картинку из буфера обмена на форму средствами платформы 1С.

1 стартмани

18.03.2024    7662    7    John_d    13    

59

Универсальные функции Программист Стажер 1С:Предприятие 8 1C:Бухгалтерия Бесплатно (free)

Пришлось помучиться с GUID-ами немного, решил поделиться опытом, мало ли кому пригодится.

12.02.2024    67075    atdonya    31    

72

Универсальные функции Программист 1С:Предприятие 8 Бесплатно (free)

На заключительных этапах, когда идет отладка или доработка интерфейса, необходимо много раз переоткрыть внешний объект. Вот один из способов автоматизации этого.

30.11.2023    9584    ke.92@mail.ru    17    

68
Комментарии
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
1. kumga99 26 09.06.17 07:04 Сейчас в теме
Лев добрый день, вчера скачал твою обработку и обнаружил косяк твоя обработка не умеет преобразовать штрихкод в ссылку - а именно ошибается на 1 цифру в УИ ссылки. Можешь доработать свою обработку. Жду скорейшего ответа и доработки.
2. Skimen 247 13.06.17 02:52 Сейчас в теме
(1) Приношу извинения, действительно косякнул.
При создании массива после M надо добавить букву N, а я добавил H.
Исправьте ее и все заработает.
Спасибо за комментарий.
3. kvaleksandr 25 13.06.17 06:53 Сейчас в теме
(2) Не все сканеры считывают ШК с длиной 22. Недавно проблема возникла как раз с этим. пару сканеров считывали спокойно ШК длиной 20-25 символов, а вот третий выше 18 не брал. В итоге пришлось уменьшить количество знаков до 18.
4. Skimen 247 15.06.17 03:55 Сейчас в теме
(3) а как уместили информацию в 18 символов?
или там был какой-то реквизит, который можно было просто административным приказом сократить?
5. kvaleksandr 25 15.06.17 06:59 Сейчас в теме
(4) я относительно ШК сказал. задача немного отличалась. Задача была документам присваивать ШК, чтобы потом их открывать при сканировании.

К примеру ШК на документ у меня формировался вот так.
Штрихкод = "2." + Сред(СокрЛП(СсылкаНаОбъект.Номер), 3, 100) + Формат(День(СсылкаНаОбъект.Дата), "ЧЦ=2; ЧВН=") + Формат(Месяц(СсылкаНаОбъект.Дата), "ЧЦ=2; ЧВН=") + Формат(Год(СсылкаНаОбъект.Дата),"ЧГ=0");


Первая цифра соответствует какому-либо документу. Потом в журналах документов в процедуре внешнего события делал вызов процедуры с обработкой этого ШК и открытием документа.

Если нужна ссылка на каждый элемент справочника, то как вариант можно создать список всех справочников и документов. каждому присвоить цифру(Номенклатура - 1, Банки - 2, Контрагенты - 3 и т.д.) и потом обрабатывать уже сформированный ШК с их открытием.
Для отправки сообщения требуется регистрация/авторизация