Основная концепция решения заключается в том, чтобы "научить" стандартные подсистемы работать с утилитой командной строки как с драйвером оборудования. Конечно можно применить данный подход не только подключая электронные весы, но и другую функциональность, которая обслуживается подобными утилитами, требующими запуска из командной строки и сохраняющие результат своего взаимодействия с оборудованием в файл.
Программная реализация.
Выполним пошаговую реализацию решения для конфигурации "BAS ERP 2.1.19.3"
В связи с тем, что использовать расширения нет возможности, необходимо включить возможность редактирования в конфигурации а также редактирования всех объектов, которые будут задействованы.
1. Перечисление
Добавим в перечисление "ОбработчикиДрайверовПодключаемогоОборудования" новое значение, которое будет определять новый драйвер: "ОбработчикUniScalesЭлектронныеВесы"
2. Драйвер
В справочник "Драйверы оборудования" добавим новый предопределенный элемент с именем "ДрайверUniScalesЭлектронныеВесы" и наименованием "UniScalesDriver"
Далее, мы должны обеспечить правильное заполнение этого предопределенного элемента при создании базы данных. Поэтому в модуле "МенеджерОборудованияВызовСервераПереопределяемый" в процедуре "ОбновитьПоставляемыеДрайвера" добавим запуск
Справочники.ДрайверыОборудования.ЗаполнитьПредопределенныйЭлемент(
Перечисления.ОбработчикиДрайверовПодключаемогоОборудования.ОбработчикUniScalesЭлектронныеВесы,
"WScript.UniScalesDriver", "ДрайверUniScalesЭлектронныеВесы", Ложь);
В том случае, если мы интегрируем это решение в уже развернутую ранее базу данных, просто создайте свою внешнюю обработку и выполните этот указанный выше код.
Хочу заметить, что во 2-м параметре "Идентификатор объекта" вы видите "новый класс оборудования" - WSCRIPT. Это такой маркер, по которому алгоритмы подключения драйвера будут "обмануты" для обеспечения функциональности этого решения. Это как бы "Ключ". Но об этом позже.
Заполненный элемент "драйвера оборудования" будет выглядеть следующим образом:
3. Форма настройки
Необходимо обеспечить настройку драйвера, с помощью которых будет сформирована командная строка для запуска утилиты UniScalesDriver
Можем взять стандартную форму из другого оборудования, например "ФормаНастройки1ССканерыШтрихкода" и адаптировать. Таким образом добавим общую форму "ФормаНастройкиUniScalesЭлектронныеВесы".
Эта форма будет вызываться кнопкой "Настройка" из формы элемента подключаемого оборудования.
Оставим на форме такие параметры: Номер порта, Скорость порта, Префикс, Суффикс. Например нам нужно будет сформировать такую строку запуска:
UniScalesDriver.exe 3 COM2 4800 0 1
Соответственно префикс это "3 COM", номер порта это "2", скорость порта это "4800", суффикс это "0 1"
4. Утилита-Драйвер в макете.
По аналогии стандартных драйверов оборудования в комплекте конфигурации, размещаем нашу утилиту в ZIP-архиве как двоичные данные в общем макете "ДрайверUniScalesЭлектронныеВесы"
Ссылка на этот макет будет прописана при заполнении предопределенного элемента драйвера, что описано выше в п.2
5. Модуль обслуживания драйвера
И самое главное. Весь функционал работы драйвера обслуживается общим модулем "ПодключаемоеОборудованиеWScriptКлиент" который также можно создать на основе существующего модуля другого стандартного оборудования, каких-то других весов.
Ссылка на этот модуль будет прописана в модуле "МенеджерОборудованияКлиентПереопределяемый" в функции "ПолучитьОбработчикДрайвера".
Если ОбработчикДрайвера = ПредопределенноеЗначение("Перечисление.ОбработчикиДрайверовПодключаемогоОборудования.ОбработчикUniScalesЭлектронныеВесы") Тогда
Возврат ПодключаемоеОборудованиеWScriptКлиент;
КонецЕсли;
Теперь об основной логике в этом модуле ПодключаемоеОборудованиеWScriptКлиент
1) Поддержка асинхронного режима выключена
Функция ПоддержкаАсинхронногоРежима() Экспорт
Возврат Ложь;
КонецФункции
2) Функционал "Подключить устройство"
В данном решении переменная "ОбъектДрайвера" будет содержать не ссылку на COM-объект драйвера устройства разработанного по стандартам драйверов 1С, а ссылку на объект Wscript.Shell
Поэтому вызов стандартных методов нужно отключить и переписать. Например отключить такие как:
ОбъектДрайвера.УстановитьПараметр()
ОбъектДрайвера.ПолучитьРевизиюИнтерфейса()
Этот вызов получения описания подменить на текстовые константы
ОбъектДрайвера.ПолучитьОписание(ОписаниеДрайвера)
Ну и основное - вызов подключения драйвера
Ответ = ОбъектДрайвера.Подключить(
нужно заменить на:
- вытащить драйвер из макета и передать с сервера на клиент
- сохранить этот драйвер во временный каталог с исходным именем и распаковать из архива
ИмяФайлаДрайвера = "";
АдресДрайвераВоВременномХранилище = МенеджерОборудованияВызовСервера.ПолучитьДрайверВоВременноеХранилище(Параметры.Идентификатор,ИмяФайлаДрайвера);
ОбщиймакетДрайвера = ПолучитьИЗВременногоХранилища(АдресДрайвераВоВременномХранилище);
УдалитьИзВременногоХранилища(АдресДрайвераВоВременномХранилище);
КаталогВременныхФайловДляАрхива = КаталогВременныхФайлов();
ВременныйКаталог = КаталогВременныхФайловДляАрхива + ИмяФайлаДрайвера;
ОбщиймакетДрайвера.Записать(ВременныйКаталог);
Архив = Новый ЧтениеZipФайла(ВременныйКаталог);
Архив.ИзвлечьВсе(КаталогВременныхФайловДляАрхива,РежимВосстановленияПутейФайловZIP.НеВосстанавливать);
Ответ = Истина;
В результате функционала "Подключить устройство" имеем нашу утилиту командной строки сохраненную на диск. Это и будем считать подключением устройства.
3) Функционал "Отключить устройство" - просто ничего не делаем.
4) Основной функционал - "Получить вес"
Эта процедура отрабатывает когда на форме документа нажимается соответствующая кнопка
Вместо вызова ОбъектДрайвера.ПолучитьВес
Делаем следующее: запускаем утилиту объектом Wscript.Shell с подавлением окна консоли и в синхронном режиме. Потом читаем результирующий файл который формирует утилита в том же временном каталоге
ОбъектДрайвера.Run(ВременныйКаталог + " " + СокрП(ДанныеДрайвера.Параметры.Префикс) + СокрЛП(ДанныеДрайвера.Параметры.Порт) + " " +
СокрЛП(СтрЗаменить(ДанныеДрайвера.Параметры.Скорость," ","")) + " " + СокрЛП(ДанныеДрайвера.Параметры.Суффикс), 0, 1);
// теперь прочитаем результат из файла
ФайлРезультат = новый ТекстовыйДокумент;
ФайлРезультат.ТолькоПросмотр = Истина;
ФайлРезультат.Прочитать(ИмяФайлаРезультата);
СтрокаРезультата = ФайлРезультат.ПолучитьСтроку(2);
Если ВРЕГ(СокрЛП(СтрокаРезультата)) = "OK" Тогда // вес успешно получен
Вес = Число(ФайлРезультат.ПолучитьСтроку(4));
Ответ = Истина;
Иначе
Ответ = Ложь;
КонецЕсли;
6. Адаптация типового кода под новый класс драйвера "WSCRIPT"
Теперь изюминка
В общем модуле "МенеджерОборудованияКлиент" в функции "ПолучитьОбъектДрайвера" подменяем инициализацию драйвера. Ориентируемся по нашему ключу WScript
// --- замена строки
// Если ДанныеДрайвера.ВСоставеКонфигурации Тогда
Если Префикс = "WScript." Тогда
Результат = Истина;
ИначеЕсли ДанныеДрайвера.ВСоставеКонфигурации Тогда
// ---
и еще
// --- замена строки
// ОбъектДрайвера = Новый (ProgID2);
Если Префикс = "WScript." Тогда
ОбъектДрайвера = Новый COMОбъект("WScript.Shell");
Иначе
ОбъектДрайвера = Новый (ProgID2);
Конецесли;
// ---
7. Эксплуатация решения.
Тут все стандартно, собственно ради чего и затевалось.
Создаем оборудование "Электронные весы", выбрав наш драйвер и выполняем его настройку.
Перезаходим в 1С и можно нажимать кнопку "Получить вес" в документах которые работают с весами.
На этом все. Идеи приветствуются.
Удачных вам проектов.
Источник: http://scriptcoding.ru/2013/06/25/wscript-shell-run/ Внимание! Права на публикацию материалов сайта находятся под охраной © http://matrixblog