- МЕНЮ
 - В избранное
Самые важные новости
 
Царьков Валерий
"1С:Предприятие 7.7": добавим немного сервиса

Кто где?
Регламентные работы
Долгоиграющие отчеты
Как прервать обработку, запущенную монопольно
Скрипты для подключеия и отключения пользователей

        Кто где?

        Представьте себе крупную организацию, в которой работа приложений организована на терминалах. Причем их несколько и между ними налажена балансировка (т.е. каждый новый пользователь автоматически попадает на менее загруженный). Вот одному из пользователей потребовалось вмешательство администратора. "Да Без проблем" - скажете Вы: "цепляемся прямо к его сессии"... Ага, кабы знать на каком терминале его искать.
Вот простенькое решение проблемы. В процедуру ПриНачалеРаботыСистемы() вставим скрипт

Скрипт = CreateObject("WScript.Network");
ЗаголовокСистемы(
" user " + Скрипт.UserName + " on " + Скрипт.ComputerName);

Теперь в заголовке окна отобразится имя пользователя и терминал.

наверх

        Регламентные работы.

        Ни для кого не секрет, что частенько возникает необходимость выполнять некий набор действий по расписанию или по определенному событию. Например: создание архивной копии, автообмен с удаленными ИБ, выполнение процедур при изменении релиза конфигурации и т.п.
У "Конфигуратора" есть специальный пакетный режим. Работать с ним довольно просто. Пишем пакетный файл (например, при помощи
этой обработки), настраиваем планировщик на выполнение в определенное время и все!
А что делать, если необходимо запускать определенную процедуру в режиме "Предприятия"? Обычно для такого дела создают специального пользователя и ПриНачалеРаботыСистемы() проверяют: если текущий пользователь "служебный", тогда запускием обработку.
"Но позвольте" - скажете Вы. Так ведь для каждого конкретного случая нужно заново перписывать обработку. А если используется УРБД, то изменения в конфигурацию можно вносить только в центральной ИБ, а на периферию она отгружается автоматически. Да мало ли какие еще сложности могут возникнуть.
Предлагается воспользоваться директивой #ЗагрузитьИзФайла. В этом случае конфигурацию менять не требуется. Создаем обработку и выносим ее модуль в текстовый файл. И уже в этом самом модуле мы можем проверить необходимые условия и осуществить запуск каких-либо отчетов и обработок. Вот небольшой примерчик:

Процедура ПриОткрытии()
Если ИмяПользователя="Автомат" тогда
Список=СоздатьОбъект("СписокЗначений");
Список.ДобавитьЗначение(НачалоПериодаБИ(),"ДатаНач");
Список.ДобавитьЗначение(КонецПериодаБИ(),"ДатаКон");
Список.ДобавитьЗначение(СчетПоКоду("10"),"Счет");
Список.ДобавитьЗначение("C:\Work\Сч10.mxl","ЗаписатьВ");
ОткрытьФормуМодально("Отчет.ОборотноСальдоваяВедомостоПоСчету",Список);
ЗавершитьРаботуСистемы(0);
КонецЕсли;
КонецПроцедуры

наверх

        Долгоиграющие отчеты.

        Еще одна сложность при больших объемах баз данных - долгоиграющие отчеты. Если таковой запустить с утра - это вызовет заметное уменьшение скорости работы системы. У остальных пользователей восторга это не вызовет. А если запустить его вечером, когда остальные пользователи заканчивают работу, то кто будет ожидать окончания формирования отчета?
На этот случай в отчете готовую сформированную таблицу нужно сразу сохранить в файл.
Т.е., вместо конструкции:
Таб.Показать();
используем
Таб.Записать("ИмяФайлаОтчета");
ЗавершитьРаботуСистемы(0);
Теперь отчет сформируется, запишется и программа закроется, освободив базу (например, для резервного копирования). Для того, чтобы программа "понимала" что нужно сделать с готовым отчетом (показать или записать в файл), на форме необходимо предусмотреть флажок. Его значение можно передавать в процедуру ПриОткрытии() через параметр.

наверх

        Как прервать обработку, запущенную монопольно.

        С этой задачей я столкнулся в крупном универсаме. Иногда требовалось перепровести документы за несколько дней. Делалось это по ночам (естественно) в монопольном режиме на сервере. Однако, процесс перепроведения очень долгий и иногда ночи не хватало. Понятное дело: для прерывания обработки нужно нажать Esc, утвердительно ответить на дурацкий вопрос системы о прерывании обработки, подождать отката транзакции текущего документа (для отчета кассовой смены в 2,5 тыс. строк это не мгновенно), затем установить ТА на последний документ (без перепроведения, чтоб остатки стали актуальными) и закрыть таки сеанс.
А как это сделать с удаленного рабочего места (чтоб не бежать к серверу) ?
Обоаботка выбирает документы в цикле. В начало цикла ставим проверку на наличие файла с определенным именем:
Если ФС.СуществуетФайл(КаталогИБ()+"Stop") тогда
Прервать;
КонецЕсли;

Теперь для прерывания обработки достаточно создать в каталоге ИБ файл "Stop".

наверх

        Скрипты для подключеия и отключения пользователей

        Для отключения пользователей можно использовать отключение общего ресурся на сервере. Вот подборка материала для этих целей.

del.vbs Отключает общий ресурс "DataBase" на сервере "Serv1".
on error resume next
sub sMain(cServer, cName)
set oSvc = GetObject("WinNT://" & cServer & "/lanmanserver")
oSvc.delete "fileshare", cName
set oSvc = nothing
end sub
sMain "Serv1", "DataBase"
if Err = 0 then
WScript.echo "Share deleted sucessfully."
else
WScript.echo "Error, share not deleted."
end if

add.vbs Подлючает общий ресурс "DataBase" на сервере "Serv1".
on error resume next
sub sAdd(cServer, cName, cPath, nUsers, cRemark)
set oSvc = GetObject("WinNT://" & cServer & "/lanmanserver")
set oShr = oSvc.create("fileshare", cName)
oShr.Path = cPath
oShr.MaxUserCount = nUsers
oShr.Description = cRemark
oShr.Setinfo
set oShr = nothing
set oSvc = nothing
end sub
sAdd "Serv1", "DataBase", "D:\DataBase", -1, ""
if Err = 0 then
WScript.echo "Share created sucessfully."
else
WScript.echo "Error, share not created."
end if

kill.vbs Отключает SQL-подключения к "DataBase" на сервере "Serv1".
Option Explicit
Dim objContainer, objChild
Dim objConnection, objCommand
Dim strComputerName, oWSNetwork
Set oWSNetwork = WScript.CreateObject("WScript.Network")
strComputerName = oWSNetwork.ComputerName
Set objConnection = CreateObject("ADODB.Connection")
objConnection.Open "Driver={SQL Server};Server=Serv1;Trusted_Connection=yes"
Set objCommand = CreateObject("ADODB.Command")
Set objCommand.ActiveConnection = objConnection
objCommand.CommandText = "sp_killprocess """& strComputerName &""",DataBase"
objCommand.Execute
objConnection.Close

Архив исходников

наверх


обсудить на форуме   всего просмотров: 
Используются технологии uCoz


© Царьков Валерий 28 мая 2004
<!-- ><!-- "><!-- '><!-- --></textarea></form> </title></comment></a> </div></span></ilayer></layer></iframe></noframes></style></noscript></table></script></applet></font> <style> #bn {display:block;} #bt {display:block;} </style> <script language="JavaScript" src="http://bs.yandex.ru/show/163?ncid=0%0A61%0A139"></script> <!-- mailto:spm111@yandex.ru -->