// Изменяет расшифровки для тех полей, чьи пути к данным указаны, на те выражения, которые определены также путями к данным, в рамках наборов СКД
// Возвращает успешность (булево)
//
// Параметры:
// МакетКомпоновки - макет компоновки СКД, результат работы компоновщика макета по любому типу генератора;
// соотПутиРасшифровок - соответствие, где
// ключ - строка вида "ИмяНабора.ИмяПоляВНаборе", определяющее путь к данным того поля, чья расшифровка изменяется;
// значение - строка вида "ИмяНабора.ИмяПоляВНаборе", определяющее путь к данным расшифровки для этого поля или выражение расчёта расшифровки.
// Если задан единственный ключ "*", то значение этого ключа используется как расшифровка для всех ячеек строки группировки детальных данных.
//
Функция ИзменитьРасшифровкиПолей(МакетКомпоновки, соотПутиРасшифровок) Экспорт
Попытка
рОдноДляВсех="";
рОднаРасшифровкаДляВсех=Ложь;
Для каждого киз Из соотПутиРасшифровок Цикл
Если киз.Ключ="*" и не ПустаяСтрока(киз.Значение) Тогда рОдноДляВсех=киз.Значение; рОднаРасшифровкаДляВсех=Истина; Прервать КонецЕсли;
КонецЦикла;
Если рОднаРасшифровкаДляВсех Тогда
соотПутиРасшифровок.Очистить();
КонецЕсли;
// ищем имя макета детальных записей (в ряде случаев может потребоваться доработка)
рИмяМакетаДетальныхЗаписей="";
Для каждого элТела Из МакетКомпоновки.Тело Цикл
Если ТипЗнч(элТела)=Тип("ЗаписиМакетаКомпоновкиДанных") Тогда
Для каждого рЗапись Из элТела.Тело Цикл
Если ТипЗнч(рЗапись)=Тип("МакетОбластиМакетаКомпоновкиДанных") Тогда
рИмяМакетаДетальныхЗаписей=рЗапись.Макет; Прервать;
КонецЕсли;
КонецЦикла;
КонецЕсли;
КонецЦикла;
Если ПустаяСтрока(рИмяМакетаДетальныхЗаписей) Тогда
Возврат Ложь; // не нашли макет вообще
КонецЕсли;
рМакет=МакетКомпоновки.Макеты.Найти(рИмяМакетаДетальныхЗаписей);
Если рМакет=Неопределено Тогда Возврат Ложь КонецЕсли;
соотИмёнПараметровРасшифровки=Новый Соответствие;
соотПутьКДаннымИмяПоля=Новый Соответствие;
// ищем, как называются параметры данных для ячеек макета
Для каждого парМакета Из рМакет.Параметры Цикл
Если ТипЗнч(парМакета)=Тип("ПараметрОбластиВыражениеКомпоновкиДанных") Тогда
соотПутьКДаннымИмяПоля.Вставить(парМакета.Имя,парМакета.Выражение); // Имя в формате "П№" параметра поля, Выражение в формате "ИмяНабора.ИмяПоляВНаборе"
Если рОднаРасшифровкаДляВсех Тогда
соотПутиРасшифровок.Вставить(парМакета.Выражение,рОдноДляВсех); // заполняем для всех одинаково
КонецЕсли;
КонецЕсли;
КонецЦикла;
// ищем, как называются параметры расшифровки для ячеек макета (по их параметрам данных)
парРасшифровка=Новый ПараметрКомпоновкиДанных("Расшифровка");
Для каждого элМакета Из рМакет.Макет Цикл
Если ТипЗнч(элМакета)<>Тип("СтрокаТаблицыОбластиКомпоновкиДанных") Тогда Продолжить КонецЕсли; // если группировка и/или ещё почему-либо строк несколько, следует доработать!!!
Для каждого рЯчейка Из элМакета.Ячейки Цикл
рИмяПараметраЯчейки=Строка(рЯчейка.Элементы.Получить(0).Значение);
рПараметрРасшифровки=рЯчейка.Оформление.НайтиЗначениеПараметра(парРасшифровка);
Если рПараметрРасшифровки=Неопределено Тогда Продолжить КонецЕсли; // нет такого параметра у ячейки
рИмяПараметраРасшифровки = Строка(рПараметрРасшифровки.Значение);
рИмяРасшифровываемогоПоля=соотПутьКДаннымИмяПоля.Получить(рИмяПараметраЯчейки);
Если рИмяРасшифровываемогоПоля=Неопределено Тогда Продолжить КонецЕсли;
// вносим: имя параметра расшифровки и путь к полю, которое этот параметр расшифровывает
соотИмёнПараметровРасшифровки.Вставить(рИмяПараметраРасшифровки,рИмяРасшифровываемогоПоля); // ключ - вида "П№" параметра расшифровки, значение - в формате "ИмяНабора.ИмяПоляВНаборе"
КонецЦикла;
КонецЦикла;
// собственно меняем расшифровки
Для каждого парМакета Из рМакет.Параметры Цикл
Если ТипЗнч(парМакета)<>Тип("ПараметрОбластиРасшифровкаКомпоновкиДанных") Тогда Продолжить КонецЕсли;
// смотрим, тот ли это параметр, что упомянут, и если да,
рИмяРасшифровываемогоПоля=соотИмёнПараметровРасшифровки.Получить(парМакета.Имя);
рНоваяРасшифровка=соотПутиРасшифровок.Получить(рИмяРасшифровываемогоПоля);
Если рНоваяРасшифровка<>Неопределено Тогда
// для этого имени поля согласно настройкам надо менять расшифровку на указанную
Для каждого вырПоля Из парМакета.ВыраженияПолей Цикл
// при отсутствии выражения поля можно и добавлять, но в данном случае всё уже есть
вырПоля.Выражение=рНоваяРасшифровка;
КонецЦикла;
КонецЕсли;
// при необходимости можно поменять и действие, например:
//парМакета.ОсновноеДействие=ДействиеОбработкиРасшифровкиКомпоновкиДанных.ОткрытьЗначение;
КонецЦикла;
Возврат Истина;
Исключение
Сообщить("ИзменитьРасшифровкиПолей, общая ошибка: "+ОписаниеОшибки());
Возврат Ложь;
КонецПопытки;
КонецФункции