Дистанционный курс по 1С для системного администратора.

В конце прошлого 2015 года на ©Курсы-по-1С.рф  стартовал новый курс “Администрирование 1C: развертывание, автоматизация, управление пользователями и поддержка систем на 1С:Предприятие 8″  . С полной программой курса можно ознакомиться по вышеприведенным ссылкам. От себя же хочу добавить, что информация по курсу имеет большое прикладное значение.  Рассмотрены многие вопросы с которыми встречается администратор или программист при внедрении, развертывании и обновлении конфигураций на платформе 1С. Кроме того рассмотрены вопросы использования WEB доступа, Linux-систем и PostgreSQL. Сам курс состоит из видео-лекций и домашних заданий (более 30шт.). При выполнении учебной программы  и обязательных домашних заданий выдается соответствующий сертификат о прохождении курса. В общем курсом доволен – время потрачено не зря: освежил старые знания и получил новые.

Опубликовано в рубриках: 1С-MIX, Для СисАдМина, Новости | Оставить комментарий

Защищаем ASTERISK

Случайно в интернете наткнулся на запись бесплатного вебинара: “Безопасная IP телефония Asterisk закрытие уязвимостей” – по безопасности VoIP (http://www.youtube.com/watch?v=5RScapkojhI — Запись от 21.04.2013. Ведущий — Сергей Грушко, компания “Вокс Линк”. Презентация на SlideShare: http://www.slideshare.net/SkillFactory/asterisk-security). Информация показалась заслуживающей внимания, особенно применительно Asterisk (FreePBX).

Опубликовано в рубриках: VoIP, Для СисАдМина, Новости | Оставить комментарий

Пример использования 1С-Automation и скриптов AutoIT

В данной статье приводится пример использования скрипта AutoIT в качестве клиента для 1С-Automation сервера.

Что бы показать возможности такого решения, в приведенном примере, выполняются смешанные операции: соединение с 1С-Automation сервером, вызов процедур глобального контекста (в том числе из общего пользовательского модуля), запуск 1С-предприятия в командной строке (выгрузка БД в режиме конфигуратора).

Функциональность примера понятна из текста программы:  мы производим выгрузку  файловой базы данных (запуская 1С в пакетном режиме через RunWhite / RunAsWhite ), при этом, заносим информацию об этом событии в журнал регистрации  БД и, через функцию общего модуля, дополнительную информации помещаем в независимый регистр сведений.

Код скрипта приведен ниже:

#RequireAdmin
#Region ;**** Directives created by AutoIt3Wrapper_GUI ****
#AutoIt3Wrapper_Compile_Both=y
#AutoIt3Wrapper_UseX64=y
#AutoIt3Wrapper_Res_Comment=Пример использования AutoIT
#AutoIt3Wrapper_Res_Description=Пример использования AutoIT
#AutoIt3Wrapper_Res_Fileversion=1.1.2
#AutoIt3Wrapper_Run_Obfuscator=y
#EndRegion ;**** Directives created by AutoIt3Wrapper_GUI ****

;--------------------------------------------------------------------------------------
;  Пример использования 1С Automation Server
;--------------------------------------------------------------------------------------
; Используем 1С как Automation сервер. Присоединяемся к файловой БД. Блокируем сеансы.
; Выгружаем БД через запуск приложения в командной строке. Пишем лог в журнал БД.
; Для запуска скрипта с правами Администратора, нужно использовать RunAsWait().
; Так как код можно скомпилировать в исполняемое приложение (используя обфускатор),
; то явно имени и пароля видно не будет (защита от дураков).
;--------------------------------------------------------------------------------------
;   Последние изменения:   26.06.2012
;   Автор -- LexSeIch www.LexSeIch.ru

;--------------------------------------------------------------------------------------

#include
;--------------------------------------------------------------------------------------
;                       Задаем параметры скрипта
;--------------------------------------------------------------------------------------

$sDBaseFile = "C:\TST\1C"         ; Место расположения БД
$sDBaseUser = "User"              ; Имя пользователя БД
$sDBasePass = "userpass"          ; Пароль пользователя БД
$sKeyCode   = "123"               ; Код блокировки ( /UC )
$sArchFile  = "C:\TST\1C\Base.DT" ; Архивный файл для выгрузки
$sAdminUser = "Администратор"     ; Пользователь администратор
$sAdminPass = "passadmin"         ; Пароль пользователя администратора
$sDomen     = "MyDomen"           ; Домен

;--------------------------------------------------------------------------------------
;   Создаем объект V82.Application
;--------------------------------------------------------------------------------------
$o1CObject = ObjCreate("V82.Application")  ; Создаем 1С объект
if @error then
  Msgbox (0,"1С Application","Ошибка создания V82.Application. Код ошибки: " & @error)
  exit
endif
;--------------------------------------------------------------------------------------

;--------------------------------------------------------------------------------------
;   Устанавливаем соединение с БД
;--------------------------------------------------------------------------------------
$o1CObject.Connect("File="& $sDBaseFile &";Usr="& $sDBaseUser &";Pwd="& $sDBasePass ) ; коннектимся к базе

if @error then
  Msgbox (0,"Соединение с 1С базой","Ошибка соединения. Код ошибки: " & @error, 5)
  exit
else
  $o1CObject.Visible = False    ; интерфейс не нужен - скрываем его
endif
;--------------------------------------------------------------------------------------

;--------------------------------------------------------------------------------------
;  Формируем статистику для записи в журнал
;--------------------------------------------------------------------------------------
$tCurTime = _Date_Time_GetSystemTime()   ; текущее системное время
$sUserObj = $o1CObject.UserName          ; Пользователь БД
$sUserSys = @UserName                    ; Пользователь системы
$sCompObj = $o1CObject.ComputerName      ; Компьютер БД
$sCompSys = @ComputerName                ; Компютер системы

$sBase = $o1CObject.InfoBaseConnectionString   ; Путь к БД
;--------------------------------------------------------------------------------------

;--------------------------------------------------------------------------------------
;  Устанавливаем блокировку сеансов
;--------------------------------------------------------------------------------------

$oSessionLock = $o1CObject.GetSessionsLock()     ; получаем блокировку сеансов
If Not $oSessionLock.Use Then                    ; блокировки еще нет
  $oSessionLock.Message = "Техническое обслуживание БД" & @CRLF & $sBase
  $oSessionLock.KeyCode = $sKeyCode              ; Код для /UC
  $oSessionLock.Use = True                       ; ставим флаг блокировки сеансов
  $o1CObject.SetSessionsLock($oSessionLock)      ; блокируем сессии...
  ;Msgbox (0,"Блокировка","Установили блокировку: " & $oSessionLock.KeyCode, 5); --
Else
  Msgbox (0,"Блокировка","Блокировка уже установлена.", 5)
  exit
EndIf

;--------------------------------------------------------------------------------------
; Выгружаем базу
;--------------------------------------------------------------------------------------

;----------------------- Для запуска с правами администратора --------------------------
; Необходимо задать дополнительные параметры: пользователь, домен, пароль
; $pid = RunAsWait($sAdminUser, $sDomen, $sAdminPasw, 0,"C:\Program Files\1cv82\common\1cestart.exe DESIGNER /F" & $sDBaseFile & "/DumpIB" & $sArchFile)
;---------------------------------------------------------------------------------------

$sCommandLine = "C:\Program Files\1cv82\common\1cestart.exe DESIGNER /F " & $sDBaseFile & " /DumpIB " & $sArchFile & " /N "& $sDBaseUser  &" /P " & $sDBasePass
;$sCommandLine = "C:\Program Files\1cv82\common\1cestart.exe DESIGNER /F C:\TST\1C /N User /P userpass"

$pid = RunWait($sCommandLine);
If @error Then
  Msgbox (0,"Выгрузка базы","Ошибка выгрузки. Код ошибки: " & @error, 5)
Else
  ProcessWaitClose($pid)
EndIf

;--------------------------------------------------------------------------------------
;  Регистрируем событие выгрузки БД в журнале
;--------------------------------------------------------------------------------------
$o1CObject.WriteLogEvent("Выгрузка БД пользователем: " & $sUserSys)
$o1CObject.MyFunction.SetLog( @UserName, $sCompSys )          ; вызываем функцию SetLog из общего модуля MyFunction

;--------------------------------------------------------------------------------------
; Снимаем блокировку
;--------------------------------------------------------------------------------------
$oSessionLock = $o1CObject.GetSessionsLock()    ; получаем блокировку сеансов
If  $oSessionLock.Use Then                      ; блокировка установлена
  $oSessionLock.Message = "Сняли блокировку"
  $oSessionLock.Use = False                     ; ставим флаг снятия блокировки сеансов
  $o1CObject.SetSessionsLock($oSessionLock)     ; разблокируем сессии...
  ;Msgbox (0,"Блокировка","Сняли блокировку: ", 5); --
EndIf

;--------------------------------------------------------------------------------------
;  Окончание работы
;--------------------------------------------------------------------------------------

$o1CObject=""            ; Освобождаем память
exit

В конфигурации 1С определен общий не глобальный модуль MyFunction, через который вызывается функция записи лога в журнал:

//————————————————————————————–
// Экспортная процедура общего не глобального модуля MyFunction
//————————————————————————————–

Процедура  SetLog( User, Comp )  Экспорт
// фиксируем пользователя и компьютер в нашем журнале
РегистрыСведений.ЖурналВыгрузки.ДобавитьНовыйЛог(User, Comp);
КонецПроцедуры

Кроме того, запись идет во внутренний «ЖурналВыгрузки» на базе непериодического независимого регистра сведений:

//——————————————————————————————
// Непериодический независимый регистр сведений “ЖурналВыгрузки”.
// Измерения:
//         Номер (Число)
// Ресурсы:
//          Пользователь (Строка)
//          Компьютер (Строка)
// Процедуры модуля менеджера:

//—————————————————————————————–

Процедура ДобавитьНовыйЛог(Пользователь, Компьютер)  Экспорт
НоваяЗапись =  РегистрыСведений.ЖурналВыгрузки.СоздатьМенеджерЗаписи();
НоваяЗапись.Пользователь = Пользователь;
НоваяЗапись.Компьютер = Компьютер;
НоваяЗапись.Номер = ПолучитьНовыйНомер();
НоваяЗапись.Записать();
КонецПроцедуры

Функция ПолучитьНовыйНомер()
Запрос = Новый Запрос;
Запрос.Текст =
“ВЫБРАТЬ ПЕРВЫЕ 1
|           МАКСИМУМ(ЖурналВыгрузки.Номер) + 1 КАК Номер
|ИЗ
|           РегистрСведений.ЖурналВыгрузки КАК ЖурналВыгрузки”;

Результат = Запрос.Выполнить();
ВыборкаДетальныеЗаписи = Результат.Выбрать();
Если  НЕ ВыборкаДетальныеЗаписи.Следующий() Тогда
Возврат 1;
Иначе
Возврат ВыборкаДетальныеЗаписи.Номер;
КонецЕсли;

КонецФункции //

Сама процедура скрипта может быть скомпилирована в отдельный исполняемый модуль. В этом случае при использовании обфуркации мы, в некотором смысле защищаем информацию, так как в явном виде не просматривается имя пользователяя и его пароль (защита от дураков). Дополнительно, средствами AutoIT можно ограничить запуск скомпилированной процедуры например только с определенного места, или, например при наличии ключа-флешки.

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

Опубликовано в рубриках: Новости | Оставить комментарий

«Тайм-менеджер по помидорам» – эффективная организация рабочего времени.

Опубликована на http://infostart.ru/public/237919/

Приходилось ли вам, взглянув на часы, с ужасом видеть, что день подходит к концу, а работы еще невпроворот. «Тайм-менеджер по помидорам» – простая система концентрации, помогающая эффективно организовать свой рабочий день.

Многие из нас на работе сталкиваются с такими вещами как:

- Воодушевление падает с ростом сложности задач;

- Склонность к прокрастинации (откладывание на потом)  нарастает, если задачи скучны;

- Сделано много тяжелой работы, но значимые дела все еще не завершены;

- С приближением срока сдачи работы нарастает напряженность;

- Ваше мышление медленно переключается между работой и отдыхом;

- Ошибки повторяются снова и снова;

- Усилия, которых требует задача, оказываются недооцененными;

- Недооценивается масштаб задачи;

- Ваш мозг занят сутолокой других мыслей;

- Ваше время съедается сложной и капризной методологией организации работы;

- В потоке вы забываете о целостной картине;

- Оценки воспринимаются как обещания;

- Рабочий ресурс не опирается на факты;

- Другие сваливают на вас работу;

- Перфекционизм превращается в препятствие;

- Вам мешает действовать страх неудачи или критики;

Часто это мешает эффективно использовать рабочее время, приходиться работать дома, в выходные, в праздники…

Существует множество методик организации рабочего времени (тайм-менеджмент) они достаточно эффективны и реально помогают.  «Тайм-менеджмент по помидору»  -  это простой способ, помогающий сконцентрироваться на задаче.

Своим интересным названием (Pomodoro technique) метод обязан автору: Франческо Черилло ( http://www.pomodorotechnique.com/download/pdf/ThePomodoroTechnique_v1-3.pdf ), который, в качестве устройства обратного отсчета времени, использовал кухонный таймер в виде красного помидора. Помидором в нем так же называется атомарный (минимальный и неделимый) отрезок времени, используемый для оценки длительности выполнения задач. Но все по порядку:

Суть метода очень простая. Выберите самое приоритетное дело из списка дел на день, поставьте таймер на 25 минут (это длительность одного помидора) и сосредоточьтесь на этом деле – и только на нем. После окончания очередного помидора обязательно делается перерыв на 5 минут. После 4 помидоров делается большой перерыв на 15-30 минут. После перерыва можно решить, продолжать выполнение того же самого дела или переключиться на другое. Переключение происходит при изменении приоритетов или тогда, когда дело завершено. Важно: помидор неделим. Если задача требует для выполнения менее одного помидора – ее надо сгруппировать с другими подобными задачами. Если же задача, по вашим оценкам занимает более 5-7 помидоров, ее надо разбить на подзадачи.

Несколько подробнее об этапах применения метода:

  1. Планирование. В начале дня вы просматриваете свой реестр дел (http://www.pomodorotechnique.com/download/pdf/Pomodoro-Inventory.pdf) и выбираете (по приоритетам) важные дела, которые нужно выполнить. Эти дела вы заносите в список дел на день (http://www.pomodorotechnique.com/download/pdf/Pomodoro-To-Do-Today.pdf ). Возле каждой задачи вы выставляете квадратики – по числу помидоров вашей оценки длительности работы. Важно понимать разницу между реестром дел (традиционный список дел куда можно добавлять новые задачи) и списком дел на сегодня – вашим соглашение с самим собой на текущий день имеющее четкие временные рамки (достижимая цель).
  2. Мониторинг. После формирования плана на сегодня, вы выбираете первое дело, заводите таймер на 25 минут и приступаете к его выполнению. В ходе работы, вы фиксируете метрики процесса, например помехи: прерывания, отвлечения.
  3. Запись. В конце дня вы заносите результаты своих наблюдений в протокол.
  4. Обработка. После записи, вы обрабатываете данные. Например, определяете сколько раз в среднем, вас прерывали.
  5.  Визуализация. Полученную информацию вы упорядочиваете, что бы это помогло вам увидеть, как можно улучшить свой рабочий процесс.

Более подробно о методе можно узнать из книги:  Штаффан Нётеберг «Тайм-менеджмент по помидору. Как концентрироваться на одном деле хотя бы 25 минут». В ней описаны многие нюансы, возникающие в процессе работы: отвлечение от задания, прерывание работы, неверная оценка задачи. Кроме того книга не скучная и с картинками (mind-map картами).

Конечно, в современный век IT технологий, не все будут использовать кухонный таймер (он своим тиканьем может раздражать окружающих) и листки бумаги. Для таких людей есть программное обеспечение. Обзор таймеров-программ можно посмотреть здесь: http://personaleffect.ru/the-pomodoro-technique-obzor-instrumentov/. Лично я в качестве таймера обратного отсчета использую простую портабельную программу (http://portableapps.com/apps/utilities/snaptimer-portable).

Может быть, вы сами уже пользуетесь такой методикой организации своей работы, но не в столь формализованном виде. Может она вам и не подходит – так как вы не любите помидоры (хотя время можно мерить и в попугаях или бананах). Некоторые используют ее даже в корпоративном виде: ( http://500k.livejournal.com/77149.html).

Ссылки по теме: блог по личной эффективности: http://personaleffect.ru/the-pomodoro-technique/

PS: Наверно, интересно, когда время на фирме измеряется в помидорах:

- У меня  на задачу еще 2 помидора осталось…

- Помидор закончу и перезвоню…

- Три помидора сегодня «протухли» …

- У меня нет ни одного свободного помидора…

- Подожди, еще пол помидора осталось…

Кстати, какова цена 2-х средних помидоров у франчайзи в Вашем регионе?

Опубликовано в рубриках: Новости, Проверено практикой, Управление проектами | Оставить комментарий

Принудительная очистка Standby – оперативной памяти по расписанию посредством утилиты RamMem и скрипта Autoit.

Опубликована на http://infostart.ru/public/237919/

Для большинства пользователей операционная система – это «черный ящик», и что происходит внутри него – это таинство. Но иногда хочется «пнуть» этот ящик, что бы он работал так, как надо… Конечно, принудительная очистка standby памяти напоминает “танец с бубном” (вроде система должна делать это сама), но в некоторых случаях она помогает…

«Памяти мало не бывает» -  Народное правило апгрейда компьютера.

Внимание!!! Все описанное ниже относится к Windows Vista и выше…

Каждый, кто хоть раз заглядывал (кто из любопытства, кто по долгу службы)  в «Монитор ресурсов» на закладку «Память» видел подобную картинку:

Рис 1.

Причем, через некоторое время, она существенно меняется (в зависимости от используемого ПО и настройки системы):

Рис. 2

Мы видим, что память из списка «Ожидание» (Standby) – растет, свободная память – уменьшается…

В данном случае свободной памяти почти не осталось:

Рис. 3

А в Standby памяти находятся большие файлы архивов вечернего бэкапа:

Рис. 4

И самое главное, есть 100% уверенность, что нахождение их в Standby памяти не целесообразно – бэкап уже закончился.

Теоретически, Standby память содержит кэшированные данные, которые возможно, когда-нибудь будут использоваться в дальнейшем… При этом, когда системе потребуется дополнительные ресурсы, системный менеджер памяти может освободить из списка Standby необходимую память.

На практике, иногда случаются ситуации, подобные этой :

 «В тестовом режиме гоняем сервер (8x2CPU AMD 64G RAM) баз данных на MS W2008R2 KR c MSSQL 2008. Под SQL выделено 50 G. Почти месяц машина отработала нормально, но последнии несколько дней вся свободная память из free перешла в Standby и производительность снизилась … причем система говорит что используется всего 52-53 G. После рестарта система съедает полженные 52-53 Gи начинает привращение Free to Standby. По завершению сего процесса снова начинаются “дикие тормаза”. 

p.s. сервер mssql+1cv81 4 базы: 2 торговли не типовых 65G каждая, 1 ЗУП 1,5G 1 бухгалтерия 14G  Подскажите как standby превратить в free «

Конечно не факт, что «тормоза» в данном конкретном случае возникли только по этой причине, но как говорят: «осадок остался».

Я так же замечал, что при работе некоторых приложений (особенно написанных для предыдущих ОС) количество свободной памяти иногда резко уменьшается и субъективно, система начинает «подтормаживать» а некоторые приложения, например 1С 7.7 Предприятие даже «вываливались» без всяких сообщений.  Чаще всего в подобных случаях спасает перезагрузка системы.

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

Есть прекрасная утилита фирмы Sysinternals (www.sysinternals.com) RamMap. Одна из опций данной программы, как раз, и отвечает за очистку Standby памяти.

Рис. 5

Результат выполнения очистки (красым отмечена свободная память):

Рис. 6

И в мониторе ресурсов свободной памяти значительно прибавилось:

Рис. 7

Эта утилита, написанная легендарным Марком Руссиновичем в соавторстве с Дэвидом Саломоном, она прекрасно справляется с данной задачей. Ее авторы – признанные специалисты по Windows-системам (это к корректности реализации). К слову, весь пакет программ – это «швейцарский нож» для каждого системного администратора.

Единственный недостаток, то, что выбор и запуск данной опции в программе происходит в интерактивном режиме. Автоматизировать нажатия кнопок и выбор меню нам поможет простой скрипт на AutoIT:

;-----------------------------------------------------------------

#RequireAdmin
#Region ;**** Directives created by AutoIt3Wrapper_GUI ****
#AutoIt3Wrapper_UseX64=y
#AutoIt3Wrapper_Res_Language=1049
#AutoIt3Wrapper_Res_requestedExecutionLevel=asInvoker
#EndRegion ;**** Directives created by AutoIt3Wrapper_GUI ****

;-----------------------------------------------------------------
;           SAM -- 20/11/2013
;-----------------------------------------------------------------

;  RunRamMap -- оболочка для запуска утилиты Sysinternals RamMap
;  - после запуска программы выполняется очистка Standby памяти
;  - после 10-15 секунд работы программа закрывается...
;
;  <strong>Оригинальная утилита должна находиться в каталоге: C:\UTIL\RAMMap\RAMMap.exe</strong>

;-----------------------------------------------------------------
; RamMap -- работает только для Windows Vista и выше ...
;-----------------------------------------------------------------

Local $hWnd                         ; идентификатор окна программы
Local $ret                               ; идентификатор программы

; Если программа еще не запущена - запускаем RamMAP
If Not WinExists("[CLASS:RamMapClass]") Then

$ret = ShellExecute('<strong>C:\UTIL\RAMMap\RAMMap.exe</strong>')

If @error Then
   MsgBox(4096, 'Сообщение', 'Ошибка запуска RamMap.exe.', 30)
   Exit 1
EndIf

EndIf

; Ожидаем появление окна программы RamMap

$hWnd = WinWait("[CLASS:RamMapClass]", "", 10)

If Not $hWnd Then

MsgBox(4096, 'Сообщение', 'Окно RamMap не найдено, завершаем работу')

Exit 2

Else

WinActivate("[CLASS:RamMapClass]", "")            ; наше окно - активное

EndIf

; Выбираем пункт "Empty Standby List" в меню "Empty" программы

WinMenuSelectItem($hWnd, '', '&Empty', 'Empty S&tandby List')

; ждем выполнение очистки 5 сек... (ориентировочно...)

Sleep(5000)

; обновляем экран

Send("{F5}")

; Ждем 5 секунд, чтобы увидеть результат и выйти...

Sleep(5000)

; Закрываем программу.

WinClose($hWnd)

;-----------------------------------------------------------------

Cкрипт компилируем в исполняемый файл. После чего, в Планировщике заданий можно создать системное задание по расписанию, которое, например, перед началом рабочего дня, очищает память, тем самым освобождая так необходимые пользователю ресурсы.

Еще раз повторюсь – эта утилита (RamMap) работает на Windows Vista и выше…

В архивном файле находится исходный текст скрипта и скомпилированные модули для запуска в 32 и 64 разрядных системах. Свежую версию утилиты RamMap лучше загрузить с сайта автора: http://live.sysinternals.com/rammap.exe

PS: Для тех, кто  любит разбираться в деталях – ссылка на статью по организации управления памяти в Windows: Here be dragons: Управление памятью в Windows как оно есть

Мир Вашему дому!

Опубликовано в рубриках: 1С-MIX, Новости, Проверено практикой | Оставить комментарий

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

Опубликована на http://infostart.ru/public/238741/

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

Идея простая и состоит в следующем: вместо загрузки банков с сайта РБК – загружаем их из заданного каталога (общего ресурса). В сам каталог файлы с РБК загружаем или вручную или, как в данном примере, программой на 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:\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, '*.*')
 <span style="color: #222222; font-family: 'Courier 10 Pitch', Courier, monospace; line-height: 21px;">For $i = 1 To UBound($aReturn) - 1</span>
 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)

 EndFunc

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

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

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

Опубликовано в рубриках: 1С-MIX, Новости, Проверено практикой | Оставить комментарий

Приятная новость!

Коллеги, Евгений Гилев и Насипов Фарит проводят новый тренинг по разработке на мобильной платформе 1С. Являясь большим поклонником этой команды, рекомендую присоединиться… Тем более, что курс бесплатный!  

Кому интересно – подробности здесь: http://kursy-po-1c.ru/mobile-apps

Опубликовано в рубриках: 1С-MIX | Оставить комментарий

Запуск скрипта по дате файла

Иногда возникает задача – запустить скрипт, когда какой то файл “состариться” до определенной даты: например нужно загружать определенный файл с ftp сервера раз в неделю. Помочь в этом может скрипт на VB (код очень простой):


Option Explicit

Dim strFolder
Dim strFile
Dim strScript
Dim objFSO

strFolder = "C:\doci\test\"
strFile = "file.ext"
strScript = "x:\internet.vbs"

Set objFSO = CreateObject("Scripting.FileSystemObject")

If DateDiff("d", objFSO.GetFile(strFolder & strFile).DateCreated, Date) > 9 Then _CreateObject("WScript.Shell").Run strScript

Оригинал кода взят с : http://forum.oszone.net/thread-212297.html

Опубликовано в рубриках: AutoIT, Для СисАдМина | 1 комментарий

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

Иногда возникает потребность удалить файлы с определенным расширением, имеющие дату создания старше, чем заданная. Например файлы архивов видео-наблюдения. Данный скрипт позволяет удалять файлы системы Горизонт (с расширениями: .hdh .hdi .hvf ). Удаляются файлы с датой ранее указанной из заданного каталога и всех его подкаталогов.

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


; Скрипт очистки видео-архива Лавина -- Маслов С.А. (SAM ) 11/04/2013 -- 03/06/2013
; В выбранном каталоге (и всех его подкаталогах) удаляются видео-файлы и служебные ( hdh | hdi | hvf ), с давностью (дата файла) более месяца (30 дней)
; или иной, установленной в интерфейсе.

; Используемые алгоритмы-прототипы:
; http://autoit-script.ru/index.php/topic,771.0.html
; http://autoit-script.ru/index.php?PHPSESSID=kvot8dgsnfuuflhjemvlkvta02&topic=689.0
#include <File.au3>
#include <Date.au3>
#include <Array.au3>
#include <GUIConstantsEx.au3>
#include <String.au3>
#include <AVIConstants.au3>

_Main()

Func _Main()

Local $WinMain, $ctrlDateNum, $InputCatalog, $SelectCatalog, $ctrlInputData, $ctrlUpDownLevel
 Local $ExecuteButton, $ExitButton, $string
 Local $nDayNum, $nDayOpt, $SetDateValue
 Local $sNewDate
 Local $DTM_SETFORMAT_, $style, $anime

#forceref $ctrlUpDownLevel

$nDayOpt = 30 ; По умолчанию оставляем файлы за последний месяц (30 дней) от текущей даты
 $filter = 'hdh|hdi|hvf' ; допустимые расширения разделяются символом "|"
 $src = @ScriptDir ; по умолчанию, первоначально выбирается каталог, где лежит скрипт
 $WinMain = GUICreate('Очистка архива Горизонт', 480, 200) ; Главное окно

; Выбор каталога
 $InputCatalog = GUICtrlCreateInput('', 130, 30, 300, 20)
 GUICtrlSetData($InputCatalog, $src )

$SelectCatalog = GUICtrlCreateButton('v', 430, 30, 15, 20)

; Выбор даты
 $ctrlInputData = GUICtrlCreateDate("", 170, 60, 140, 20)
 $DTM_SETFORMAT_ = 0x1032 ; определяем формат $DTM_SETFORMATW
 $style = "yyyy/MM/dd HH:mm:ss"
 GUICtrlSendMsg($ctrlInputData, $DTM_SETFORMAT_, 0, $style)

$sNewDate = _DateAdd('d', -$nDayOpt, _NowCalcDate()) ; вычисляем дату - границу чистки каталога
 GUICtrlSetData($ctrlInputData, $sNewDate )

; Выбор числа дней
 $ctrlDateNum = GUICtrlCreateInput(30, 330, 60, 50, 20, 0x2001)
 $ctrlUpDownLevel = GUICtrlSetLimit(GUICtrlCreateUpdown($ctrlDateNum), 365, 1)
 GUICtrlSetData($ctrlDateNum, $nDayOpt )

; Кнопки
 $ExecuteButton = GUICtrlCreateButton('Выполнить', 120, 150, 105, 35)
 $ExitButton = GUICtrlCreateButton('Выйти', 230, 150, 105, 35)

; Текст
 GUICtrlCreateLabel('Каталог для очистки', 10, 30)
 GUICtrlCreateLabel('Сохранить данные начиная с:', 10, 65)
 GUICtrlCreateLabel('за', 310, 65)
 GUICtrlCreateLabel('дней', 385, 65)

; анимация
 $anime = GUICtrlCreateAvi(@SystemDir & "\shell32.dll", 165, 160, 80)
 GUICtrlSetState($anime, $GUI_HIDE)

GUISetState() ;

While 1
 Switch GUIGetMsg()
 Case $GUI_EVENT_CLOSE
 ExitLoop

Case $ctrlDateNum ; сменили число дней
 ; вычисляем дату для календаря
 $nDayNum = GUICtrlRead($ctrlDateNum)
 IF $nDayNum <> 0 Then
 $sNewDate = _DateAdd('d', -$nDayNum, _NowCalcDate()) ; вычисляем дату - границу чистки каталога
 GUICtrlSetData($ctrlInputData, $sNewDate )
 EndIf

Case $SelectCatalog ; выбор каталога

$src = GUICtrlRead($InputCatalog)
 $src = FileSelectFolder('Пожалуйста, выберите каталог для очистки', '', 1 + 2 + 4, $src)

If NOT @error Then
 GUICtrlSetData($InputCatalog, $src) ; новый каталог
 EndIf

Case $ctrlInputData ; сменили дату на календаре

; вычисляем новое количество дней периода сохранения через выбранную дату
 $sNewDate = GUICtrlRead($ctrlInputData)
 $nDayNum = _DateDiff('d', $sNewDate, _NowCalc())

If $nDayNum >= 0 Then ; дата не должна быть в будущем периоде - число дней положительно
 GUICtrlSetData($ctrlDateNum, $nDayNum )
 Else ; дата не должна быть в будущем периоде иначе устанавливаем границу чистки каталога по умолчанию
 $nDayNum = 30
 $sNewDate = _DateAdd('d', -$nDayNum, _NowCalcDate())
 GUICtrlSetData($ctrlInputData, $sNewDate )
 GUICtrlSetData($ctrlDateNum, $nDayNum )
 EndIf

Case $ExecuteButton ; Выполняем рекурсивную процедуру зачистки

GUICtrlSetState($anime, $GUI_SHOW)
 GUICtrlSetState($anime, $GUI_AVISTART)
 GUISetState(@SW_DISABLE, $WinMain) ; замораживаем окно

;If @error Then Exit
 _Delete($src, $filter, $nDayNum )
 ;Sleep(20000)

GUISetState(@SW_ENABLE, $WinMain) ; размораживаем окно
 GUICtrlSetState($anime, $GUI_HIDE)
 GUICtrlSetState($anime, $GUI_AVICLOSE)

Case $ExitButton ; Выходим
 ExitLoop

EndSwitch
 WEnd
EndFunc ;==>_Main

&nbsp;
;---------------------------------------- рекурсивная обработка удаления --------------------------------------------
;;;
;;; Рекурсивная функция удаления файлов c заданым расширением и старше N дней от текущей даты
;;;

Func _Delete($source, $filter = 'hdh|hdi|hvf', $nData = 30)

$aFolders = _FileListToArray($source, '*', 2) ; массив папок
 $aFiles = _FileListToArray($source, '*', 1) ; массив файлов

If Not IsArray($aFolders) AND Not IsArray($aFiles) Then Return ''; Папки и файлы не найдены
 ;
 ; цикл по файлам текущей папки...
 ;
 If IsArray($aFiles) Then
 For $j = 1 to $aFiles[0]
 $ext = _ExtDefine($aFiles[$j])
 $aTime = FileGetTime($source & '\' & $aFiles[$j])
 ; если расширения файла совпадает и даты попадают в заданный диапазон дней
 If ( _DateDiff('d', $aTime[0] & '/' & $aTime[1] & '/' & $aTime[2], _NowCalc()) > $nData ) AND StringInStr($filter, $ext) Then FileDelete($source & '\' & $aFiles[$j])
 Next
 EndIf
 ;
 ; рекурсия по подкаталогам...
 ;
 If IsArray($aFolders) Then
 For $i = 1 to $aFolders[0]
 $new_source = $source & '\' & $aFolders[$i] ; выбираем очередной подкаталог из массива
 _Delete($new_source, $filter,$nData) ; и выполняем рекурсивный вызов для подкаталогов
 Next
 EndIf
EndFunc

;;; Функция определяющая расширение файла
Func _ExtDefine($file)
 If StringInStr($file, '\') Then
 $aFile = StringSplit($file, '\')
 $file = $aFile[$aFile[0]]
 EndIf
 If Not StringInStr($file, '.') Then Return ''
 $aFile = StringSplit($file, '.')
 Return $aFile[$aFile[0]]
EndFunc
Опубликовано в рубриках: AutoIT | Метки записи: | Оставить комментарий

Новый год – новым курсом по УТ11

Вот уже походит к концу курс “1С:Управление торговлей 11-Быстрый старт” (http://xn—-1-bedvffifm4g.xn--p1ai/ut11-fast-start/).

В то время, когда вся страна праздновала Новый год (и наступление Старого Нового года), мы учились. Время не было потрачено зря (ИМХО). Что понравилось.

Прежде всего, очень порадовало возвращение  к практике вебинаров. Я так думаю, и со мной многие согласятся, особенно те, кто работает в одиночку, что такое общение очень полезно. Быстрый вопрос –  быстрый ответ. Кроме того, в чате иногда получаешь важную информацию, о которой ранее не задумывался.

Появилось пособие в электронном виде ( PDF – файл ). Это то, чего не хватало на некоторых предыдущих курсах – почитать в дороге или в электронной книге, а позже использовать как справочник.

По курсу: самым важным, по моему мнению, является то, что мы получили много информации по УТ на новой платформе: расчет себестоимости, нюансы работы, плюсы и минусы тех или иных механизмов и все это на примерах. Каждый имел возможность решив примеры, и сравнив их с эталонными решениями, определить где лежат возможные «грабли» и что можно от них ожидать.

Сейчас многие находятся в состоянии «Буриданова осла», находящегося на равном расстоянии между двумя охапками сена (УТ10.3 и УТ11), а после курсов многие начали поглядывать в сторону УТ11. Это проявилось на записях чата вебинара.

При принятии решений самое важное, иметь как можно больше информации. На курсе информации было много для начального старта, уверен, что в последующем курсе ее будет больше, она будет раскрыта подробней, и в нем уже будут отражены пожелания “курсантов” первого потока.

Лично для себя, в очередной раз убедился, что курсы команды Фарита Насипова и Евгения Гилева – качественный и интересный продукт. С нетерпением жду новых проектов.

 

 

Опубликовано в рубриках: 1С-MIX, Новости, Проверено практикой | Оставить комментарий