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