|
|
|
Поиск строки по всем данным в базе. Вообще по всем. | ☑ | ||
|---|---|---|---|---|
|
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) Вы зануда
|
| Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |