Функция ЗаменаНаименования(Знач ИсходнаяСтрока, СтрокаРезультат, СловоРазделитель, ДоРазделителя)
СписокСкобок = Новый СписокЗначений;
МассивНеБукв = Новый Массив;
МассивНеБукв.Добавить(" ");
МассивНеБукв.Добавить(".");
МассивНеБукв.Добавить(",");
МассивНеБукв.Добавить("!");
МассивНеБукв.Добавить("?");
МассивНеБукв.Добавить(";");
МассивНеБукв.Добавить(")");
МассивНеБукв.Добавить("(");
МассивНеБукв.Добавить("]");
МассивНеБукв.Добавить("[");
МассивНеБукв.Добавить("}");
МассивНеБукв.Добавить("{");
МассивНеБукв.Добавить(":");
МассивНеБукв.Добавить("*");
Если СтрНайти(ИсходнаяСтрока, СловоРазделитель) = 0 Тогда
Возврат ИсходнаяСтрока;
КонецЕсли;
Если ( //Проверяем, является ли СловоРазделитель, собственно, словом, т.е. обособлено ли слово пробелами или знаками препинания, или стоит в начале или конце строки
(
МассивНеБукв.Найти(Сред(ИсходнаяСтрока,СтрНайти(ИсходнаяСтрока, СловоРазделитель) - 1,1)) = Неопределено
И
СтрНайти(ИсходнаяСтрока, СловоРазделитель) <> 1
)
Или
(
МассивНеБукв.Найти(Сред(ИсходнаяСтрока, СтрНайти(ИсходнаяСтрока, СловоРазделитель) + СтрДлина(СловоРазделитель), 1)) = Неопределено
И
СтрНайти(ИсходнаяСтрока, СловоРазделитель) + СтрДлина(СловоРазделитель) - 1 <> СтрДлина(ИсходнаяСтрока)
)
)
И
( //кроме того по условию задачи должна быть возможноть указывать символы скобки
СловоРазделитель <> ")"
И СловоРазделитель <> "]"
И СловоРазделитель <> "}"
И СловоРазделитель <> "("
И СловоРазделитель <> "["
И СловоРазделитель <> "{"
)
Тогда
Возврат ИсходнаяСтрока;
КонецЕсли;
Если ДоРазделителя Тогда//Измененние имени ДО разделителя если истина
СписокСкобок.Вставить(0, 0, "[");
СписокСкобок.Вставить(1, 0, "(");
СписокСкобок.Вставить(2, 0, "{");
ПозицияРазделителя = СтрНайти(ИсходнаяСтрока, СловоРазделитель);
ЗаменяемаяПодстрока = Лев(ИсходнаяСтрока, ПозицияРазделителя-1);
ПоискЗакрывающихСкобок(СписокСкобок, ЗаменяемаяПодстрока);
ЗакрывающаяСкобка = Макс(СписокСкобок[0].Значение, СписокСкобок[1].Значение, СписокСкобок[2].Значение);
Если ЗакрывающаяСкобка > СтрНайти(ЗаменяемаяПодстрока, ПолучитьПарнуюСкобку(СписокСкобок, ЗакрывающаяСкобка)) Тогда
ЗаменяемаяПодстрока = Лев(ЗаменяемаяПодстрока, СтрНайти(ЗаменяемаяПодстрока, ПолучитьПарнуюСкобку(СписокСкобок, ЗакрывающаяСкобка)) - 1);
КонецЕсли;
СерединаСтроки = Сред(ИсходнаяСтрока, СтрНайти(ИсходнаяСтрока, ПолучитьПарнуюСкобку(СписокСкобок, ЗакрывающаяСкобка)), ПозицияРазделителя - СтрДлина(ЗаменяемаяПодстрока) - 1);
КонецСтроки = Прав(ИсходнаяСтрока,СтрДлина(ИсходнаяСтрока) - ПозицияРазделителя + 1);
Возврат СтрокаРезультат + СерединаСтроки + КонецСтроки;
Иначе
СписокСкобок.Вставить(0, 999, "]");
СписокСкобок.Вставить(1, 999, ")");
СписокСкобок.Вставить(2, 999, "}");
ПозицияРазделителя = СтрНайти(ИсходнаяСтрока, СловоРазделитель) + СтрДлина(СловоРазделитель) - 1;
ЗаменяемаяПодстрока = Прав(ИсходнаяСтрока, СтрДлина(ИсходнаяСтрока) - ПозицияРазделителя);
ПоискОткрывающихСкобок(СписокСкобок, ЗаменяемаяПодстрока);
ОткрывающаяСкобка = Мин(СписокСкобок[0].Значение, СписокСкобок[1].Значение, СписокСкобок[2].Значение);
Если ОткрывающаяСкобка < СтрНайти(ЗаменяемаяПодстрока, ПолучитьПарнуюСкобку(СписокСкобок, ОткрывающаяСкобка)) Тогда
ЗаменяемаяПодстрока = Лев(ЗаменяемаяПодстрока, ОткрывающаяСкобка - 1);
КонецЕсли;
НачалоСтроки = Лев(ИсходнаяСтрока, ПозицияРазделителя - СтрДлина(СловоРазделитель));
СерединаСтроки = Сред(ИсходнаяСтрока, СтрДлина(ИсходнаяСтрока) + СтрДлина(ЗаменяемаяПодстрока), СтрДлина(ЗаменяемаяПодстрока));
КонецСтроки = Прав(ИсходнаяСтрока, СтрДлина(ИсходнаяСтрока) - СтрДлина(НачалоСтроки) - СтрДлина(СловоРазделитель) - СтрДлина(ЗаменяемаяПодстрока));
Возврат СокрЛ(НачалоСтроки + СловоРазделитель + СтрокаРезультат + " " + КонецСтроки);
КонецЕсли;
КонецФункции