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

03.09.24

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

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

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

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

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

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

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

 

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

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


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

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

См. также

SALE! 20%

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

Универсальная обработка для загрузки документов из Excel в 1С одним нажатием. Не требует указания параметров (номера колонок, номер первой строки таблицы и т.д.) и предварительной настройки. Просто выбираете файл Excel, документ 1С и нажимаете кнопку "Загрузить". Обработка сама находит таблицу в файле Excel, необходимые для загрузки данные в ней (номенклатура, количество, НДС, цена, сумма) и загружает ее в 1С. Вместе с номенклатурой может найти контрагента, номер и дату документа, штрих-коды, серии ГТД, страну и т.д. Распознает документы ЛЮБОЙ ФОРМЫ (УПД, ТОРГ-12, заказ, отчет комиссионера и т.д.). Не требует MS Office. Для поиска таблиц используются методы эвристического поиска. Загружает только то, что нужно, т.е. пропускает повторы шапки таблицы, заголовки, промежуточные итоги, подписи и т.д. Содержит модуль работы с электронной почтой и api-загрузчик отчетов о продажах маркетплейсов.

6000 5100 руб.

09.11.2016    234080    1062    898    

1003

SALE! 15%

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

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

22200 19980 руб.

06.10.2023    15392    35    7    

70

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

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

14400 руб.

13.03.2018    60692    207    76    

120

Печатные формы Программист Пользователь Платформа 1С v8.3 Управляемые формы Конфигурации 1cv8 1С:ERP Управление предприятием 2 Платные (руб)

Научите вашу 1C печатать из 1С в файл Word (Например: трудовые договоры, договоры с контрагентами, спецификации, дополнительные соглашения, приказы, коммерческие предложения, акты, накладные, карточки партнера или любого справочника и многие другие). Универсальная печать предназначена для формирования печатных форм на основе шаблонов в формате Word из любой конфигурации 1С. С помощью данного инструмента можно самостоятельно заполнить шаблон реквизитами справочника или документа 1С и сформировать печатные формы на основании ссылки на любой объект.

5400 руб.

08.10.2019    46985    166    95    

160

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

Учет путевых листов выполнен в виде расширения. Предназначен для учета путевых листов в конфигурации БП 3.0., УТ 11.5 и КА 2.5 Печатная форма: Типовая межотраслевая форма № 3. Утверждена постановлением Госкомстата России от 28.11.97 № 78. Типовая межотраслевая форма № 4-П от 18.09.2008 г. N 152 с учетом изменений указанных в Приказе Министерства транспорта Российской Федерации №368 от 11 сентября 2020 г. №368, Типовая межотраслевая форма № ЭСМ-7, и др. ЭСМ-2, 4-С, 3 спец., 6 спец., ПЛ для Автомобильного крана.

3600 руб.

14.10.2019    38847    258    216    

167

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

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

3600 руб.

13.02.2019    96241    440    44    

423

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

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

13200 руб.

27.06.2023    3858    10    1    

11

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

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

4500 руб.

23.08.2019    57057    174    64    

167
Отзывы
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);
	КонецЦикла;
	Возврат Результат;
КонецФункции
Показать
Кстати, имена параметров могут содержать пробел, поэтому использование структуры может вызвать ошибку.
SirStefan; nameless2987; blindcat2006; JohnyDeath; Matveev_VS; Punisher_1C; AndruShik; Vasvas05; zqzq; fancy; SoftLeon; unichkin; redtram; +13 Ответить
Остальные комментарии
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
1. Xershi 1555 03.09.24 19:47 Сейчас в теме
Не плохо бы указать с какой платформы взлетит.
redtram; artbear; +2 Ответить
2. sergpn 04.09.24 08:07 Сейчас в теме
(1) просто смотри СП по методу СтрНайтиВсеПоРегулярномуВыражению
3. artbear 1563 04.09.24 10:34 Сейчас в теме
Методы работы с регулярками доступны, начиная с версии 8.3.23.

(0) Хорошо бы все-таки в статье это указать. будет чуть больше пользы для читателей
4. redtram 53 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);
	КонецЦикла;
	Возврат Результат;
КонецФункции
Показать
Кстати, имена параметров могут содержать пробел, поэтому использование структуры может вызвать ошибку.
SirStefan; nameless2987; blindcat2006; JohnyDeath; Matveev_VS; Punisher_1C; AndruShik; Vasvas05; zqzq; fancy; SoftLeon; unichkin; redtram; +13 Ответить
8. redtram 53 04.09.24 15:45 Сейчас в теме
(7) пожалуй это можно и в саму статью засунуть со ссылкой на ваш коммент :) не додумался, спасибо.
9. starik-2005 3087 05.09.24 10:53 Сейчас в теме
(7)
Кстати, имена параметров могут содержать пробел
ЧЯДНТ?
Прикрепленные файлы:
10. SlavaKron 05.09.24 10:55 Сейчас в теме
(9) В шаблоне могут.
Прикрепленные файлы:
11. starik-2005 3087 05.09.24 10:58 Сейчас в теме
(10) Это типа параметры шаблона, которые в [] нарисованы? Типа [бла бла бла]?
12. SlavaKron 05.09.24 11:03 Сейчас в теме
13. starik-2005 3087 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 595 10.09.24 09:11 Сейчас в теме
Только за первое предложение ставлю плюсик!
Оставьте свое сообщение