Читая статьи набрёл на «Запуск внешней обработки по расписанию 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С, или скрипт.
Как можно улучшить решение?
первое что приходит на ум — добавить обработку ошибок, прикрутить логирование с проверкой занятости файла
от автора статьи «Запуск внешней обработки по расписанию v7.7» отправлен камаз лайков)))
(1) Yury1001, ахахаха) спасибо))
Спасибо за ваш скрипт! Работает «из коробки»
Спасибо, полезно