В нашей компании на кассовых местах подключено несколько ККМ от Атола. При подключении к штатным разъемам USB на материнской плате все работает без проблем. Проблемы в тех магазинах, где кассы подключаются через USB-Hub.
Данная обработка позволяет быстро, без запуска "Тест-драйвера" и "Управление драйверами", настроить кассовое оборудование.
Была написана обработка, которая позволяет быстро произвести поиск подключенных кассовых аппаратов, проверить их подключение и сохранить настройки подключения в базе 1С. Так же сохраняются параметры для передачи данных в ОФД.
Обработка протестирована на 32-х битной версии 1С и конфигурации 1С:Розница 2.2 с версиями драйверов от Атол 8.16.1.8701 и 9.12.1.6236
P.S. Для работы обработки необходимо наличие компоненты от Атола fprnm1c.dll и наличие прав на изменения в папке C:\ProgramData\Atol\EoU
Изменения
13.09.2018
1. Добавлена возможность работы без компоненты fprnm1c.dll
2. Процесс поиска оборудования выведен в отдельную форму, на которой размещен индикатор процесса.
Поиск и настройка ККТ Атол без использования Тест-Драйвера
- Главное окно обработки
-
- Отмечаем порты для проверки
- Выбираем скорость(-и)
- Выбираем модель аппарата
- Нажимает «Выполнить поиск»
- Результат поиска
- Тестовая печать
- Нажимая кнопку «Тестовая печать» или «Х-отчет» выясняем какой аппарат отработает команду.
- В поле «Касса ККМ» выбираем соответствующий элемент справочника «Кассы ККМ»
- Поле «Подключаемое оборудование» заполниться автоматически
- Настройка портов для отправки данных в ОФД
- В поле «Порт отправки ОФД» устанавливаем для каждой кассы
- Сохраняем параметры
Проверить правильность можно при установленном драйвере ККТ 8-й версии в программе «Управление драйверами» на закладке «Служба EthernetOverUSB»
В поле ККМ будет записан заводской номер кассы, в поле СОМ-порт номер порта
Либо открыв файл C:\ProgramData\ATOL\EoU\settings.xml
Публикую код из модулей формы для тех кому жалко SM. Формочку нарисуете сами....
Модуль формы настройки поиска
&НаКлиенте
Перем ДрайверFPrnM8 Экспорт;
#Область Программный_Интефейс_Клиент
&НаКлиенте
Функция ПроверкаВозможна()
СтрокаПредупреждения = "";
// Выбор модели кассового аппарата
Если МодельКассовогоАппарата = "" Тогда
СтрокаПредупреждения = СтрокаПредупреждения + "Не выбрана модель кассового аппарата!";
КонецЕсли;
// Проверка на наличие выбранного порта
ВыбранПорт = Ложь;
Для Каждого ПортСписка Из СписокПортов Цикл
Если ПортСписка.Пометка Тогда
ВыбранПорт = Истина;
Прервать;
КонецЕсли;
КонецЦикла;
Если Не ВыбранПорт Тогда
Если СтрокаПредупреждения <> "" Тогда
СтрокаПредупреждения = СтрокаПредупреждения + "
|";
КонецЕсли;
СтрокаПредупреждения = СтрокаПредупреждения + "Не выбран порт для проверки подключения!";
КонецЕсли;
// Проверка на наличие выбранной скорости
ВыбранаСкорость = Ложь;
Для Каждого СкоростьСписка Из СписокСкоростейПодключения Цикл
Если СкоростьСписка.Пометка Тогда
ВыбранаСкорость = Истина;
Прервать;
КонецЕсли;
КонецЦикла;
Если Не ВыбранаСкорость Тогда
Если СтрокаПредупреждения <> "" Тогда
СтрокаПредупреждения = СтрокаПредупреждения + "
|";
КонецЕсли;
СтрокаПредупреждения = СтрокаПредупреждения + "Не выбрана скорость для проверки подключения!";
КонецЕсли;
Если СтрокаПредупреждения = "" Тогда
ПроверкаВозможна = Истина;
Иначе
ПроверкаВозможна = Ложь;
Предупреждение(СтрокаПредупреждения);
КонецЕсли;
Возврат ПроверкаВозможна;
КонецФункции //ПроверкаВозможна()
&НаКлиенте
Процедура ЗаполнитьСписокВыбораПортовОФД(МассивЗначений)
Элементы.КассыККМРабочегоМестаПортДляОтправкиОФД.СписокВыбора.Очистить();
Для Каждого ЭлементМассивЗначений Из МассивЗначений Цикл
Элементы.КассыККМРабочегоМестаПортДляОтправкиОФД.СписокВыбора.Добавить(ЭлементМассивЗначений.Значение, ЭлементМассивЗначений.Представление);
КонецЦикла;
КонецПроцедуры //ЗаполнитьСписокВыбораПортовОФД()
&НаКлиенте
Процедура ИзменитьПометкиСписка(СписокЗначенийФормы, ЗначениеПометки)
Для Каждого ЭлементСписка Из СписокЗначенийФормы Цикл
ЭлементСписка.Пометка = ЗначениеПометки;
КонецЦикла;
КонецПроцедуры //ИзменитьПометкиСписка()
///////////////////////////////////////////////////////////////////////////////
// ЗаполнитьСписокПортов() - Читаем раздел реестра, который содержит информацию
// о виртуальных портах для активного в настоящий
// момент времени оборудования
//
// Доп. информация: //infostart.ru/public/166440/
// http://www.script-coding.com/WMI_StdRegProv.html
//
///////////////////////////////////////////////////////////////////////////////
&НаКлиенте
Процедура ЗаполнитьСписокПортов()
СписокПортов.Очистить();
HKEY_LOCAL_MACHINE = 2147483650; // Раздел реестра HKEY_LOCAL_MACHINE
Путь = "hardware\devicemap\serialcomm\";
МассивКлючей = НеОпределено;
Попытка
sNames = НеОпределено;
Types = НеОпределено;
objReg = ПолучитьCOMОбъект("winmgmts:{impersonationLevel=impersonate}!\\.\root\default:StdRegProv");
readValue = objReg.EnumValues(HKEY_LOCAL_MACHINE, Путь, sNames, Types);
МассивКлючей = Новый Массив;
МассивКлючей = sNames.Выгрузить();
Исключение
КонецПопытки;
ЗначенияКлючейРеестра = Новый Структура;
Для Каждого КлючРеестра Из МассивКлючей Цикл
Попытка
ЗначениеКлюча = НеОпределено;
objReg = ПолучитьCOMОбъект("winmgmts:{impersonationLevel=impersonate}!\\.\root\default:StdRegProv");
objReg.GetStringValue(HKEY_LOCAL_MACHINE, Путь, КлючРеестра, ЗначениеКлюча);
Если Найти(КлючРеестра, "atol") = 0 И Найти(КлючРеестра, "FPrintUSB") = 0 Тогда
Продолжить;
КонецЕсли;
ПредставлениеПорта = ЗначениеКлюча + ": " + КлючРеестра;
ЗначениеПорта = Строка(Число(СтрЗаменить(ЗначениеКлюча, "COM","")) + 1000);
СписокПортов.Добавить(ЗначениеПорта, ПредставлениеПорта);
Исключение
КонецПопытки
КонецЦикла;
СписокПортов.СортироватьПоЗначению();
КонецПроцедуры //ЗаполнитьСписокПортов()
///////////////////////////////////////////////////////////////////////////////
// ПолучитьОбъектДрайвераFPrnM8() - Подключаем внешнюю компоненту с драйвером.
// Компоента должна быть предварительно заре-
// гистрирована в системе
///////////////////////////////////////////////////////////////////////////////
&НаКлиенте
Процедура ПолучитьОбъектДрайвераFPrnM8()
ДрайверFPrnM8 = НеОпределено;
ПрогИДFPrnM8 = "AddIn.FPrnM8";
Попытка
ПодключитьВнешнююКомпоненту(ПрогИДFPrnM8);
ДрайверFPrnM8 = Новый (ПрогИДFPrnM8);
ВерсияДрайвера = "8.х";
Исключение
КонецПопытки;
Если ДрайверFPrnM8 = НеОпределено Тогда
Попытка
ПодключитьВнешнююКомпоненту("ОбщийМакет.ДрайверАТОЛККТ54ФЗ9X", "ATOL_KKT_1C83_V9");
ДрайверFPrnM8 = Новый ("AddIn.ATOL_KKT_1C83_V9.ATOL_KKT_1C83_V9");
ВерсияДрайвера = "9.х"
Исключение
КонецПопытки;
КонецЕсли;
Если ДрайверFPrnM8 = НеОпределено Тогда
Предупреждение("Драйвер Кассового оборудования на данном рабочем
|месте не обнаружен либо работает с ошибками!
|Обратитесь к администратору системы!");
Элементы.КомандаВыполнитьПоиск.Доступность = Ложь;
КонецЕсли;
КонецПроцедуры //ПолучитьОбъектДрайвераFPrnM8()
///////////////////////////////////////////////////////////////////////////////
// ПодключитьУстройствоПоПараметрам(ДрайверFPrnM8, ПараметрыПодключения)
// Подключаем устройство с указанными параметрами:
// ДрайверFPrnM8 - Объект драйвера
// ПараметрыПодключения - структура или строка таблицы значения с ключами/полями:
// ПортПодключения - Значение порта в виде <Номер порта> + 1000
// СкоростьПодключения - Номер скорости из исписка возможных скоростей
// Модель - Номер модели из списка моделей
//
// Доп. информация: https://www.atol.ru/upload/iblock/792/Drivers8_FprnM_PM.pdf
///////////////////////////////////////////////////////////////////////////////
&НаКлиенте
Процедура ПодключитьУстройствоПоПараметрам(ДрайверFPrnM8, ПараметрыПодключения)
Если ВерсияДрайвера = "8.х" Тогда
StringOfParameters_Template = "DeviceNumber=1
|DeviceName=
|MachineName=
|PortNumber=#PortNumber
|BaudRate=#BaudRate
|Model=#Model
|AccessPassword=
|UseAccessPassword=1";
StringOfParameters = СтрЗаменить(StringOfParameters_Template, "#PortNumber", ПараметрыПодключения.ПортПодключения);
StringOfParameters = СтрЗаменить(StringOfParameters, "#BaudRate", ПараметрыПодключения.СкоростьПодключения);
StringOfParameters = СтрЗаменить(StringOfParameters, "#Model", ПараметрыПодключения.Модель);
ДрайверFPrnM8.DeviceSettings = StringOfParameters;
ДрайверFPrnM8.AddDevice();
ДрайверFPrnM8.PortNumber = ПараметрыПодключения.ПортПодключения;
ДрайверFPrnM8.BaudRate = ПараметрыПодключения.СкоростьПодключения;
ДрайверFPrnM8.Model = ПараметрыПодключения.Модель;
ДрайверFPrnM8.DeviceEnabled = 1;
ИначеЕсли ВерсияДрайвера = "9.х" Тогда
ДрайверFPrnM8.УстановитьПараметр("Port", ПараметрыПодключения.ПортПодключения);
ДрайверFPrnM8.УстановитьПараметр("BaudRate", ПараметрыПодключения.СкоростьПодключения);
ДрайверFPrnM8.УстановитьПараметр("Model", ПараметрыПодключения.Модель);
КонецЕсли;
КонецПроцедуры //ПодключитьУстройствоПоПараметрам()
&НаКлиенте
Процедура ОтключитьУстройство(ДрайверFPrnM8)
ДрайверFPrnM8.DeviceEnabled = 0;
ДрайверFPrnM8.DeleteDevice();
КонецПроцедуры //ОтключитьУстройство()
///////////////////////////////////////////////////////////////////////////////
// ЕстьПодключениеПоПараметрам(ДрайверFPrnM8, ПараметрыПодключения)
// Проверка наличия связи с у стройством по переданным параметрам
// Описание параметров см. в процедуре ПодключитьУстройствоПоПараметрам()
///////////////////////////////////////////////////////////////////////////////
&НаКлиенте
Функция ЕстьПодключениеПоПараметрам(ДрайверFPrnM8, ПараметрыПодключения)
ЕстьПодключение = Ложь;
ПодключитьУстройствоПоПараметрам(ДрайверFPrnM8, ПараметрыПодключения);
Если ВерсияДрайвера = "8.х" Тогда
СтатусУстройства = ДрайверFPrnM8.GetStatus();
ОтключитьУстройство(ДрайверFPrnM8);
Если СтатусУстройства = 0 Тогда
ЕстьПодключение = Истина;
СерийныйНомер = ДрайверFPrnM8.СерийныйНомер;
КонецЕсли;
ИначеЕсли ВерсияДрайвера = "9.х" Тогда
РезультатТеста = "";
АктивированДемоРежим = "";
ЕстьПодключение = ДрайверFPrnM8.ТестУстройства(РезультатТеста, АктивированДемоРежим);
Если ЕстьПодключение Тогда
ПозицияНомера = Найти(РезультатТеста, "№");
НомерНачало = СтрЗаменить(РезультатТеста,Лев(РезультатТеста, ПозицияНомера), "");
ПозицияЗавершенияНомера = Найти(НомерНачало, ",");
СерийныйНомер = Лев(НомерНачало, ПозицияЗавершенияНомера-1);
КонецЕсли;
КонецЕсли;
Если ЕстьПодключение Тогда
ПараметрыПодключения.Вставить("СерийныйНомер", СерийныйНомер);
СохранитьЗначенияПараметров(ПараметрыПодключения);
КонецЕсли;
Возврат ЕстьПодключение;
КонецФункции //ЕстьПодключениеПоПараметрам()
///////////////////////////////////////////////////////////////////////////////
// НастроитьПортДляОтправкиВОФД() - Записывает данные в xml файл с параметрами
// для службе EthernetOverUSB
///////////////////////////////////////////////////////////////////////////////
&НаКлиенте
Процедура НастроитьПортДляОтправкиВОФД()
Попытка
ИмяВременногоФайла = КаталогВременныхФайлов() + "settings.xml";
ДанныеФайла = Новый ЗаписьXML;
ДанныеФайла.ОткрытьФайл(ИмяВременногоФайла, "windows-1251");
ДанныеФайла.ЗаписатьОбъявлениеXML();
ДанныеФайла.ЗаписатьНачалоЭлемента("settings");
ЕстьИзменения = Ложь;
Для Каждого СтрокаДанных Из Объект.КассыККМРабочегоМеста Цикл
Если ЗначениеЗаполнено(СтрокаДанных.ПортДляОтправкиОФД) Тогда
ДанныеФайла.ЗаписатьНачалоЭлемента("device");
ДанныеФайла.ЗаписатьНачалоЭлемента("id"); ДанныеФайла.ЗаписатьТекст(СтрокаДанных.СерийныйНомер); ДанныеФайла.ЗаписатьКонецЭлемента();
ДанныеФайла.ЗаписатьНачалоЭлемента("port"); ДанныеФайла.ЗаписатьТекст(СтрокаДанных.ПортДляОтправкиОФД); ДанныеФайла.ЗаписатьКонецЭлемента();
ДанныеФайла.ЗаписатьКонецЭлемента();
ЕстьИзменения = Истина;
КонецЕсли;
КонецЦикла;
ДанныеФайла.ЗаписатьКонецЭлемента();
ДанныеФайла.Закрыть();
Если ЕстьИзменения Тогда
ПереместитьФайл(ИмяВременногоФайла, "C:\ProgramData\ATOL\EoU\settings.xml");
Иначе
УдалитьФайлы(ИмяВременногоФайла);
КонецЕсли;
Исключение
ИнфоОбОшибке = ИнформацияОбОшибке();
СообщениеОбОшибке = Новый СообщениеПользователю;
СообщениеОбОшибке.Текст = "При записи параметров для службы
|отправки данных в ОФД возникли ошибки!
|Обратитесь к администратору системы!
|
|Ошибка: '" + ИнфоОбОшибке.Описание + "'";
СообщениеОбОшибке.Сообщить();
КонецПопытки;
КонецПроцедуры //НастроитьПортДляОтправкиВОФД()
#КонецОбласти
#Область Программный_Интефейс_Сервер
&НаСервере
Процедура ЗаполнитьТаблицуКассККМРабочегоМеста(ТаблицаКассККМ)
ТаблицаКассККМРабочегоМеста = Объект.КассыККМРабочегоМеста.Выгрузить();
ТаблицаКассККМРабочегоМеста.Очистить();
Для Каждого ЭлементТаблицы Из ТаблицаКассККМ Цикл
СтрокаТаблицы = ТаблицаКассККМРабочегоМеста.Добавить();
ЗаполнитьЗначенияСвойств(СтрокаТаблицы, ЭлементТаблицы);
КонецЦикла;
Объект.КассыККМРабочегоМеста.Загрузить(ТаблицаКассККМРабочегоМеста);
КонецПроцедуры //ЗаполнитьТаблицуКассККМРабочегоМеста()
&НаСервере
Функция ПолучитьМассивОтмеченныхЗначений(СписокЗначенийДляОбработки, ОтмеченыВсе = Ложь)
МассивЗначений = Новый Массив;
Для Каждого ЭлементЗначение Из СписокЗначенийДляОбработки Цикл
Если ЭлементЗначение.Пометка Или ОтмеченыВсе Тогда
СтруктураЗначения = Новый Структура;
СтруктураЗначения.Вставить("Значение", ЭлементЗначение.Значение);
СтруктураЗначения.Вставить("Представление", ЭлементЗначение.Представление);
МассивЗначений.Добавить(СтруктураЗначения);
КонецЕсли;
КонецЦикла;
Возврат МассивЗначений;
КонецФункции //ПолучитьМассивОтмеченныхЗначений()
&НаСервере
Процедура СформироватьПараметрыПоиска(ПараметрыПоиска)
СписокПортовПараметры = ПолучитьМассивОтмеченныхЗначений(СписокПортов);
ПараметрыПоиска.Вставить("СписокПортов", СписокПортовПараметры);
СписокСкоростейПодключенияПараметры = ПолучитьМассивОтмеченныхЗначений(СписокСкоростейПодключения);
ПараметрыПоиска.Вставить("СписокСкоростейПодключения", СписокСкоростейПодключенияПараметры);
СписокПортовДляОтправкиОФДПараметры = ПолучитьМассивОтмеченныхЗначений(СписокПортовДляОтправкиОФД, Истина);
ПараметрыПоиска.Вставить("СписокПортовДляОтправкиОФД", СписокПортовДляОтправкиОФДПараметры);
ПараметрыПоиска.Вставить("МодельКассовогоАппарата", МодельКассовогоАппарата);
ПараметрыПоиска.Вставить("ПрерватьПоискЕслиНайденоОборудование", ПрерватьПоискЕслиНайденоОборудование);
КонецПроцедуры //СформироватьПараметрыПоиска()
&НаСервере
Функция ПолучитьПодключаемоеОборудование(КассаККМ)
Возврат КассаККМ.ПодключаемоеОборудование;
КонецФункции //ПолучитьПодключаемоеОборудование()
///////////////////////////////////////////////////////////////////////////////
// ЗаполнитьСписокМоделей() - Формируем список моделей кассового оборудования, с
// которым возможна работа. Данные о моделях записаны
// в макете
///////////////////////////////////////////////////////////////////////////////
&НаСервере
Процедура ЗаполнитьСписокМоделей()
Обработка = РеквизитФормыВЗначение("Объект");
МакетДанныеМоделей = Обработка.ПолучитьМакет("СписокМоделейККМ");
КолонкаКодов = 1;
КолонкаНаименований = 2;
Для СтрокаМакета = 1 По МакетДанныеМоделей.ВысотаТаблицы Цикл
ТекстЯчейкиКод = МакетДанныеМоделей.Область(СтрокаМакета, КолонкаКодов).Текст;
ТекстЯчейкиНаименование = МакетДанныеМоделей.Область(СтрокаМакета, КолонкаНаименований).Текст;
Если ТекстЯчейкиКод = "КодМодели" И ТекстЯчейкиНаименование = "НаименованиеМодели" Тогда
Продолжить;
КонецЕсли;
Элементы.МодельКассовогоАппарата.СписокВыбора.Добавить(ТекстЯчейкиКод, ТекстЯчейкиНаименование);
КонецЦикла;
КонецПроцедуры //ЗаполнитьСписокМоделей()
&НаСервере
Процедура ЗаполнитьСписокСкоростей()
СписокСкоростейПодключения.Добавить(3, 1200);
СписокСкоростейПодключения.Добавить(4, 2400);
СписокСкоростейПодключения.Добавить(5, 4800);
СписокСкоростейПодключения.Добавить(7, 9600);
СписокСкоростейПодключения.Добавить(9, 14400);
СписокСкоростейПодключения.Добавить(10, 19200);
СписокСкоростейПодключения.Добавить(12, 38400);
СписокСкоростейПодключения.Добавить(14, 57600);
СписокСкоростейПодключения.Добавить(18, 115200);
КонецПроцедуры //ЗаполнитьСписокСкоростей()
&НаСервере
Процедура СохранитьЗначенияПараметров(ПараметрыПодключения)
ТаблицаПараметровКасс = Объект.КассыККМРабочегоМеста.Выгрузить();
ПараметрыОтбора = Новый Структура("ПортПодключения");
ПараметрыОтбора.ПортПодключения = ПараметрыПодключения.ПортПодключения;
СтрокиПоПараметрам = ТаблицаПараметровКасс.НайтиСтроки(ПараметрыОтбора);
Если СтрокиПоПараметрам.Количество() = 0 Тогда
СтрокаПоПараметрам = ТаблицаПараметровКасс.Добавить();
Иначе
СтрокаПоПараметрам = СтрокиПоПараметрам[0];
КонецЕсли;
ЗаполнитьЗначенияСвойств(СтрокаПоПараметрам, ПараметрыПодключения);
Объект.КассыККМРабочегоМеста.Загрузить(ТаблицаПараметровКасс);
КонецПроцедуры //СохранитьЗначенияПараметров()
&НаСервере
Процедура ОчиститьТаблицуПараметров()
Объект.КассыККМРабочегоМеста.Очистить();
КонецПроцедуры //ОчиститьТаблицуПараметров()
///////////////////////////////////////////////////////////////////////////////
// СохранитьДанныеНаСервере()
// Сохраняем значения параметртов подключения кассовых аппаратов
///////////////////////////////////////////////////////////////////////////////
&НаСервере
Функция СохранитьДанныеНаСервере()
ДанныеКассыККМЗаписаны = Ложь;
ДанныеОборудованияЗаписаны = Ложь;
СтрокаОшибкиККМ = "";
СтрокаОшибкиПО = "";
ТаблицаДанных = Объект.КассыККМРабочегоМеста.Выгрузить();
Результат = Новый Массив;
Для Каждого СтрокаДанных Из ТаблицаДанных Цикл
Если СтрокаДанных.КассаККМ = Справочники.КассыККМ.ПустаяСсылка() Тогда
Продолжить;
КонецЕсли;
Если СтрокаДанных.СерийныйНомер <> "" Тогда
КассаККМ = СтрокаДанных.КассаККМ.ПолучитьОбъект();
КассаККМ.СерийныйНомер = СтрокаДанных.СерийныйНомер;
КассаККМ.ПодключаемоеОборудование = СтрокаДанных.ПодключаемоеОборудование;
Попытка
КассаККМ.Записать();
ДанныеКассыККМЗаписаны = Истина;
Исключение
СтрокаОшибкиККМ = ОписаниеОшибки();
КонецПопытки;
КонецЕсли;
// Данные КассыККМ записаны, запишем параметры оборудования
Если ДанныеКассыККМЗаписаны Тогда
// -- Порт подключения
ЗначениеПорта = НеОпределено;
Для Каждого ПортСписка Из СписокПортов Цикл
Если ВерсияДрайвера = "8.х" Тогда
ПортПодключения = Число(СтрокаДанных.ПортПодключения);
ИначеЕсли ВерсияДрайвера = "9.х" Тогда
ПортПодключения = Число(СтрокаДанных.ПортПодключения) + 1000;
КонецЕсли;
Если Число(ПортСписка.Значение) = ПортПодключения Тогда
ЗначениеПорта = ПортСписка;
Прервать;
КонецЕсли;
КонецЦикла;
Если ЗначениеПорта = НеОпределено Тогда
Продолжить;
КонецЕсли;
// -- Скорость подключения
ЗначениеСкорости = НеОпределено;
Для Каждого СкоростьИзСписка Из СписокСкоростейПодключения Цикл
Если ВерсияДрайвера = "8.х" Тогда
Если СкоростьИзСписка.Значение = СтрокаДанных.СкоростьПодключения Тогда
ЗначениеСкорости = СкоростьИзСписка;
Прервать;
КонецЕсли;
ИначеЕсли ВерсияДрайвера = "9.х" Тогда
Если Число(СкоростьИзСписка.Представление) = СтрокаДанных.СкоростьПодключения Тогда
ЗначениеСкорости = СкоростьИзСписка;
Прервать;
КонецЕсли;
КонецЕсли;
КонецЦикла;
Если ЗначениеСкорости = НеОпределено Тогда
Продолжить;
КонецЕсли;
ПодключаемоеОборудование = СтрокаДанных.ПодключаемоеОборудование.ПолучитьОбъект();
ПараметрыОборудования = ПодключаемоеОборудование.Параметры.Получить();
Если ПараметрыОборудования.Свойство("P_Port") Тогда
ПараметрыОборудования.P_Port = Строка(Число(ЗначениеПорта.Значение) - 1000);
ПараметрыОборудования.P_BaudRate = СтрЗаменить(ЗначениеСкорости.Представление, " ", "");
ИначеЕсли ПараметрыОборудования.Свойство("P_PortNumber") Тогда
ПараметрыОборудования.P_PortNumber = ЗначениеПорта.Значение;
ПараметрыОборудования.P_BaudRate = ЗначениеСкорости.Значение;
КонецЕсли;
Попытка
ПодключаемоеОборудование.Параметры = Новый ХранилищеЗначения(ПараметрыОборудования);
ПодключаемоеОборудование.Записать();
ДанныеОборудованияЗаписаны = Истина;
Исключение
СтрокаОшибкиПО = ОписаниеОшибки();
КонецПопытки;
Иначе
КонецЕсли; //ДанныеКассыККМЗаписаны
КонецЦикла;
Если НЕ ДанныеКассыККМЗаписаны Или Не ДанныеОборудованияЗаписаны Тогда
СтруктураРезультата = Новый Структура;
СтруктураРезультата.Вставить("КассаККМ", СтрокаДанных.КассаККМ);
СтруктураРезультата.Вставить("СтрокаОшибкиККМ", СтрокаОшибкиККМ);
СтруктураРезультата.Вставить("ПодключаемоеОборудование", СтрокаДанных.ПодключаемоеОборудование);
СтруктураРезультата.Вставить("СтрокаОшибкиПО", СтрокаОшибкиПО);
Результат.Добавить(СтруктураРезультата);
Иначе
Результат = НеОпределено;
КонецЕсли;
ОбновитьПовторноИспользуемыеЗначения();
Возврат Результат;
КонецФункции //СохранитьДанныеНаСервере()
#КонецОбласти
#Область События_Формы_Клиент
&НаКлиенте
Процедура ПриОткрытии(Отказ)
ЗаполнитьСписокПортов();
ПолучитьОбъектДрайвераFPrnM8();
Если ДрайверFPrnM8 = НеОпределено Тогда
Предупреждение("Не удалось определить версию драйвера оборудования!
|Дальнейшая работа не возможна!");
Элементы.КомандаВыполнитьПоиск.Доступность = Ложь;
Элементы.КомандаТестоваяПечать.Доступность = Ложь;
Элементы.Команда_Х_Отчет.Доступность = Ложь;
Элементы.КомандаСохранитьПараметры.Доступность = Ложь;
КонецЕсли;
КонецПроцедуры //ПриОткрытии()
&НаКлиенте
Процедура КассыККМРабочегоМестаКассаККМПриИзменении(Элемент)
ТекущиеДанные = Элементы.КассыККМРабочегоМеста.ТекущиеДанные;
ТекущиеДанные.ПодключаемоеОборудование = ПолучитьПодключаемоеОборудование(ТекущиеДанные.КассаККМ);
Если ЗначениеЗаполнено(ТекущиеДанные.ПодключаемоеОборудование) Тогда
ТекущиеДанные.СоздатьЭкземплярОборудования = "Использовать существующий";
ИначеЕсли ЗначениеЗаполнено(ТекущиеДанные.КассаККМ) Тогда
ТекущиеДанные.СоздатьЭкземплярОборудования = "Создать новый";
Иначе
ТекущиеДанные.СоздатьЭкземплярОборудования = "";
КонецЕсли;
КонецПроцедуры //КассыККМРабочегоМестаКассаККМПриИзменении()
///////////////////////////////////////////////////////////////////////////////
// КассыККМРабочегоМестаПередНачаломДобавления()
// Запретим что либо добавлять в таблицу с найденным оборудованием.
// Работаем только с найденным
///////////////////////////////////////////////////////////////////////////////
&НаКлиенте
Процедура КассыККМРабочегоМестаПередНачаломДобавления(Элемент, Отказ, Копирование, Родитель, Группа, Параметр)
Отказ = Истина;
КонецПроцедуры //КассыККМРабочегоМестаПередНачаломДобавления()
&НаКлиенте
Процедура КассыККМРабочегоМестаПортДляОтправкиОФДПриИзменении(Элемент)
ДанныеСтроки = Элементы.КассыККМРабочегоМеста.ТекущиеДанные;
ДанныеСтроки.ПортДляОтправкиОФДПредставление = Элемент.ТекстРедактирования;
Для Каждого ЗначениеПорта Из Элемент.СписокВыбора Цикл
Если ЗначениеПорта.Представление = ДанныеСтроки.ПортДляОтправкиОФДПредставление Тогда
ДанныеСтроки.ПортДляОтправкиОФД = Число(ЗначениеПорта.Значение) - 1000;
КонецЕсли;
КонецЦикла;
КонецПроцедуры //КассыККМРабочегоМестаПортДляОтправкиОФДПриИзменении()
&НаКлиенте
Процедура ОповещениеЗавершенияПоиска(РезультатПоиска, ДопПараметры) Экспорт
ЗаполнитьТаблицуКассККМРабочегоМеста(РезультатПоиска.ДанныеПараметровКасс);
ЗаполнитьСписокВыбораПортовОФД(РезультатПоиска.СписокПортовДляОтправкиОФД);
КонецПроцедуры //ОповещениеЗавершенияПоиска()
#КонецОбласти
#Область События_Формы_Сервер
&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
ЗаполнитьСписокМоделей();
ЗаполнитьСписокСкоростей();
КонецПроцедуры //ПриСозданииНаСервере()
#КонецОбласти
#Область Команды_Формы
&НаКлиенте
Процедура КомандаВсеПортыОтметить(Команда)
ИзменитьПометкиСписка(СписокПортов, Истина);
КонецПроцедуры //КомандаВсеПортыОтметить()
&НаКлиенте
Процедура КомандаВсеПортыСнятьОтметку(Команда)
ИзменитьПометкиСписка(СписокПортов, Ложь);
КонецПроцедуры //КомандаВсеПортыСнятьОтметку()
&НаКлиенте
Процедура КомандаВсеСкоростиОтметить(Команда)
ИзменитьПометкиСписка(СписокСкоростейПодключения, Истина);
КонецПроцедуры //КомандаВсеСкоростиОтметить()
&НаКлиенте
Процедура КомандаВсеСкоростиСнятьОтметку(Команда)
ИзменитьПометкиСписка(СписокСкоростейПодключения, Ложь);
КонецПроцедуры //КомандаВсеСкоростиСнятьОтметку()
///////////////////////////////////////////////////////////////////////////////
// КомандаВыполнитьПоиск() - Производим перебор отмеченных портов и скоростей,
// проверяем подключение кассового оборудования.
// При успешном подключении читаем данные о серийном
// номере кассового аппарата.
// Формируем список портов для настройки службы
// отправки данных в ОФД
///////////////////////////////////////////////////////////////////////////////
&НаКлиенте
Процедура КомандаВыполнитьПоиск(Команда)
Если ДрайверFPrnM8 = НеОпределено Тогда
Возврат;
КонецЕсли;
Если НЕ ПроверкаВозможна() Тогда
Возврат;
КонецЕсли;
ОчиститьТаблицуПараметров();
СписокПортовДляОтправкиОФД.Очистить();
Для Каждого ДоступныйПорт Из СписокПортов Цикл
СписокПортовДляОтправкиОФД.Добавить(ДоступныйПорт.Значение, ДоступныйПорт.Представление);
КонецЦикла;
ПараметрыПоиска = Новый Структура;
СформироватьПараметрыПоиска(ПараметрыПоиска);
ОповещениеЗавершенияПоиска = Новый ОписаниеОповещения("ОповещениеЗавершенияПоиска", ЭтаФорма);
ИмяФормыПоиска = "ВнешняяОбработка.ПоискКассовогоАппарата.Форма.ФормаПоискаОбрудования";
РежимОкнаФормы = РежимОткрытияОкнаФормы.БлокироватьОкноВладельца;
ОткрытьФорму(ИмяФормыПоиска, ПараметрыПоиска,,,,,ОповещениеЗавершенияПоиска, РежимОкнаФормы);
КонецПроцедуры //КомандаВыполнитьПоиск()
&НаКлиенте
Процедура КомандаСохранитьДанные(Команда)
Результат = СохранитьДанныеНаСервере();
Если Результат = НеОпределено Тогда
НастроитьПортДляОтправкиВОФД();
Иначе
СтрокаЗаголовокСообщения = "При сохранении данных возникли ошибки." + Символы.ПС;
СтрокаПодвалСообщения = Символы.ПС + "Обратитесь к администратору системы.";
СтрокаДанныхСообщения = "";
Для Каждого ЭлементРезультата Из Результат Цикл
Если ЭлементРезультата.СтрокаОшибкиККМ <> "" Тогда
Если СтрокаДанныхСообщения <> "" Тогда
СтрокаДанныхСообщения = СтрокаДанныхСообщения + Символы.ПС;
КонецЕсли;
СтрокаДанныхСообщения = СтрокаДанныхСообщения + "КассаККМ: " + ЭлементРезультата.КассаККМ + ". Ошибка: " + ЭлементРезультата.СтрокаОшибкиККМ;
КонецЕсли;
Если ЭлементРезультата.СтрокаОшибкиПО <> "" Тогда
Если СтрокаДанныхСообщения <> "" Тогда
СтрокаДанныхСообщения = СтрокаДанныхСообщения + Символы.ПС;
КонецЕсли;
СтрокаДанныхСообщения = СтрокаДанныхСообщения + "Подключаемое оборудование: " + ЭлементРезультата.ПодключаемоеОборудование + ". Ошибка: " + ЭлементРезультата.СтрокаОшибкиПО;
КонецЕсли;
КонецЦикла;
СтрокаСообщения = СтрокаСообщения + СтрокаДанныхСообщения + СтрокаПодвалСообщения;
КонецЕсли;
ОбновитьПовторноИспользуемыеЗначения();
КонецПроцедуры //КомандаСохранитьДанные()
&НаКлиенте
Процедура КомандаОбновитьСписокПортов(Команда)
ЗаполнитьСписокПортов();
КонецПроцедуры //КомандаОбновитьСписокПортов()
///////////////////////////////////////////////////////////////////////////////
// КомандаТестоваяПечать() - Выводим тестовую информацию на кассовом аппарате,
// используя методы драйвера
///////////////////////////////////////////////////////////////////////////////
&НаКлиенте
Процедура КомандаТестоваяПечать(Команда)
Если ВерсияДрайвера = "9.х" Тогда
Предупреждение("Не работает в данной версии драйвера!
|Воспользуйтесь выводом Х-Отчета.");
Возврат;
КонецЕсли;
ПараметрыПодключения = Элементы.КассыККМРабочегоМеста.ТекущиеДанные;
Если ПараметрыПодключения = НеОпределено Тогда
Возврат;
КонецЕсли;
Если ДрайверFPrnM8 = НеОпределено Тогда
Возврат;
КонецЕсли;
ПодключитьУстройствоПоПараметрам(ДрайверFPrnM8, ПараметрыПодключения);
Если ДрайверFPrnM8.DeviceEnabled = 0 Тогда
Возврат;
КонецЕсли;
ДрайверFPrnM8.Password = "30";
ДрайверFPrnM8.OperatorName = "Кассир";
ДрайверFPrnM8.Mode = 4;
ДрайверFPrnM8.SetMode();
ДрайверFPrnM8.TextWrap = 1;
СтрокаПечати = "
|
|Модель: " + ДрайверFPrnM8.УОписаниеУстройства + "
|Версия: " + ДрайверFPrnM8.Версия + "
|ИД Продукта: " + ДрайверFPrnM8.ИДПродукта + "
|Серийный номер: " + ДрайверFPrnM8.СерийныйНомер + "
| " + "
|Порт подключения: " + ПараметрыПодключения.ПортПодключенияПредставление + "
|Скорость подключения: " + ПараметрыПодключения.СкоростьПодключенияПредставление + "
| " + "
| " + "
| " + "
| " + "
|";
ДрайверFPrnM8.Caption = СтрокаПечати;
ДрайверFPrnM8.PrintHeader();
ДрайверFPrnM8.PrintString();
ДрайверFPrnM8.PrintFooter();
ДрайверFPrnM8.FullCut ();
ОтключитьУстройство(ДрайверFPrnM8);
КонецПроцедуры //КомандаТестоваяПечать()
///////////////////////////////////////////////////////////////////////////////
// Команда_Х_Отчет() - Выводим Х-отчет на кассовом аппарате, используя
// методы драйвера
///////////////////////////////////////////////////////////////////////////////
&НаКлиенте
Процедура Команда_Х_Отчет(Команда)
Если ДрайверFPrnM8 = НеОпределено Тогда
Возврат;
КонецЕсли;
ПараметрыПодключения = Элементы.КассыККМРабочегоМеста.ТекущиеДанные;
Если ПараметрыПодключения = НеОпределено Тогда
Возврат;
КонецЕсли;
ПодключитьУстройствоПоПараметрам(ДрайверFPrnM8, ПараметрыПодключения);
Если ВерсияДрайвера = "8.х" Тогда
ДрайверFPrnM8.Mode = 2; // Режим отчетов без гашения
ДрайверFPrnM8.Password = 30; // Пароль системного администратора
ДрайверFPrnM8.SetMode(); // Войти в режим Снятие X-отчета
ДрайверFPrnM8.ReportType = 2; // Суточный отчет без гашения
ДрайверFPrnM8.Report(); // Снять отчет
ОтключитьУстройство(ДрайверFPrnM8);
ИначеЕсли ВерсияДрайвера = "9.х" Тогда
ИД_Устройства = "";
Ответ = ДрайверFPrnM8.Подключить(ИД_Устройства);
МассивПараметров = НеОпределено;
Ответ = ДрайверFPrnM8.GetParameters(МассивПараметров);
ПараметрыОперации = "<?xml version=""1.0"" encoding=""UTF-8""?>
|<InputParameters>
| <Parameters CashierName=""Администратор"" CashierVATIN=""""/>
|</InputParameters>";
Результат = ДрайверFPrnM8.НапечататьОтчетБезГашения(ИД_Устройства, ПараметрыОперации);
Ответ = ДрайверFPrnM8.Отключить(ИД_Устройства);
КонецЕсли;
КонецПроцедуры //Команда_Х_Отчет()
&НаКлиенте
Процедура КомандаЗавершитьРаботу(Команда)
ЭтаФорма.Закрыть();
КонецПроцедуры
#КонецОбласти
ДрайверFPrnM8 = Неопределено;
Модуль формы поиска
&НаКлиенте
Перем ДрайверFPrnM8 Экспорт;
///////////////////////////////////////////////////////////////////////////////
// ПолучитьОбъектДрайвераFPrnM8() - Подключаем внешнюю компоненту с драйвером.
// Компоента должна быть предварительно заре-
// гистрирована в системе
///////////////////////////////////////////////////////////////////////////////
&НаКлиенте
Процедура ПолучитьОбъектДрайвераFPrnM8()
ДрайверFPrnM8 = НеОпределено;
ПрогИДFPrnM8 = "AddIn.FPrnM8";
Попытка
ПодключитьВнешнююКомпоненту(ПрогИДFPrnM8);
ДрайверFPrnM8 = Новый (ПрогИДFPrnM8);
ВерсияДрайвера = "8.х";
Исключение
КонецПопытки;
Если ДрайверFPrnM8 = НеОпределено Тогда
Попытка
ПодключитьВнешнююКомпоненту("ОбщийМакет.ДрайверАТОЛККТ54ФЗ9X", "ATOL_KKT_1C83_V9");
ДрайверFPrnM8 = Новый ("AddIn.ATOL_KKT_1C83_V9.ATOL_KKT_1C83_V9");
ВерсияДрайвера = "9.х"
Исключение
КонецПопытки;
КонецЕсли;
КонецПроцедуры //ПолучитьОбъектДрайвераFPrnM8()
&НаСервере
Функция ПолучитьСтрокиТаблицы(ТаблицаДанных)
МассивСтрок = Новый Массив;
Для Каждого СтрокаПараметров Из ТаблицаДанных Цикл
СтруктураСтроки = Новый Структура;
Для Каждого Колонка Из ТаблицаДанных.Колонки Цикл
ИмяКолонки = Колонка.Имя;
СтруктураСтроки.Вставить(ИмяКолонки, СтрокаПараметров[ИмяКолонки]);
КонецЦикла;
МассивСтрок.Добавить(СтруктураСтроки);
КонецЦикла;
Возврат МассивСтрок;
КонецФункции //ПолучитьСтрокиТаблицы()
&НаСервере
Функция ПолучитьМассивЗначений(СписокЗначенийДляОбработки)
МассивЗначений = Новый Массив;
Для Каждого ЭлементЗначение Из СписокЗначенийДляОбработки Цикл
СтруктураЗначения = Новый Структура;
СтруктураЗначения.Вставить("Значение", ЭлементЗначение.Значение);
СтруктураЗначения.Вставить("Представление", ЭлементЗначение.Представление);
МассивЗначений.Добавить(СтруктураЗначения);
КонецЦикла;
Возврат МассивЗначений;
КонецФункции //ПолучитьМассивЗначений()
&НаСервере
Функция ПолучитьПараметрыЗакрытиФормы()
ПараметрыЗакрытия = Новый Структура;
//ТаблицаПараметровКасс = Объект.КассыККМРабочегоМеста.Выгрузить();
ТаблицаПараметровКасс = Объект["КассыККМРабочегоМеста"].Выгрузить();
МассивСтрок = ПолучитьСтрокиТаблицы(ТаблицаПараметровКасс);
ПараметрыЗакрытия.Вставить("ДанныеПараметровКасс", МассивСтрок);
СписокПортовДляОтправкиОФДПараметры = ПолучитьМассивЗначений(СписокПортовДляОтправкиОФД);
ПараметрыЗакрытия.Вставить("СписокПортовДляОтправкиОФД", СписокПортовДляОтправкиОФДПараметры);
Возврат ПараметрыЗакрытия;
КонецФункции
///////////////////////////////////////////////////////////////////////////////
// ПодключитьУстройствоПоПараметрам(ДрайверFPrnM8, ПараметрыПодключения)
// Подключаем устройство с указанными параметрами:
// ДрайверFPrnM8 - Объект драйвера
// ПараметрыПодключения - структура или строка таблицы значения с ключами/полями:
// ПортПодключения - Значение порта в виде <Номер порта> + 1000
// СкоростьПодключения - Номер скорости из исписка возможных скоростей
// Модель - Номер модели из списка моделей
//
// Доп. информация: https://www.atol.ru/upload/iblock/792/Drivers8_FprnM_PM.pdf
///////////////////////////////////////////////////////////////////////////////
&НаКлиенте
Процедура ПодключитьУстройствоПоПараметрам(ДрайверFPrnM8, ПараметрыПодключения)
Если ВерсияДрайвера = "8.х" Тогда
StringOfParameters_Template = "DeviceNumber=1
|DeviceName=
|MachineName=
|PortNumber=#PortNumber
|BaudRate=#BaudRate
|Model=#Model
|AccessPassword=
|UseAccessPassword=1";
StringOfParameters = СтрЗаменить(StringOfParameters_Template, "#PortNumber", ПараметрыПодключения.ПортПодключения);
StringOfParameters = СтрЗаменить(StringOfParameters, "#BaudRate", ПараметрыПодключения.СкоростьПодключения);
StringOfParameters = СтрЗаменить(StringOfParameters, "#Model", ПараметрыПодключения.Модель);
ДрайверFPrnM8.DeviceSettings = StringOfParameters;
ДрайверFPrnM8.AddDevice();
ДрайверFPrnM8.PortNumber = ПараметрыПодключения.ПортПодключения;
ДрайверFPrnM8.BaudRate = ПараметрыПодключения.СкоростьПодключения;
ДрайверFPrnM8.Model = ПараметрыПодключения.Модель;
ДрайверFPrnM8.DeviceEnabled = 1;
ИначеЕсли ВерсияДрайвера = "9.х" Тогда
ДрайверFPrnM8.УстановитьПараметр("Port", ПараметрыПодключения.ПортПодключения);
ДрайверFPrnM8.УстановитьПараметр("BaudRate", ПараметрыПодключения.СкоростьПодключения);
ДрайверFPrnM8.УстановитьПараметр("Model", ПараметрыПодключения.Модель);
КонецЕсли;
КонецПроцедуры //ПодключитьУстройствоПоПараметрам()
&НаКлиенте
Процедура ОтключитьУстройство(ДрайверFPrnM8)
ДрайверFPrnM8.DeviceEnabled = 0;
ДрайверFPrnM8.DeleteDevice();
КонецПроцедуры //ОтключитьУстройство()
&НаСервере
Процедура СохранитьЗначенияПараметров(ПараметрыПодключения)
ТаблицаПараметровКасс = Объект.КассыККМРабочегоМеста.Выгрузить();
ПараметрыОтбора = Новый Структура("ПортПодключения");
ПараметрыОтбора.ПортПодключения = ПараметрыПодключения.ПортПодключения;
СтрокиПоПараметрам = ТаблицаПараметровКасс.НайтиСтроки(ПараметрыОтбора);
Если СтрокиПоПараметрам.Количество() = 0 Тогда
СтрокаПоПараметрам = ТаблицаПараметровКасс.Добавить();
Иначе
СтрокаПоПараметрам = СтрокиПоПараметрам[0];
КонецЕсли;
ЗаполнитьЗначенияСвойств(СтрокаПоПараметрам, ПараметрыПодключения);
Объект.КассыККМРабочегоМеста.Загрузить(ТаблицаПараметровКасс);
КонецПроцедуры //СохранитьЗначенияПараметров()
&НаКлиенте
Функция ЕстьПодключениеПоПараметрам(ДрайверFPrnM8, ПараметрыПодключения)
ЕстьПодключение = Ложь;
ПодключитьУстройствоПоПараметрам(ДрайверFPrnM8, ПараметрыПодключения);
Если ВерсияДрайвера = "8.х" Тогда
СтатусУстройства = ДрайверFPrnM8.GetStatus();
ОтключитьУстройство(ДрайверFPrnM8);
Если СтатусУстройства = 0 Тогда
ЕстьПодключение = Истина;
СерийныйНомер = ДрайверFPrnM8.СерийныйНомер;
КонецЕсли;
ИначеЕсли ВерсияДрайвера = "9.х" Тогда
РезультатТеста = "";
АктивированДемоРежим = "";
ЕстьПодключение = ДрайверFPrnM8.ТестУстройства(РезультатТеста, АктивированДемоРежим);
Если ЕстьПодключение Тогда
ПозицияНомера = Найти(РезультатТеста, "№");
НомерНачало = СтрЗаменить(РезультатТеста,Лев(РезультатТеста, ПозицияНомера), "");
ПозицияЗавершенияНомера = Найти(НомерНачало, ",");
СерийныйНомер = Лев(НомерНачало, ПозицияЗавершенияНомера-1);
КонецЕсли;
КонецЕсли;
Если ЕстьПодключение Тогда
ПараметрыПодключения.Вставить("СерийныйНомер", СерийныйНомер);
СохранитьЗначенияПараметров(ПараметрыПодключения);
КонецЕсли;
Возврат ЕстьПодключение;
КонецФункции //ЕстьПодключениеПоПараметрам()
&НаКлиенте
Процедура ВыполнитьПоискОборудования()
ПоискОборудованияПроцент = 0;
// -- Поиск оборудования по параметрам - Порт+Скорость
Для Каждого ПроверяемыйПортПодключения Из СписокПортов Цикл
ПоискОборудованияПроцент = ПоискОборудованияПроцент + 1;
ОборудованиеНайдено = Ложь;
//Если ПроверяемыйПортПодключения.Пометка Тогда
Для Каждого ПроверяемаяСкоростьПодключения Из СписокСкоростейПодключения Цикл
//Если ПроверяемаяСкоростьПодключения.Пометка Тогда
Если ВерсияДрайвера = "9.х" Тогда
ПортПодключения = Число(ПроверяемыйПортПодключения.Значение) - 1000;
СкоростьПодключения = ПроверяемаяСкоростьПодключения.Представление;
Иначе
ПортПодключения = ПроверяемыйПортПодключения.Значение;
СкоростьПодключения = ПроверяемаяСкоростьПодключения.Значение;
КонецЕсли;
ПараметрыПодключения = Новый Структура("ПортПодключения,
|ПортПодключенияПредставление,
|СкоростьПодключения,
|СкоростьПодключенияПредставление,
|Модель",
ПортПодключения,
ПроверяемыйПортПодключения.Представление,
СкоростьПодключения,
ПроверяемаяСкоростьПодключения.Представление,
МодельКассовогоАппарата);
ОборудованиеНайдено = ЕстьПодключениеПоПараметрам(ДрайверFPrnM8, ПараметрыПодключения);
//КонецЕсли;
Если ОборудованиеНайдено Тогда
ЗачениеПорта = СписокПортовДляОтправкиОФД.НайтиПоЗначению(ПроверяемыйПортПодключения.Значение);
Если ЗачениеПорта <> НеОпределено Тогда
СписокПортовДляОтправкиОФД.Удалить(ЗачениеПорта);
КонецЕсли;
КонецЕсли;
Если ОборудованиеНайдено И ПрерватьПоискЕслиНайденоОборудование Тогда
Прервать;
КонецЕсли;
КонецЦикла;
//КонецЕсли;
КонецЦикла;
ПараметрыЗакрытия = ПолучитьПараметрыЗакрытиФормы();
Закрыть(ПараметрыЗакрытия);
КонецПроцедуры
&НаСервере
Функция ПолучитьЗначенияСписка(МассивСпискаЗначений)
СписокПолучаемыхЗначений = Новый СписокЗначений;
Для Каждого ЭлементМассива Из МассивСпискаЗначений Цикл
СписокПолучаемыхЗначений.Добавить(ЭлементМассива.Значение, ЭлементМассива.Представление);
КонецЦикла;
Возврат СписокПолучаемыхЗначений;
КонецФункции
&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
СписокПортов = ПолучитьЗначенияСписка(Параметры.СписокПортов);
СписокПортовДляОтправкиОФД = ПолучитьЗначенияСписка(Параметры.СписокПортовДляОтправкиОФД);
СписокСкоростейПодключения = ПолучитьЗначенияСписка(Параметры.СписокСкоростейПодключения);
МодельКассовогоАппарата = Параметры.МодельКассовогоАппарата;
ПрерватьПоискЕслиНайденоОборудование = Параметры.ПрерватьПоискЕслиНайденоОборудование;
Элементы.ПоискОборудованияПроцент.МаксимальноеЗначение = СписокПортов.Количество() * СписокСкоростейПодключения.Количество();
КонецПроцедуры
&НаКлиенте
Процедура ПриОткрытии(Отказ)
ПолучитьОбъектДрайвераFPrnM8();
ПодключитьОбработчикОжидания("ВыполнитьПоискОборудования", 1, Истина);
КонецПроцедуры