Одной из причин, по которой система 1с завоевала такую популярность, является ее гибкость и относительная легкость в настройке и адаптации к потребностям конечного пользователя. Одним из несомненных плюсов система является возможность написания внешних отчетов и обработок, которая от версии к версии получает новые возможности. Если в версии 7.7 ми имели просто внешние отчёты и обработки которые были сами по себе и могли взаимодействовать с системой очень ограничено, то уже в 8 версии возможности внешних отчетов и обработок расширили, теперь пользователям стандартных конфигураций не нужно было изменять конфигурацию для того чтобы создать нестандартную печатную форму. Данная подсистема является развитием идей расширения возможностей внешних отчетов и обработок. Теперь нам предлагают сохранять файлы отчетов в базе данных в специальном справочнике, причем доступ к данным файлам возможен не только из справочника, но и из специально отведенных мест командного интерфейса. Лично для меня функцией, из-за которой я буду использовать данную подсистему, является возможность легко настроить расписание запуска для внешнего отчета или обработки.
Если помните, то в одной из предыдущих статей я писал простую обработку получения курсов валют с сайта НБУ, сегодня постараемся разобраться, как модифицировать обработку для ежедневного автоматического получения курсов валют.
Для начала к нашей обработке нужно добавить функцию СведенияОВнешнейОбработке, которая вызывается при добавлении нашей обработки в справочник «ВнешниеОбработки».
В ней указываются значения, которыми заполнится элемент справочника при выборе обработки.
Ми предложим пользователю две команды, для нашей обработки первая просто будет открывать форму загрузки курсов валют, а вторая автоматически будет загружать курсы с сайта на сегодняшний день. Если мы назначим второй команде расписание, то она будет выполняться по расписанию, что очень удобно. Выполнять по расписанию нужные нам действия без изменения конфигурации очень мощный функционал, которого я с нетерпением жду в типовых конфигурациях. Приведу листинг модуля обработки полностью.
Перем Команда_ЗагрузитьКурсФорма ЭКСПОРТ; Перем Команда_ЗагрузитьКурсАвтомат ЭКСПОРТ; // Интерфейс для регистрации обработки. // Вызывается при добавлении обработки в справочник "ВнешниеОбработки" // // Возвращаемое значение: // Структура: // Вид - строка - возможные значения: "ДополнительнаяОбработка" // "ДополнительныйОтчет" // "ЗаполнениеОбъекта" // "Отчет" // "ПечатнаяФорма" // "СозданиеСвязанныхОбъектов" // // Назначение - массив строк имен объектов метаданных в формате: // <ИмяКлассаОбъектаМетаданного>.[ * | <ИмяОбъектаМетаданных>] // Например, "Документ.СчетЗаказ" или "Справочник.*" // Прим. параметр имеет смысл только для назначаемых обработок // // Наименование - строка - наименование обработки, которым будет заполнено // наименование справочника по умолчанию - краткая строка для // идентификации обработки администратором // // Версия - строка - версия обработки в формате <старший номер>.<младший номер> // используется при загрузке обработок в информационную базу // БезопасныйРежим – Булево – Если истина, обработка будет запущена в безопасном режиме. // Более подбробная информация в справке. // // Информация - Строка- краткая информация по обработке, описание обработки // // ВерсияБСП - Строка - Минимальная версия БСП, на которую рассчитывает код // дополнительной обработки. Номер версии БСП задается в формате «РР.ПП.ВВ.СС» // (РР – старший номер редакции; ПП – младший номер ре-дакции; ВВ – номер версии; СС – номер сборки). // // Команды - ТаблицаЗначений - команды, поставляемые обработкой, одная строка таблицы соотвествует // одной команде // колонки: // - Представление - строка - представление команды конечному пользователю // - Идентификатор - строка - идентефикатор команды. В случае печатных форм // перечисление через запятую списка макетов // - Использование - строка - варианты запуска обработки: // "ОткрытиеФормы" - открыть форму обработки // "ВызовКлиентскогоМетода" - вызов клиентского экспортного метода из формы обработки // "ВызовСерверногоМетода" - вызов серверного экспортного метода из модуля объекта обработки // - ПоказыватьОповещение – Булево – если Истина, требуется оказывать оповещение при начале // и при окончании запуска обработки. Прим. Имеет смысл только // при запуске обработки без открытия формы. // - Модификатор – строка - для печатных форм MXL, которые требуется // отображать в форме ПечатьДокументов подсистемы Печать // требуется установить как "ПечатьMXL" // Функция СведенияОВнешнейОбработке() Экспорт ПараметрыРегистрации = Новый Структура; ПараметрыРегистрации.Вставить("Вид", "ДополнительнаяОбработка"); ПараметрыРегистрации.Вставить("Назначение", Неопределено); ПараметрыРегистрации.Вставить("Наименование", НСтр("ru = 'Загрузка курсов валют с сайта НБУ'")); ПараметрыРегистрации.Вставить("Версия", "0.1"); ПараметрыРегистрации.Вставить("БезопасныйРежим", Ложь); ПараметрыРегистрации.Вставить("Информация", НСтр("ru = 'Загружает курсы валют с сайта НБУ на текущую дату'")); ПараметрыРегистрации.Вставить("ВерсияБСП", "2.0.1.3"); ТаблицаКоманд = ПолучитьТаблицуКоманд(); ДобавитьКоманду(ТаблицаКоманд, НСтр("ru = 'Загрузить курс'"), Команда_ЗагрузитьКурсФорма, "ОткрытиеФормы", Истина); ДобавитьКоманду(ТаблицаКоманд, НСтр("ru = 'Загрузить курс по расписанию'"), Команда_ЗагрузитьКурсАвтомат, "ВызовСерверногоМетода", Истина); ПараметрыРегистрации.Вставить("Команды", ТаблицаКоманд); Возврат ПараметрыРегистрации; КонецФункции Процедура ДобавитьКоманду(ТаблицаКоманд, Представление, Идентификатор, Использование, ПоказыватьОповещение = Ложь, Модификатор = "") НоваяКоманда = ТаблицаКоманд.Добавить(); НоваяКоманда.Представление = Представление; НоваяКоманда.Идентификатор = Идентификатор; НоваяКоманда.Использование = Использование; НоваяКоманда.ПоказыватьОповещение = ПоказыватьОповещение; НоваяКоманда.Модификатор = Модификатор; КонецПроцедуры Функция ПолучитьТаблицуКоманд() Команды = Новый ТаблицаЗначений; Команды.Колонки.Добавить("Представление", Новый ОписаниеТипов("Строка")); Команды.Колонки.Добавить("Идентификатор", Новый ОписаниеТипов("Строка")); Команды.Колонки.Добавить("Использование", Новый ОписаниеТипов("Строка")); Команды.Колонки.Добавить("ПоказыватьОповещение", Новый ОписаниеТипов("Булево")); Команды.Колонки.Добавить("Модификатор", Новый ОписаниеТипов("Строка")); Возврат Команды; КонецФункции Процедура ВыполнитьКоманду(ИдентификаторКоманды, ПараметрыВыполненияКоманды = Неопределено) Экспорт УстановитьПривилегированныйРежим(Истина); Если ИдентификаторКоманды = Команда_ЗагрузитьКурсФорма Тогда КонецЕсли; Если ИдентификаторКоманды = Команда_ЗагрузитьКурсАвтомат Тогда ЗагружаемыеВалюты = РаботаСКурсамиВалют.ПолучитьМассивЗагружаемыхВалют(); КопироватьФайл("http://www.bank.gov.ua/control/ru/curmetal/currency/search?formType=searchFormDate&time_step=daily&date="+Формат(текущаядата(), "ДФ=""дд.ММ.гггг""")+"&execute=%D0%92%D1%8B%D0%BF%D0%BE%D0%BB%D0%BD%D0%B8%D1%82%D1%8C", "0001.htm"); ТекстДок=новый ТекстовыйДокумент ; ТекстДок.Прочитать("0001.htm"); ЧтениеHTML = Новый ЧтениеHTML; ЧтениеHTML.ОткрытьФайл("0001.htm","UTF-8"); ПостроительDOM = новый ПостроительDOM ; дом =ПостроительDOM.Прочитать(ЧтениеHTML); х=0; для каждого елемент из дом.ПолучитьЭлементыПоИмени("table").Элемент(5).ДочерниеУзлы цикл если х=0 тогда иначе для каждого валюта из ЗагружаемыеВалюты цикл если строка(валюта.Код)= строка(елемент.ПолучитьЭлементыПоИмени("td").Элемент(0).ТекстовоеСодержимое) тогда Сообщить(валюта.код); Сообщить(елемент.ПолучитьЭлементыПоИмени("td").Элемент(0).ТекстовоеСодержимое); РегистрКурсыВалют = РегистрыСведений.КурсыВалют.СоздатьМенеджерЗаписи(); Сообщить(текущаядата()); РегистрКурсыВалют.Период = текущаядата(); РегистрКурсыВалют.Валюта = валюта; Сообщить(елемент.ПолучитьЭлементыПоИмени("td").Элемент(4).ТекстовоеСодержимое); Сообщить(елемент.ПолучитьЭлементыПоИмени("td").Элемент(2).ТекстовоеСодержимое); РегистрКурсыВалют.Курс = елемент.ПолучитьЭлементыПоИмени("td").Элемент(4).ТекстовоеСодержимое; РегистрКурсыВалют.Кратность = елемент.ПолучитьЭлементыПоИмени("td").Элемент(2).ТекстовоеСодержимое; РегистрКурсыВалют.Записать(); конецесли; конеццикла; конецесли; х=1; конеццикла; КонецЕсли; КонецПроцедуры Процедура ДобавитьВалютуВСписок(Валюта) // Добавление записи в список валют НоваяСтрока = этотОбъект.СписокВалют.Добавить(); // Заполнение информации о курсе на основе ссылки валюты ЗаполнитьДанныеСтрокиТаблицыНаОсновеВалюты(НоваяСтрока, Валюта); КонецПроцедуры Процедура ЗаполнитьДанныеСтрокиТаблицыНаОсновеВалюты(ТекСтрока, СсылкаНаВалюту); // Заполнение информации о курсе на основе ссылки валюты ТекСтрока.Валюта = СсылкаНаВалюту; ТекСтрока.КодВалюты = СсылкаНаВалюту.Код; ДанныеКурса = РаботаСКурсамиВалют.ЗаполнитьДанныеКурсаДляВалюты(СсылкаНаВалюту); Если ТипЗнч(ДанныеКурса) = Тип ("Структура") Тогда ТекСтрока.ДатаКурса = ДанныеКурса.ДатаКурса; ТекСтрока.Курс = ДанныеКурса.Курс; ТекСтрока.Кратность = ДанныеКурса.Кратность; КонецЕсли; КонецПроцедуры Процедура ЗагрузитиНаСервере() // Вставити вміст обробника. КонецПроцедуры Команда_ЗагрузитьКурсФорма = "ЗагрузитьКурс"; Команда_ЗагрузитьКурсАвтомат = "ЗагрузитьКурсАвтомат";
Расписание указывается в форме элемента внешних обработок в табличной части команд. Так как указано на скриншоте.
Следует помнить что нормально запускается по расписанию обработки будут при работе базы в клиент-серверном режиме. То, что я описал это только часть функционала данной подсистемы, возможно, мы еще вернемся, чтобы более подробно описать ее функционал.