Конечно это громко сказано, но в случае, если Вам необходимо изменить заголовки сервисов по всей системе, а именно заголовки датасетов, названия окон, элементов окон и т.п., то для этих нужд можно воспользоваться разработанной функцией (см. ниже). Как пример, допустим нам нужно изменить название раздела с "Контрагенты" на "Юр. лица", кроме того, необходимо внести эти изменения во все карточки, во все реестры и т.д.
function ReplaceCaption(FromCaption, ToCaption) {
try {
System.BeginProcessing();
Log.Write(1, "Старт: " + (new Date()).toLocaleString());
var ServiceCount = Services.InformationsCount;
var LoadedCount = 0;
var ChangedCount = 0;
System.ProcessMessages();
var RE = new RegExp(FromCaption, 'g');
for (var i = 0; i ServiceCount; i++) {
System.ProcessMessages();
var Info = Services.Informations(i);
var ServiceTypeCode = Info.ServiceTypeCode;
var ToLoad = IsStringInArray(ServiceTypeCode, ['DBDataset', 'Window']);
if (ToLoad) {
try {
if (Info.USI.substring(0, Info.USI.indexOf('\\')) == 'Call Centre') {
continue;
}
var Service = GetSingleItemByCode(Info.USI);
} catch(e) {
continue;
}
LoadedCount++;
// Изменяем заголовок самого сервиса
Service.Caption = Service.Caption.replace(RE, ToCaption);
if ((ServiceTypeCode == 'DBDataset') && (Assigned(Service.DataFields))) {
var Count = Service.DataFields.Count;
// Изменяем заголовки датафилдов
for (var j = 0; j Count; j++) {
var Item = Service.DataFields.Items(j);
Item.Caption = Item.Caption.replace(RE, ToCaption);
}
Services.SaveItem(Service, sdoaSave);
ChangedCount++;
} else if ((ServiceTypeCode == 'Window') && (Service.ComponentCount > 0)) {
if (Service.Name == 'wnd_Main') {
// Отключить таймер
var Timer = Service.ComponentsByName('Timer');
Timer.IsEnabled = false;
}
if (Service.Name == 'wnd_CallCentreClient') {
// Отключить таймер
var Timer = Service.ComponentsByName('tmrRefreshCallList');
Timer.IsEnabled = false;
}
var Count = Service.ComponentCount;
// Изменяем заголовки контролов
for (var j = 0; j Count; j++) {
var Item = Service.Components(j);
if (!IsEmptyValue(Item.Caption)) {
Item.Caption = Item.Caption.replace(RE, ToCaption);
}
}
Services.SaveItem(Service, sdoaSave);
ChangedCount++;
}
}
}
} finally {
System.EndProcessing();
Log.Write(1, "Финиш: " + (new Date()).toLocaleString());
}
Log.Write(1, "Всего сервисов: " + ServiceCount +
" Рассмотрено сервисов: " + LoadedCount +
" Изменено сервисов: " + ChangedCount);
}
function Main() {
ReplaceCaption('Контрагенты', 'Юр. лица');
}
Параметры функции ReplaceCaption():
FromCaption - фраза, которую нужно найти и заменить
ToCaption - фраза, на которую нужно заменить
Небольшие рекомендации:
1. Перед использованием сделать ОБЯЗАТЕЛЬНО бекап, "дабы не было мучительно больно..."
2. При установке параметров функции нужно помнить, что функция ищет любые совпадения, т.е. если мы хотим заменить "Контрагент" на "Юр.лицо", то при обнаружении слова "Контрагенты" будет сделана некорректная замена на "Юр.лицоы". Поэтому запускать ее нужно сначала для самых длинных склонений, далее для множественного числа и т.д.
Пример: нужно заменить все упоминания "проектов" на "сделки". Для этого запускаем функцию поэтапно со следующими параметрами:
Проектами - Сделками
проектами - сделками
Проектов - Сделок
проектов - сделок
Проекты - Сделки
проекты - сделки
Проектом - Сделкой
проектом - сделкой
Проекта - Сделки
проекта - сделки
Проект - Сделка
проект - сделка
и т.д.
Как видите, приведенная функция не универсальна. Т.е. ее можно доработать, добавив дополнительные параметры замены (учет регистра символов, можно "прикрутить" какой-то алгоритм склонения слов и т.п.). Следовательно, есть поле для полета "программерской" фантазии.
В принципе, у меня все. Юзайте!