Имя: Пароль:
1C
 
Поиск строки по всем данным в базе. Вообще по всем.
,
0 LevelUP
 
22.05.24
17:06
Здравствуйте!
Есть ли способ/обработка поиска строкового фрагмента  во всех данных базы. Чтобы анализировались все реквизиты всех объектов конфигурации?
1 Волшебник
 
22.05.24
17:08
Полнотекстовый поиск, но потом Вы с ним повеситесь
2 LevelUP
 
22.05.24
17:09
(1) Пробовал. Даже переиндексировал его. Но он не везде ищет, к сожалению.
3 Волшебник
 
22.05.24
17:11
(2) Напишите свою обработку с перебором объектов по метаданным. Только поставьте её на ночь и готовьтесь долго ждать. Можно давать ей сразу несколько заданий и даже сделать её многопоточной. Хорошее задание для изучения программирования.
4 LevelUP
 
22.05.24
17:15
(3) Интересовало готовое решение, ну или сервисная возможность, о существовании которой я не знаю.
5 Волшебник
 
22.05.24
18:15
(4) Цикл в цикле
6 Волшебник
 
22.05.24
19:42
(5) точнее цикл в цикле в цикле...

Цикл по видам объектов метаданных, сохраняемых в базе
  Цикл по объектам метаданных
    Цикл по элементам
       Цикл по реквизитам типа "Строка"

      
Ну или 2 внутренних цикла можно заменить на запрос, текст которого формируется динамически.

Вам придётся хорошо изучить структуру метаданных, потому что:
- у справочников есть Код и Наименование, а это не реквизиты, а системные реквизиты.
- у документов есть Номер (строка)
- у регистров много всего

Вы решили проанализировать все строки в базе? Мощная задача!
7 Tarzan_Pasha
 
22.05.24
19:51
Elastiс Search в помощь. Правда придется проделать большую работу чтобы запихивать на автомате туда все обновления в реквизитах и прочих полях.
8 PR
 
22.05.24
19:54
(0) winhex
9 LevelUP
 
22.05.24
19:54
(6) Генерировать запросик на каждый объект метаданных (регистры, документы, справочники), включать в него только реквизиты строковых типов (ОбъектМетаданных.тип) , там же в запросе условие на сравнение любого из этих реквизитов с искомой строкой. Не так чтоб сильно сложно.
10 Волшебник
 
22.05.24
20:10
(9) Это может подвесить базу. Тут надо всё взвесить. Или Вы запрашиваете или сами в цикле...
Я бы в цикле
11 youalex
 
23.05.24
00:54
я в скуле скрипт сочинял на коленке, но мне нужно было разово найти, и в служебных таблицах
12 Волшебник
 
23.05.24
11:32
(0) Гляньте, что ChatGPT сгенерировал, может поможет:

Процедура НайтиСтрокуВоВсехДанных (с) ChatGPT
Процедура НайтиСтрокуВоВсехДанных(ИскомаяСтрока)
 
 // Пройдемся по всем метаданным базы
 Для Каждого ВидМетаданных Из Метаданные.Справочники Цикл
  ИскатьВМетаданных(ИскомаяСтрока, ВидМетаданных);
 КонецЦикла;
 
 Для Каждого ВидМетаданных Из Метаданные.Документы Цикл
  ИскатьВМетаданных(ИскомаяСтрока, ВидМетаданных);
 КонецЦикла;
 
 Для Каждого ВидМетаданных Из Метаданные.РегистрыСведений Цикл
  ИскатьВМетаданных(ИскомаяСтрока, ВидМетаданных);
 КонецЦикла;
 
 Для Каждого ВидМетаданных Из Метаданные.БизнесПроцессы Цикл
  ИскатьВМетаданных(ИскомаяСтрока, ВидМетаданных);
 КонецЦикла;
 
 Для Каждого ВидМетаданных Из Метаданные.Задачи Цикл
  ИскатьВМетаданных(ИскомаяСтрока, ВидМетаданных);
 КонецЦикла;
 
КонецПроцедуры

Процедура ИскатьВМетаданных(ИскомаяСтрока, ВидМетаданных)
 
 // Получаем все элементы метаданных
 Элементы = ВидМетаданных.ПолучитьОбъект();
 Для Каждого Элемент Из Элементы Цикл
  
  // Получаем реквизиты элемента
  ОбработатьРеквизиты(Элемент, ИскомаяСтрока);
  
  // Проверяем табличные части
  ОбработатьТабличныеЧасти(Элемент, ИскомаяСтрока);
  
 КонецЦикла;

КонецПроцедуры

Процедура ОбработатьРеквизиты(Элемент, ИскомаяСтрока)
 СтруктураРеквизитов = Новый Структура();
 МетаданныеЭлемента = Элемент.Метаданные();
 Для Каждого Реквизит Из МетаданныеЭлемента.Реквизиты Цикл
  Если ТипЗнч(Реквизит) = Тип("РеквизитМетаданныхОбъекта") Тогда
   ТипРеквизита = Реквизит.Тип;
   Если ТипРеквизита = Тип("Строка") Тогда
    СтруктураРеквизитов.Вставить(Реквизит.Имя, Истина);
   КонецЕсли;
  КонецЕсли;
 КонецЦикла;
 
 Для Каждого ИмяРеквизита Из СтруктураРеквизитов Цикл
  Запрос = Новый Запрос;
  Запрос.Текст = "ВЫБРАТЬ " + ИмяРеквизита + " ИЗ " + МетаданныеЭлемента.Путь + " КАК Таблица " +
        "ГДЕ " + ИмяРеквизита + " КАК '' СОДЕРЖИТ &ИскомаяСтрока";
  Запрос.УстановитьПараметр("ИскомаяСтрока", ИскомаяСтрока);
  Выборка = Запрос.Выполнить().Выбрать();
  
  Пока Выборка.Следующий() Цикл
   Сообщить("Найдено в " + МетаданныеЭлемента.Имя + ": " + Выборка.Получить(ИмяРеквизита));
  КонецЦикла;
 КонецЦикла;
КонецПроцедуры

Процедура ОбработатьТабличныеЧасти(Элемент, ИскомаяСтрока)
 МетаданныеЭлемента = Элемент.Метаданные();
 Для Каждого ТабЧасть Из МетаданныеЭлемента.ТабличныеЧасти Цикл
  
  // Получаем реквизиты табличной части
  СтруктураРеквизитов = Новый Структура();
  Для Каждого Реквизит Из ТабЧасть.Реквизиты Цикл
   Если ТипЗнч(Реквизит) = Тип("РеквизитМетаданныхОбъекта") Тогда
    ТипРеквизита = Реквизит.Тип;
    Если ТипРеквизита = Тип("Строка") Тогда
     СтруктураРеквизитов.Вставить(Реквизит.Имя, Истина);
    КонецЕсли;
   КонецЕсли;
  КонецЦикла;
  
  // Ищем значение искомой строки в строковых реквизитах табличной части
  Для Каждого ИмяРеквизита Из СтруктураRеквизитов Цикл
   Запрос = Новый Запрос;
   Запрос.Текст = "ВЫБРАТЬ " + ИмяРеквизита + " ИЗ " + МетаданныеЭлемента.Путь + "." + ТабЧасть.Имя + " КАК Таблица " +
         "ГДЕ " + ИмяРеквизита + " КАК '' СОДЕРЖИТ &ИскомаяСтрока";
   Запрос.УстановитьПараметр("ИскомаяСтрока", ИскомаяСтрока);
   Выборка = Запрос.Выполнить().Выбрать();
   
   Пока Выборка.Следующий() Цикл
    Сообщить("Найдено в табличной части " + МетаданныеЭлемента.Имя + "." + ТабЧасть.Имя + ": " + Выборка.Получить(ИмяРеквизита));
   КонецЦикла;
  КонецЦикла;
  
 КонецЦикла;
КонецПроцедуры
13 Волшебник
 
23.05.24
11:32
(12)+ Там косячок небольшой, точнее неполнота понимания структуры 1С.
Вот обновленный код, который проверяет также измерения и ресурсы для регистров сведений:

Процедура НайтиСтрокуВоВсехДанных (с) ChatGPT
```1C
Процедура НайтиСтрокуВоВсехДанных(ИскомаяСтрока)
	
	// Пройдемся по всем метаданным базы
	Для Каждого ВидМетаданных Из Метаданные.Справочники Цикл
		ИскатьВМетаданных(ИскомаяСтрока, ВидМетаданных);
	КонецЦикла;
	
	Для Каждого ВидМетаданных Из Метаданные.Документы Цикл
		ИскатьВМетаданных(ИскомаяСтрока, ВидМетаданных);
	КонецЦикла;
	
	Для Каждого ВидМетаданных Из Метаданные.РегистрыСведений Цикл
		ИскатьВМетаданных(ИскомаяСтрока, ВидМетаданных);
	КонецЦикла;
	
	Для Каждого ВидМетаданных Из Метаданные.БизнесПроцессы Цикл
		ИскатьВМетаданных(ИскомаяСтрока, ВидМетаданных);
	КонецЦикла;
	
	Для Каждого ВидМетаданных Из Метаданные.Задачи Цикл
		ИскатьВМетаданных(ИскомаяСтрока, ВидМетаданных);
	КонецЦикла;
	
КонецПроцедуры

Процедура ИскатьВМетаданных(ИскомаяСтрока, ВидМетаданных)
	
	// Получаем все элементы метаданных
	Элементы = ВидМетаданных.ПолучитьОбъект();
	Для Каждого Элемент Из Элементы Цикл
		
		// Получаем реквизиты элемента
		ОбработатьРеквизиты(Элемент, ИскомаяСтрока);
		
		// Проверяем табличные части
		ОбработатьТабличныеЧасти(Элемент, ИскомаяСтрока);
		
		// Проверяем измерения и ресурсы для регистров сведений
		Если ТипЗнч(Элемент) = Тип("РегистрСведенийОбъект") Тогда
			ОбработатьИзмеренияИРесурсы(Элемент, ИскомаяСтрока);
		КонецЕсли;
		
	КонецЦикла;

КонецПроцедуры

Процедура ОбработатьРеквизиты(Элемент, ИскомаяСтрока)
	СтруктураРеквизитов = Новый Структура();
	МетаданныеЭлемента = Элемент.Метаданные();
	Для Каждого Реквизит Из МетаданныеЭлемента.Реквизиты Цикл
		Если ТипЗнч(Реквизит) = Тип("РеквизитМетаданныхОбъекта") Тогда
			ТипРеквизита = Реквизит.Тип;
			Если ТипРеквизита = Тип("Строка") Тогда
				СтруктураРеквизитов.Вставить(Реквизит.Имя, Истина);
			КонецЕсли;
		КонецЕсли;
	КонецЦикла;
	
	Для Каждого ИмяРеквизита Из СтруктураРеквизитов Цикл
		Запрос = Новый Запрос;
		Запрос.Текст = "ВЫБРАТЬ " + ИмяРеквизита + " ИЗ " + МетаданныеЭлемента.Путь + " КАК Таблица " +
					   "ГДЕ " + ИмяРеквизита + " КАК '' СОДЕРЖИТ &ИскомаяСтрока";
		Запрос.УстановитьПараметр("ИскомаяСтрока", ИскомаяСтрока);
		Выборка = Запрос.Выполнить().Выбрать();
		
		Пока Выборка.Следующий() Цикл
			Сообщить("Найдено в " + МетаданныеЭлемента.Имя + ": " + Выборка.Получить(ИмяРеквизита));
		КонецЦикла;
	КонецЦикла;
КонецПроцедуры

Процедура ОбработатьТабличныеЧасти(Элемент, ИскомаяСтрока)
	МетаданныеЭлемента = Элемент.Метаданные();
	Для Каждого ТабЧасть Из МетаданныеЭлемента.ТабличныеЧасти Цикл
		
		// Получаем реквизиты табличной части
		СтруктураРеквизитов = Новый Структура();
		Для Каждого Реквизит Из ТабЧасть.Реквизиты Цикл
			Если ТипЗнч(Реквизит) = Тип("РеквизитМетаданныхОбъекта") Тогда
				ТипРеквизита = Реквизит.Тип;
				Если ТипРеквизита = Тип("Строка") Тогда
					СтруктураРеквизитов.Вставить(Реквизит.Имя, Истина);
				КонецЕсли;
			КонецЕсли;
		КонецЦикла;
		
		// Ищем значение искомой строки в строковых реквизитах табличной части
		Для Каждого ИмяРеквизита Из СтруктураРеквизитов Цикл
			Запрос = Новый Запрос;
			Запрос.Текст = "ВЫБРАТЬ " + ИмяРеквизита + " ИЗ " + МетаданныеЭлемента.Путь + "." + ТабЧасть.Имя + " КАК Таблица " +
						   "ГДЕ " + ИмяРеквизита + " КАК '' СОДЕРЖИТ &ИскомаяСтрока";
			Запрос.УстановитьПараметр("ИскомаяСтрока", ИскомаяСтрока);
			Выборка = Запрос.Выполнить().Выбрать();
			
			Пока Выборка.Следующий() Цикл
				Сообщить("Найдено в табличной части " + МетаданныеЭлемента.Имя + "." + ТабЧасть.Имя + ": " + Выборка.Получить(ИмяРеквизита));
			КонецЦикла;
		КонецЦикла;
		
	КонецЦикла;
КонецПроцедуры

Процедура ОбработатьИзмеренияИРесурсы(Элемент, ИскомаяСтрока)
	МетаданныеЭлемента = Элемент.Метаданные();

	// Проверяем измерения
	Для Каждого Измерение Из МетаданныеЭлемента.Измерения Цикл
		Если ТипЗнч(Измерение) = Тип("РеквизитМетаданныхОбъекта") Тогда
			ТипИзмерения = Измерение.Тип;
			Если ТипИзмерения = Тип("Строка") Тогда
				Запрос = Новый Запрос;
				Запрос.Текст = "ВЫБРАТЬ " + Измерение.Имя + " ИЗ " + МетаданныеЭлемента.Путь + " КАК Таблица " +
							   "ГДЕ " + Измерение.Имя + " КАК '' СОДЕРЖИТ &ИскомаяСтрока";
				Запрос.УстановитьПараметр("ИскомаяСтрока", ИскомаяСтрока);
				Выборка = Запрос.Выполнить().Выбрать();
				
				Пока Выборка.Следующий() Цикл
					Сообщить("Найдено в измерении " + МетаданныеЭлемента.Имя + ": " + Выборка.Получить(Измерение.Имя));
				КонецЦикла;
			КонецЕсли;
		КонецЕсли;
	КонецЦикла;

	// Проверяем ресурсы
	Для Каждого Ресурс Из МетаданныеЭлемента.Ресурсы Цикл
		Если ТипЗнч(Ресурс) = Тип("РеквизитМетаданныхОбъекта") Тогда
			ТипРесурса = Ресурс.Тип;
			Если ТипРесурса = Тип("Строка") Тогда
				Запрос = Новый Запрос;
				Запрос.Текст = "ВЫБРАТЬ " + Ресурс.Имя + " ИЗ " + МетаданныеЭлемента.Путь + " КАК Таблица " +
							   "ГДЕ " + Ресурс.Имя + " КАК '' СОДЕРЖИТ &ИскомаяСтрока";
				Запрос.УстановитьПараметр("ИскомаяСтрока", ИскомаяСтрока);
				Выборка = Запрос.Выполнить().Выбрать();
				
				Пока Выборка.Следующий() Цикл
					Сообщить("Найдено в ресурсе " + МетаданныеЭлемента.Имя + ": " + Выборка.Получить(Ресурс.Имя));
				КонецЦикла;
			КонецЕсли;
		КонецЕсли;
	КонецЦикла;

КонецПроцедуры
```
14 Kongo2019
 
23.05.24
11:42
Ну не фига себе.
15 Мультук
 
гуру
23.05.24
11:52
(12)

0) Поглядел.
Ну нет - имхо самому быстрее написать, чем искать ошибки.

Этот код работать не будет (к счастью), но может быть вариант, что ошибок синтаксиса не будет,
и код работать таки будет

Немного сократил. ПолучитьОбъект() -- прямо порадовало :-)

Для Каждого ВидМетаданных Из Метаданные.РегистрыСведений Цикл
     // Получаем все элементы метаданных
     Элементы = ВидМетаданных.ПолучитьОбъект();
КонецЦикла;
16 LevelUP
 
23.05.24
12:45
(12) Вот это да! Даже умеет в 1С. Надо будет поиграться с chatGPT.
17 Волшебник
 
23.05.24
12:50
(15) Вы зануда
Закон Брукера: Даже маленькая практика стоит большой теории.