xmlTSDGalery/CommonModules/МенеджерОборудованияКлиентСервер/Ext/Module.bsl
kykaevv 88098aa86f Initial commit: конфигурация ТСД с обменом УНФ.
Включает перемещение по ячейкам, стикеровку МП, синхронизацию справочников и обработку кодов маркировки.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-09-01 12:50:57 +03:00

1549 lines
92 KiB
Plaintext
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#Область ПрограммныйИнтерфейс
#Область Системные
// Получает ревизию требований для драйверов подключаемого оборудования.
//
// Возвращаемое значение:
// Число -
//
Функция РевизияИнтерфейсаДрайверов() Экспорт
РевизияИнтерфейса = 4005;
Возврат РевизияИнтерфейса;
КонецФункции
// Функция заполняет наименование рабочего места клиента по имени пользователя.
//
// Параметры:
// Объект - СправочникОбъект.РабочиеМеста - рабочее место текущего сеанса.
// ИмяПользователя - Строка - ИмяПользователя
//
Процедура ЗаполнитьНаименованиеРабочегоМеста(Объект, ИмяПользователя) Экспорт
ИмяПустойПользователь = НСтр("ru='<Пользователь>'");
Если ПустаяСтрока(Объект.Наименование) Тогда
ИмяПользователя = ?(ПустаяСтрока(ИмяПользователя), ИмяПустойПользователь, Строка(ИмяПользователя));
РабочееМестоИмя = ?(ПустаяСтрока(Объект.ИмяКомпьютера), Объект.Код, Объект.ИмяКомпьютера);
Наименование = СтрШаблон(НСтр("ru = '%1 (%2)'"), ИмяПользователя, РабочееМестоИмя);
НаименованиеНовое = Наименование;
ВыполненаСтандартнаяОбработка = Истина;
МенеджерОборудованияКлиентСерверПереопределяемый.ОбработкаЗаполненияНаименованияРабочегоМеста(НаименованиеНовое, ИмяПользователя, ВыполненаСтандартнаяОбработка);
Объект.Наименование = ?(Не ВыполненаСтандартнаяОбработка, НаименованиеНовое, Наименование);
ИначеЕсли Не ПустаяСтрока(Строка(ИмяПользователя)) И Найти(Объект.Наименование, ИмяПустойПользователь) > 0 Тогда
Объект.Наименование = СтрЗаменить(Объект.Наименование, ИмяПустойПользователь, Строка(ИмяПользователя));
КонецЕсли;
КонецПроцедуры
// Вызывается при получении имени кассира и его ИНН.
//
// Возвращаемое значение:
// Структура.
// *ИмяКассира - Строка, Неопределено - Текст, используемый для заполнения документа
// *ИННКассира - Строка, Неопределено - Текст, используемый для заполнения документа
//
Функция ТекущийКассирДляФискальныхОпераций() Экспорт
Кассир = "";
ВыполненаСтандартнаяОбработка = Истина;
МенеджерОборудованияКлиентСерверПереопределяемый.ОбработкаЗаполненияИмяКассира(Кассир, ВыполненаСтандартнаяОбработка);
Кассир = ?(Не ВыполненаСтандартнаяОбработка, Кассир, НСтр("ru='Администратор'"));
КассирИНН = "";
ВыполненаСтандартнаяОбработка = Истина;
МенеджерОборудованияКлиентСерверПереопределяемый.ОбработкаЗаполненияИННКассира(КассирИНН, ВыполненаСтандартнаяОбработка);
КассирИНН = ?(Не ВыполненаСтандартнаяОбработка, КассирИНН, "");
РезультатОперации = Новый Структура();
РезультатОперации.Вставить("Кассир" , Кассир);
РезультатОперации.Вставить("КассирИНН", КассирИНН);
Возврат РезультатОперации;
КонецФункции
// Возвращает структуру отбора для получения списка оборудования
//
// Возвращаемое значение:
// Структура:
// * Идентификатор - Массив, СправочникСсылка.ПодключаемоеОборудование
// * ТипыПО - Строка, Структура, Массив
// * РабочееМесто - СправочникСсылка.РабочиеМеста
// * Организация - ОпределяемыйТип.Организация
// * СетевоеОборудование - Булево - отобрать только сетевое оборудование, по умолчанию Ложь
// * КодЯзыка - Строка - Код языка драйвера
//
Функция СписокОборудованияОтбор() Экспорт
Отбор = Новый Структура();
Отбор.Вставить("Идентификатор" , Неопределено);
Отбор.Вставить("ТипыПО", ПараметрыТипыОборудования());
Отбор.Вставить("РабочееМесто", Неопределено);
Отбор.Вставить("Организация", Неопределено);
Отбор.Вставить("СетевоеОборудование" , Истина);
Отбор.Вставить("СерверноеОборудование", Ложь);
Отбор.Вставить("КодЯзыка", Неопределено);
Отбор.Вставить("РазрешенаАвтоматическаяФискализация", Ложь);
Возврат Отбор;
КонецФункции
#КонецОбласти
#Область ТипыОборудования
// Структура типы оборудования
//
// Возвращаемое значение:
// Структура
//
Функция ПараметрыТипыОборудования() Экспорт
#Если Сервер Или ТолстыйКлиентОбычноеПриложение Или ВнешнееСоединение Тогда
Возврат МенеджерОборудования.ПараметрыТипыОборудования();
#Иначе
Возврат МенеджерОборудованияКлиент.ПараметрыТипыОборудования();
#КонецЕсли
КонецФункции
#КонецОбласти
#Область Конструкторы
// Заполняет структуру выполнения операции на Оборудовании.
//
// Параметры:
// Результат - Булево - результат операции.
// ОписаниеОшибки - ИнформацияОбОшибке - информация об ошибке.
// ИдентификаторУстройства - СправочникСсылка.ПодключаемоеОборудование - подключаемое оборудование.
//
// Возвращаемое значение:
// Структура:
// * Результат - Булево
// * ОписаниеОшибки - Строка
// * ИдентификаторУстройства - СправочникСсылка.ПодключаемоеОборудование
// * ПодключенноеУстройство - Неопределено, см. МенеджерОборудованияКлиент.ПараметрыПодключенияУстройства.
// * ОшибкаЗагрузки - Булево
// * ИдентификаторОбъекта - Строка
//
Функция ПараметрыВыполненияОперацииНаОборудовании(Результат = Ложь, ОписаниеОшибки = Неопределено, ИдентификаторУстройства = Неопределено) Экспорт;
РезультатВыполнения = Новый Структура();
РезультатВыполнения.Вставить("Результат" , Результат);
РезультатВыполнения.Вставить("ОписаниеОшибки" , ОписаниеОшибки);
РезультатВыполнения.Вставить("ИдентификаторУстройства", ИдентификаторУстройства);
РезультатВыполнения.Вставить("ПодключенноеУстройство" , Неопределено);
РезультатВыполнения.Вставить("ОшибкаЗагрузки" , Ложь);
РезультатВыполнения.Вставить("ИдентификаторОбъекта" , "");
РезультатВыполнения.Вставить("СтатусВОблачнойКассе" , "");
Возврат РезультатВыполнения;
КонецФункции
// Параметры создания нового драйвера.
//
// Возвращаемое значение:
// Структура - Параметры создания нового драйвера:
// *ТипОборудования - ПеречислениеСсылка.ТипыПодключаемогоОборудования - .
// *ИдентификаторОбъекта - УникальныйИдентификатор.
// *ИмяДрайвера - Строка - .
// *Наименование - Строка - .
// *ВерсияДрайвера - Строка - .
// *СпособПодключения - ПеречислениеСсылка.СпособПодключенияДрайвера - .
// *ИмяМакетаДрайвера - Строка -
// *СнятСПоддержки - Булево -
// *СообщениеПриИспользовании - Булево -
// *Предопределенный - Булево -
// *ЛокальныйРежим - Булево -
// *СетевойРежим - Булево -
// *СерверныйРежим - Булево -
// *БезопасноеПодключение - Булево -
// *РекомендуемоеИспользование - Булево -
//
Функция ПараметрыСозданияНовогоДрайвера() Экспорт
ПараметрыСоздания = Новый Структура();
ПараметрыСоздания.Вставить("ТипОборудования");
ПараметрыСоздания.Вставить("ИдентификаторОбъекта");
ПараметрыСоздания.Вставить("ИмяДрайвера");
ПараметрыСоздания.Вставить("Наименование");
ПараметрыСоздания.Вставить("ВерсияДрайвера");
ПараметрыСоздания.Вставить("СпособПодключения");
ПараметрыСоздания.Вставить("БезопасноеПодключение", Ложь);
ПараметрыСоздания.Вставить("РекомендуемоеИспользование", Ложь);
ПараметрыСоздания.Вставить("ИмяМакетаДрайвера");
ПараметрыСоздания.Вставить("СнятСПоддержки" , Ложь);
ПараметрыСоздания.Вставить("СообщениеПриИспользовании" , Истина);
ПараметрыСоздания.Вставить("Предопределенный", Ложь);
ПараметрыСоздания.Вставить("ЛокальныйРежим" , Истина);
ПараметрыСоздания.Вставить("СетевойРежим" , Ложь);
ПараметрыСоздания.Вставить("СерверныйРежим" , Ложь);
Возврат ПараметрыСоздания;
КонецФункции
// Параметры создания нового подключаемого оборудования.
//
// Возвращаемое значение:
// Структура - Параметры создания нового подключаемого оборудования:
// *Наименование - Строка -
// *ТипОборудования - ПеречислениеСсылка.ТипыПодключаемогоОборудования -
// *ТипПодключения - ПеречислениеСсылка.ТипыПодключенияОборудования -
// *ДрайверОборудования - СправочникСсылка.ДрайверыОборудования -
// *Организация - ОпределяемыйТип.ОрганизацияБПО -
// *РабочееМесто - СправочникСсылка.РабочиеМеста -
// *СерийныйНомер - Строка -
// *СпособФорматноЛогическогоКонтроля - ПеречислениеСсылка.СпособыФорматноЛогическогоКонтроля -
// *ДопустимоеРасхождениеФорматноЛогическогоКонтроля - Число -
// *ИспользуетсяФН36 - Булево -
//
Функция ПараметрыСозданияНовогоПодключаемогоОборудования() Экспорт
ПараметрыСоздания = Новый Структура();
ПараметрыСоздания.Вставить("Наименование");
ПараметрыСоздания.Вставить("УстройствоИспользуется", Истина);
ПараметрыСоздания.Вставить("ТипОборудования" , Неопределено);
ПараметрыСоздания.Вставить("ТипПодключения" , ПредопределенноеЗначение("Перечисление.ТипыПодключенияОборудования.ЛокальноеПодключение"));
ПараметрыСоздания.Вставить("ДрайверОборудования" , Неопределено);
ПараметрыСоздания.Вставить("Организация");
ПараметрыСоздания.Вставить("РабочееМесто", МенеджерОборудованияВызовСервера.РабочееМестоКлиента());
ПараметрыСоздания.Вставить("СерийныйНомер");
ПараметрыСоздания.Вставить("СпособФорматноЛогическогоКонтроля", ПредопределенноеЗначение("Перечисление.СпособыФорматноЛогическогоКонтроля.РазделятьСтроки"));;
ПараметрыСоздания.Вставить("ДопустимоеРасхождениеФорматноЛогическогоКонтроля", 0.01);
ПараметрыСоздания.Вставить("ИспользуетсяФН36", Ложь);
Возврат ПараметрыСоздания;
КонецФункции
// Параметры описания драйвера.
//
// Возвращаемое значение:
// Структура - Параметры описания драйвера:
// *Установлен - Булево -
// *ВерсияДрайвера - Строка -
// *ВерсияИнтеграционногоКомпонента - Строка -
// *НаименованиеДрайвера - Строка -
// *ОписаниеДрайвера - Строка -
// *ТипОборудования - Строка -
// *ИнтеграционныйКомпонент - Булево -
// *ОсновнойДрайверУстановлен - Булево -
// *РевизияИнтерфейса - Число -
// *URLЗагрузкиДрайвера - Строка -
// *ПараметрыДрайвера - Строка -
// *ДополнительныеДействия - Строка -
// *ВерсияДрайвераВМакете - Строка -
// *ОписаниеДрайвераXML - Строка -
// *ЛогДрайвераВключен - Булево -
// *ЛогДрайвераПутьКФайлу - Строка -
// *ЭтоЭмулятор - Булево -
// *ИнформацияОбОкружении - Строка -
//
Функция ПараметрыОписанияДрайвера() Экспорт
Результат = Новый Структура();
Результат.Вставить("Установлен", Ложь);
Результат.Вставить("ВерсияДрайвера");
Результат.Вставить("ВерсияИнтеграционногоКомпонента");
Результат.Вставить("НаименованиеДрайвера", "");
Результат.Вставить("ОписаниеДрайвера" , "");
Результат.Вставить("ТипОборудования" , "" );
Результат.Вставить("ИнтеграционныйКомпонент" , Ложь);
Результат.Вставить("ОсновнойДрайверУстановлен", Ложь);
Результат.Вставить("РевизияИнтерфейса" , РевизияИнтерфейсаДрайверов());
Результат.Вставить("РевизияИнтерфейсаПредставление");
Результат.Вставить("URLЗагрузкиДрайвера" , "");
Результат.Вставить("ПараметрыДрайвера" , "");
Результат.Вставить("ДополнительныеДействия" , "");
Результат.Вставить("ПоддерживаетсяЛокализация", Ложь);
Результат.Вставить("ШаблонЛокализации" , "");
Результат.Вставить("ВерсияДрайвераВМакете" , "");
Результат.Вставить("ОписаниеДрайвераXML" , "");
Результат.Вставить("ЛогДрайвераВключен" , Ложь);
Результат.Вставить("ЛогДрайвераПутьКФайлу" , "");
Результат.Вставить("ЭтоЭмулятор" , Ложь);
Результат.Вставить("ИнформацияОбОкружении" , "");
Результат.Вставить("АвтоНастройкаОборудования", Ложь);
Возврат Результат;
КонецФункции
// Параметры подключения.
//
// Параметры:
// ДанныеДрайвера - Структура - Данные драйвера
//
// Возвращаемое значение:
// Структура - Параметры подключения:
// *Наименование - Строка.
// *ТипОборудования - ПеречислениеСсылка.ТипыПодключаемогоОборудования.
// *ПодключениеИзМакета - Булево.
// *ПодключениеЛокальноПоИдентификатору - Булево.
// *ИдентификаторОбъекта - СправочникСсылка.ПодключаемоеОборудование.
// *ВерсияДрайвера - Строка.
// *ИмяМакетаДрайвера - Строка.
// *МакетДоступен - Булево.
// *РевизияИнтерфейса - Строка.
// *ШиринаСтроки - Строка.
// *ИдентификаторТерминала - Строка.
// *ПечатьКвитанцийНаТерминале - Булево.
// *КороткиеСлипЧеки - Булево.
// *ВыдачиНаличныхДенежныхСредств - Булево.
// *ОплатаЭлектроннымиСертификатами - Булево.
// *ЧастичнаяОтмена - Булево.
// *СписокОперацийПоКартам - Булево.
// *ConsumerPresentedQR - Булево.
// *ПокупкаСЗачислениемНаКарту - Булево.
// *СтолбцовНаДисплее - Число.
// *СтрокНаДисплее - Число.
// *ДисплейОтображаетТекст - Булево.
// *ДисплейОтображаетГрафику - Булево.
// *ДисплейОтображаетQRКод - Булево.
// *ИдентификаторУстройства - УникальныйИдентификатор.
//
Функция ПараметрыПодключения(ДанныеДрайвера) Экспорт
Подключение = Новый Структура();
Подключение.Вставить("Наименование" , ДанныеДрайвера.Наименование);
Подключение.Вставить("ТипыОборудования" , ДанныеДрайвера.ТипыОборудования);
Подключение.Вставить("ТипОборудования" , ДанныеДрайвера.ТипОборудования);
Подключение.Вставить("ТипОборудованияИмя" , ДанныеДрайвера.ТипОборудованияИмя);
Подключение.Вставить("ПодключениеИзМакета" , ДанныеДрайвера.ПодключениеИзМакета);
Подключение.Вставить("ПодключениеЛокальноПоИдентификатору", ДанныеДрайвера.ПодключениеЛокальноПоИдентификатору);
Подключение.Вставить("ИдентификаторОбъекта" , ДанныеДрайвера.ИдентификаторОбъекта);
Подключение.Вставить("ВерсияДрайвера" , ДанныеДрайвера.ВерсияДрайвера);
Подключение.Вставить("ИмяМакетаДрайвера" , ДанныеДрайвера.ИмяМакетаДрайвера);
Подключение.Вставить("МакетДоступен" , ДанныеДрайвера.МакетДоступен);
Подключение.Вставить("СнятСПоддержки" , ДанныеДрайвера.СнятСПоддержки);
Подключение.Вставить("СообщениеПриИспользовании", ДанныеДрайвера.СообщениеПриИспользовании);
Подключение.Вставить("БезопасноеПодключение" , ДанныеДрайвера.БезопасноеПодключение);
Подключение.Вставить("ШаблонЛокализации", ?(ДанныеДрайвера.Свойство("ШаблонЛокализации"), ДанныеДрайвера.ШаблонЛокализации, Неопределено));
Подключение.Вставить("ПоддерживаетсяЛокализация", ?(ДанныеДрайвера.Свойство("ПоддерживаетсяЛокализация"), ДанныеДрайвера.ПоддерживаетсяЛокализация, Ложь));
Подключение.Вставить("Несертифицированное" , ДанныеДрайвера.Несертифицированное);
Подключение.Вставить("РевизияИнтерфейса", ?(ДанныеДрайвера.Свойство("РевизияИнтерфейса"), ДанныеДрайвера.РевизияИнтерфейса, 0));
Подключение.Вставить("РевизияИнтерфейсаПредставление", ?(ДанныеДрайвера.Свойство("РевизияИнтерфейсаПредставление"), ДанныеДрайвера.РевизияИнтерфейсаПредставление, ""));
Подключение.Вставить("ШиринаСтроки" , ?(ДанныеДрайвера.Свойство("ШиринаСтроки"), ДанныеДрайвера.ШиринаСтроки, 0));
Подключение.Вставить("ЭтоЭмулятор" , ?(ДанныеДрайвера.Свойство("ЭтоЭмулятор"), ДанныеДрайвера.ЭтоЭмулятор, Ложь));
Подключение.Вставить("ИдентификаторТерминала" , ?(ДанныеДрайвера.Свойство("ИдентификаторТерминала"), ДанныеДрайвера.ИдентификаторТерминала, ""));
Подключение.Вставить("ИдентификаторБанкаЭквайера" , ?(ДанныеДрайвера.Свойство("ИдентификаторБанкаЭквайера"), ДанныеДрайвера.ИдентификаторБанкаЭквайера, ""));
Подключение.Вставить("ПечатьКвитанцийНаТерминале" , ?(ДанныеДрайвера.Свойство("ПечатьКвитанцийНаТерминале"), ДанныеДрайвера.ПечатьКвитанцийНаТерминале, Ложь));
Подключение.Вставить("КороткиеСлипЧеки" , ?(ДанныеДрайвера.Свойство("КороткиеСлипЧеки"), ДанныеДрайвера.КороткиеСлипЧеки, Ложь));
Подключение.Вставить("ВыдачиНаличныхДенежныхСредств" , ?(ДанныеДрайвера.Свойство("ВыдачиНаличныхДенежныхСредств"), ДанныеДрайвера.ВыдачиНаличныхДенежныхСредств, Ложь));
Подключение.Вставить("ОплатаЭлектроннымиСертификатами", ?(ДанныеДрайвера.Свойство("ОплатаЭлектроннымиСертификатами"), ДанныеДрайвера.ОплатаЭлектроннымиСертификатами, Ложь));
Подключение.Вставить("ЧастичнаяОтмена" , ?(ДанныеДрайвера.Свойство("ЧастичнаяОтмена"), ДанныеДрайвера.ЧастичнаяОтмена, Ложь));
Подключение.Вставить("СписокОперацийПоКартам" , ?(ДанныеДрайвера.Свойство("СписокОперацийПоКартам"), ДанныеДрайвера.СписокОперацийПоКартам, Ложь));
Подключение.Вставить("ВозвратЭСБезКартыПоBasketID" , ?(ДанныеДрайвера.Свойство("ReturnElectronicCertificateByBasketID"), ДанныеДрайвера.ReturnElectronicCertificateByBasketID, Ложь));
Подключение.Вставить("ConsumerPresentedQR" , ?(ДанныеДрайвера.Свойство("ConsumerPresentedQR"), ДанныеДрайвера.ConsumerPresentedQR, Ложь));
Подключение.Вставить("ПокупкаСЗачислениемНаКарту" , ?(ДанныеДрайвера.Свойство("ПокупкаСЗачислениемНаКарту"), ДанныеДрайвера.ПокупкаСЗачислениемНаКарту, Ложь));
Подключение.Вставить("СтолбцовНаДисплее" , ?(ДанныеДрайвера.Свойство("СтолбцовНаДисплее"), ДанныеДрайвера.СтолбцовНаДисплее, 20));
Подключение.Вставить("СтрокНаДисплее" , ?(ДанныеДрайвера.Свойство("СтрокНаДисплее"), ДанныеДрайвера.СтрокНаДисплее, 2));
Подключение.Вставить("ДисплейОтображаетТекст" , ?(ДанныеДрайвера.Свойство("ДисплейОтображаетТекст"), ДанныеДрайвера.ДисплейОтображаетТекст, Истина));
Подключение.Вставить("ДисплейОтображаетГрафику", ?(ДанныеДрайвера.Свойство("ДисплейОтображаетГрафику"), ДанныеДрайвера.ДисплейОтображаетГрафику, Ложь));
Подключение.Вставить("ДисплейОтображаетQRКод" , ?(ДанныеДрайвера.Свойство("ДисплейОтображаетQRКод"), ДанныеДрайвера.ДисплейОтображаетQRКод, Ложь));
Подключение.Вставить("ДисплейОтображаетHTML" , ?(ДанныеДрайвера.Свойство("ДисплейОтображаетHTML"), ДанныеДрайвера.ДисплейОтображаетHTML, Ложь));
Подключение.Вставить("ДисплейОтображаетСтатус" , ?(ДанныеДрайвера.Свойство("ДисплейОтображаетСтатус"), ДанныеДрайвера.ДисплейОтображаетСтатус, Ложь));
Подключение.Вставить("ДисплейОтображаетСостоянияРМ", ?(ДанныеДрайвера.Свойство("ДисплейОтображаетСостоянияРМ"), ДанныеДрайвера.ДисплейОтображаетСостоянияРМ, Ложь));
Подключение.Вставить("ДисплейОтрабатываетНажатия" , ?(ДанныеДрайвера.Свойство("ДисплейОтрабатываетНажатия"), ДанныеДрайвера.ДисплейОтрабатываетНажатия, Ложь));
Подключение.Вставить("ВесыПоддерживаютТарирование", ?(ДанныеДрайвера.Свойство("ВесыПоддерживаютТарирование"), ДанныеДрайвера.ВесыПоддерживаютТарирование, Ложь));
Подключение.Вставить("СобытиеПолученииВеса" , ?(ДанныеДрайвера.Свойство("СобытиеПолученииВеса"), ДанныеДрайвера.СобытиеПолученииВеса, Ложь));
Подключение.Вставить("ИдентификаторУстройства" , ?(ДанныеДрайвера.Свойство("Ссылка"), ДанныеДрайвера.Ссылка, Неопределено));
Возврат Подключение;
КонецФункции
// АПК: 142-выкл обратная совместимость
// Параметры выполнение команды.
//
// Параметры:
// Команда - КомандаФормы - .
// ПроцессорДанных - ПроцессорКомпоновкиДанных - Процессор данных
// ДополнительныеПараметры - Неопределено - Дополнительные параметры
// ПодготовитьДанные - Булево - Подготовить данные
// ОбработатьДанные - Булево - Обработать данные
// ИспользоватьПечатающееУстройство - Булево - Использовать печатающее устройство
// ОбработатьДанныеПриОшибке - Булево
//
// Возвращаемое значение:
// Структура - Параметры выполнение команды:
// *Команда - КомандаФормы - .
// *ПроцессорДанных - ПроцессорКомпоновкиДанных - Процессор данных
// *ПодготовитьДанные - Булево -.
// *ОбработатьДанные - Булево -.
// *ИспользоватьПечатающееУстройство - Булево -.
// *СообщенияВСлужбуТехническойПоддержки - Булево - Будет сформировано сообщения в службу технической поддержки при ошибке.
//
Функция ПараметрыВыполнениеКоманды(Команда, ПроцессорДанных, ДополнительныеПараметры = Неопределено, ПодготовитьДанные = Истина,
ОбработатьДанные = Истина, ИспользоватьПечатающееУстройство = Ложь, ОбработатьДанныеПриОшибке = Ложь) Экспорт
ПараметрыВыполнение = Новый Структура();
ПараметрыВыполнение.Вставить("Команда" , Команда);
ПараметрыВыполнение.Вставить("ПроцессорДанных" , ПроцессорДанных);
ПараметрыВыполнение.Вставить("ПодготовитьДанные", ПодготовитьДанные);
ПараметрыВыполнение.Вставить("ОбработатьДанные" , ОбработатьДанные);
ПараметрыВыполнение.Вставить("ОбработатьДанныеПриОшибке", ОбработатьДанныеПриОшибке);
ПараметрыВыполнение.Вставить("ИспользоватьПечатающееУстройство", ИспользоватьПечатающееУстройство);
ПараметрыВыполнение.Вставить("ПечатьСлипЧека", Истина);
ПараметрыВыполнение.Вставить("ПолныйСлипЧек" , Истина);
ПараметрыВыполнение.Вставить("СообщенияВСлужбуТехническойПоддержки" , Ложь);
Если ДополнительныеПараметры <> Неопределено Тогда
Для Каждого ДополнительныйПараметр Из ДополнительныеПараметры Цикл
ПараметрыВыполнение.Вставить(ДополнительныйПараметр.Ключ, ДополнительныйПараметр.Значение);
КонецЦикла;
КонецЕсли;
Возврат ПараметрыВыполнение;
КонецФункции
// АПК: 142-вкл
// Дополнительные параметры операции.
//
// Параметры:
// ОставитьПодключенным - Булево - Оставить подключенным
//
// Возвращаемое значение:
// Структура - Дополнительные параметры операции:
// *ОставитьПодключенным - Булево -
// *ОповещениеПослеОткрытииЧека - Неопределено -
// *ОповещениеПриОшибкеПечатиЧека - Неопределено -
//
Функция ДополнительныеПараметрыОперации(ОставитьПодключенным = Ложь) Экспорт
ДополнительныеПараметры = Новый Структура();
ДополнительныеПараметры.Вставить("ОставитьПодключенным", ОставитьПодключенным);
ДополнительныеПараметры.Вставить("ОповещениеПослеОткрытииЧека");
ДополнительныеПараметры.Вставить("ОповещениеПриОшибкеПечатиЧека");
Возврат ДополнительныеПараметры;
КонецФункции
#КонецОбласти
#Область ПрограммныйИнтерфейсМаркировка
// Функция определяет тип штрихкода по значение кода.
//
// Параметры:
// Штрихкод - Строка - значение штрихкода.
//
// Возвращаемое значение:
// Строка.
//
Функция ОпределитьТипШтрихкода(Знач Штрихкод) Экспорт
ТипШтрихкодаЗнач = "";
ДлинаШтрихкода = СтрДлина(Штрихкод);
Если ДлинаШтрихкода = 0 Тогда
Возврат ТипШтрихкодаЗнач;
КонецЕсли;
Если ДлинаШтрихкода = 14 Тогда // ITF14
Если РассчитатьКонтрольныйСимволGTIN14(Штрихкод) = Прав(Штрихкод, 1) Тогда
ТипШтрихкодаЗнач = "ITF14";
КонецЕсли;
ИначеЕсли ДлинаШтрихкода = 13 Тогда // EAN13
Если РассчитатьКонтрольныйСимволGTIN13(Штрихкод) = Прав(Штрихкод, 1) Тогда
ТипШтрихкодаЗнач = "EAN13";
КонецЕсли;
ИначеЕсли ДлинаШтрихкода = 8 Тогда // EAN8
Если РассчитатьКонтрольныйСимволGTIN8(Штрихкод) = Прав(Штрихкод, 1) Тогда
ТипШтрихкодаЗнач = "EAN8";
КонецЕсли;
КонецЕсли;
Если ТипШтрихкодаЗнач= "" Тогда // CODE39
CODE39 = Истина;
Для Сч = 1 По ДлинаШтрихкода Цикл
ВремКодСимвола = КодСимвола(Штрихкод, Сч);
Если (ВремКодСимвола <> 32)
И (ВремКодСимвола < 36 Или ВремКодСимвола > 37)
И (ВремКодСимвола <> 43)
И (ВремКодСимвола < 45 Или ВремКодСимвола > 57)
И (ВремКодСимвола < 65 Или ВремКодСимвола > 90) Тогда
CODE39 = Ложь;
Прервать;
КонецЕсли;
КонецЦикла;
Если CODE39 Тогда
ТипШтрихкодаЗнач = "CODE39";
КонецЕсли
КонецЕсли;
Если ТипШтрихкодаЗнач= "" Тогда // CODE128
// CODE128 символы ASCII от 0 до 127 (цифры от «0» до «9», буквы от «A» до «Z» и от «a» до «z») и специальные символы;
CODE128 = Истина;
Для Сч = 1 По ДлинаШтрихкода Цикл
ВремКодСимвола = КодСимвола(Штрихкод, Сч);
Если (ВремКодСимвола > 127) Тогда
CODE128 = Ложь;
Прервать;
КонецЕсли;
КонецЦикла;
Если CODE128 Тогда
ТипШтрихкодаЗнач = "CODE128";
КонецЕсли
КонецЕсли;
Если ТипШтрихкодаЗнач = "CODE128" Тогда // EAN128
// В коде EAN128 регламентирован словарь CODE128 но регламентированы группы кодов, и возможны разделители GS.
Если КодСимвола(Штрихкод, 1) = 40 Или СтрНайти(Штрихкод, ОбщегоНазначенияБПОКлиентСервер.РазделительGS1()) > 0 Тогда
ТипШтрихкодаЗнач = "EAN128";
КонецЕсли;
КонецЕсли;
Возврат ТипШтрихкодаЗнач;
КонецФункции
// Функция возвращает пустую структуру записи EPC.
//
// Возвращаемое значение:
// Структура:
// *Результат - Булево - Результат декодирования (успешно или нет)
// *EPC - Строка - Значение EPC в виде HEX строки
// *EPC_BIN - Строка - Значение EPC в виде бинарной строки
// *Формат - Строка - Распознанный формат данных SGTIN-96 или SGTIN-198
// *GTIN - Строка - GTIN
// *СерийныйНомер - Строка - Серийный номер SGTIN
// *ПрефиксКомпании - Строка - Префикс компании
// *URI - Строка - EPC Tag URI.
//
Функция ПолучитьСтруктуруЗаписиEPC() Экспорт
СтруктураЗаписиEPC = Новый Структура;
СтруктураЗаписиEPC.Вставить("Результат", Ложь); // Результат декодирования (успешно или нет)
СтруктураЗаписиEPC.Вставить("EPC"); // Значение EPC в виде HEX строки
СтруктураЗаписиEPC.Вставить("EPC_BIN"); // Значение EPC в виде бинарной строки
СтруктураЗаписиEPC.Вставить("Формат"); // Распознанный формат данных SGTIN-96 или SGTIN-198
СтруктураЗаписиEPC.Вставить("GTIN"); // GTIN
СтруктураЗаписиEPC.Вставить("СерийныйНомер"); // Серийный номер SGTIN
СтруктураЗаписиEPC.Вставить("ПрефиксКомпании"); // Префикс компании
СтруктураЗаписиEPC.Вставить("URI"); // EPC Tag URI
Возврат СтруктураЗаписиEPC;
КонецФункции
// Расчет контрольной цифры для GTIN-8.
//
// Параметры:
// GTIN - Строка - Текстовая строка с GTIN-8. Может содержать числа от 0 до 9.
//
// Возвращаемое значение:
// Число - Контрольный символ (число) рассчитанный по алгоритму для GTIN.
//
Функция РассчитатьКонтрольныйСимволGTIN8(Знач GTIN) Экспорт
Сумма = 0;
Коэффициент = 3;
Для Сч = 1 По 7 Цикл
ВремКодСимвола = КодСимвола(GTIN, Сч);
Сумма = Сумма + Коэффициент * (ВремКодСимвола - 48);
Коэффициент = 4 - Коэффициент;
КонецЦикла;
Сумма = (10 - Сумма % 10) % 10;
КонтрольныйСимвол = Символ(Сумма + 48);
Возврат КонтрольныйСимвол;
КонецФункции
// Расчет контрольной цифры для GTIN-12.
//
// Параметры:
// GTIN - Строка - Текстовая строка с GTIN-12. Может содержать числа от 0 до 9.
//
// Возвращаемое значение:
// Число - Контрольный символ (число) рассчитанный по алгоритму для GTIN.
//
Функция РассчитатьКонтрольныйСимволGTIN12(Знач GTIN) Экспорт
Сумма = 0;
Коэффициент = 3;
Для Сч = 1 По 11 Цикл
ВремКодСимвола = КодСимвола(GTIN, Сч);
Сумма = Сумма + Коэффициент * (ВремКодСимвола - 48);
Коэффициент = 4 - Коэффициент;
КонецЦикла;
Сумма = (10 - Сумма % 10) % 10;
КонтрольныйСимвол = Символ(Сумма + 48);
Возврат КонтрольныйСимвол;
КонецФункции
// Расчет контрольной цифры для GTIN-13.
//
// Параметры:
// GTIN - Строка -Текстовая строка с GTIN-13. Может содержать числа от 0 до 9.
//
// Возвращаемое значение:
// Число - Контрольный символ (число) рассчитанный по алгоритму для GTIN.
//
Функция РассчитатьКонтрольныйСимволGTIN13(Знач GTIN) Экспорт
Сумма = 0;
Коэффициент = 1;
Для Сч = 1 По 12 Цикл
ВремКодСимвола = КодСимвола(GTIN, Сч);
Сумма = Сумма + Коэффициент * (ВремКодСимвола - 48);
Коэффициент = 4 - Коэффициент;
КонецЦикла;
Сумма = (10 - Сумма % 10) % 10;
КонтрольныйСимвол = Символ(Сумма + 48);
Возврат КонтрольныйСимвол;
КонецФункции
// Расчет контрольной цифры для GTIN-14.
//
// Параметры:
// GTIN - Строка - Текстовая строка с GTIN-14. Может содержать числа от 0 до 9.
//
// Возвращаемое значение:
// Число - Контрольный символ (число) рассчитанный по алгоритму для GTIN.
//
Функция РассчитатьКонтрольныйСимволGTIN14(Знач GTIN) Экспорт
Сумма = 0;
Коэффициент = 3;
Для Сч = 1 По 13 Цикл
ВремКодСимвола = КодСимвола(GTIN, Сч);
Сумма = Сумма + Коэффициент * (ВремКодСимвола - 48);
Коэффициент = 4 - Коэффициент;
КонецЦикла;
Сумма = (10 - Сумма % 10) % 10;
КонтрольныйСимвол = Символ(Сумма + 48);
Возврат КонтрольныйСимвол;
КонецФункции
// Универсальная функция расчета контрольной цифры GTIN.
// GTIN допускает в формате GTIN-8, GTIN-12, GTIN-13, GTIN-14 c контрольным символом.
//
// Параметры:
// GTIN - Строка - Текстовая строка с GTIN(c контрольным символом). Может содержать числа от 0 до 9.
//
// Возвращаемое значение:
// Число - Контрольный символ (число) рассчитанный по алгоритму для GTIN.
//
Функция РассчитатьКонтрольныйСимволGTIN(Знач GTIN) Экспорт
Сумма = 0;
ДлиннаGTIN = СтрДлина(GTIN);
Коэффициент = ?(ДлиннаGTIN % 2 = 0, 3, 1);
Для Сч = 1 По ДлиннаGTIN - 1 Цикл
ВремКодСимвола = КодСимвола(GTIN, Сч);
Сумма = Сумма + Коэффициент * (ВремКодСимвола - 48);
Коэффициент = 4 - Коэффициент;
КонецЦикла;
Сумма = (10 - Сумма % 10) % 10;
КонтрольныйСимвол = Символ(Сумма + 48);
Возврат КонтрольныйСимвол;
КонецФункции
// Функция проверяет корректность GTIN.
// GTIN допускает в формате GTIN-8, GTIN-12, GTIN-13, GTIN-14 c контрольным символом.
//
// Параметры:
// GTIN - Строка - Текстовая строка с GTIN(c контрольным символом). Может содержать числа от 0 до 9.
//
// Возвращаемое значение:
// Булево
//
Функция ПроверитьКорректностьGTIN(Знач GTIN) Экспорт
Результат = (СтрДлина(GTIN) = 8) Или (СтрДлина(GTIN) = 12) Или (СтрДлина(GTIN) = 13) Или (СтрДлина(GTIN) = 14);
Возврат Результат И РассчитатьКонтрольныйСимволGTIN(GTIN) = Прав(GTIN, 1);
КонецФункции
// Декодирование данных по значение EPC(HEX строка). Поддерживается формат SGTIN-96 и SGTIN-198.
//
// Параметры:
// EPC - Строка - Строка содержащая значение банка EPC в HEX виде.
//
// Возвращаемое значение:
// Структура:
// *Результат - Булево - Результат декодирования (успешно или нет)
// *EPC - Строка - Значение EPC в виде HEX строки
// *EPC_BIN - Строка - Значение EPC в виде бинарной строки
// *Формат - Строка - Распознанный формат данных SGTIN-96 или SGTIN-198
// *GTIN - Строка - GTIN
// *СерийныйНомер - Строка - Серийный номер SGTIN
// *ПрефиксКомпании - Строка - Префикс компании
// *URI - Строка - EPC Tag URI.
//
Функция ДекодированиеДанныхSGTIN(EPC) Экспорт
// Преобразовываем HEX строку значение банка EPC в бинарную строку.
БитовыйМассив = ПреобразоватьHEXВБинарнуюСтроку(EPC);
// Подготавливаем структура результата.
СтруктураРезультата = ПолучитьСтруктуруЗаписиEPC();
СтруктураРезультата.EPC = EPC;
СтруктураРезультата.EPC_BIN = БитовыйМассив;
// Получаем заголовок метки.
Заголовок = Сред(БитовыйМассив, 1, 8);
Если Заголовок = "00110000" Тогда // Распознан заголовок SGTIN-96.
Формат = "sgtin-96";
// Для SGTIN-96 длинная серийного номера 38 bit.
СерийныйНомер = Сред(БитовыйМассив, 59);
// Серийный номер состоит из десятичных цифр. Максимальное значение 274,877,906,943
СерийныйНомер = ДобавитьЛидирующиеНули(Формат(ПреобразоватьБинарнуюСтрокуВЧисло(СерийныйНомер), "ЧГ=0"), 12);
ИначеЕсли Заголовок = "00110110" Тогда // Распознан заголовок SGTIN-198.
Формат = "sgtin-198";
// Для SGTIN-198 длинная серийного номера 140 bit.
СерийныйНомерВрем = Сред(БитовыйМассив, 59);
// Серийный номер состоит из 7 битных символов. Максимально 20 символов.
СерийныйНомер = "";
Пока СтрДлина(СерийныйНомерВрем) > 0 Цикл
ТекСимвол = Лев(СерийныйНомерВрем, 7);
КодСимвола = ПреобразоватьБинарнуюСтрокуВЧисло(ТекСимвол);
Если КодСимвола > 31 Тогда
СерийныйНомер = СерийныйНомер + Символ(КодСимвола);
КонецЕсли;
СерийныйНомерВрем = Сред(СерийныйНомерВрем, 8);
КонецЦикла;
Иначе
Возврат СтруктураРезультата; // Не распознан формат данных EPC.
КонецЕсли;
СтруктураРезультата.СерийныйНомер = СерийныйНомер;
СтруктураРезультата.Формат = Формат;
Фильтр = ПреобразоватьБинарнуюСтрокуВЧисло(Сред(БитовыйМассив, 9, 3));
Разделитель = ПреобразоватьБинарнуюСтрокуВЧисло(Сред(БитовыйМассив, 12, 3));
// Определяем разделить префикса компании.
Если Разделитель = 1 Тогда
РазрядовКомпании = 37;
РазрядовЗнаков = 11;
ИначеЕсли Разделитель = 2 Тогда
РазрядовКомпании = 34;
РазрядовЗнаков = 10;
ИначеЕсли Разделитель = 3 Тогда
РазрядовКомпании = 30;
РазрядовЗнаков = 9;
ИначеЕсли Разделитель = 4 Тогда
РазрядовКомпании = 27;
РазрядовЗнаков = 8;
ИначеЕсли Разделитель = 5 Тогда
РазрядовКомпании = 24;
РазрядовЗнаков = 7;
ИначеЕсли Разделитель = 6 Тогда
РазрядовКомпании = 20;
РазрядовЗнаков = 6;
Иначе
РазрядовКомпании = 40;
РазрядовЗнаков = 12;
КонецЕсли;
ПрефиксКомпании = Сред(БитовыйМассив, 15, РазрядовКомпании);
ГруппаТовара = Сред(БитовыйМассив, 15 + РазрядовКомпании, 44 - РазрядовКомпании);
ПрефиксКомпании = ДобавитьЛидирующиеНули(Формат(ПреобразоватьБинарнуюСтрокуВЧисло(ПрефиксКомпании), "ЧГ=0"), РазрядовЗнаков);
ГруппаТовара = ДобавитьЛидирующиеНули(Формат(ПреобразоватьБинарнуюСтрокуВЧисло(ГруппаТовара), "ЧГ=0"), 13 - РазрядовЗнаков);
URI = "urn:epc:tag:" + Формат + ":" + Фильтр + "." + ПрефиксКомпании + "." + ГруппаТовара + "." + СерийныйНомер;
GTIN = Лев(ГруппаТовара, 1) + ПрефиксКомпании + Прав(ГруппаТовара, СтрДлина(ГруппаТовара) - 1);
Если СтрДлина(GTIN) = 13 Тогда
GTIN = GTIN + РассчитатьКонтрольныйСимволGTIN14(GTIN)
КонецЕсли;
СтруктураРезультата.ПрефиксКомпании = ПрефиксКомпании;
СтруктураРезультата.GTIN = GTIN;
СтруктураРезультата.URI = URI;
СтруктураРезультата.Результат = Истина;
Возврат СтруктураРезультата;
КонецФункции
// Функция определяет, содержит ли EPC значащую информацию (GTIN или СерийныйНомер) по формату SGTIN.
//
// Параметры:
// EPC - Строка - Строка содержащая значение банка EPC в HEX виде.
//
// Возвращаемое значение:
// Булево
//
Функция ПустойEPC(EPC) Экспорт
БитовыйМассив = ПреобразоватьHEXВБинарнуюСтроку(EPC);
СерийныйНомер = Прав(БитовыйМассив, 38);
GTIN = Сред(БитовыйМассив, 15, 44);
СерийныйНомер = ПреобразоватьБинарнуюСтрокуВЧисло(СерийныйНомер);
GTIN = ПреобразоватьБинарнуюСтрокуВЧисло(GTIN);
Заполнен = (СерийныйНомер > 0) Или (GTIN > 0);
Возврат Не Заполнен;
КонецФункции
// Сформировать значение EPC в формате SGTIN-96 для GTIN и серийного номера.
// GTIN допускает в формате GTIN-8, GTIN-12, GTIN-13, GTIN-14.
//
// Параметры:
// GTIN - Строка - GTIN товарной номенклатуры. Текстовая строка с GTIN(c контрольным символом).
// СерийныйНомер - Строка - Серийный номер номенклатуры.
// Фильтр - Строка - Фильтр
//
// Возвращаемое значение:
// Строка - HEX с сформированным EPC для записи на метку RFID.
//
Функция СформироватьДанныеSGTIN96(Знач GTIN, Знач СерийныйНомер, Знач Фильтр = 3) Экспорт
ВремGTIN = ДобавитьЛидирующиеНули(GTIN, 14);
ВремGTIN = Лев(ВремGTIN, 13); // Отбрасываем контрольный символ.
Если СтрДлина(GTIN) > 13 И Лев(GTIN, 1) <> "0" Тогда
ЗнаковКомпании = 9;
Индикатор = Лев(ВремGTIN, 1);
Компания = Сред(ВремGTIN, 2, ЗнаковКомпании);
ГруппаТоваров = Индикатор + Прав(ВремGTIN, 3);
Иначе
ЗнаковКомпании = 7;
Компания = Лев(ВремGTIN, ЗнаковКомпании + 1);
ГруппаТоваров = Сред(ВремGTIN, ЗнаковКомпании + 2);
КонецЕсли;
Если ЗнаковКомпании = 7 Тогда
РазрядовКомпании = 24;
Разделитель = 5;
ИначеЕсли ЗнаковКомпании = 9 Тогда
РазрядовКомпании = 30;
Разделитель = 3;
Иначе
Разделитель = 3;
РазрядовКомпании = 30;
КонецЕсли;
// АПК: 1353-выкл EPC - технический термин
СерийныйНомер = ?(ПустаяСтрока(СерийныйНомер), "0", СерийныйНомер);
EPC = "00110000"; // - Определяем заголовок SGTIN-96.
EPC = EPC + ДобавитьЛидирующиеНули(ПреобразоватьЧислоВБинарнуюСтроку(Фильтр), 3); // Фильтр.
EPC = EPC + ДобавитьЛидирующиеНули(ПреобразоватьЧислоВБинарнуюСтроку(Разделитель), 3); // Разделитель
EPC = EPC + ДобавитьЛидирующиеНули(ПреобразоватьЧислоВБинарнуюСтроку(Число(Компания)), РазрядовКомпании);
EPC = EPC + ДобавитьЛидирующиеНули(ПреобразоватьЧислоВБинарнуюСтроку(Число(ГруппаТоваров)), 44 - РазрядовКомпании);
EPC = EPC + ДобавитьЛидирующиеНули(ПреобразоватьЧислоВБинарнуюСтроку(Число(СерийныйНомер)), 38);
Результат = ПреобразоватьБинарнуюСтрокуВHEX(EPC);
Возврат Результат;
// АПК: 1353-вкл
КонецФункции
// Сформировать серийный номер по правилам производителей чипов.
//
// Параметры:
// TID - Строка - GTIN товарной номенклатуры. Текстовая строка с GTIN(c контрольным символом).
// EPC - Строка - Серийный номер номенклатуры.
//
// Возвращаемое значение:
// Структура.
//
Функция СерийныйНомерПоTID(Знач TID, Знач EPC = Неопределено) Экспорт
ОписаниеОшибки = НСтр("ru='Ошибка генерации серийного номера по TID.'");
РезультатВыполнения = Новый Структура("Результат, ОписаниеОшибки, СерийныйНомер", Ложь, ОписаниеОшибки);
ПризнакG2 = Лев(TID, 2);
Если ПризнакG2 <> "E2" Тогда // Фиксированное значение "E2" признак того что тип соответствует EPC Class1Gen2.
РезультатВыполнения.ОписаниеОшибки = НСтр("ru='Указанный TID не соответствует типу EPC Class1 Gen2.'");
Возврат РезультатВыполнения;
КонецЕсли;
// Преобразовываем HEX строку значение банка TID в бинарную строку.
БитовыйМассив = ПреобразоватьHEXВБинарнуюСтроку(TID);
// Получаем префикс производителя.
Производитель = Сред(TID, 3, 3);
Если Производитель = "001" Или Производитель = "801" Тогда // Чипы Impinj
СерияЧипа = Сред(БитовыйМассив, 84, 2); // Серия чипа 00
Если СерияЧипа = "00" Тогда
СерийныйНомер = "000"
+ Сред(БитовыйМассив, 86, 8)
+ Сред(БитовыйМассив, 66, 15)
+ Сред(БитовыйМассив, 94, 3)
+ Сред(БитовыйМассив, 65, 1)
+ Сред(БитовыйМассив, 55, 4)
+ Сред(БитовыйМассив, 61, 4);
Иначе // Серия чипа 01,10,11
СерийныйНомер = Сред(БитовыйМассив, 86, 11)
+ Сред(БитовыйМассив, 65, 16)
+ Сред(БитовыйМассив, 52, 2)
+ Сред(БитовыйМассив, 57, 1)
+ Сред(БитовыйМассив, 55, 4)
+ Сред(БитовыйМассив, 61, 4);
КонецЕсли;
ИначеЕсли Производитель = "006" Или Производитель = "806" Тогда // Чипы NXP Semiconductors
СерияЧипа = Сред(БитовыйМассив, 21, 11); // Серия чипа
СерияЧипа = ПреобразоватьБинарнуюСтрокуВHEX(СерияЧипа);
Если СерияЧипа = "806" Или СерияЧипа = "807" Тогда // G2iL или G2iL+
СерийныйНомер = "111"
+ Сред(БитовыйМассив, 24, 3)
+ Сред(БитовыйМассив, 33, 32);
Иначе
СерийныйНомер = Сред(БитовыйМассив, 59, 38);
КонецЕсли;
ИначеЕсли Производитель = "003" Или Производитель = "803" Тогда // Чипы Alien Technology
// Words 2, 3, 4 and 5
СерийныйНомер = Сред(БитовыйМассив, 59, 38);
Иначе
РезультатВыполнения.ОписаниеОшибки = НСтр("ru='Генерация серийного номера для чипа производителя указанного в TID не поддерживается.'");
Возврат РезультатВыполнения;
КонецЕсли;
РезультатВыполнения.Результат = Истина;
РезультатВыполнения.СерийныйНомер = ПреобразоватьБинарнуюСтрокуВЧисло(СерийныйНомер);
Возврат РезультатВыполнения;
КонецФункции
// Преобразовывает HEX строку в строку символов.
//
// Параметры:
// СтрокаHEX - Строка - Строка HEX содержащая символы.
//
// Возвращаемое значение:
// Строка - Строка символов
//
Функция ПреобразоватьHEXВСтроку(Знач СтрокаHEX) Экспорт
Результат = "";
ВремСтрока = СтрокаHEX;
КодСимвола = 0;
Пока СтрДлина(ВремСтрока) > 0 Цикл
ТекСимвол = Лев(ВремСтрока, 2);
ТекСимвол = ПреобразоватьHEXВБинарнуюСтроку(ТекСимвол);
КодСимвола = ПреобразоватьБинарнуюСтрокуВЧисло(ТекСимвол);
Если КодСимвола > 31 Тогда
Результат = Результат + Символ(КодСимвола);
КонецЕсли;
ВремСтрока = Сред(ВремСтрока, 3);
КонецЦикла;
Возврат Результат;
КонецФункции
// Преобразовывает строку символов в HEX строку.
//
// Параметры:
// Строка - Строка - Тестовая строка
//
// Возвращаемое значение:
// - Строка - Строка HEX содержащая символы.
//
Функция ПреобразоватьСтрокуВHEX(Знач Строка) Экспорт
Результат = "";
ИндексСимвола = 1;
Пока ИндексСимвола <= СтрДлина(Строка) Цикл
ТекКод = КодСимвола(Строка, ИндексСимвола);
ТекСимвол = ДобавитьЛидирующиеНули(ПреобразоватьЧислоВБинарнуюСтроку(ТекКод), 8);
Результат = Результат + ПреобразоватьБинарнуюСтрокуВHEX(ТекСимвол);
ИндексСимвола = ИндексСимвола + 1;
КонецЦикла;
Результат = ДобавитьЛидирующиеНули(Результат, 8);
Возврат Результат;
КонецФункции
// Функция - Преобразовать HEX в бинарную строку
//
// Параметры:
// СтрокаHEX - Строка - Строка HEX содержащая символы.
//
// Возвращаемое значение:
// Строка - Текстовая строка в бинарном представлении (Пример "000010101").
//
Функция ПреобразоватьHEXВБинарнуюСтроку(Знач СтрокаHEX) Экспорт
Результат = "";
Для ИндексСимвола = 1 По СтрДлина(СтрокаHEX) Цикл
ТекСимвол = Сред(СтрокаHEX, ИндексСимвола, 1);
Если ТекСимвол = "0" Тогда
Результат = Результат + "0000"
ИначеЕсли ТекСимвол = "1" Тогда
Результат = Результат + "0001"
ИначеЕсли ТекСимвол = "2" Тогда
Результат = Результат + "0010"
ИначеЕсли ТекСимвол = "3" Тогда
Результат = Результат + "0011"
ИначеЕсли ТекСимвол = "4" Тогда
Результат = Результат + "0100"
ИначеЕсли ТекСимвол = "5" Тогда
Результат = Результат + "0101"
ИначеЕсли ТекСимвол = "6" Тогда
Результат = Результат + "0110"
ИначеЕсли ТекСимвол = "7" Тогда
Результат = Результат + "0111"
ИначеЕсли ТекСимвол = "8" Тогда
Результат = Результат + "1000"
ИначеЕсли ТекСимвол = "9" Тогда
Результат = Результат + "1001"
ИначеЕсли ТекСимвол = "A" Тогда
Результат = Результат + "1010"
ИначеЕсли ТекСимвол = "B" Тогда
Результат = Результат + "1011"
ИначеЕсли ТекСимвол = "C" Тогда
Результат = Результат + "1100"
ИначеЕсли ТекСимвол = "D" Тогда
Результат = Результат + "1101"
ИначеЕсли ТекСимвол = "E" Тогда
Результат = Результат + "1110"
ИначеЕсли ТекСимвол = "F" Тогда
Результат = Результат + "1111"
КонецЕсли;
КонецЦикла;
Возврат Результат;
КонецФункции
// Функция - Преобразовать бинарную строку ВHEX
//
// Параметры:
// БинарнаяСтрока- Строка - Текстовая строка в бинарном представлении (Пример "000010101").
//
// Возвращаемое значение:
// Строка - Строка HEX содержащая символы.
//
Функция ПреобразоватьБинарнуюСтрокуВHEX(Знач БинарнаяСтрока) Экспорт
Результат = "";
ВремСтрока = БинарнаяСтрока;
Пока СтрДлина(ВремСтрока) > 0 Цикл
ТекСимвол = Лев(ВремСтрока, 4);
Если ТекСимвол = "0000" Тогда
Результат = Результат + "0";
ИначеЕсли ТекСимвол = "0001" Тогда
Результат = Результат + "1";
ИначеЕсли ТекСимвол = "0010" Тогда
Результат = Результат + "2";
ИначеЕсли ТекСимвол = "0011" Тогда
Результат = Результат + "3";
ИначеЕсли ТекСимвол = "0100" Тогда
Результат = Результат + "4";
ИначеЕсли ТекСимвол = "0101" Тогда
Результат = Результат + "5";
ИначеЕсли ТекСимвол = "0110" Тогда
Результат = Результат + "6";
ИначеЕсли ТекСимвол = "0111" Тогда
Результат = Результат + "7";
ИначеЕсли ТекСимвол = "1000" Тогда
Результат = Результат + "8";
ИначеЕсли ТекСимвол = "1001" Тогда
Результат = Результат + "9";
ИначеЕсли ТекСимвол = "1010" Тогда
Результат = Результат + "A";
ИначеЕсли ТекСимвол = "1011" Тогда
Результат = Результат + "B";
ИначеЕсли ТекСимвол = "1100" Тогда
Результат = Результат + "C";
ИначеЕсли ТекСимвол = "1101" Тогда
Результат = Результат + "D";
ИначеЕсли ТекСимвол = "1110" Тогда
Результат = Результат + "E";
ИначеЕсли ТекСимвол = "1111" Тогда
Результат = Результат + "F";
КонецЕсли;
ВремСтрока = Сред(ВремСтрока, 5);
КонецЦикла;
Возврат Результат;
КонецФункции
// Функция - Преобразовать бинарную строку в десятичное число
//
// Параметры:
// БинарнаяСтрока - Строка - Текстовая строка в бинарном представлении (Пример "000010101").
//
// Возвращаемое значение:
// Число - Десятичное число.
//
Функция ПреобразоватьБинарнуюСтрокуВЧисло(Знач БинарнаяСтрока) Экспорт
Результат = 0;
ТекущийИндекс = СтрДлина(БинарнаяСтрока) - 1;
Для ИндексСимвол = 1 По СтрДлина(БинарнаяСтрока) Цикл
ТекСимвол = Сред(БинарнаяСтрока, ИндексСимвол, 1);
Если ТекСимвол = "1" Тогда
Результат = Результат + Pow(2, ТекущийИндекс);
КонецЕсли;
ТекущийИндекс = ТекущийИндекс - 1;
КонецЦикла;
Возврат Результат;
КонецФункции
// Функция - Преобразовать десятичное число в бинарную строку
//
// Параметры:
// Число - Число - Десятичное число которое будет преобразовано в бинарный вид.
// КоличествоСимволов - Число - количество символов.
//
// Возвращаемое значение:
// Строка - Текстовая строка в бинарном представлении (Пример "000010101").
//
Функция ПреобразоватьЧислоВБинарнуюСтроку(Знач Число, Знач КоличествоСимволов = 0) Экспорт
Результат = "";
Пока Число > 0 Цикл
Остаток = Число % 2;
Число = Цел(Число / 2);
Результат = Строка(Остаток) + Результат;
КонецЦикла;
Результат =?(ПустаяСтрока(Результат), "0", Результат);
Если КоличествоСимволов > 0 Тогда
Пока СтрДлина(Результат) < КоличествоСимволов Цикл
Результат = "0" + Результат;
КонецЦикла;
КонецЕсли;
Возврат Результат;
КонецФункции
// Сформировать серийный номер по правилам производителей чипов.
//
// Параметры:
// TID - Строка - TID
// EPC - Неопределено - EPC
//
// Возвращаемое значение:
// Структура - Получить серийный номер по TID:
// *Результат - Булево -
// *ОписаниеОшибки - Строка -
// *СерийныйНомер - Строка -
//
Функция ПолучитьСерийныйНомерПоTID(Знач TID, Знач EPC = Неопределено) Экспорт
ОписаниеОшибки = НСтр("ru='Ошибка генерации серийного номера по TID.'");
РезультатВыполнения = Новый Структура("Результат, ОписаниеОшибки, СерийныйНомер", Ложь, ОписаниеОшибки);
ПризнакG2 = Лев(TID, 2);
Если ПризнакG2 <> "E2" Тогда // Фиксированное значение "E2" признак того что тип соответствует EPC Class1Gen2.
РезультатВыполнения.ОписаниеОшибки = НСтр("ru='Указанный TID не соответствует типу EPC Class1 Gen2.'");
Возврат РезультатВыполнения;
КонецЕсли;
// Преобразовываем HEX строку значение банка TID в бинарную строку.
БитовыйМассив = ПреобразоватьHEXВБинарнуюСтроку(TID);
// Получаем префикс производителя.
Производитель = Сред(TID, 3, 3);
Если Производитель = "001" Или Производитель = "801" Тогда // Чипы Impinj
СерияЧипа = Сред(БитовыйМассив, 84, 2); // Серия чипа 00
Если СерияЧипа = "00" Тогда
СерийныйНомер = "000"
+ Сред(БитовыйМассив, 86, 8)
+ Сред(БитовыйМассив, 66, 15)
+ Сред(БитовыйМассив, 94, 3)
+ Сред(БитовыйМассив, 65, 1)
+ Сред(БитовыйМассив, 55, 4)
+ Сред(БитовыйМассив, 61, 4);
Иначе // Серия чипа 01,10,11
СерийныйНомер = Сред(БитовыйМассив, 86, 11)
+ Сред(БитовыйМассив, 65, 16)
+ Сред(БитовыйМассив, 52, 2)
+ Сред(БитовыйМассив, 57, 1)
+ Сред(БитовыйМассив, 55, 4)
+ Сред(БитовыйМассив, 61, 4);
КонецЕсли;
ИначеЕсли Производитель = "006" Или Производитель = "806" Тогда // Чипы NXP Semiconductors
СерияЧипа = Сред(БитовыйМассив, 21, 11); // Серия чипа
СерияЧипа = ПреобразоватьБинарнуюСтрокуВHEX(СерияЧипа);
Если СерияЧипа = "806" Или СерияЧипа = "807" Тогда // G2iL или G2iL+
СерийныйНомер = "111"
+ Сред(БитовыйМассив, 24, 3)
+ Сред(БитовыйМассив, 33, 32);
Иначе
СерийныйНомер = Сред(БитовыйМассив, 59, 38);
КонецЕсли;
ИначеЕсли Производитель = "003" Или Производитель = "803" Тогда // Чипы Alien Technology
// Words 2, 3, 4 and 5
СерийныйНомер = Сред(БитовыйМассив, 59, 38);
Иначе
РезультатВыполнения.ОписаниеОшибки = НСтр("ru='Генерация серийного номера для чипа производителя указанного в TID не поддерживается.'");
Возврат РезультатВыполнения;
КонецЕсли;
РезультатВыполнения.Результат = Истина;
РезультатВыполнения.СерийныйНомер = ПреобразоватьБинарнуюСтрокуВЧисло(СерийныйНомер);
Возврат РезультатВыполнения;
КонецФункции
#КонецОбласти
#Область RFID
// Получить таблицу меток RFID.
//
// Параметры:
// ДанныеМеток - Строка
//
// Возвращаемое значение:
// Массив
//
Функция МеткиRFID(ДанныеМеток) Экспорт
#Если ВебКлиент Тогда
Возврат МенеджерОборудованияВызовСервера.МеткиRFID(ДанныеМеток);
#Иначе
Результат = Новый Массив();
Если Не ПустаяСтрока(ДанныеМеток) Тогда
ЧтениеXML = Новый ЧтениеXML;
ЧтениеXML.УстановитьСтроку(ДанныеМеток);
ЧтениеXML.ПерейтиКСодержимому();
Если ЧтениеXML.Имя = "Table" И ЧтениеXML.ТипУзла = ТипУзлаXML.НачалоЭлемента Тогда
Пока ЧтениеXML.Прочитать() Цикл
Если ЧтениеXML.Имя = "Tag" И ЧтениеXML.ТипУзла = ТипУзлаXML.НачалоЭлемента Тогда
// АПК: 1353-выкл TID, EPC, USER - аббревиатура
// Получение банков памяти считанной метки.
TID = ЧтениеXML.ЗначениеАтрибута("TID");
EPC = ЧтениеXML.ЗначениеАтрибута("EPC");
USER = ЧтениеXML.ЗначениеАтрибута("USER");
// Декодирование банка EPC по формату SGTIN.
ПозицияДанных = МенеджерОборудованияКлиентСервер.ДекодированиеДанныхSGTIN(EPC);
ПозицияДанных.Вставить("TID" , TID); // Добавляем в структура значения TID чипа метки.
ПозицияДанных.Вставить("USER", USER); // Добавляем в структура значения банка USER.
ПозицияДанных.Вставить("UserMemory", МенеджерОборудованияКлиентСервер.ПреобразоватьHEXВСтроку(USER));
// АПК: 1353-вкл
Результат.Добавить(ПозицияДанных);
КонецЕсли;
КонецЦикла;
КонецЕсли;
КонецЕсли;
Возврат Результат;
#КонецЕсли
КонецФункции
#КонецОбласти
// Base64 в штрихкод.
//
// Параметры:
// ШтрихкодВBase64 - Строка - Штрихкод в base64
//
// Возвращаемое значение:
// Строка - Base64 в штрихкод
Функция Base64ВШтрихкод(ШтрихкодВBase64) Экспорт
ДвоичныеДанные = Base64Значение(ШтрихкодВBase64);
Если ДвоичныеДанные = Неопределено Тогда
Штрихкод = ШтрихкодВBase64;
Иначе
Штрихкод = ПолучитьСтрокуИзДвоичныхДанных(ДвоичныеДанные);
КонецЕсли;
Возврат Штрихкод;
КонецФункции
// Штрихкод в base64.
//
// Параметры:
// Штрихкод - Строка - Штрихкод
//
// Возвращаемое значение:
// Строка - Штрихкод в base64
Функция ШтрихкодВBase64(Штрихкод) Экспорт
Если Штрихкод = Неопределено Тогда
ДвоичныеДанныеСтроки = Неопределено;
Иначе
ДвоичныеДанныеСтроки = ПолучитьДвоичныеДанныеИзСтроки(Штрихкод);
ШтрихкодBase64 = Base64Строка(ДвоичныеДанныеСтроки);
ШтрихкодBase64 = СтрЗаменить(ШтрихкодBase64, Символы.ПС, "");
ШтрихкодBase64 = СтрЗаменить(ШтрихкодBase64, Символы.ВК, "");
КонецЕсли;
Возврат ШтрихкодBase64;
КонецФункции
#КонецОбласти
#Область СлужебныйПрограммныйИнтерфейс
// Проверяет и преобразовывает абонентский номер (телефон) в формат ФФД +{Ц}
//
// Параметры:
// АбонентскийНомер - Строка - Телефон
//
// Возвращаемое значение:
// Строка - Абонентский номер в формат ФФД +{Ц}
//
Функция АбонентскийНомерФорматФФД(Знач АбонентскийНомер) Экспорт
НомерФорматФФД = "";
Если ПустаяСтрока(АбонентскийНомер) Тогда
Возврат НомерФорматФФД;
КонецЕсли;
Для Индекс = 1 По СтрДлина(АбонентскийНомер) Цикл
КодСимвола = Сред(АбонентскийНомер, Индекс, 1);
Если СтрНайти("0123456789", КодСимвола) > 0 Тогда
НомерФорматФФД = НомерФорматФФД + КодСимвола;
КонецЕсли;
КонецЦикла;
ДлинаНомераТелефона = СтрДлина(НомерФорматФФД);
Если ДлинаНомераТелефона = 10 Тогда
НомерФорматФФД = "+7" + НомерФорматФФД;
ИначеЕсли ДлинаНомераТелефона = 11 И Лев(НомерФорматФФД, 1) = "8" Тогда
НомерФорматФФД = "+7" + Сред(НомерФорматФФД, 2);
Иначе
НомерФорматФФД = "+" + НомерФорматФФД;
КонецЕсли;
Возврат НомерФорматФФД;
КонецФункции
// Идентификатор клиента для рабочего места.
//
// Возвращаемое значение:
// Строка - Идентификатор клиента для рабочего места
Функция ИдентификаторКлиентаДляРабочегоМеста() Экспорт
СистемнаяИнформация = Новый СистемнаяИнформация();
Возврат ВРег(СистемнаяИнформация.ИдентификаторКлиента);
КонецФункции
Функция НовыеРеквизитыПоискаРабочегоМеста() Экспорт
Реквизиты = Новый Структура;
Реквизиты.Вставить("ИдентификаторКлиента", "");
Реквизиты.Вставить("ИмяКомпьютера", "");
Реквизиты.Вставить("MACАдреса", Новый Массив);
Возврат Реквизиты;
КонецФункции
Функция НовыеПараметрыРабочегоМеста() Экспорт
Параметры = Новый Структура;
Параметры.Вставить("РабочееМесто");
Параметры.Вставить("ИспользуетсяRDP", Ложь);
Параметры.Вставить("ЕстьПодключаемоеОборудование", Истина);
Параметры.Вставить("АктуальныеРеквизитыПоиска", НовыеРеквизитыПоискаРабочегоМеста());
Параметры.Вставить("ЗаписанныеРеквизитыПоиска", НовыеРеквизитыПоискаРабочегоМеста());
Возврат Параметры;
КонецФункции
#КонецОбласти
#Область СлужебныеПроцедурыИФункции
Функция ДобавитьЛидирующиеНули(Знач Строка, Знач ДлиннаСтроки)
ТекстПолный = Строка;
Пока СтрДлина(ТекстПолный) < ДлиннаСтроки Цикл
ТекстПолный = "0" + ТекстПолный;
КонецЦикла;
Возврат ТекстПолный;
КонецФункции
#Область УстаревшиеПроцедурыИФункции
// Устарела: больше не используется
// Заполняет структуру параметров запрос КМ.
//
// Возвращаемое значение:
// Структура:
// *ИдентификаторЗапроса - Строка - Уникальный идентификатор запроса
// *Количество - Число - Количество
// *ДробноеКоличество - см. ОборудованиеЧекопечатающиеУстройстваКлиентСервер.ПараметрыДробноеКоличество
// *КонтрольнаяМарка - Строка - Код контрольной марки. Кодируется текстом в кодировке Base64.
// *КодЕдиницыИзмерения - Строка - Код единицы измерения в соответствии с общероссийским классификатором единиц измерения.
// *ПланируемыйСтатусТовара - ПеречислениеСсылка
//
Функция ПараметрыЗапросКМ() Экспорт;
Если МенеджерОборудованияВызовСервера.ИспользуетсяЧекопечатающиеУстройства() Тогда
МодульОборудованиеЧекопечатающиеУстройстваКлиентСервер = ОбщийМодуль("ОборудованиеЧекопечатающиеУстройстваКлиентСервер");
КонецЕсли;
Возврат МодульОборудованиеЧекопечатающиеУстройстваКлиентСервер.ПараметрыЗапросКМ();
КонецФункции
// Устарела: больше не используется
// Заполняет структуру параметров запрос КМ.
//
// Возвращаемое значение:
// Структура:
// * ИдентификаторЗапроса - Строка - Уникальный идентификатор запроса
//
Функция ПараметрыПодтверждениеКМ() Экспорт;
Если МенеджерОборудованияВызовСервера.ИспользуетсяЧекопечатающиеУстройства() Тогда
МодульОборудованиеЧекопечатающиеУстройстваКлиентСервер = ОбщийМодуль("ОборудованиеЧекопечатающиеУстройстваКлиентСервер");
КонецЕсли;
Возврат МодульОборудованиеЧекопечатающиеУстройстваКлиентСервер.ПараметрыПодтверждениеКМ();
КонецФункции
// Устарела: больше не используется
// Возвращает ссылку на общий модуль или модуль менеджера по имени.
//
// См. ОбщегоНазначенияБПО.ОбщийМодуль
//
// Параметры:
// Имя - Строка - имя общего модуля.
//
// Возвращаемое значение:
// ОбщийМодуль - общий модуль.
//
// Пример:
// Если ОбщегоНазначенияБПО.ПодсистемаСуществует("СтандартныеПодсистемы.ОбновлениеКонфигурации") Тогда
// МодульОбновлениеКонфигурации = ОбщегоНазначенияБПО.ОбщийМодуль("ОбновлениеКонфигурации");
// МодульОбновлениеКонфигурации.<Имя метода>();
// КонецЕсли;
//
// Если ОбщегоНазначенияБПО.ПодсистемаСуществует("СтандартныеПодсистемы.ПолнотекстовыйПоиск") Тогда
// МодульПолнотекстовыйПоискСервер = ОбщегоНазначенияБПО.ОбщийМодуль("ПолнотекстовыйПоискСервер");
// МодульПолнотекстовыйПоискСервер.<Имя метода>();
// КонецЕсли.
Функция ОбщийМодуль(Имя)
Модуль = Вычислить(Имя); // АПК: 486 ВычислитьВБезопасномРежиме не требуется, т.к. проверка надежная.
#Если Не ВебКлиент Тогда
// В веб-клиенте не проверяется
// т.к. при обращении к модулям с вызовом сервера типа такого модуля в веб-клиенте не существует.
Если ТипЗнч(Модуль) <> Тип("ОбщийМодуль") Тогда
ВызватьИсключение СтрШаблон(
НСтр("ru = 'Общий модуль ""%1"" не существует.'"),
Имя);
КонецЕсли;
#КонецЕсли
Возврат Модуль;
КонецФункции
#КонецОбласти
Функция СтрокаЗапускаБезопасная(СтрокаЗапуска) Экспорт
// Безопасными считаются такие строковые данные, которые не содержат в себе следующие символы: "$", "`", "|", "||" ";", "&", "&&".
ОпасныйВызов = СтрНайти(СтрокаЗапуска, "$")>0
Или СтрНайти(СтрокаЗапуска, "`")>0
Или СтрНайти(СтрокаЗапуска, "|")>0
Или СтрНайти(СтрокаЗапуска, "||")>0
Или СтрНайти(СтрокаЗапуска, ";")>0
Или СтрНайти(СтрокаЗапуска, "&")>0
Или СтрНайти(СтрокаЗапуска, "&&")>0;
Возврат Не ОпасныйВызов;
КонецФункции
// Устарела: следует использовать ОбщегоНазначенияБПОКлиент.ДатаСеанса.
Функция ДатаСеанса() Экспорт
Возврат ОбщегоНазначенияБПОКлиентСервер.ДатаСеанса();
КонецФункции
#КонецОбласти