Хитрости запуска обработок через Обновлятор
Казалось бы, зачем нужно для изменения данных в базах через Обновлятор запускать внешние обработки (в режиме пакетных скриптов), для которых нужно полностью запускать 1С:Предприятие, если можно пользоваться быстрым COM-соединением?
Но есть несколько случаев, когда такой способ полезен:
- Никак не получалось настроить корректную работу COM-соединения, просто не создавался объект. А задача была простая, но срочная. В итоге решили использовать обработку.
- Отчет формировался только в режиме клиентского приложения, из формы. Перенос логики в COM-соединение был бы очень объемным.
- Обработка должна была загружать выписки, аналогично, нужно было открывать формы, имитировать действия пользователей.
Что нужно помнить при запуске внешних обработок через Обновлятор?
Нужно отключать защиту от опасных действий. Рекомендую второй способ из методички Обновлятора — прописывать отключение в файле «conf.cfg» на том компьютере, откуда запускается Обновлятор.
У пользователей, под которым запускается Обновлятор, должно быть право на использование внешних обработок:
Также нужно каким-то образом организовать контроль за результатами работы. 1С может не запуститься или вылететь по ошибке.
Лог можно выводить прямо в консоль выполнения. Вот пример простого скрипта, из которого понятно, как это делается:
@echo off
del /Q "C:\Users\office\Documents\RunRestrictEditDate.log"
%f1c% /Execute "C:\Users\office\Documents\RunRestrictEditDate.epf" /C 20241031
type "C:\Users\office\Documents\RunRestrictEditDate.log"
Как видите, в скрипте можно использовать любые команды системы. Однако к сожалению символ @ там зарезервирован под другое, поэтому лучше использовать в начале @echo off, чтобы команды не выводились в протокол Обновлятора.
И пример результата:
Как вариант, лог можно выводить в файл. Например, я использовал отдельный файл для каждого запуска обновлятора по каждой базе, размещая его рядом с файлом обработки.
Также можно собирать данные по каждой базе и выводить результат в один общий отчет в виде Ecxel, например.
Вот пример внешней обработки для запуска через Обновлятор, которая меняет дату запрета редактирования:
&НаСервере Функция ИмяФайлаОбработки() Экспорт ОО = РеквизитФормыВЗначение("Объект"); Возврат ОО.ИспользуемоеИмяФайла; КонецФункции &НаКлиенте Процедура ПриОткрытии(Отказ) ИмяФайлаОбработки = ИмяФайлаОбработки(); ИмяФайлаЛога = СтрЗаменить(ИмяФайлаОбработки, ".epf", ".log"); Лог = Новый ТекстовыйДокумент(); ДатаЗапрета = Неопределено; ТекПараметрЗапуска = СокрЛП(ПараметрЗапуска); Если ТекПараметрЗапуска = "" Тогда Лог.ДобавитьСтроку("ОШИБКА!!! Не заполнен параметр запуска!"); Иначе Попытка ДатаЗапрета = Дата(ТекПараметрЗапуска); Исключение Лог.ДобавитьСтроку("ОШИБКА!!! Не удалось получить дату из параметра: " + ТекПараметрЗапуска); КонецПопытки; КонецЕсли; Если ДатаЗапрета <> Неопределено Тогда УстановитьДату(ДатаЗапрета); Лог.ДобавитьСтроку("УСПЕШНО. Дата запрета установлена на: " + Формат(ДатаЗапрета, "ДФ=dd.MM.yyyy")); КонецЕсли; Лог.Записать(ИмяФайлаЛога, КодировкаТекста.ANSI); Отказ = истина; ЗавершитьРаботуСистемы(Ложь); //ложь КонецПроцедуры Процедура УстановитьДату(ДатаЗапрета) //Внимание - удаляются все даты запрета изменения данных и оставляется только одна общая НЗ = РегистрыСведений.ДатыЗапретаИзменения.СоздатьНаборЗаписей(); МЗ = НЗ.Добавить(); МЗ.Пользователь = Перечисления.ВидыНазначенияДатЗапрета.ДляВсехПользователей; МЗ.Объект = ПланыВидовХарактеристик.РазделыДатЗапретаИзменения.ПустаяСсылка(); МЗ.Раздел = ПланыВидовХарактеристик.РазделыДатЗапретаИзменения.ПустаяСсылка(); МЗ.ДатаЗапрета = ДатаЗапрета; НЗ.Записать(); КонецПроцедуры
Обратите внимание, что лог нужно записывать в кодировке ANSI, чтобы он корректно был показан в Обновляторе.
Параметры можно передавать через параметр запуска в простых случаях и через файл настроек, расположенный рядом с обработкой, если требуются более точные настройки.
UPD: кстати, можно использовать команду exit с ненулевым значением, чтобы сообщить Обновлятору об ошибке. Можно проаналазировать файл возврата и если в нем есть сообщение об ошибке, сделать exit с ненулевым значением. Тогда результат выполнения по базе данных будет ошибочным и подсвечен красным.
Свежие комментарии