1
0
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:
DenisUshakov 2024-05-03 15:35:58 +03:00 committed by GitHub
parent 99a7374d0a
commit 9ecdbf5b8a
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
6 changed files with 228 additions and 295 deletions

View File

@ -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">

View File

@ -60,23 +60,13 @@
#Область СлужебныеПроцедурыИФункции
&НаСервереБезКонтекста
Процедура ОчиститьНеиспользуемыеНастройки(Адрес)
УдалитьИзВременногоХранилища(Адрес);
КонецПроцедуры
&НаСервере
Функция АдресМассиваВХранилище()
Адрес = "";
Если ЗначениеЗаполнено(Массив) Тогда
Результат = Массив.ВыгрузитьЗначения();
// Если коллекция помещена в хранилище перезапишем в тот же адрес
УИД = ?(ПустаяСтрока(АдресЗначения), Новый УникальныйИдентификатор, АдресЗначения);
Адрес = ПоместитьВоВременноеХранилище(Результат, УИД);
Иначе
ОчиститьНеиспользуемыеНастройки(АдресЗначения);
КонецЕсли;
Результат = Массив.ВыгрузитьЗначения();
// Если коллекция помещена в хранилище перезапишем в тот же адрес
УИД = ?(ПустаяСтрока(АдресЗначения), Новый УникальныйИдентификатор, АдресЗначения);
Адрес = ПоместитьВоВременноеХранилище(Результат, УИД);
Возврат Адрес;

View File

@ -80,26 +80,15 @@
#Область СлужебныеПроцедурыИФункции
&НаСервереБезКонтекста
Процедура ОчиститьНеиспользуемыеНастройки(Адрес)
УдалитьИзВременногоХранилища(Адрес);
КонецПроцедуры
&НаСервере
Функция АдресСтруктурыВХранилище()
Адрес = "";
Если ЗначениеЗаполнено(Структура) Тогда
Результат = Новый Структура;
Для Каждого Пара Из Структура Цикл
Результат.Вставить(Пара.Ключ, Пара.Значение);
КонецЦикла;
УИД = ?(ПустаяСтрока(АдресЗначения), Новый УникальныйИдентификатор, АдресЗначения);
Адрес = ПоместитьВоВременноеХранилище(Результат, УИД);
Иначе
ОчиститьНеиспользуемыеНастройки(АдресЗначения);
КонецЕсли;
Результат = Новый Структура;
Для Каждого Пара Из Структура Цикл
Результат.Вставить(Пара.Ключ, Пара.Значение);
КонецЦикла;
УИД = ?(ПустаяСтрока(АдресЗначения), Новый УникальныйИдентификатор, АдресЗначения);
Адрес = ПоместитьВоВременноеХранилище(Результат, УИД);
Возврат Адрес;

View File

@ -107,22 +107,12 @@
#Область СлужебныеПроцедурыИФункции
&НаСервереБезКонтекста
Процедура ОчиститьНеиспользуемыеНастройки(Адрес)
УдалитьИзВременногоХранилища(Адрес);
КонецПроцедуры
&НаСервере
Функция АдресТаблицыВХранилище()
Адрес = "";
Если ЗначениеЗаполнено(СтрокиТаблицыЗначений) Тогда
УИД = ?(ПустаяСтрока(АдресЗначения), Новый УникальныйИдентификатор, АдресЗначения);
ТаблицаЗначений = СтрокиТаблицыЗначений.Выгрузить();
Адрес = ПоместитьВоВременноеХранилище(ТаблицаЗначений, УИД);
Иначе
ОчиститьНеиспользуемыеНастройки(АдресЗначения);
КонецЕсли;
УИД = ?(ПустаяСтрока(АдресЗначения), Новый УникальныйИдентификатор, АдресЗначения);
ТаблицаЗначений = СтрокиТаблицыЗначений.Выгрузить();
Адрес = ПоместитьВоВременноеХранилище(ТаблицаЗначений, УИД);
Возврат Адрес;

View File

@ -128,7 +128,7 @@
СохранитьКаталогИсходногоКодаКонфигурации(КаталогИсходногоКодаКонфигурации);
КонецЕсли;
СохранитьПараметрыФункции();
СохранитьПараметрыФункции(Отказ);
КонецПроцедуры
@ -244,6 +244,8 @@
ТекДанные.ТипВФорме = ВыбранныйЭлемент.Представление;
// Доработать, отражение количество элементов в коллекции, условное оформление - цвет текста, запрет изменения
ТекДанные.ЗначениеВФорме = ВыбранныйЭлемент.Представление;
ПустаяКоллекция = Новый(Тип(ВыбранныйЭлемент.Значение));
ТекДанные.АдресЗначения = ПоместитьВоВременноеХранилище(ПустаяКоллекция, Новый УникальныйИдентификатор);
Иначе
ИнициализацияТипаИЗначенияПараметра(ТекДанные, ВыбранныйЭлемент);
КонецЕсли;
@ -502,37 +504,17 @@
&НаСервере
Процедура ВыполнитьКодСервер()
СтрПеременные = Новый Структура;
Для Каждого СтрокаТаблицы Из Объект.Переменные Цикл
Если Не ПустаяСтрока(СтрокаТаблицы.Имя) И Не СтрПеременные.Свойство(СтрокаТаблицы.Имя) Тогда
СтрПеременные.Вставить(СтрокаТаблицы.Имя, СтрокаТаблицы.Значение);
КонецЕсли;
КонецЦикла;
ТабПараметров = Новый ТаблицаЗначений;
ТабПараметров.Колонки.Добавить("Номер");
ТабПараметров.Колонки.Добавить("Параметр");
ТабПараметров.Колонки.Добавить("Значение");
ЗначенияПараметровФункции = ПолучитьПараметрыФункции();
Для Каждого Стр Из Объект.ПараметрыФункции Цикл
НоваяСтрока = ТабПараметров.Добавить();
НоваяСтрока.Номер = Стр.НомерСтроки;
НоваяСтрока.Параметр = Стр.Наименование;
Значение = ЗначенияПараметровФункции.Получить(Стр.Идентификатор);
Если ЗначениеЗаполнено(Значение) Тогда
НоваяСтрока.Значение = Значение.Значение;
КонецЕсли;
КонецЦикла;
// Чтобы текст функции не изменился сформируем его копию.
ТекстФункции = Строка(Объект.КодПодпрограммы);
ПараметрыФункции = Новый Структура;
Для Каждого Стр Из Объект.ПараметрыФункции Цикл
СтрокаПараметра = ЗначенияПараметровФункции.Получить(Стр.Идентификатор);
Значение = ?(СтрокаПараметра = Неопределено, Неопределено, СтрокаПараметра.Значение);
ПараметрыФункции.Вставить(Стр.Наименование, Значение);
КонецЦикла;
Попытка
Результат = __ОбщегоНазначенияСервер.ВыполнитьПользовательскуюФункциюСПараметрами(ТекстФункции,
ТабПараметров, СтрПеременные);
Результат = __ОбщегоНазначенияСервер.ВыполнитьПользовательскуюФункциюСПараметрами(Объект.Ссылка, ПараметрыФункции);
__ОбщегоНазначенияСлужебный.СообщитьПользователю(Строка(Результат));
Исключение
@ -2056,11 +2038,11 @@
КонецПроцедуры
&НаСервере
Процедура СохранитьПараметрыФункции()
Процедура СохранитьПараметрыФункции(Отказ = Ложь)
НастройкиПараметров = ПолучитьПараметрыФункции();
// ключ - Идентификатор параметра, значение - Структура("Тип,Значение")
// Ключ - Идентификатор параметра, Значение - Структура("Имя,Тип,Значение")
Данные = Новый Соответствие;
Для Каждого Параметр Из Объект.ПараметрыФункции Цикл
ОписаниеПараметра = Новый Структура;

View File

@ -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 Тогда // региональные коды
Возврат Ложь;
КонецЕсли;
Возврат Истина;
КонецФункции
#КонецОбласти
#КонецОбласти // СлужебныеПроцедурыИФункции