Обработка 7.7 по расписанию

Альтернативный метод запуска обработок в 7.7 по расписанию

Читая статьи набрёл на «Запуск внешней обработки по расписанию v7.7«, стало интересно — чем предложенный способ отличается от того, как сделал я.

В оригинальной статье автор предлагает использовать событие начала работы системы в глобальном модуле и отдельного пользователя.
На мой взгляд решение реальное, однако я бы дополнил его:
При таком подходе стоит выделить отдельную внешнюю обработку и запускать только её.
В коде этой обработки запускать другие необходимые обработки.
Плюс подхода — всё в одной обработке.
Минусы подхода — нет возможности выполнять обработки параллельно; необходимость первоначальной правки глобального модуля каждой конфигурации, где планируется запускать обработку по расписанию.

Другой способ

Мы не будем вообще трогать код конфигурации, в которой планируется запускать внешнюю обработку.
Вместо этого мы создадим vbs-сценарий, который будем создавать COM-объект приложения 7.7.
В нём открывать необходимую обработку.
Внутри обработки опишим необходимые действия в событии «ПриОткрытии».
После всего добавляем запуск этого сценария в планировщик заданий.

совсем примитивный вариант, который демонстрирует идею:

Set v77 = CreateObject(«V77.Application»)
v77.Initialize v77.RMTrade, «/D»»E:1С77Тестовая»»», «NO_SPLASH_SHOW»
v77.OpenForm «Report», «», «c:РегламентРегламент.ert»

Shine bright like a diamond!

Давайте улучшим наше решение.
Что было бы здорово добавить?

1) во-первых, нужно сделать из этого скрипта универсальный механизм.
Неудобно держать 100 однотипных скриптов для разных баз, поэтому сделаем один, но с параметрами.

Добавим такие параметры:
— путь к базе
— логин
— пароль
— путь к внешней обработке

2) во-вторых, нам нужен лог файл.
Желательно лог запуска + лог действий обработки.
Добавляем параметр — лог файл.
Пишим в него самим скриптом, передаём как параметр открываемой обработке. Если будет использовать — хорошо, не будет — и ладно.

3) нужно корректно закрывать 1С
Используем ЗавершитьРаботуСистемы(0), чтобы корректно выйти из 1С, обнуляем ссылку в памяти.

этот вариант уже толще:

'будем получать параметры запуска из коммандной строки, и они будут именованные
Set Arguments = WScript.Arguments.Named

if Not Arguments.Exists("Base1C") OR Not Arguments.Exists("Ert") Then
Wscript.Echo "Необходимо задать параметры запуска!"
Wscript.Quit
End if

Base1C = Arguments.Item("Base1C") 'путь к базе
Ert = Arguments.Item("Ert") 'путь к обработке
LogFile = "" 'лог-файл

'формируем строку - аргумент для запуска 1С
V77Arguments = "/D" & """" & Base1C & """"
if Arguments.Exists("Login") Then
V77Arguments = V77Arguments & " /N" & Arguments.Item("Login")
End if
if Arguments.Exists("Pass") Then
V77Arguments = V77Arguments & " /P" & Arguments.Item("Pass")
End if
if Arguments.Exists("Log") Then
LogFile = Arguments.Item("Log")
End if

'Запишим в лог факт попытки запуска 1С
'Однако, лучше делать это внутри обработки
'if LogFile <> "" Then
' set objFSO = CreateObject("Scripting.FileSystemObject")
' set objLogFile = objFSO.OpenTextFile(LogFile, 8, True)
' objLogFile.WriteLine("----------------------------")
' objLogFile.WriteLine(">> " & Now)
' objLogFile.WriteLine(">Start 1C: " & V77Arguments)
' objLogFile.WriteLine(">Opening " & Ert)
' objLogFile.Close
' Set objFSO = Nothing
'End if


Set v77 = CreateObject("V77.Application")
v77.Initialize v77.RMTrade, V77Arguments, "NO_SPLASH_SHOW"

'открываем форму внешней обработки, что для нас важно:
'*второй параметр - путь к лог-файлу, передаётся в форму и доступен как "Форма.Параметр"
'последний параметр - путь к самой обработке
v77.OpenForm "Report", LogFile, Ert

'закрываем 1С
v77.ExitSystem 0
set v77 = Nothing
'завершаем скрипт
Wscript.Quit

В самой обработке

Процедура Сформировать()

ПисатьПротокол = ?(СтрДлина(LogFile) > 0, 1, 0);

Если ПисатьПротокол = 1 Тогда
протокол = СоздатьОБъект("Текст");
Попытка
// если лог-файл уже содержит какие-то данные, пробуем их прочитать
протокол.Открыть(LogFile);
Исключение
КонецПопытки;
КонецЕсли;


СчитаемДо = 10;

// записываем протокол обновления данных - дату, сообщения об ошибках, результаты
Если ПисатьПротокол = 1 Тогда
протокол.ДобавитьСтроку("Обработка запущена > " + текущаяДата());
протокол.ДобавитьСтроку("Считаем до " + СчитаемДо);
КонецЕсли;

Для а = 1 по СчитаемДо Цикл
Если ПисатьПротокол = 1 Тогда
протокол.ДобавитьСтроку(а);
КонецЕсли;
КонецЦикла;

Если ПисатьПротокол = 1 Тогда
протокол.ДобавитьСтроку("Счёт завершён > " + текущаяДата());
Попытка
// пытаемся записать лог-файл
протокол.Записать(LogFile);
Исключение
// если попытка записи не прошла, то можно предпринять дополнительные действия
протокол.Показать();
Сообщить("Невозможно сохранить протокол");
КонецПопытки;
КонецЕсли;

КонецПроцедуры


Процедура ПриОткрытии()

LogFile = Форма.Параметр;


ВремяОжиданияОтклика = 10;
'Если обработка была запущена для отладки или совмещает автоматический и ручной режимы
Ответ = Вопрос("Прервать автоматическое выполнение обработки?", 4, ВремяОжиданияОтклика);
Если Ответ <> 6 Тогда
Попытка
Сформировать();
Исключение
// Глобальный перехват - плохой приём
// В нашем случае все возможные ошибки лучше обработать в процедуре "Сформировать()"
// Тем не менее, нам не нужно, чтобы обработка мёртвым грузом висела в памяти и что-нибудь блокировала
// Поэтому, на случай каких-то пропущенных исключений, здесь можно сделать обращение в какой-то глобальный лог ошибок
КонецПопытки;
КонецЕсли;


КонецПроцедуры
 

Создаём расписание

Полный путь к скрипту выглядит так: C:WINDOWSsystem32wscript.exe C:Регламентautostart.vbs /Base1C:E:1С77Тестовая /Ert:c:РегламентРегламент.ert /Log:c:РегламентРегламент.log

C:WINDOWSsystem32wscript.exe — необходимо указывать наш скрипт как параметр для wscript.exe, иначе он сам не сможет получать параметры
C:Регламентautostart.vbs — путь к нашему скрипту
/Base1C:E:1С77Тестовая — путь к базе
/Ert:c:РегламентРегламент.ert — путь к обработке
/Log:c:РегламентРегламент.log — путь к лог-файлу
/Login:… — можно указать пользователя, под которым нужно открывать 1С
/Pass:… — и пароль

Важные моменты

При таком подходе возможны ошибки, когда обработка вызывает «ЗавершитьРаботуСистемы» одновременно с прописанным «v77.ExitSystem 0» в скрипте.
Происходит некорректное завершение, которое лечится входом в 1С в монопольном режиме с переиндексацией.
Нужно определится — или обработка закрывает 1С, или скрипт.

Как можно улучшить решение?

первое что приходит на ум — добавить обработку ошибок, прикрутить логирование с проверкой занятости файла

4 Comments

  1. Yury1001

    от автора статьи «Запуск внешней обработки по расписанию v7.7» отправлен камаз лайков)))

    Reply
  2. delete

    (1) Yury1001, ахахаха) спасибо))

    Reply
  3. yanis

    Спасибо за ваш скрипт! Работает «из коробки»

    Reply
  4. mcgoblin

    Спасибо, полезно

    Reply

Leave a Comment

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