Укажите сферу деятельности вашей компании?

Оставьте ваши контакты

Contact Form
Нажимая на кнопку, Вы даете согласие на обработку персональных данных

Оперативная отладка и изменение кода, добавление регламентных и HTTP-методов

Статья посвящена доработкам, призванным уменьшить количество обновлений конфигурации. Будет полезна для организаций, где тех. задания возникают на лету, базы огромные, работает более 1000 пользователей. Частое отключение базы нежелательно. А динамика часто приводит к краху базы. Доработка позволяет оперативно менять, отлаживать код без изменения конфигурации. Оперативно добавлять регламентные задания, оперативно добавлять методы HTTP-сервисов (можно и Веб, но тут не используется). И второй пункт ХранимыеЗначения – аналог констант в базе с возможностью хранить произвольные значения с произвольным именем.

Перед этим конфигурацию придется минимально доработать:

Для регламентного и сервисов нужно соответственно создать РАЗОВО универсальное регламентное и универсальный HTTP- сервис.

Для отладки или изменяемого кода нужно добавить РАЗОВО несколько строк в нужный блок программы.

Принцип работы – имеется справочник алгоритмов, в котором есть текстовое поле с исполняемым кодом. Идентифицируется по наименованию элемента. В алгоритм можно передать через структуру какие-то данные и получить через эту же структуру новые или обработанные  данные – полученные по результату работы алгоритма. Ограничение на код алгоритма стандартные – нельзя использовать операторы Функция, Процедура, Возврат. Если у вас что-то очень сложное —  поместите свой исполняемый код в обработку без всяких ограничений и вызовите обработку из алгоритма. Таким образом можно к примеру легко сделать рассылку отчета. Вся сложность заключается в том, что нужно заранее описать в конфигураторе передаваемые и получаемые данные. Здесь представлен самый универсальный вариант. Можно в принципе получить и выполнить код алгоритма напрямую — контекст будет ему виден, данные передавать не надо. 

Соответственно на этом же справочнике основаны и регламентное и HTTPсервис. Регламентные задания различаются по параметрам – фактически в регламентном основная процедура исполняет код алгоритма – идентификация которого идет по параметру регламентного. Вы просто добавляете очередное регламентное, прописываете в параметре наименование нужного алгоритма, и он будет выполняться по расписанию.

HTTP –сервис имеет универсальный метод Execute, В качестве тела запроса передается структура с Ключом -Наименование алгоритма, и с допПараметрами – данными. ДопПараметры будут и в ответе сервиса. Метод по ключу находит алгоритм, передает в него допПараметр, алгоритм возвращает в допПараметре результат выполнения. Сервис возвращает допПараметр в ответе.

Ошибки отладки видно в Журнале регистрации

image 1 – Гранд Проект: Корпоративные финансы 1С

Описание, ТекстПрограммы – строковое неограниченное

Активный – булево, признак что алгоритм рабочий.

Ответственный, Автор – информационные поля, можно прицепить справочник пользователи, здесь строка.

ДатаАктивации – дата, информационное поле.

В модуль менеджера справочника добавляем Процедуру:

Процедура ВыполнитьАлгоритм(Ключ, ДопПараметры="") Экспорт
	// Ключ, наименование алгоритма
	//Доппараметры - структура(данные любые) которую можно передать в алгоритм- сюда же нужно положить результат выполнения если возвращается какое-то значение
	УстановитьПривилегированныйРежим(Истина);
	ЗапросАлгоритмы = Новый Запрос;
	ЗапросАлгоритмы.УстановитьПараметр("ИмяАлг", Ключ);
	
	
	ЗапросАлгоритмы.Текст = 
	"ВЫБРАТЬ ПЕРВЫЕ 1
	|	Алгоритмы.Ссылка КАК Ссылка,
	|	Алгоритмы.ТекстПрограммы КАК ТекстПрограммы,
	|	Алгоритмы.Код КАК Код
	|ИЗ
	|	Справочник.Алгоритмы КАК Алгоритмы
	|ГДЕ
	|	НЕ Алгоритмы.ЭтоГруппа
	|	И Алгоритмы.Наименование = &ИмяАлг
	|	И Алгоритмы.Активный
	|	И НЕ Алгоритмы.ПометкаУдаления
	|
	|УПОРЯДОЧИТЬ ПО
	|	Код УБЫВ
	|АВТОУПОРЯДОЧИВАНИЕ";
	ВыборкаАлг = ЗапросАлгоритмы.Выполнить().Выбрать();
	
	Если ВыборкаАлг.Следующий() Тогда
		
		Код = ВыборкаАлг.Код;
		
		Попытка
			Выполнить ВыборкаАлг.ТекстПрограммы;
		Исключение
			стрОшибки	=ОписаниеОшибки();
			ЗаписьЖурналаРегистрации("Ошибка алгоритма", , , стрОшибки); 
			Сообщить("---Ошибка АЛГОРИТМа Ключ - " + Ключ+": "+стрОшибки);	
			ДопПараметры	=Новый Структура("Ошибка","!!!ошибка алгоритма: "+стрОшибки );
		КонецПопытки;
	Иначе
		стрОшибки	="нет алгоритма по ключу - "+Ключ;
		ЗаписьЖурналаРегистрации("Ошибка алгоритма", УровеньЖурналаРегистрации.Ошибка, , , стрОшибки); 
		Сообщить(стрОшибки);	
		ДопПараметры	=Новый Структура("Ошибка",стрОшибки );
	КонецЕсли;
	
	
	УстановитьПривилегированныйРежим(Ложь);
		
КонецПроцедуры

Пример использования  отладки кода:

Функция ПолучитьОстатки (ДанОп)
	
	допПараметры	=Новый Структура("ДанОп", даноп);
	ВыполнитьАлгоритм("ОстаткиДляЧегото", допПараметры);
//В алгоритме ОстаткиДляЧегото на спискаНоменклатуры (переменная данОП) вычисляются 
//остатки и помещаются в тз. Эта тз добавляется в структуру допПараметры под параметром рез.

	Если допПараметры.Свойство("Рез") Тогда
		Возврат допПараметры.Рез;
	КонецЕсли;
//Если алгоритма нет или в нем ошибка выполняется типовой код
//…. 
//….
Возврат тзОстатки;
КонецФункции

Реализация HTTP-Сервиса:

Добавляем сервис

image 2 – Гранд Проект: Корпоративные финансы 1С
image 3 – Гранд Проект: Корпоративные финансы 1С
image 4 – Гранд Проект: Корпоративные финансы 1С
image 5 – Гранд Проект: Корпоративные финансы 1С

В модуль сервиса добавляем процедуры:

Функция GetclientsPost(Запрос)
	
Если  Запрос.ОтносительныйURL = "/Execute" Тогда
		
		ПолученныеДанные =  Десериализовать(Запрос.ПолучитьТелоКакСтроку());

		Результат = ОтветНаHTTP(ПолученныеДанные);
		Ответ = Новый HTTPСервисОтвет(200);
		Ответ.УстановитьТелоИзСтроки(Результат);
		Возврат Ответ;
	Иначе
		Ответ = Новый HTTPСервисОтвет(200);
		Возврат Ответ;
	КонецЕсли;
	
КонецФункции

Функция Десериализовать(XMLСтруктура) Экспорт 
	
	ЧтениеXMLДанных = Новый ЧтениеXML;
	ЧтениеXMLДанных.УстановитьСтроку(XMLСтруктура);
	ТЗ = СериализаторXDTO.ПрочитатьXML(ЧтениеXMLДанных);
	ЧтениеXMLДанных.Закрыть();
	Возврат ТЗ;
	
КонецФункции
Функция Сериализовать(Структура) Экспорт 
	
	ДеревоВОбъекте = СериализаторXDTO.ЗаписатьXDTO(Структура);
	МойXML = Новый ЗаписьXML;
	МойXML.УстановитьСтроку();
	ФабрикаXDTO.ЗаписатьXML(МойXML,ДеревоВОбъекте);
	Возврат МойXML.Закрыть();
	
КонецФункции

Функция ОтветНаHTTP(ПолученныеДанные) Экспорт
	Ответ="";
	Если ПолученныеДанные.Свойство("Ключ") Тогда	
		Ответ	=ВыполнениеПоАлгоритму(ПолученныеДанные);			
	Иначе
		Ответ	="Запрос не определен";
	КонецЕсли;

	Возврат Сериализовать(Ответ);
	
КонецФункции

Функция ВыполнениеПоАлгоритму(ДанОп)
	//Выполенние произвольного алагоритма по справочнику Алгоритмы
	//Должно быть свойство ключ и допПараметры(тудасюдаха- будет передано В и вернется ИЗ алгоритма)
	Если данОп.свойство("Ключ") Тогда
		допПараметры	=?(данОп.свойство("допПараметры"), ДанОп.допПараметры, "");
		Справочники.Алгоритмы.ВыполнитьАлгоритм(данОп.Ключ, допПараметры);
		
		Возврат (Новый Структура("Успешно, допПараметры", Истина, допПараметры));
	КонецЕсли;
		
	Возврат Новый структура("Успешно,допПараметры", ложь, ДанОп.допПараметры);	
КонецФункции

По коду – при вызове метод сервиса uni/Execute, метод проверяет полученную структуру запроса, здесь должно быть 2 параметра – Ключ (имя алгоритма) и допПараметр (вложенная структура с данными). Алгоритм может переопределить эту переменную или добавить свои данные. Эта структура возвращаются в качестве ответа.

Пример вызова веб-сервиса, код обработки:

&НаКлиенте
Процедура Команда1(Команда)
	ответ	=СделатьHTTPЗапрос(Новый Структура("Ключ, допПараметры", "СложитьСтр", Новый Структура("Текст1, текст2","раз", "два")));
	Сообщить(Ответ);
КонецПроцедуры

&НаСервере
//Вход для запроса Execute
//структура с параметрами Ключ и Допппараметры
Функция СделатьHTTPЗапрос(Структура) Экспорт
	// Вставить содержимое обработчика.
	ТестовыйРежим = ПараметрыСеанса.ТестовыйРежим;
	НастрБазы	=Константы.ТестоваяБаза.Получить();
	Запрос = Сериализовать(Структура);
	
	Пользователь = "Admin";
	Пароль = "1";
	СоединениеHTTP = Новый HTTPСоединение("192.168.1.1", , Пользователь, Пароль);
	HTTPЗапрос = Новый HTTPЗапрос("TabUPS/hs/uni/Execute");
	
	HTTPЗапрос.УстановитьТелоИзСтроки(Запрос);
	
	Попытка
		HTTPОтвет = СоединениеHTTP.ОтправитьДляОбработки(HTTPЗапрос);
		Ответ = HTTPОтвет.ПолучитьТелоКакСтроку();
		Возврат Десериализовать(Ответ);
	Исключение
		Сообщить(ОписаниеОшибки());
	КонецПопытки;
КонецФункции


&НаСервере
Функция Десериализовать(XMLСтруктура)
	ЧтениеXMLДанных = Новый ЧтениеXML;
	ЧтениеXMLДанных.УстановитьСтроку(XMLСтруктура);
	ТЗ = СериализаторXDTO.ПрочитатьXML(ЧтениеXMLДанных);
	ЧтениеXMLДанных.Закрыть();
	Возврат ТЗ;
КонецФункции

&НаСервере
Функция Сериализовать(Объект)
	ДеревоВОбъекте = СериализаторXDTO.ЗаписатьXDTO(Объект);
	МойXML = Новый ЗаписьXML;
	МойXML.УстановитьСтроку();
	ФабрикаXDTO.ЗаписатьXML(МойXML, ДеревоВОбъекте);
	Возврат МойXML.Закрыть();
КонецФункции

Итого если в основной базе будет алгоритм с именем «СложитьСтр»

image 6 – Гранд Проект: Корпоративные финансы 1С

В ответе сервиса вы получите структуру с 3 параметрами: п1, п2, рез.

Реализация регламентного (НЕТ в Расширении!!!).

Добавляем универсальное регламентное

image 7 – Гранд Проект: Корпоративные финансы 1С

В качестве процедуры:

Процедура УниверсальноеРегламентное(КлючРЗ="", Парам1="", Парам2="", Парам3="") Экспорт
	
	Если не СокрЛП(КлючРЗ) ="" Тогда //это регламентное из алгоритма
		
		Справочники.Алгоритмы.ВыполнитьАлгоритм(КлючРЗ, Новый Структура("Парам1, Парам2, Парам3", Парам1, Парам2, Парам3));	
	КонецЕсли;

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

Итого при создании регламентного в пользовательском режиме вам нужно указать первым параметром название алгоритма. Здесь прошито еще 3 параметра. Вы можете указать свои данные для регламентного – например, подразделение. Алгоритм видит эти параметры как ДопПараметры.Парам1, ДопПараметры.Парам2, ДопПараметры.Парам3

Вид созданного задания:

image 8 – Гранд Проект: Корпоративные финансы 1С

Здесь – АвтоФормирование это наименование алгоритма который будет выполняться из справочника Алгоритмы. Второй параметр произвольный – данные которые вы передаете в алгоритм. Здесь подразделение по которому нужно формировать чтото…

Второй механизм проще – аналог констант, регистр сведений ХранимыеЗначения. Периодический. Состав данных определите сами

image 9 – Гранд Проект: Корпоративные финансы 1С
image 10 – Гранд Проект: Корпоративные финансы 1С

Имя – Строка 20
ТипЗначения – Строка 100
Имя и типЗначения просто составной ключ для поиска нужного значения. В качестве типаЗначения используется тип данных  для возврата пустого значения — если нет записи. В другом варианте сюда заносил подсистему к которой относится переменная – упрощает редактирование пользователю, особенно когда значений уже поднакопилось.
Значение — Составной тип данных: Строка, Число, и т.д.….

В модуль менеджера добавляем функцию:

Функция ПолучитьХран(Ключ, ТипЗнач="", Дата="") Экспорт
	УстановитьПривилегированныйРежим(Истина);
	Запрос	= Новый Запрос;
	Запрос.УстановитьПараметр("Ключ"				, Ключ);
	Запрос.УстановитьПараметр("Дата"	,?(Дата="", Дата('00010101'), Дата));
	Запрос.УстановитьПараметр("ТипЗнач"	,ТипЗнач);

	
	Запрос.Текст = 
	"ВЫБРАТЬ
	|	ХранимыеЗначенияСрезПоследних.Период КАК Период,
	|	ХранимыеЗначенияСрезПоследних.Имя КАК Имя,
	|	ХранимыеЗначенияСрезПоследних.ТипЗначения КАК ТипЗначения,
	|	ХранимыеЗначенияСрезПоследних.Значение КАК Значение,
	|	ХранимыеЗначенияСрезПоследних.Комментарий КАК Комментарий
	|ИЗ
	|	РегистрСведений.ХранимыеЗначения.СрезПоследних(
	|			&Дата,
	|			ТипЗначения = &ТипЗнач
	|				И имя = &Ключ) КАК ХранимыеЗначенияСрезПоследних";
	Выборка = Запрос.Выполнить().Выбрать();
	
	Если Выборка.Следующий() Тогда
		Возврат Выборка.Значение;
	ИначеЕсли ТипЗнач	="Дата" Тогда
		Возврат Дата("00010101");
	ИначеЕсли ТипЗнач	="Булево" Тогда
		Возврат Дата(Ложь);
	ИначеЕсли ТипЗнач	="Строка" Тогда
		Возврат "";
	Иначе
		Возврат Неопределено;
	КонецЕсли;
	
	
	УстановитьПривилегированныйРежим(Ложь);

КонецФункции

Теперь из любого места конфигурации можем вызвать ее:

стрП	=РегистрыСведений.ХранимыеЗначения.ПолучитьХран("ПолноеРедакт", "Строка");

В качестве значения может быть либо ссылка либо к примеру список кодов справочников через запятую. Их после получения придется обработать – но зато его может редактировать пользователь. Если очень надо через ЗначениеВСтрокуВнутр можно сохранять массивы, списки, таблицы значений и т.д.. 

По  практике постоянно использую Хранимые, HTTPсервис и Регламентное. 

В расширении абсолютно тот же код, еще и без регламентного. Выложено для тех кто не хочет заморачиваться с кодом. Не думаю что копипаст займет больше часа ).

Код тестировался на платформе 1С:Предприятие 8.3 (8.3.15.1830) на управляемых формах. В рабочей базе работает под обычными формами.

Поделитесь с коллегами