Сбор всех параметров табличного документа с 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С:Конвертация данных 1С:ERP Управление предприятием 2 1С:Управление торговлей 11 Платные (руб)

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

18000 руб.

06.10.2023    13516    34    7    

67

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 Бухгалтерский учет Управленческий учет Платные (руб)

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

6000 5100 руб.

09.11.2016    229915    987    894    

986

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

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

13200 руб.

27.06.2023    3271    9    1    

9

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

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

3600 руб.

13.02.2019    93288    428    44    

410

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

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

12000 руб.

13.03.2018    59094    200    76    

119

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

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

5400 руб.

08.10.2019    45813    159    89    

154

Печатные формы Бухгалтер Платформа 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    38156    245    216    

156

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

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

2520 руб.

18.02.2019    63421    196    14    

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

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