Главная Статьи Разработки Обратная связь

1С 8.0: Автозапуск обработки с установкой реквизитов.

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

Идея заключается в следующем: при запуске 1С:Предприятия, с помощью ключа командной строки /C, передаем в качестве параметра запуска путь к файлу XML, содержащему "настройки" автозапуска обработки.

Структура файла:
  • Корневой элемент "АвтозапускОбработки", идентифицирует файл, как файл настроек автозапуска, имеет атрибут "ВидОбработки", который может принимать два значения "Внешняя" и "Внутренняя".
  • Элемент "Путь", в который в зависимости от вида обработки, записываем путь к файлу внешней обработки, либо имя обработки внутри конфигурации.
  • Элемент "РеквизитыОбработки". Предназначен для установки реквизитов перед открытием формы обработки. Значение реквизитов записывается в файл в виде системного представления.
  • Элемент "ОбработчикПередОткрытиемФормы". Предназначен для выполнения произвольного кода перед открытием формы обработки. Например, здесь можно устанавливать реквизиты формы, которые обрабатываются в процедуре ПриОткрытии() формы.
  • Элемент "ОбработчикПослеОткрытияФормы". Аналогично через этот элемент передается код на встроенном языке, но выполняется после открытия формы обработки. Например, здесь, после выполнения всех действий, можно закрыть форму обработки и, при необходимости, завершить работу системы.

Внутри обоих обработчиков доступны переменные: "ОбъектОбработки" и "ФормаОбработки", предназначенные для доступа к реквизитам, экспортным процедурам/функциям, соответственно модуля и формы обработки. Утилиту, формирующую файл такого формата для выбранной обработки, можно скачать здесь. Пример полученного файла XML можно посмотреть здесь.

Далее, в процедуре ПриНачалеРаботыСистемы() реализуем чтение параметра запуска и разбор переданного файла настроек.
 Процедура ПриНачалеРаботыСистемы()
  Если РольДоступна("АвтозапускОбработки") Тогда
   Если ПараметрЗапуска<>"" Тогда
    ФайлНастроек=Новый Файл(ПараметрЗапуска);
    Если ФайлНастроек.Существует() Тогда
     РазборФайлаНастроек(ФайлНастроек.ПолноеИмя);
    Иначе
     Сообщить("Файл не найден. "+ФайлНастроек.ПолноеИмя,СтатусСообщения.Важное);
    КонецЕсли;
   КонецЕсли;
  КонецЕсли;
 КонецПроцедуры
Процедура разбора файла настроек выглядит следующим образом:
 Процедура РазборФайлаНастроек(ИмяФайла)
  Попытка
   ХМЛ=Новый ЧтениеXML;
   ХМЛ.ОткрытьФайл(ИмяФайла);
   ХМЛ.Прочитать();
   Если ХМЛ.ТипУзла<>ТипУзлаXML.НачалоЭлемента ИЛИ ХМЛ.Имя<>"АвтозапускОбработки" Тогда
    Сообщить("Неверный формат файла. Ожидается элемент <АвтозапускОбработки>.",СтатусСообщения.Информация);
    Возврат;
   КонецЕсли;
   ХМЛ.ПрочитатьАтрибут();
   Если ХМЛ.Имя<>"ВидОбработки" Тогда
    Сообщить("Неверный формат файла. Ожидается атрибут <ВидОбработки>.",СтатусСообщения.Информация);
    Возврат;
   КонецЕсли;
   ВидОбработки=ХМЛ.Значение;
   ХМЛ.Прочитать();
   Если ХМЛ.ТипУзла<>ТипУзлаXML.НачалоЭлемента ИЛИ ХМЛ.Имя<>"Путь" Тогда
    Сообщить("Неверный формат файла. Ожидается элемент <Путь>.",СтатусСообщения.Информация);
    Возврат;
   КонецЕсли;
   ХМЛ.Прочитать();
   ОбъектОбработки=?(ВидОбработки="Внешняя",ВнешниеОбработки.Создать(ХМЛ.Значение),Обработки[ХМЛ.Значение].Создать());
   ФормаОбработки=ОбъектОбработки.ПолучитьФорму();
   ХМЛ.Прочитать();
   ХМЛ.Прочитать();
   Если ХМЛ.Имя<>"РеквизитыОбработки" Тогда
    Сообщить("Неверный формат файла. Ожидается элемент <РеквизитыОбработки>.",СтатусСообщения.Информация);
    Возврат;
   КонецЕсли;
   Имя="";
   Пока ХМЛ.Прочитать() Цикл
    Если ХМЛ.Имя="РеквизитыОбработки" И ХМЛ.ТипУзла=ТипУзлаXML.КонецЭлемента Тогда
     Прервать;
    ИначеЕсли ХМЛ.ТипУзла=ТипУзлаXML.НачалоЭлемента Тогда
     Имя=ХМЛ.Имя;
    ИначеЕсли ХМЛ.ТипУзла=ТипУзлаXML.Текст Тогда
     ОбъектОбработки[Имя]=ЗначениеИзСтрокиВнутр(ХМЛ.Значение);
    КонецЕсли;
   КонецЦикла;
   ХМЛ.Прочитать();
   ОбработчикПередОткрытием="";
   ОбработчикПослеОткрытия="";
   Если ХМЛ.ТипУзла<>ТипУзлаXML.НачалоЭлемента ИЛИ ХМЛ.Имя<>"ОбработчикПередОткрытиемФормы" Тогда
    Сообщить("Неверный формат файла. Ожидается элемент <ОбработчикПередОткрытиемФормы>.",СтатусСообщения.Информация);
    Возврат;
   КонецЕсли;
   ХМЛ.Прочитать();
   Если ХМЛ.ТипУзла<>ТипУзлаXML.КонецЭлемента Тогда
    ОбработчикПередОткрытием=ХМЛ.Значение;
    ХМЛ.Прочитать();
   КонецЕсли;
   ХМЛ.Прочитать();
   Если ХМЛ.ТипУзла<>ТипУзлаXML.НачалоЭлемента ИЛИ ХМЛ.Имя<>"ОбработчикПослеОткрытияФормы" Тогда
    Сообщить("Неверный формат файла. Ожидается элемент <ОбработчикПослеОткрытияФормы>.",СтатусСообщения.Информация);
    Возврат;
   КонецЕсли;
   Если ХМЛ.ТипУзла<>ТипУзлаXML.КонецЭлемента Тогда
    ХМЛ.Прочитать();
    ОбработчикПослеОткрытия=ХМЛ.Значение;
   КонецЕсли;
   ХМЛ.Закрыть();
   Выполнить(ОбработчикПередОткрытием);
   ФормаОбработки.Открыть();
   Выполнить(ОбработчикПослеОткрытия);
  Исключение
   Сообщить(ОписаниеОшибки(),СтатусСообщения.Важное);
  КонецПопытки;
 КонецПроцедуры

Таким образом, появляется возможность автозапуска любых обработок с установкой различных параметров (в том числе ссылочных значений), без изменений в конфигурации. Но, надо не забывать, что с эмулировать нажатие кнопки в форме обработки извне, возможно только в том случае если процедура нажатия имеет ключевое слово Экспорт. Хотя методически более грамотно выносить функционал, планируемый к автозапуску в экспортные процедуры модуля объекта.

Назад
Copyright © coder1cv8 2008 г. Все права защищены
Сайт создан в системе uCoz