Загрузка классификатора банков на сервере терминалов для пользователей с ограниченными правами через AutoIT скрипт и внешнюю обработку.



У клиента возникла проблема с загрузкой классификатора банков. Работа велась на сервере терминалов, и его прав не хватало для выполнения загрузки – при загрузке требуется запуск .exe файла, а это соответственно требует повышенных привилегий, которых не хотелось давать пользователю.  

Идею подсмотрел на форуме: Установка перечня банков. Там было очень интересное обсуждение проблемы и предложен способ решения. Тут же захотелось набросать реализацию… Делюсь тем, что получилось.

Идея простая и состоит в следующем: вместо загрузки банков с сайта РБК – загружаем их из заданного каталога (общего ресурса). В сам каталог файлы с РБК загружаем или вручную или, как в данном примере, программой на AutoIT.

I. Выгружаем  обработку загрузки банков во внешнюю обработку.

 Операция обычная — здесь вопросов не у кого не появится.

II. Подправляем полученную обработку в конфигураторе:

 1. На форме устанавливаем по умолчанию загрузку с сайта РБК:

 Рис1

 Для чего в обработчике событий вносим изменения:

 Рис2

 2. В модуль формы добавляем переменную – полный путь к каталогу, из которого будем загружать банки в справочник :

   В начало модуля ставим объявление переменной – имени общего каталога:

Рис2_1

  В конец модуля ставим значение инициализации нашего каталога:

  Рис2_2              

 Ставим простую врезку кода в процедуру загрузки с РБК, для изменения способа загрузки – грузим файлы из папки:

 Рис3

 Теперь новая внешняя обработка готова загружать банки из файлов, которые, находятся  в заданном каталоге (и были ранее загружены каким либо способом).

III Формируем скрипт на AutoIT для загрузки информации в заданный каталог с сайта РБК.

#Region ;**** Directives created by AutoIt3Wrapper_GUI ****

#AutoIt3Wrapper_UseX64=y

#EndRegion ;**** Directives created by AutoIt3Wrapper_GUI ****

 

;—————————————————————————————

; SAM 19.11.2013 — Процедура загрузки файла архива БАНКОВ с сервера РБК

;

; — СерверИсточник = «cbrates.rbc.ru»;

; — Адрес = «bnk/bnk.exe»;

;

;—————————————————————————————

; Использованы алгоритмы, код и библиотеки с ресурсов:

; http://autoit-script.ru/index.php?topic=1440.0

; http://autoit-script.ru/index.php/topic,14689.0.html

; http://code.google.com/p/autoit-winhttp/downloads/detail?name=1.6.3.4.zip&can=2&q=

;—————————————————————————————

#include «File.au3»

#include «WinHttp.au3»

#RequireAdmin

Opt(«MustDeclareVars», 1)

 

Global $sHost = «cbrates.rbc.ru»                                                             ; Сервер РБК

Global $sTarget = «bnk/bnk.exe»                                                            ; загружаемый файл

Global $sDestinationDir = «D:1CBaseBankRBC»                                    ; каталог куда будет загружаеться файл с сервера РБК

Global $sDestinationFile = «local_bnk.exe»                                            ; файл в который будет выгружаться файл с сервера 

 

Global $sDestination = $sDestinationDir & $sDestinationFile                  ; полный путь для исполняемого файла

Local $aReturn

Local $var

 

; Проверяем доступность сервера РБК

$var = Ping($sHost, 250)

If $var = 0 Then

    MsgBox(48, «Ошибка:», «Нет доступа к серверу cbrates.rbc.ru»)

    Exit 1

EndIf

 

; Очищаем каталог от результатов предыдущих загрузок

$aReturn = _FileSearch($sDestinationDir, ‘*.*’)

For $i = 1 To UBound($aReturn) — 1

        FileDelete($aReturn[$i])

Next

 

; Открываем HTTP сессию

Global $hHttpOpen = _WinHttpOpen()

If @error Then

    MsgBox(48, «Ошибка:», «Ошибка инициализации и использования функции: WinHTTP.»)

    Exit 2

EndIf

 

; Устанавливаем соединение

Global $hHttpConnect = _WinHttpConnect($hHttpOpen, $sHost)

If @error Then

    MsgBox(48, «Ошибка:», «Ошибка связи с сервером.»)

    _WinHttpCloseHandle($hHttpOpen)

    Exit 3

EndIf

 

; Определяем содержимое запроса

Global $hHttpRequest = _WinHttpOpenRequest($hHttpConnect, Default, $sTarget)

If @error Then

    MsgBox(48, «Ошибка:», «Ошибка HTTP запроса.»)

    _WinHttpCloseHandle($hHttpConnect)

    _WinHttpCloseHandle($hHttpOpen)

    Exit 4

EndIf

 

; Посылаем запрос

_WinHttpSendRequest($hHttpRequest)

If @error Then

    MsgBox(48, «Ошибка:», «Ошибка передачи запроса.»)

    _WinHttpCloseHandle($hHttpConnect)

    _WinHttpCloseHandle($hHttpOpen)

    Exit 5

EndIf

 

; Ждем ответа на запрос

_WinHttpReceiveResponse($hHttpRequest)

 

; Читаем данные с сервера

Global $bChunk, $bData, $hFile

If _WinHttpQueryDataAvailable($hHttpRequest) Then

    While 1

        $bChunk = _WinHttpReadData($hHttpRequest, 2)                          ; читаем двоичные данные

        If @error Then ExitLoop

        $bData = _WinHttpSimpleBinaryConcat($bData, $bChunk)             ; дописываем очередные данные…

    WEnd

    ; Сохраняем данные в файл (старый файл с таким же именем перезаписывается)

    $hFile = FileOpen($sDestination, 26)

    FileWrite($hFile, $bData)

    FileClose($hFile)

Else

    MsgBox(48, «Ошибка:», «Невозможно загрузить данные. » & @CRLF)

EndIf

 

; Чистим указатели

_WinHttpCloseHandle($hHttpRequest)

_WinHttpCloseHandle($hHttpConnect)

_WinHttpCloseHandle($hHttpOpen)

 

; Выполняем загруженный файл для распаковки архива в заданном каталоге

ShellExecute($sDestination, «», $sDestinationDir)

;————————————————————

; вспомогательная функция построения списка файлов каталога

;————————————————————

Func _FileSearch($sPath, $sFileMask)

    Local $sOut = StringToBinary(«0» & @CRLF, 2), $aOut

    Local $hDir = Run(@ComSpec & ‘ /U/C DIR «‘ & $sPath & » & $sFileMask & ‘» /S/B/A-D’, @SystemDir, @SW_HIDE, 6)

 

    While 1

        $sOut &= StdoutRead($hDir, False, True)

        If @error Then ExitLoop

    WEnd

 

    $aOut = StringRegExp(BinaryToString($sOut, 2), «[#k8SjZc9Dxk
]+», 3)

    If @error Then Return SetError(1)

 

    $aOut[0] = UBound($aOut) — 1

    Return $aOut

EndFunc

 

IV Созданый  скрипт  помещаем в Планировщик заданий, для автоматизации обновлений по расписанию (с нужной нам периодичностью).

 

Теперь у нас есть каталог, в который по расписанию загружается свежая информация по классификатору банков (с нужной нам периодичностью). И внешняя обработка при помощи которой можно загрузить классификатор в конкретную базу. В приложеном архиве находятся: скрипт (полный исходный и скомпилированный для 64 разрядной Windows), скорректированная внешняя обработка.

PS: На Infostart есть статьи на подобную тему, но те, которые просмотрел не имели описания и только ссылку на загрузку обработки – просто так, чтобы посмотреть решение, качать обработки не было желания.

2 Comments

  1. MaeXtro

    Можно без шаманства!

    берем ИТС ПРОФ и из него две папки в корень любого диска:

    1CItsEXEEXTDB — обработки

    DatabaseGarantMorphDB — базы БИК, Кладр, ОКОНХ…

    Выбираем загрузку с ИТС и 1С-ка сама их найдет. Проверено на БП 3.0 и 2.0

    PS Почему-то БП 3.0 просит http://cbrates.rbc.ru/bnk/bnk.zip

    Reply
  2. LexSeIch

    (1) MaeXtro,

    Как часто обновляется ИТС ПРОФ? Как часто закрываются банки или меняются их атрибуты?

    Каждой вещи — свое место и время… ИМХО.

    Reply

Leave a Comment

Ваш адрес email не будет опубликован. Обязательные поля помечены *