Возникла задача:
* заранее параметры макета (Табл.документа/Области и тд) - неизвестны (это важно!).
* Нужно получить все доступные параметры в структуру.
(Обращаю внимание - не имена свойств областей! А именно - имена параметров!!!!)
Из документации:
ПараметрыМакетаТабличногоДокумента (SpreadsheetDocumentTemplateParameters)
Свойства:
<ИмяПараметра>
Методы:
Заполнить (Fill)
Количество (Count)
Получить (Get)
Установить (Set)
Платформа такую возможность не поддерживает:
(0) нет такого метода, чтобы выгрузить параметры в структуру, например:
Структура = ТабДок.Параметры.Выгрузить(<КонкретныеИменаЕслиУказано_Иначе_ВсеПараметры>);
(1) вариант не работает - инициализация приемника не предусмотрена:
Структура = Новый Структура;
ЗаполнитьЗначенияСвойств(Структура,ТабДок.Параметры);
(2) Вариант в цикле тоже не работает:
Для Каждого ЗначениеПараметра из ТабДок.Параметры Цикл
или Для й=1 по ТабДок.Параметры.Количество() Цикл
ЗначениеПараметра = ТабДок.Параметры.Получить(й-1);
// из коллекции возвращается сразу значение параметра.....
// Параметр - нет такого типа объектов, чтобы получить "ИМЯ" параметра
// Например: Параметр.ИмяПараметра()
КонецЦикла;
Собственно - функция. В результате сделал через парсер для ЗначениеВСтрокуВнутр():
Примеры использования - см.ниже ....
// На входе: ТабДок = ТабличныйДокумент (целиком или секция, не важно ... )
// Возвращает: Структура = заполненная параметрами из ТабДок.Параметры
Функция СтруктураПараметровТабДок(ТабДок) Экспорт
Параметры = Новый Структура;
// --- этот кусок кода (попытка/сключение) исключительно для демонстрации
// --- чего не хватает в платформе = его можно удалить )))
попытка
// в режиме совместимости "Версия 8.3.9" не работает...
// возможно добавили функционал позже...хотя - вряд ли....
ЗаполнитьЗначенияСвойств(Параметры,ТабДок.Параметры);// ?,ФлагИницВсехСвойств=ИСТИНА);
//ну или типа : Параметры =
// ТабДок.Параметры.Выгрузить(<КонкретныеИменаСовойствЕслиУказаноИначеВсе>)"..... ??????
Если Параметры.Количество() = ТабДок.Параметры.Количество() Тогда
Возврат Параметры;//СУПЕР! МОЛОДЦЫ! АППЛАДИРУЮ СТОЯ РАЗРАБАМ ИЗ 1С !!!!
КонецЕсли;
Исключение
КонецПопытки;
// --- поэтому = будем парсить ...
//ВсеЯзыки = Новый Массив;
//ВсеЯзыки.Добавить("");
//Для Каждого Язык из Метаданные.Языки Цикл
// ВсеЯзыки.Добавить(Язык.КодЯзыка)
//КонецЦикла;
Тхт = ЗначениеВСтрокуВнутр(ТабДок);
// {24,26,"ПКО",{1,1,{"","Объект_Приемник"}},0},4, = установлена расшифровка
// {16,23,{1,1,{"","Нумерация_Имя_Приемник"}},0},6, = расшифровки нет
// Сообщить(Тхт); // {<16|24>,ХХХХХ,{1,1,{"","Объект_Приемник"}},0},
й = 0; Кво = СтрЧислоСтрок(Тхт);
Пока й<Кво Цикл
й = й+1; СтрТхт = СтрПолучитьСтроку(Тхт,й);
Лев4 = Лев(СокрЛП(СтрТхт),4);
Если (Лев4 = "{16,") или (Лев4 = "{24,") Тогда // 16 = расшифровки нет, 24 = есть
Сч1 =1;
Сч2 =0; НовыйТекст = СтрТхт;
Пока й<Кво Цикл
й = й+1; СтрТхт = СтрПолучитьСтроку(Тхт,й);
Сч1 = Сч1+СтрЧислоВхождений(СтрТхт,"{");
Сч2 = Сч2+СтрЧислоВхождений(СтрТхт,"}");
НовыйТекст = НовыйТекст + СтрТхт;
Если Сч1 <= Сч2 Тогда
Прервать;
КонецЕсли;
КонецЦикла;
//ЯЗЫК ИСКЛЮЧИТЕЛЬНО И ТОЛЬКО ПУСТОЙ!!! ТАКОЕ НЕ ДОПУСТИМО: ",{1,1,{""ru"","""
СтрНачало= ",{1,1,{"""",""";
СтрКонец = """}},0},";
ДлНачало = СтрДлина(СтрНачало);
Поз1=СтрНайти(НовыйТекст,СтрНачало);
Поз2=СтрНайти(НовыйТекст,СтрКонец);
Если 0 < Поз1 И Поз1+ДлНачало<Поз2 Тогда
Поз1 = Поз1+ДлНачало;
ИмяПараметра = Сред(НовыйТекст,Поз1,Поз2-Поз1);
// ПараметрыМакетаТабличногоДокумента => Структура
Параметры.Вставить(ИмяПараметра,ТабДок.Параметры[ИмяПараметра]);
КонецЕсли;
КонецЕсли;
КонецЦикла;
Возврат Параметры;
КонецФункции
Пример использования:
ТабличныйДокумент = Новый ТабличныйДокумент;
Макет = ПолучитьОбщийМакет("НекоторыйТабличныйМакет");
ОбластьШапка = Макет.ПолучитьОбласть("Шапка");
ОбластьПодвал= Макет.ПолучитьОбласть("Подвал");
ЗаполнитьЗначенияСвойств(ОбластьШапка.Параметры,ИсточникЗаполнения1);
ТабличныйДокумент.Вывести(ОбластьШапка);
ЗаполнитьЗначенияСвойств(ОбластьПодвал.Параметры,ИсточникЗаполнения2);
ТабличныйДокумент.Вывести(ОбластьПодвал);
// стуктура всех параметров макета, значения свойств = Неопределено
ПараметрыМакет = СтруктураПараметровТабДок(Макет);
Для Каждого КЗ из ПараметрыМакет Цикл
Сообщить("" + КЗ.Ключ + " = " +КЗ.Значение )
КонецЦикла;
// стуктура параметров области "Шапка"
// значения свойств будут соответствовать "ИсточникЗаполнения1"
ПараметрыШапка = СтруктураПараметровТабДок(ОбластьШапка);
Для Каждого КЗ из ПараметрыШапка Цикл
Сообщить("" + КЗ.Ключ + " = " +КЗ.Значение )
КонецЦикла;
// стуктура параметров области "Подвал"
// значения свойств будут соответствовать "ИсточникЗаполнения2"
ПараметрыПодвал = СтруктураПараметровТабДок(ОбластьПодвал);
Для Каждого КЗ из ПараметрыПодвал Цикл
Сообщить("" + КЗ.Ключ + " = " +КЗ.Значение )
КонецЦикла;
// стуктура параметров всего документа
// значения свойств = "ИсточникЗаполнения1"+"ИсточникЗаполнения2"
ПараметрыТабДок = СтруктураПараметровТабДок(ТабличныйДокумент);
Для Каждого КЗ из ПараметрыТабДок Цикл
Сообщить("" + КЗ.Ключ + " = " +КЗ.Значение )
КонецЦикла;
Если у кого-то не работает - пишите в комментарии:
1) точную версию платформы
2) точную версию конфигурации
3) желательно прикрепить в виде файла макет ТабДок
Будем посмотреть )))
PS> ставьте лайки )))
Жду комментариев. Всем хорошего дня!