Получение структуры Параметров табличного документа (ПараметрыМакетаТабличногоДокумента)

18.12.23

Разработка - Механизмы платформы 1С

Все знают, как заполнять параметры ТабДок (ПараметрыМакетаТабличногоДокумента) из структуры:
 ЗаполнитьЗначенияСвойств(ТабДок.Параметры,Структура).
 ТабДок.Параметры.Заполнить(Структура).

А в обратную сторону - пробовали? Не работает! Платформа не поддерживает!
 ЗаполнитьЗначенияСвойств(Структура,ТабДок.Параметры) - иниц.не предусмотрена
 Структура = ТабДок.Параметры.Выгрузить() - нет такого метода

Решение есть!

Возникла задача:

* заранее параметры макета (Табл.документа/Области и тд) - неизвестны (это важно!).

* Нужно получить все доступные параметры в структуру.
(Обращаю внимание - не имена свойств областей! А именно - имена параметров!!!!)

 

Из документации:
       ПараметрыМакетаТабличногоДокумента (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> ставьте лайки )))

Жду комментариев. Всем хорошего дня!

ТабличныйДокумент Параметры Структура ПараметрыМакетаТабличногоДокумента

См. также

Сервисы интеграции без Шины и интеграции

Механизмы платформы 1С Программист Стажер Платформа 1С v8.3 Конфигурации 1cv8 Бесплатно (free)

Пример использования «Сервисов интеграции» без подключения к Шине и без обменов.

13.03.2024    3197    dsdred    16    

65

Как готовить и есть массивы

Механизмы платформы 1С Программист Стажер Платформа 1С v8.3 Бесплатно (free)

Все мы используем массивы в своем коде. Это один из первых объектов, который дают ученикам при прохождении обучения программированию. Но умеем ли мы ими пользоваться? В этой статье я хочу показать все методы массива, а также некоторые фишки в работе с массивами.

24.01.2024    7468    YA_418728146    25    

69

Планы обмена VS История данных

Перенос данных 1C Механизмы платформы 1С Системный администратор Программист Стажер Платформа 1С v8.3 Бесплатно (free)

Вы все еще регистрируете изменения только на Планах обмена и Регистрах сведений?

11.12.2023    7724    dsdred    36    

115

1С-ная магия

Механизмы платформы 1С Программист Бесплатно (free)

Язык программирования 1С содержит много нюансов и особенностей, которые могут приводить к неожиданным для разработчика результатам. Сталкиваясь с ними, программист начинает лучше понимать логику платформы, а значит, быстрее выявлять ошибки и видеть потенциальные узкие места своего кода там, где позже можно было бы ещё долго медитировать с отладчиком в поисках источника проблемы. Мы рассмотрим разные примеры поведения кода 1С. Разберём результаты выполнения и ответим на вопросы «Почему?», «Как же так?» и «Зачем нам это знать?». 

06.10.2023    20088    SeiOkami    46    

124

Дефрагментация и реиндексация после перехода на платформу 8.3.22

Механизмы платформы 1С Системный администратор Платформа 1С v8.3 Бесплатно (free)

Начиная с версии платформы 8.3.22 1С снимает стандартные блокировки БД на уровне страниц. Делаем рабочий скрипт, как раньше.

14.09.2023    14021    human_new    27    

77

Валидация JSON через XDTO (включая массивы)

WEB-интеграция Универсальные функции Механизмы платформы 1С Программист Платформа 1С v8.3 Конфигурации 1cv8 Бесплатно (free)

При работе с интеграциями рано или поздно придется столкнуться с получением JSON файлов. И, конечно же, жизнь заставит проверять файлы перед тем, как записывать данные в БД.

28.08.2023    10379    YA_418728146    7    

148

Внешние компоненты Native API на языке Rust - Просто!

Механизмы платформы 1С Программист Платформа 1С v8.3 Конфигурации 1cv8 Бесплатно (free)

Внешние компоненты для 1С можно разработывать очень просто, пользуясь всеми преимуществами языка Rust - от безопасности и кроссплатформенности до удобного менеджера библиотек.

20.08.2023    6997    sebekerga    54    

99
Комментарии
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
1. aleksey2 87 18.12.23 10:46 Сейчас в теме
2. tormozit 7168 18.12.23 10:55 Сейчас в теме
В ИР есть тоже
- в интерфейсе https://www.hostedredmine.com/issues/965446
- в коде ирОбщий.ПараметрыТабличногоДокументаЛкс()
grfsd; Pipapalamm; kos-1cpp; Batman; zqzq; Totoro; Torin; +7 Ответить
10. kos-1cpp 18 20.12.23 15:33 Сейчас в теме
(2) да, действительно, не обратил внимание. Спасибо. Посмотрю
3. maksa2005 536 18.12.23 11:24 Сейчас в теме
СУПЕР! МОЛОДЦЫ! АППЛАДИРУЮ СТОЯ РАЗРАБАМ ИЗ 1С !!!!

Часто аппладируете?
9. kos-1cpp 18 20.12.23 15:31 Сейчас в теме
(3) было 1 раз, в 2003, когда в платформу 7.7 наконец-то добавили исправление, про которое я им писал с 1998 года )))
А так больше не приходилось.....
4. ixijixi 1812 18.12.23 14:22 Сейчас в теме
Не очень понял, зачем эти танцы с бубном
    Параметры = Новый Структура;
    
    попытка
        // в режиме совместимости "Версия 8.3.9" не работает...
        // возможно добавили функционал позже...хотя - вряд ли....
        ЗаполнитьЗначенияСвойств(Параметры,ТабДок.Параметры);// ?,ФлагИницВсехСвойств=ИСТИНА);
        //ну или типа : Параметры =
        //    ТабДок.Параметры.Выгрузить(<КонкретныеИменаСовойствЕслиУказаноИначеВсе>)"..... ??????
        Если Параметры.Количество() = ТабДок.Параметры.Количество() Тогда
            Возврат Параметры;//СУПЕР! МОЛОДЦЫ! АППЛАДИРУЮ СТОЯ РАЗРАБАМ ИЗ 1С !!!!
        КонецЕсли;
    Исключение
    КонецПопытки;
Показать
когда можно просто
Если ТабДок.Параметры.Количество() = 0 Тогда
     Возврат Параметры;
КонецЕсли;
7. kos-1cpp 18 20.12.23 15:27 Сейчас в теме
(4) это просто демонстрация - как хотелось бы, чтоб работало в платформе. Этот кусок кода можно удалить. Просто демонстрация - почему не работает в платформе....
5. t278 57 19.12.23 04:11 Сейчас в теме
2 упомянуть "ставьте лайки".
по этого не ставлю лайки.

А работа интересна.
6. zqzq 24 19.12.23 09:19 Сейчас в теме
ЗаполнитьЗначенияСвойств работает, если структура уже инициализирована именами параметров. Понятно, что имена параметров так не получить.


Функция ЕстьВОбластиПараметр(Знач Область, Знач ИмяПараметра) Экспорт 
	
	УникИД = Новый УникальныйИдентификатор;
	
	ПараметрыПров = Новый Структура(ИмяПараметра, УникИД);
	ЗаполнитьЗначенияСвойств(ПараметрыПров, Область.Параметры);
	
	Возврат УникИД <> ПараметрыПров[ИмяПараметра] ;
	
КонецФункции
Показать
8. kos-1cpp 18 20.12.23 15:28 Сейчас в теме
(6) в самом начале я написал постановку задачи - имена параметров заранее не известны (это важно).
Понятно, что если - знаешь имена - то и получить значение можно.......
Оставьте свое сообщение