mirror of
https://github.com/firstBitSportivnaya/PSSL.git
synced 2025-01-26 03:52:13 +02:00
Added universal func for execute custom functions (#66)
Доработана подсистема пользовательских функций
This commit is contained in:
parent
99a7374d0a
commit
9ecdbf5b8a
@ -393,54 +393,6 @@
|
||||
<DataHistory>Use</DataHistory>
|
||||
</Properties>
|
||||
</Attribute>
|
||||
<Attribute uuid="55633158-5ec1-443f-bce2-095b9fb272e9">
|
||||
<Properties>
|
||||
<Name>Описание</Name>
|
||||
<Synonym>
|
||||
<v8:item>
|
||||
<v8:lang>ru</v8:lang>
|
||||
<v8:content>Описание</v8:content>
|
||||
</v8:item>
|
||||
<v8:item>
|
||||
<v8:lang>en</v8:lang>
|
||||
<v8:content>Description</v8:content>
|
||||
</v8:item>
|
||||
</Synonym>
|
||||
<Comment/>
|
||||
<Type>
|
||||
<v8:Type>xs:string</v8:Type>
|
||||
<v8:StringQualifiers>
|
||||
<v8:Length>0</v8:Length>
|
||||
<v8:AllowedLength>Variable</v8:AllowedLength>
|
||||
</v8:StringQualifiers>
|
||||
</Type>
|
||||
<PasswordMode>false</PasswordMode>
|
||||
<Format/>
|
||||
<EditFormat/>
|
||||
<ToolTip/>
|
||||
<MarkNegatives>false</MarkNegatives>
|
||||
<Mask/>
|
||||
<MultiLine>false</MultiLine>
|
||||
<ExtendedEdit>false</ExtendedEdit>
|
||||
<MinValue xsi:nil="true"/>
|
||||
<MaxValue xsi:nil="true"/>
|
||||
<FillFromFillingValue>false</FillFromFillingValue>
|
||||
<FillValue xsi:nil="true"/>
|
||||
<FillChecking>DontCheck</FillChecking>
|
||||
<ChoiceFoldersAndItems>Items</ChoiceFoldersAndItems>
|
||||
<ChoiceParameterLinks/>
|
||||
<ChoiceParameters/>
|
||||
<QuickChoice>Auto</QuickChoice>
|
||||
<CreateOnInput>Auto</CreateOnInput>
|
||||
<ChoiceForm/>
|
||||
<LinkByType/>
|
||||
<ChoiceHistoryOnInput>Auto</ChoiceHistoryOnInput>
|
||||
<Use>ForItem</Use>
|
||||
<Indexing>DontIndex</Indexing>
|
||||
<FullTextSearch>Use</FullTextSearch>
|
||||
<DataHistory>Use</DataHistory>
|
||||
</Properties>
|
||||
</Attribute>
|
||||
<Attribute uuid="cac666e3-1c3c-4135-bb7c-e9c8838a9d34">
|
||||
<Properties>
|
||||
<Name>ТипВозвращаемогоЗначения</Name>
|
||||
@ -632,47 +584,6 @@
|
||||
<DataHistory>Use</DataHistory>
|
||||
</Properties>
|
||||
</Attribute>
|
||||
<Attribute uuid="5b112e4b-dce5-4c96-86d3-b0bc7bf96726">
|
||||
<Properties>
|
||||
<Name>ТипПараметра</Name>
|
||||
<Synonym>
|
||||
<v8:item>
|
||||
<v8:lang>ru</v8:lang>
|
||||
<v8:content>Тип параметра</v8:content>
|
||||
</v8:item>
|
||||
<v8:item>
|
||||
<v8:lang>en</v8:lang>
|
||||
<v8:content>Parameter Type</v8:content>
|
||||
</v8:item>
|
||||
</Synonym>
|
||||
<Comment/>
|
||||
<Type>
|
||||
<v8:Type>v8:ValueStorage</v8:Type>
|
||||
</Type>
|
||||
<PasswordMode>false</PasswordMode>
|
||||
<Format/>
|
||||
<EditFormat/>
|
||||
<ToolTip/>
|
||||
<MarkNegatives>false</MarkNegatives>
|
||||
<Mask/>
|
||||
<MultiLine>false</MultiLine>
|
||||
<ExtendedEdit>false</ExtendedEdit>
|
||||
<MinValue xsi:nil="true"/>
|
||||
<MaxValue xsi:nil="true"/>
|
||||
<FillChecking>DontCheck</FillChecking>
|
||||
<ChoiceFoldersAndItems>Items</ChoiceFoldersAndItems>
|
||||
<ChoiceParameterLinks/>
|
||||
<ChoiceParameters/>
|
||||
<QuickChoice>Auto</QuickChoice>
|
||||
<CreateOnInput>Auto</CreateOnInput>
|
||||
<ChoiceForm/>
|
||||
<LinkByType/>
|
||||
<ChoiceHistoryOnInput>Auto</ChoiceHistoryOnInput>
|
||||
<Indexing>DontIndex</Indexing>
|
||||
<FullTextSearch>Use</FullTextSearch>
|
||||
<DataHistory>Use</DataHistory>
|
||||
</Properties>
|
||||
</Attribute>
|
||||
<Attribute uuid="ed036b65-226b-42e4-ae09-bf1436fa0120">
|
||||
<Properties>
|
||||
<Name>Наименование</Name>
|
||||
@ -718,50 +629,39 @@
|
||||
<DataHistory>Use</DataHistory>
|
||||
</Properties>
|
||||
</Attribute>
|
||||
<Attribute uuid="8e72b20d-8eae-4026-88be-7ac8447469d7">
|
||||
<Attribute uuid="50282414-75c3-4d5b-a39b-1afa2cca73c3">
|
||||
<Properties>
|
||||
<Name>ЗначениеПоУмолчанию</Name>
|
||||
<Name>Тип</Name>
|
||||
<Synonym>
|
||||
<v8:item>
|
||||
<v8:lang>ru</v8:lang>
|
||||
<v8:content>Значение по умолчанию</v8:content>
|
||||
</v8:item>
|
||||
<v8:item>
|
||||
<v8:lang>en</v8:lang>
|
||||
<v8:content>Default Value</v8:content>
|
||||
<v8:content>Тип</v8:content>
|
||||
</v8:item>
|
||||
</Synonym>
|
||||
<Comment/>
|
||||
<Comment>Тип</Comment>
|
||||
<Type>
|
||||
<v8:Type>xs:boolean</v8:Type>
|
||||
<v8:Type>xs:string</v8:Type>
|
||||
<v8:Type>xs:dateTime</v8:Type>
|
||||
<v8:Type>xs:decimal</v8:Type>
|
||||
<v8:TypeSet>cfg:AnyRef</v8:TypeSet>
|
||||
<v8:NumberQualifiers>
|
||||
<v8:Digits>10</v8:Digits>
|
||||
<v8:FractionDigits>0</v8:FractionDigits>
|
||||
<v8:AllowedSign>Any</v8:AllowedSign>
|
||||
</v8:NumberQualifiers>
|
||||
<v8:StringQualifiers>
|
||||
<v8:Length>10</v8:Length>
|
||||
<v8:Length>0</v8:Length>
|
||||
<v8:AllowedLength>Variable</v8:AllowedLength>
|
||||
</v8:StringQualifiers>
|
||||
<v8:DateQualifiers>
|
||||
<v8:DateFractions>Date</v8:DateFractions>
|
||||
</v8:DateQualifiers>
|
||||
</Type>
|
||||
<PasswordMode>false</PasswordMode>
|
||||
<Format/>
|
||||
<EditFormat/>
|
||||
<ToolTip/>
|
||||
<ToolTip>
|
||||
<v8:item>
|
||||
<v8:lang>ru</v8:lang>
|
||||
<v8:content>Тип параметра</v8:content>
|
||||
</v8:item>
|
||||
</ToolTip>
|
||||
<MarkNegatives>false</MarkNegatives>
|
||||
<Mask/>
|
||||
<MultiLine>false</MultiLine>
|
||||
<ExtendedEdit>false</ExtendedEdit>
|
||||
<MinValue xsi:nil="true"/>
|
||||
<MaxValue xsi:nil="true"/>
|
||||
<FillChecking>DontCheck</FillChecking>
|
||||
<FillChecking>ShowError</FillChecking>
|
||||
<ChoiceFoldersAndItems>Items</ChoiceFoldersAndItems>
|
||||
<ChoiceParameterLinks/>
|
||||
<ChoiceParameters/>
|
||||
@ -816,52 +716,6 @@
|
||||
<DataHistory>Use</DataHistory>
|
||||
</Properties>
|
||||
</Attribute>
|
||||
<Attribute uuid="50282414-75c3-4d5b-a39b-1afa2cca73c3">
|
||||
<Properties>
|
||||
<Name>Тип</Name>
|
||||
<Synonym>
|
||||
<v8:item>
|
||||
<v8:lang>ru</v8:lang>
|
||||
<v8:content>Тип</v8:content>
|
||||
</v8:item>
|
||||
</Synonym>
|
||||
<Comment>Тип</Comment>
|
||||
<Type>
|
||||
<v8:Type>xs:string</v8:Type>
|
||||
<v8:StringQualifiers>
|
||||
<v8:Length>0</v8:Length>
|
||||
<v8:AllowedLength>Variable</v8:AllowedLength>
|
||||
</v8:StringQualifiers>
|
||||
</Type>
|
||||
<PasswordMode>false</PasswordMode>
|
||||
<Format/>
|
||||
<EditFormat/>
|
||||
<ToolTip>
|
||||
<v8:item>
|
||||
<v8:lang>ru</v8:lang>
|
||||
<v8:content>Тип параметра</v8:content>
|
||||
</v8:item>
|
||||
</ToolTip>
|
||||
<MarkNegatives>false</MarkNegatives>
|
||||
<Mask/>
|
||||
<MultiLine>false</MultiLine>
|
||||
<ExtendedEdit>false</ExtendedEdit>
|
||||
<MinValue xsi:nil="true"/>
|
||||
<MaxValue xsi:nil="true"/>
|
||||
<FillChecking>DontCheck</FillChecking>
|
||||
<ChoiceFoldersAndItems>Items</ChoiceFoldersAndItems>
|
||||
<ChoiceParameterLinks/>
|
||||
<ChoiceParameters/>
|
||||
<QuickChoice>Auto</QuickChoice>
|
||||
<CreateOnInput>Auto</CreateOnInput>
|
||||
<ChoiceForm/>
|
||||
<LinkByType/>
|
||||
<ChoiceHistoryOnInput>Auto</ChoiceHistoryOnInput>
|
||||
<Indexing>DontIndex</Indexing>
|
||||
<FullTextSearch>Use</FullTextSearch>
|
||||
<DataHistory>Use</DataHistory>
|
||||
</Properties>
|
||||
</Attribute>
|
||||
</ChildObjects>
|
||||
</TabularSection>
|
||||
<TabularSection uuid="ad25fde7-2eab-4cf5-a3b9-174008de7522">
|
||||
|
@ -60,23 +60,13 @@
|
||||
|
||||
#Область СлужебныеПроцедурыИФункции
|
||||
|
||||
&НаСервереБезКонтекста
|
||||
Процедура ОчиститьНеиспользуемыеНастройки(Адрес)
|
||||
УдалитьИзВременногоХранилища(Адрес);
|
||||
КонецПроцедуры
|
||||
|
||||
&НаСервере
|
||||
Функция АдресМассиваВХранилище()
|
||||
|
||||
Адрес = "";
|
||||
Если ЗначениеЗаполнено(Массив) Тогда
|
||||
Результат = Массив.ВыгрузитьЗначения();
|
||||
// Если коллекция помещена в хранилище перезапишем в тот же адрес
|
||||
УИД = ?(ПустаяСтрока(АдресЗначения), Новый УникальныйИдентификатор, АдресЗначения);
|
||||
Адрес = ПоместитьВоВременноеХранилище(Результат, УИД);
|
||||
Иначе
|
||||
ОчиститьНеиспользуемыеНастройки(АдресЗначения);
|
||||
КонецЕсли;
|
||||
Результат = Массив.ВыгрузитьЗначения();
|
||||
// Если коллекция помещена в хранилище перезапишем в тот же адрес
|
||||
УИД = ?(ПустаяСтрока(АдресЗначения), Новый УникальныйИдентификатор, АдресЗначения);
|
||||
Адрес = ПоместитьВоВременноеХранилище(Результат, УИД);
|
||||
|
||||
Возврат Адрес;
|
||||
|
||||
|
@ -80,26 +80,15 @@
|
||||
|
||||
#Область СлужебныеПроцедурыИФункции
|
||||
|
||||
&НаСервереБезКонтекста
|
||||
Процедура ОчиститьНеиспользуемыеНастройки(Адрес)
|
||||
УдалитьИзВременногоХранилища(Адрес);
|
||||
КонецПроцедуры
|
||||
|
||||
&НаСервере
|
||||
Функция АдресСтруктурыВХранилище()
|
||||
|
||||
Адрес = "";
|
||||
|
||||
Если ЗначениеЗаполнено(Структура) Тогда
|
||||
Результат = Новый Структура;
|
||||
Для Каждого Пара Из Структура Цикл
|
||||
Результат.Вставить(Пара.Ключ, Пара.Значение);
|
||||
КонецЦикла;
|
||||
УИД = ?(ПустаяСтрока(АдресЗначения), Новый УникальныйИдентификатор, АдресЗначения);
|
||||
Адрес = ПоместитьВоВременноеХранилище(Результат, УИД);
|
||||
Иначе
|
||||
ОчиститьНеиспользуемыеНастройки(АдресЗначения);
|
||||
КонецЕсли;
|
||||
Результат = Новый Структура;
|
||||
Для Каждого Пара Из Структура Цикл
|
||||
Результат.Вставить(Пара.Ключ, Пара.Значение);
|
||||
КонецЦикла;
|
||||
УИД = ?(ПустаяСтрока(АдресЗначения), Новый УникальныйИдентификатор, АдресЗначения);
|
||||
Адрес = ПоместитьВоВременноеХранилище(Результат, УИД);
|
||||
|
||||
Возврат Адрес;
|
||||
|
||||
|
@ -107,22 +107,12 @@
|
||||
|
||||
#Область СлужебныеПроцедурыИФункции
|
||||
|
||||
&НаСервереБезКонтекста
|
||||
Процедура ОчиститьНеиспользуемыеНастройки(Адрес)
|
||||
УдалитьИзВременногоХранилища(Адрес);
|
||||
КонецПроцедуры
|
||||
|
||||
&НаСервере
|
||||
Функция АдресТаблицыВХранилище()
|
||||
|
||||
Адрес = "";
|
||||
Если ЗначениеЗаполнено(СтрокиТаблицыЗначений) Тогда
|
||||
УИД = ?(ПустаяСтрока(АдресЗначения), Новый УникальныйИдентификатор, АдресЗначения);
|
||||
ТаблицаЗначений = СтрокиТаблицыЗначений.Выгрузить();
|
||||
Адрес = ПоместитьВоВременноеХранилище(ТаблицаЗначений, УИД);
|
||||
Иначе
|
||||
ОчиститьНеиспользуемыеНастройки(АдресЗначения);
|
||||
КонецЕсли;
|
||||
УИД = ?(ПустаяСтрока(АдресЗначения), Новый УникальныйИдентификатор, АдресЗначения);
|
||||
ТаблицаЗначений = СтрокиТаблицыЗначений.Выгрузить();
|
||||
Адрес = ПоместитьВоВременноеХранилище(ТаблицаЗначений, УИД);
|
||||
|
||||
Возврат Адрес;
|
||||
|
||||
|
@ -128,7 +128,7 @@
|
||||
СохранитьКаталогИсходногоКодаКонфигурации(КаталогИсходногоКодаКонфигурации);
|
||||
КонецЕсли;
|
||||
|
||||
СохранитьПараметрыФункции();
|
||||
СохранитьПараметрыФункции(Отказ);
|
||||
|
||||
КонецПроцедуры
|
||||
|
||||
@ -244,6 +244,8 @@
|
||||
ТекДанные.ТипВФорме = ВыбранныйЭлемент.Представление;
|
||||
// Доработать, отражение количество элементов в коллекции, условное оформление - цвет текста, запрет изменения
|
||||
ТекДанные.ЗначениеВФорме = ВыбранныйЭлемент.Представление;
|
||||
ПустаяКоллекция = Новый(Тип(ВыбранныйЭлемент.Значение));
|
||||
ТекДанные.АдресЗначения = ПоместитьВоВременноеХранилище(ПустаяКоллекция, Новый УникальныйИдентификатор);
|
||||
Иначе
|
||||
ИнициализацияТипаИЗначенияПараметра(ТекДанные, ВыбранныйЭлемент);
|
||||
КонецЕсли;
|
||||
@ -502,37 +504,17 @@
|
||||
&НаСервере
|
||||
Процедура ВыполнитьКодСервер()
|
||||
|
||||
СтрПеременные = Новый Структура;
|
||||
|
||||
Для Каждого СтрокаТаблицы Из Объект.Переменные Цикл
|
||||
Если Не ПустаяСтрока(СтрокаТаблицы.Имя) И Не СтрПеременные.Свойство(СтрокаТаблицы.Имя) Тогда
|
||||
СтрПеременные.Вставить(СтрокаТаблицы.Имя, СтрокаТаблицы.Значение);
|
||||
КонецЕсли;
|
||||
КонецЦикла;
|
||||
|
||||
ТабПараметров = Новый ТаблицаЗначений;
|
||||
ТабПараметров.Колонки.Добавить("Номер");
|
||||
ТабПараметров.Колонки.Добавить("Параметр");
|
||||
ТабПараметров.Колонки.Добавить("Значение");
|
||||
|
||||
ЗначенияПараметровФункции = ПолучитьПараметрыФункции();
|
||||
Для Каждого Стр Из Объект.ПараметрыФункции Цикл
|
||||
НоваяСтрока = ТабПараметров.Добавить();
|
||||
НоваяСтрока.Номер = Стр.НомерСтроки;
|
||||
НоваяСтрока.Параметр = Стр.Наименование;
|
||||
Значение = ЗначенияПараметровФункции.Получить(Стр.Идентификатор);
|
||||
Если ЗначениеЗаполнено(Значение) Тогда
|
||||
НоваяСтрока.Значение = Значение.Значение;
|
||||
КонецЕсли;
|
||||
КонецЦикла;
|
||||
|
||||
// Чтобы текст функции не изменился сформируем его копию.
|
||||
ТекстФункции = Строка(Объект.КодПодпрограммы);
|
||||
ПараметрыФункции = Новый Структура;
|
||||
Для Каждого Стр Из Объект.ПараметрыФункции Цикл
|
||||
СтрокаПараметра = ЗначенияПараметровФункции.Получить(Стр.Идентификатор);
|
||||
Значение = ?(СтрокаПараметра = Неопределено, Неопределено, СтрокаПараметра.Значение);
|
||||
ПараметрыФункции.Вставить(Стр.Наименование, Значение);
|
||||
КонецЦикла;
|
||||
|
||||
Попытка
|
||||
|
||||
Результат = __ОбщегоНазначенияСервер.ВыполнитьПользовательскуюФункциюСПараметрами(ТекстФункции,
|
||||
ТабПараметров, СтрПеременные);
|
||||
Результат = __ОбщегоНазначенияСервер.ВыполнитьПользовательскуюФункциюСПараметрами(Объект.Ссылка, ПараметрыФункции);
|
||||
__ОбщегоНазначенияСлужебный.СообщитьПользователю(Строка(Результат));
|
||||
Исключение
|
||||
|
||||
@ -2056,11 +2038,11 @@
|
||||
КонецПроцедуры
|
||||
|
||||
&НаСервере
|
||||
Процедура СохранитьПараметрыФункции()
|
||||
Процедура СохранитьПараметрыФункции(Отказ = Ложь)
|
||||
|
||||
НастройкиПараметров = ПолучитьПараметрыФункции();
|
||||
|
||||
// ключ - Идентификатор параметра, значение - Структура("Тип,Значение")
|
||||
// Ключ - Идентификатор параметра, Значение - Структура("Имя,Тип,Значение")
|
||||
Данные = Новый Соответствие;
|
||||
Для Каждого Параметр Из Объект.ПараметрыФункции Цикл
|
||||
ОписаниеПараметра = Новый Структура;
|
||||
|
@ -411,68 +411,6 @@
|
||||
|
||||
КонецФункции // ОпределитьРежимВывода()
|
||||
|
||||
// Выполняет произвольный код с параметрами.
|
||||
//
|
||||
// Параметры:
|
||||
// Текст функции - Произвольный.
|
||||
// СтруктураПараметров - Массив структур (Номер, Значение).
|
||||
// Переменные - Структура - Структура переменных функции.
|
||||
//
|
||||
// Возвращаемое значение:
|
||||
// Неопределено, в случае успешного выполнения, Описание ошибки, в случае неудачи.
|
||||
//
|
||||
Функция ВыполнитьПользовательскуюФункциюСПараметрами(ТекстФункции, СтруктураПараметров, Переменные) Экспорт
|
||||
|
||||
// Служебные переменные для передачи параметров функции.
|
||||
Перем П1, П2, П3, П4, П5, П6, П7, П8, П9, П10;
|
||||
|
||||
Для Каждого Параметр Из СтруктураПараметров Цикл
|
||||
|
||||
Если Параметр.Номер = 1 Тогда
|
||||
П1 = Параметр.Значение;
|
||||
ТекстФункции = СтрЗаменить(ТекстФункции, Параметр.Параметр, "П1");
|
||||
ИначеЕсли Параметр.Номер = 2 Тогда
|
||||
П2 = Параметр.Значение;
|
||||
ТекстФункции = СтрЗаменить(ТекстФункции, Параметр.Параметр, "П2");
|
||||
ИначеЕсли Параметр.Номер = 3 Тогда
|
||||
П3 = Параметр.Значение;
|
||||
ТекстФункции = СтрЗаменить(ТекстФункции, Параметр.Параметр, "П3");
|
||||
ИначеЕсли Параметр.Номер = 4 Тогда
|
||||
П4 = Параметр.Значение;
|
||||
ТекстФункции = СтрЗаменить(ТекстФункции, Параметр.Параметр, "П4");
|
||||
ИначеЕсли Параметр.Номер = 5 Тогда
|
||||
П5 = Параметр.Значение;
|
||||
ТекстФункции = СтрЗаменить(ТекстФункции, Параметр.Параметр, "П5");
|
||||
ИначеЕсли Параметр.Номер = 6 Тогда
|
||||
П6 = Параметр.Значение;
|
||||
ТекстФункции = СтрЗаменить(ТекстФункции, Параметр.Параметр, "П6");
|
||||
ИначеЕсли Параметр.Номер = 7 Тогда
|
||||
П7 = Параметр.Значение;
|
||||
ТекстФункции = СтрЗаменить(ТекстФункции, Параметр.Параметр, "П7");
|
||||
ИначеЕсли Параметр.Номер = 8 Тогда
|
||||
П8 = Параметр.Значение;
|
||||
ТекстФункции = СтрЗаменить(ТекстФункции, Параметр.Параметр, "П8");
|
||||
ИначеЕсли Параметр.Номер = 9 Тогда
|
||||
П9 = Параметр.Значение;
|
||||
ТекстФункции = СтрЗаменить(ТекстФункции, Параметр.Параметр, "П9");
|
||||
ИначеЕсли Параметр.Номер = 10 Тогда
|
||||
П10 = Параметр.Значение;
|
||||
ТекстФункции = СтрЗаменить(ТекстФункции, Параметр.Параметр, "П10");
|
||||
КонецЕсли;
|
||||
КонецЦикла;
|
||||
|
||||
Результат = Неопределено;
|
||||
|
||||
Попытка
|
||||
Выполнить(ТекстФункции);
|
||||
Исключение
|
||||
ВызватьИсключение КраткоеПредставлениеОшибки(ИнформацияОбОшибке());
|
||||
КонецПопытки;
|
||||
|
||||
Возврат Результат;
|
||||
|
||||
КонецФункции // ВыполнитьПользовательскуюФункциюСПараметрами()
|
||||
|
||||
// Добавляет новую строку "ДобавляемаяСтрока" к тексту "Текст".
|
||||
//
|
||||
// Параметры:
|
||||
@ -1865,6 +1803,92 @@
|
||||
|
||||
#КонецОбласти
|
||||
|
||||
#Область ПользовательскиеФункции
|
||||
|
||||
// Выполняет пользовательскую функцию с переданными параметрами.
|
||||
//
|
||||
// Параметры:
|
||||
// Ссылка - СправочникСсылка.__ПользовательскиеФункции - Ссылка пользовательской функции,
|
||||
// которую требуется выполнить
|
||||
// Параметры - Структура - Подготовленные параметры для выполнения пользовательской функции
|
||||
// * Ключ - Строка - Имя параметра
|
||||
// * Значение - Структура - Значение параметра
|
||||
//
|
||||
// Возвращаемое значение:
|
||||
// Неопределено, в - случае успешного выполнения, Описание ошибки, в случае неудачи.
|
||||
//
|
||||
Функция ВыполнитьПользовательскуюФункциюСПараметрами(Ссылка, Параметры) Экспорт
|
||||
|
||||
Отказ = Ложь;
|
||||
Результат = Неопределено;
|
||||
|
||||
Запрос = Новый Запрос;
|
||||
Запрос.Текст =
|
||||
"ВЫБРАТЬ
|
||||
| __ПользовательскиеФункции.КодПодпрограммы КАК КодПодпрограммы
|
||||
|ИЗ
|
||||
| Справочник.__ПользовательскиеФункции КАК __ПользовательскиеФункции
|
||||
|ГДЕ
|
||||
| __ПользовательскиеФункции.Ссылка = &Ссылка
|
||||
|;
|
||||
|
|
||||
|////////////////////////////////////////////////////////////////////////////////
|
||||
|ВЫБРАТЬ
|
||||
| __ПользовательскиеФункцииПараметрыФункции.Наименование КАК Наименование,
|
||||
| __ПользовательскиеФункцииПараметрыФункции.Тип КАК Тип,
|
||||
| __ПользовательскиеФункцииПараметрыФункции.Необязательный КАК Необязательный
|
||||
|ИЗ
|
||||
| Справочник.__ПользовательскиеФункции.ПараметрыФункции КАК __ПользовательскиеФункцииПараметрыФункции
|
||||
|ГДЕ
|
||||
| __ПользовательскиеФункцииПараметрыФункции.Ссылка = &Ссылка
|
||||
|;
|
||||
|
|
||||
|////////////////////////////////////////////////////////////////////////////////
|
||||
|ВЫБРАТЬ РАЗЛИЧНЫЕ
|
||||
| __ПользовательскиеФункцииПеременные.Имя КАК Имя,
|
||||
| __ПользовательскиеФункцииПеременные.Значение КАК Значение
|
||||
|ИЗ
|
||||
| Справочник.__ПользовательскиеФункции.Переменные КАК __ПользовательскиеФункцииПеременные
|
||||
|ГДЕ
|
||||
| __ПользовательскиеФункцииПеременные.Ссылка = &Ссылка";
|
||||
|
||||
Запрос.УстановитьПараметр("Ссылка", Ссылка);
|
||||
|
||||
РезультатыЗапроса = Запрос.ВыполнитьПакет();
|
||||
|
||||
Выборка = РезультатыЗапроса[0].Выбрать();
|
||||
ВыборкаТЧ = РезультатыЗапроса[1].Выбрать();
|
||||
ВыборкаПерем = РезультатыЗапроса[2].Выбрать();
|
||||
|
||||
Выборка.Следующий();
|
||||
ТекстФункции = Выборка.КодПодпрограммы;
|
||||
|
||||
Переменные = Новый Структура;
|
||||
Пока ВыборкаПерем.Следующий() Цикл
|
||||
Если ПустаяСтрока(ВыборкаПерем.Имя) И Переменные.Свойство(ВыборкаПерем.Имя) Тогда
|
||||
Продолжить;
|
||||
КонецЕсли;
|
||||
Переменные.Вставить(ВыборкаПерем.Имя, ВыборкаПерем.Значение);
|
||||
КонецЦикла;
|
||||
|
||||
Параметры = ПодставитьПараметрыВФункцию(ТекстФункции, Параметры, ВыборкаТЧ, Отказ);
|
||||
|
||||
Если Отказ Тогда
|
||||
ВызватьИсключение(НСтр("ru='Ошибки при подстановке параметров!.'"));
|
||||
КонецЕсли;
|
||||
|
||||
Попытка
|
||||
Выполнить(ТекстФункции);
|
||||
Исключение
|
||||
ВызватьИсключение КраткоеПредставлениеОшибки(ИнформацияОбОшибке());
|
||||
КонецПопытки;
|
||||
|
||||
Возврат Результат;
|
||||
|
||||
КонецФункции
|
||||
|
||||
#КонецОбласти
|
||||
|
||||
#КонецОбласти // ПрограммныйИнтерфейс
|
||||
|
||||
#Область СлужебныеПроцедурыИФункции
|
||||
@ -2346,4 +2370,108 @@
|
||||
|
||||
#КонецОбласти
|
||||
|
||||
#КонецОбласти // СлужебныеПроцедурыИФункции
|
||||
#Область ПользовательскиеФункции
|
||||
|
||||
// Процедура - Подставить параметры в функцию
|
||||
//
|
||||
// Параметры:
|
||||
// Текст - Строка - Исходный текст
|
||||
// Параметры - Структура - Подготовленные параметры для выполнения пользовательской функции
|
||||
// * Ключ - Строка - Имя параметра
|
||||
// * Значение - Произвольный - Значение параметра
|
||||
// Выборка - ВыборкаИзРезультатаЗапроса - Проверямые параметры функции.
|
||||
// * Наименование - Строка - Имя параметра
|
||||
// * Необязательный - Булево - Если Необязательный = Ложь и параметра нет в структуре параметров,
|
||||
// то функция не будет выполнена
|
||||
// * Тип - Строка - Представление типа значения параметра
|
||||
// Отказ - Булево
|
||||
//
|
||||
// Возвращаемое значение:
|
||||
// Структура - Заполненные параметры.
|
||||
// * Ключ - Строка - Имя параметра;
|
||||
// * Значение - Произвольный - Значение подставляемого параметра.
|
||||
//
|
||||
Функция ПодставитьПараметрыВФункцию(Текст, Параметры, Выборка, Отказ = Ложь)
|
||||
|
||||
Парам = Новый Структура;
|
||||
Пока Выборка.Следующий() Цикл
|
||||
Значение = Неопределено;
|
||||
Если Параметры.Свойство(Выборка.Наименование, Значение) Тогда
|
||||
ТипПараметра = ТипЗнч(Значение);
|
||||
Если ТипПараметра <> Тип(Выборка.Тип) Тогда
|
||||
ТекстСообщения = СтрШаблон(НСтр("ru='Тип значения параметра %1 - %2. Допустимый - %3!'"),
|
||||
Выборка.Наименование,
|
||||
ТипПараметра,
|
||||
Выборка.Тип);
|
||||
__ОбщегоНазначенияСлужебный.СообщитьПользователю(ТекстСообщения, , , , Отказ);
|
||||
КонецЕсли;
|
||||
ИначеЕсли Выборка.Необязательный = Ложь Тогда
|
||||
ТекстСообщения = СтрШаблон(НСтр("ru='Параметр: %1, является обязательным!'"), Выборка.Наименование);
|
||||
__ОбщегоНазначенияСлужебный.СообщитьПользователю(ТекстСообщения, , , , Отказ);
|
||||
КонецЕсли;
|
||||
|
||||
Если Отказ Тогда
|
||||
Продолжить;
|
||||
КонецЕсли;
|
||||
|
||||
Парам.Вставить(Выборка.Наименование, Значение);
|
||||
ЗаменаПодстроки(Текст, Выборка.Наименование);
|
||||
КонецЦикла;
|
||||
|
||||
Возврат Парам;
|
||||
|
||||
КонецФункции
|
||||
|
||||
// Предназначена для поиска и замены параметров в исходной строке,
|
||||
// замена по ключу происходит в случае если перед ключом стоит не буквенно-числовой символ.
|
||||
//
|
||||
// Параметры:
|
||||
// Текст - Строка - Исходный текст
|
||||
// Ключ - Строка - По ключу осуществляется поиск и замена
|
||||
//
|
||||
Процедура ЗаменаПодстроки(Текст, Ключ)
|
||||
|
||||
Префикс = "Параметры.";
|
||||
Позиция = СтрНайти(Текст, Ключ);
|
||||
Пока Позиция > 0 Цикл
|
||||
|
||||
СимволДо = ?(Позиция = 1, "", Сред(Текст, Позиция - 1, 1));
|
||||
КодДо = КодСимвола(НРег(СимволДо));
|
||||
|
||||
СимволПосле = Сред(Текст, Позиция + СтрДлина(Ключ), 1);
|
||||
КодПосле = КодСимвола(НРег(СимволПосле));
|
||||
|
||||
Если ЭтоДопустимыйСимвол(КодДо) И ЭтоДопустимыйСимвол(КодПосле) Тогда
|
||||
Текст = СтрЗаменить(Текст, СимволДо + Ключ + СимволПосле, СимволДо + Префикс + Ключ + СимволПосле);
|
||||
КонецЕсли;
|
||||
|
||||
Позиция = СтрНайти(Текст, Ключ, НаправлениеПоиска.СНачала, Позиция + СтрДлина(Префикс) + 1);
|
||||
|
||||
КонецЦикла;
|
||||
|
||||
КонецПроцедуры
|
||||
|
||||
// Проверка на допустимость символа, недопустимым является любой буквенно-цифровой символ,
|
||||
// а также любые региональные символы после 7Fh
|
||||
//
|
||||
// Параметры:
|
||||
// КодСимвола - Число - см. КодСимвола
|
||||
//
|
||||
// Возвращаемое значение:
|
||||
// Булево
|
||||
//
|
||||
Функция ЭтоДопустимыйСимвол(КодСимвола)
|
||||
|
||||
Если КодСимвола >= 48 И КодСимвола <= 57 // Цифры
|
||||
Или КодСимвола >= 97 И КодСимвола <= 122 // (en) буквы
|
||||
Или КодСимвола > 127 Тогда // региональные коды
|
||||
Возврат Ложь;
|
||||
КонецЕсли;
|
||||
|
||||
Возврат Истина;
|
||||
|
||||
КонецФункции
|
||||
|
||||
#КонецОбласти
|
||||
|
||||
#КонецОбласти // СлужебныеПроцедурыИФункции
|
||||
|
Loading…
x
Reference in New Issue
Block a user