Сбор всех параметров табличного документа с RegExp

03.09.24

Разработка - Универсальные функции

Началось всё как всегда с лени. На этот раз я не хотел писать вывод результатов проверки заполненности макета, т.к. в нем много параметров и все они обязательные.

Проблема: получить ВСЕ параметры табличного документа с именем параметра и его значением при этом имена параметров заранее неизвестны. Это легко сделать в отладчике в просмотре переменной ТабДок.Параметры, но программно получить их список невозможно.

Сначала я с чего-то решил, что параметры табличного документа - это обычная структура :) с кем не бывает?
Но потом понял, что табличный документ имена параметров не отдаст без костылей вида ЗначениеВСтрокуВнутр и нагуглил эту статью: //infostart.ru/1c/articles/1999853/.

Оказалось до меня уже сделали, я немного поплевался от стиля написания кода, а проверив работу функции на моем макете поплевался и от результата, т.к. у меня были задействованы новомодные "форматированные строки". 

Допиливать чужой велосипед, как водится, не так интересно, как позаниматься своим :) И вспомнил что регулярные выражения в 1с уже завезли и от режима совместимости они не зависят (будет работать на 8.3.23, ну или переделать вызов регулярки на VBScript на старых платформах).

Оставляю свой буквально двухколесный велик потомкам:

 

	//Макет - ТабличныйДокумент или область табличного документа
	//Превращаем в 1С-ную кашу:
	Стр = ЗначениеВСтрокуВнутр(Макет);

	ПараметрыСтруктура = Новый Структура;
	
	//это для обычных параметров
	Результат = СтрНайтиВсеПоРегулярномуВыражению(Стр, "\[([^\]]+)\]", Истина, Истина);
	
	Для Каждого Элемент Из Результат Цикл
		Значение = Элемент.ПолучитьГруппы()[0].Значение;
		ПараметрыСтруктура.Вставить(Значение, Макет.Параметры[Значение]);
	КонецЦикла;
	
	//это для шаблонов и форматрованных строк
	Результат = СтрНайтиВсеПоРегулярномуВыражению(Стр, "\{\s*\""\"",\s*\""([^\""]+)\""\s*\}", Истина, Истина);
	
	Для Каждого Элемент Из Результат Цикл
		Значение = Элемент.ПолучитьГруппы()[0].Значение;
		ПараметрыСтруктура.Вставить(Значение, Макет.Параметры[Значение]);
	КонецЦикла;


UPD: в комментариях указали более здоровый способ получения через сериализацию XDTO.

Вступайте в нашу телеграмм-группу Инфостарт

ТабличныйДокумент Параметры табличного документа табдок печатная форма Табличный документ ЗначениеВСтрокуВнутр Регулярки

См. также

Пакетная печать Печатные формы Инструментарий разработчика Программист 1С v8.3 Запросы 1С:Зарплата и кадры бюджетного учреждения 1С:ERP Управление предприятием 2 1С:Управление торговлей 11 Платные (руб)

Расширение для создания и редактирования печатных форм в системе 1С:Предприятие 8.3. Благодаря конструктору можно значительно снизить затраты времени на разработку печатных форм, повысить качество и прозрачность разработки, а также навести порядок в многообразии корпоративных печатных форм.

22200 руб.

06.10.2023    23602    63    26    

92

Печатные формы Логистика, склад и ТМЦ Бухгалтер 1С v8.3 Бухгалтерский учет 1С:Бухгалтерия 3.0 Россия Бухгалтерский учет Платные (руб)

Обработки для "1С:Бухгалтерия предприятия 3.0", которые формируют акты МХ-1 и МХ-3 для документов "ПоступлениеТоваровУслуг", "Реализация товаров услуг", "Возврат товаров поставщику", "Передача материалов в эксплуатацию" соответственно. Так же можно сформировать акты с факсимиле, которая загружена в 1С:Бухгалтерия предприятия 3.0.

6000 руб.

18.02.2019    67722    243    15    

195

Печатные формы Взаиморасчеты Оптовая торговля Производство готовой продукции (работ, услуг) Акт сверки Бухгалтер Пользователь Оперативный учет Управляемые формы 1С:ERP Управление предприятием 2 1С:Управление торговлей 11 1С:Комплексная автоматизация 2.х Россия Бухгалтерский учет Управленческий учет Платные (руб)

Задайте для каждой организации свою печать и для каждого физического лица свою подпись. Выберите в документе печатную форму "... с печатью и подписью" - и автоматически сформируется табличный документ с печатью и подписями той организации и ответственных лиц, которые указаны в документе.

14400 руб.

13.03.2018    64304    230    79    

121

Печатные формы Адаптация типовых решений Бухгалтер Пользователь 1С v8.3 1С:ERP Управление предприятием 2 1С:Управление торговлей 11 1С:Комплексная автоматизация 2.х 1С:Управление нашей фирмой 3.0 1С:Розница 3.0 Платные (руб)

Расширение позволяет вывести в табличном документе факсимиле печати и подписей и/или вывести произвольную картинку из прикреплённых файлов организации для 1С УТ 11.5, КА 2.5, ERP 2.5, УНФ 3, Розница 3. Вывод факсимиле возможен в табличные документы УПД, УКД, Счёт-фактура, ТОРГ-12 и другие. Возможно настроить вывод для любых типовых макетов (Акт сверки, М-15, ТТН), для этого потребуется отредактировать макет и разместить на нём картинки с соответствующими именами, при выводе на печать в размещённые картинки будут выводиться факсимиле из прикреплённых рисунков. Редактирование осуществляется через типовой механизм в пользовательском интерфейсе.

3500 руб.

07.02.2023    9198    99    17    

55

Печатные формы Учет рабочего времени Бухгалтер Пользователь 1С v8.3 Бухгалтерский учет Оперативный учет 1С:Бухгалтерия 3.0 Транспорт, автопарки, такси Россия Бухгалтерский учет Платные (руб)

Программа «Путевой лист грузового автомобиля в 1С:БП 3.0» - заполнить, распечатать, сохранить. Вы можете не только внести всю информацию и распечатать путевой лист грузового автомобиля в 1С, но и повторно использовать ранее введенные данные спустя любое время - данные путевого листа водителя сохраняются в "1С:Бухгалтерия 3.0" без каких-либо доработок.

5700 руб.

23.08.2019    61148    191    65    

186

Производство готовой продукции (работ, услуг) Печатные формы Бухгалтер 1С v8.3 Бухгалтерский учет 1С:Бухгалтерия 3.0 Россия Бухгалтерский учет Платные (руб)

Для целей использования в ЮЗЭДО ОАО "РЖД". Обработка используется для формирования XML файлов (согласно формату, утвержденному приказом ФНС РФ от 19.12.2018 N ММВ-7-15/820@) актов выполненных работ по форме ФПУ-26 (Утверждена распоряжением ОАО "РЖД" от 15.12.2008 №2688р)

26400 руб.

14.05.2020    32877    45    19    

43

Печатные формы Логистика, склад и ТМЦ Бухгалтер 1С v8.3 Бухгалтерский учет Оперативный учет Управляемые формы 1С:Комплексная автоматизация 2.х Транспорт, автопарки, такси Оптовая торговля, дистрибуция, логистика Россия Бухгалтерский учет Управленческий учет Платные (руб)

Программа для автоматизации учета путевых листов в 1С - расширение, добавляющее в конфигурацию "Комплексная автоматизация", документ Путевой лист и печатные формы установленных образцов для легковых и грузовых авто, расчет и списание нормативного количества топлива, отчет "Реестр путевых листов" с отбором по автомобилю и по водителю (через настройки) Позволит контролировать расход топлива, потому что сразу будет виден сверхнормативный расход.

13200 руб.

27.06.2023    5696    18    2    

19
Отзывы
7. SlavaKron 04.09.24 15:14 Сейчас в теме
Вариант без привязки к платформе и регуляркам
Функция ПолучитьПараметрыТабличногоДокумента(ТабличныйДокумент)
	ОбъектXDTO = СериализаторXDTO.ЗаписатьXDTO(ТабличныйДокумент);
	
	ИменаПараметров = Новый Соответствие;
	Для Каждого ДанныеСтрок Из ОбъектXDTO.rowsItem Цикл
		Для Каждого Колонка Из ДанныеСтрок.row.c Цикл
			ИмяПараметра = Колонка.c.parameter; 
			Если ИмяПараметра <> Неопределено Тогда
				ИменаПараметров.Вставить(ИмяПараметра);
			КонецЕсли;
			Если Колонка.c.f > 0 Тогда 
				Формат = ОбъектXDTO.format[Колонка.c.f - 1];
				Если Формат.fillType = ТипЗаполненияОбластиТабличногоДокумента.Шаблон Тогда
					Для Каждого Содержание Из Колонка.c.tl.item Цикл
						ПараметрыШаблона = ПараметрыШаблона(Содержание.content);
						Для Каждого ИмяПараметра Из ПараметрыШаблона Цикл
							ИменаПараметров.Вставить(ИмяПараметра);
						КонецЦикла;
					КонецЦикла;
				КонецЕсли;
			КонецЕсли;
		КонецЦикла;
	КонецЦикла;
	
	Результат = Новый Соответствие;
	Для Каждого КлючИЗначение Из ИменаПараметров Цикл
		Результат[КлючИЗначение.Ключ] = ТабличныйДокумент.Параметры[КлючИЗначение.Ключ];
	КонецЦикла;
	
	Возврат Результат;
КонецФункции

Функция ПараметрыШаблона(Знач Строка)
	Результат = Новый Массив;
	Пока Истина Цикл
		Начало = Найти(Строка, "[");
		Если Начало = 0 Тогда
			Прервать;
		КонецЕсли;
		Конец = Найти(Строка, "]");
		Если Конец = 0 Тогда
			Прервать;
		КонецЕсли;
		
		ИмяПараметра = Сред(Строка, Начало + 1, Конец - Начало - 1);
		Если Не ПустаяСтрока(ИмяПараметра) Тогда
			Результат.Добавить(ИмяПараметра);
		КонецЕсли;
		Строка = Сред(Строка, Конец + 1);
	КонецЦикла;
	Возврат Результат;
КонецФункции
Показать
Кстати, имена параметров могут содержать пробел, поэтому использование структуры может вызвать ошибку.
shard; SirStefan; nameless2987; blindcat2006; JohnyDeath; Matveev_VS; Punisher_1C; AndruShik; Vasvas05; zqzq; fancy; SoftLeon; unichkin; redtram; +14 Ответить
Остальные комментарии
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
1. Xershi 1537 03.09.24 19:47 Сейчас в теме
Не плохо бы указать с какой платформы взлетит.
redtram; artbear; +2 Ответить
2. sergpn 04.09.24 08:07 Сейчас в теме
(1) просто смотри СП по методу СтрНайтиВсеПоРегулярномуВыражению
3. artbear 1568 04.09.24 10:34 Сейчас в теме
Методы работы с регулярками доступны, начиная с версии 8.3.23.

(0) Хорошо бы все-таки в статье это указать. будет чуть больше пользы для читателей
4. redtram 48 04.09.24 11:13 Сейчас в теме
5. dhurricane 04.09.24 14:06 Сейчас в теме
Разве регулярка для обычных параметров не поймает и скобки в обычном тексте? Ситуация, наверное, не частая, но вполне вероятная.
Gesperid; +1 Ответить
6. пользователь 04.09.24 14:11
Сообщение было скрыто модератором.
...
7. SlavaKron 04.09.24 15:14 Сейчас в теме
Вариант без привязки к платформе и регуляркам
Функция ПолучитьПараметрыТабличногоДокумента(ТабличныйДокумент)
	ОбъектXDTO = СериализаторXDTO.ЗаписатьXDTO(ТабличныйДокумент);
	
	ИменаПараметров = Новый Соответствие;
	Для Каждого ДанныеСтрок Из ОбъектXDTO.rowsItem Цикл
		Для Каждого Колонка Из ДанныеСтрок.row.c Цикл
			ИмяПараметра = Колонка.c.parameter; 
			Если ИмяПараметра <> Неопределено Тогда
				ИменаПараметров.Вставить(ИмяПараметра);
			КонецЕсли;
			Если Колонка.c.f > 0 Тогда 
				Формат = ОбъектXDTO.format[Колонка.c.f - 1];
				Если Формат.fillType = ТипЗаполненияОбластиТабличногоДокумента.Шаблон Тогда
					Для Каждого Содержание Из Колонка.c.tl.item Цикл
						ПараметрыШаблона = ПараметрыШаблона(Содержание.content);
						Для Каждого ИмяПараметра Из ПараметрыШаблона Цикл
							ИменаПараметров.Вставить(ИмяПараметра);
						КонецЦикла;
					КонецЦикла;
				КонецЕсли;
			КонецЕсли;
		КонецЦикла;
	КонецЦикла;
	
	Результат = Новый Соответствие;
	Для Каждого КлючИЗначение Из ИменаПараметров Цикл
		Результат[КлючИЗначение.Ключ] = ТабличныйДокумент.Параметры[КлючИЗначение.Ключ];
	КонецЦикла;
	
	Возврат Результат;
КонецФункции

Функция ПараметрыШаблона(Знач Строка)
	Результат = Новый Массив;
	Пока Истина Цикл
		Начало = Найти(Строка, "[");
		Если Начало = 0 Тогда
			Прервать;
		КонецЕсли;
		Конец = Найти(Строка, "]");
		Если Конец = 0 Тогда
			Прервать;
		КонецЕсли;
		
		ИмяПараметра = Сред(Строка, Начало + 1, Конец - Начало - 1);
		Если Не ПустаяСтрока(ИмяПараметра) Тогда
			Результат.Добавить(ИмяПараметра);
		КонецЕсли;
		Строка = Сред(Строка, Конец + 1);
	КонецЦикла;
	Возврат Результат;
КонецФункции
Показать
Кстати, имена параметров могут содержать пробел, поэтому использование структуры может вызвать ошибку.
shard; SirStefan; nameless2987; blindcat2006; JohnyDeath; Matveev_VS; Punisher_1C; AndruShik; Vasvas05; zqzq; fancy; SoftLeon; unichkin; redtram; +14 Ответить
8. redtram 48 04.09.24 15:45 Сейчас в теме
(7) пожалуй это можно и в саму статью засунуть со ссылкой на ваш коммент :) не додумался, спасибо.
9. starik-2005 3181 05.09.24 10:53 Сейчас в теме
(7)
Кстати, имена параметров могут содержать пробел
ЧЯДНТ?
Прикрепленные файлы:
10. SlavaKron 05.09.24 10:55 Сейчас в теме
(9) В шаблоне могут.
Прикрепленные файлы:
11. starik-2005 3181 05.09.24 10:58 Сейчас в теме
(10) Это типа параметры шаблона, которые в [] нарисованы? Типа [бла бла бла]?
12. SlavaKron 05.09.24 11:03 Сейчас в теме
13. starik-2005 3181 05.09.24 11:08 Сейчас в теме
(12) И там будет параметр "бла бла бла"? Век живи - век страдай )))
14. SlavaKron 05.09.24 11:09 Сейчас в теме
(13) Не факт, что он будет работать – не проверял, но в контексте задачи, придётся учитывать.
15. Pavl0 92 05.09.24 16:29 Сейчас в теме
Вот так еще можно, перебором ячеек табличного документа:

Функция ТабличныйДокумент_ИменаПараметров(пТабДок) Экспорт 
	
	коллекцияИменПараметров = Новый Соответствие;
	Для номерРяда = 1 По пТабДок.ВысотаТаблицы Цикл
		Для номерКолонки = 1 По пТабДок.ШиринаТаблицы Цикл
			областьЯчейка = пТабДок.Область(номерРяда, номерКолонки, номерРяда, номерКолонки);
			Если областьЯчейка.Заполнение = ТипЗаполненияОбластиТабличногоДокумента.Параметр Тогда
				коллекцияИменПараметров.Вставить(областьЯчейка.Параметр, областьЯчейка.Параметр);
				
			ИначеЕсли областьЯчейка.Заполнение = ТипЗаполненияОбластиТабличногоДокумента.Шаблон Тогда
				стрШаблон = областьЯчейка.Текст;
				стрШаблон = СтрЗаменить(стрШаблон, "[", Символы.ПС + "[");
				стрШаблон = СтрЗаменить(стрШаблон, "]", Символы.ПС);
				частиШаблона = СтрРазделить(стрШаблон, Символы.ПС);
				Для Каждого частьШаблона Из частиШаблона Цикл
					Если Найти(частьШаблона, "[") Тогда
						имяПараметра = СтрЗаменить(частьШаблона, "[", "");
						коллекцияИменПараметров.Вставить(имяПараметра, имяПараметра);
						
					КонецЕсли;
					
				КонецЦикла; 
				частиШаблона = Неопределено;
				
			КонецЕсли;
			
		КонецЦикла;
		номерКолонки = Неопределено;
		
	КонецЦикла;
	номерРяда = Неопределено; 
	
	Возврат коллекцияИменПараметров

КонецФункции
Показать
16. ivnik 620 10.09.24 09:11 Сейчас в теме
Только за первое предложение ставлю плюсик!
17. user1832003 60 23.06.25 09:28 Сейчас в теме
для обычных шаблонов регулярка есть проще


"\[.*?\]"


любой символ между скобок. Останется обработать скобки и норм

upd вот такая функция получилась. давольно короткая, естесна на регулярках. Без тонны текста сериализации, ибо проблемы тех кто сидит на древней платформе никого не интересуют. Одинаково работает как с шаблоном текста, так и с форматированной строкой

//
//
Функция ПараметрыОбластиТабличногоДокумента(Область) Экспорт
	
	Соответствие = Новый Соответствие;
	
	Для Строка = 1 По Область.ВысотаТаблицы Цикл
		
		Для Колонка = 1 По Область.ШиринаТаблицы Цикл
			            
			Ячейка = Область.Область(Строка, Колонка, Строка, Колонка);
			
			Если Ячейка.Заполнение = ТипЗаполненияОбластиТабличногоДокумента.Текст Тогда
				Продолжить;	
				
			ИначеЕсли Ячейка.Заполнение = ТипЗаполненияОбластиТабличногоДокумента.Параметр Тогда
				Соответствие.Вставить(Ячейка.Параметр, Истина);				
				
			ИначеЕсли Ячейка.Заполнение = ТипЗаполненияОбластиТабличногоДокумента.Шаблон Тогда
				
				Массив = СтрНайтиВсеПоРегулярномуВыражению(Строка(Ячейка.Текст), "\[.*?\]");
				
				Для Каждого Параметр ИЗ Массив Цикл
					
					Значение = Сред(Параметр.Значение, 2, СтрДлина(Параметр.Значение) - 2);
					
					Соответствие.Вставить(Значение, Истина);	
										
				КонецЦикла;
				
			КонецЕсли;
						
		КонецЦикла;		
		
	КонецЦикла;
	
	Возврат ОбщегоНазначенияКлиентСервер.ВыгрузитьКолонку(Соответствие, "Ключ");
	
КонецФункции
Показать
Оставьте свое сообщение