Идею подсмотрел на форуме: Установка перечня банков. Там было очень интересное обсуждение проблемы и предложен способ решения. Тут же захотелось набросать реализацию… Делюсь тем, что получилось.
Идея простая и состоит в следующем: вместо загрузки банков с сайта РБК – загружаем их из заданного каталога (общего ресурса). В сам каталог файлы с РБК загружаем или вручную или, как в данном примере, программой на AutoIT.
I. Выгружаем обработку загрузки банков во внешнюю обработку.
Операция обычная - здесь вопросов не у кого не появится.
II. Подправляем полученную обработку в конфигураторе:
1. На форме устанавливаем по умолчанию загрузку с сайта РБК:
Для чего в обработчике событий вносим изменения:
2. В модуль формы добавляем переменную – полный путь к каталогу, из которого будем загружать банки в справочник :
В начало модуля ставим объявление переменной – имени общего каталога:
В конец модуля ставим значение инициализации нашего каталога:
Ставим простую врезку кода в процедуру загрузки с РБК, для изменения способа загрузки – грузим файлы из папки:
Теперь новая внешняя обработка готова загружать банки из файлов, которые, находятся в заданном каталоге (и были ранее загружены каким либо способом).
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:\1CBase\BankRBC" ; каталог куда будет загружаеться файл с сервера РБК
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), "[^\r\n]+", 3)
If @error Then Return SetError(1)
$aOut[0] = UBound($aOut) - 1
Return $aOut
EndFunc
IV Созданый скрипт помещаем в Планировщик заданий, для автоматизации обновлений по расписанию (с нужной нам периодичностью).
Теперь у нас есть каталог, в который по расписанию загружается свежая информация по классификатору банков (с нужной нам периодичностью). И внешняя обработка при помощи которой можно загрузить классификатор в конкретную базу. В приложеном архиве находятся: скрипт (полный исходный и скомпилированный для 64 разрядной Windows), скорректированная внешняя обработка.
PS: На Infostart есть статьи на подобную тему, но те, которые просмотрел не имели описания и только ссылку на загрузку обработки – просто так, чтобы посмотреть решение, качать обработки не было желания.