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

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)

Эта небольшая статья - некоторого рода шпаргалка по файловым потокам: как и зачем с ними работать, какие преимущества это дает.

23.06.2024    7500    bayselonarrend    20    

154

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

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

13.03.2024    5962    dsdred    16    

80

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

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

24.01.2024    17786    YA_418728146    26    

71

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

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

06.10.2023    23783    SeiOkami    48    

135

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

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

28.08.2023    14773    YA_418728146    7    

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

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

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


Функция ЕстьВОбластиПараметр(Знач Область, Знач ИмяПараметра) Экспорт 
	
	УникИД = Новый УникальныйИдентификатор;
	
	ПараметрыПров = Новый Структура(ИмяПараметра, УникИД);
	ЗаполнитьЗначенияСвойств(ПараметрыПров, Область.Параметры);
	
	Возврат УникИД <> ПараметрыПров[ИмяПараметра] ;
	
КонецФункции
Показать
8. kos-1cpp 20 20.12.23 15:28 Сейчас в теме
(6) в самом начале я написал постановку задачи - имена параметров заранее не известны (это важно).
Понятно, что если - знаешь имена - то и получить значение можно.......
11. redtram 53 03.09.24 02:22 Сейчас в теме
В этом решении не подхватываются шаблоны из форматированной строки. Я не стал допиливать этот код, сделал свой на регулярных выражениях: https://infostart.ru/1c/articles/2179573/. Работает без режима совместимости, главное чтоб платформа была новая.
Оставьте свое сообщение