Имя: Пароль:
1C
1С v8
Как получить справочник из запроса не указывая его имя?
, ,
0 dart909
 
03.08.15
11:45
Есть Обработка, которая в строке заменяет значение подстроки на введенное. Код:

&НаКлиенте
Процедура Заполнить(Команда)
    ЗаполнитьДанными()
КонецПроцедуры

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

Вопрос такой как пожно это переделать в запрос? Чтобы не пробегатсья в цикле по всем. А например сразу получить справочники со строковыми реквизитами?
1 1Сергей
 
03.08.15
11:46
можно к тексту запроса применить СтрЗаменить
2 бомболюк
 
03.08.15
11:46
(0) извините, но тут без цикла никак.
3 dart909
 
03.08.15
11:51
(2) А вообще в запросе можно получить интересующий справочник конкретно не указывая его имени?
4 Fish
 
03.08.15
11:52
(3) Конечно можно.
5 gigi789
 
03.08.15
11:53
(3) Звучит как дайте мне то сам не знаю что
6 gigi789
 
03.08.15
11:55
(5) Можно что бы текст запроса динамически строился, а вот возможности чтоб 1с определяла какой тебе справочник нужен нет.
7 1Сергей
 
03.08.15
11:55
чёто, я теперь вообще ничего не понял. Чего надо? Куда надо?
8 Господин ПЖ
 
03.08.15
11:56
в последних платформах "динамические запросы" можно конструктором собирать
9 Господин ПЖ
 
03.08.15
11:56
но там опять циклы
10 dart909
 
03.08.15
11:59
(6) я имею ввиду, что в приведенном коде я перебираю справочники из метаданных Для каждого Справочник Из Метаданные.Справочники Цикл

А обращаюсь к справочнику не указывая его имени через
Справочники[Справочник.Имя]

Меня интересует можно ли это сделать в запросе, но без перебора справочников, а вывести те справочники где тип реквизита строка.
11 ДенисЧ
 
03.08.15
12:00
(10) нельзя
12 dart909
 
03.08.15
12:01
(7) Нужно в запросе получить справочники, у которых реквизит имеет тип строка.
13 gigi789
 
03.08.15
12:02
(11) Почему нет Создай справочник метаданные запихай в него реквизиты и их  типы и отбирай на здоровье
14 1Сергей
 
03.08.15
12:04
(13) для этого нужно перебрать метаданные. А аутор этого боится
15 gigi789
 
03.08.15
12:08
(14) так 1 раз перебрать, а не каждый раз переберать хотя если автору реально нужно ускорится то подход не верен
16 бомболюк
 
03.08.15
12:09
может это такой модный новый тренд - циклы не использовать?
17 dart909
 
03.08.15
12:09
(14) Нет просто смысл в том, что если у меня будет 100 справочников и только у одного будет строковый реквизит. и мне придется все 100 проверять. А так я хочу сразу запросом получить этот справочник, у которого строковый реквизит.
18 gigi789
 
03.08.15
12:10
(16) реал нужно использовать рекурсию
19 gigi789
 
03.08.15
12:10
(17) чем не катит 13
20 1Сергей
 
03.08.15
12:11
(19) Внесли изменения в конфу - перезаполняй справочник? :)
21 gigi789
 
03.08.15
12:12
(20) так что страшного то
22 Fish
 
03.08.15
12:13
(20) А ты разве не видел в типовых справочника ИдентификаторыОбъектовМетаданных? :))
23 gigi789
 
03.08.15
12:13
(17) а  что каждый справочник имеет строковое наименование и через раз строковый код
24 1Сергей
 
03.08.15
12:14
(17) Кароче, не парься. Код в (0) весьма оптимальный. Этот цикл пролетит за доли секунды
25 dart909
 
03.08.15
12:14
(24) Да я верю)) Мне это в запрос переделать надо))
26 dart909
 
03.08.15
12:15
(24) Задание такое
27 gigi789
 
03.08.15
12:15
(24) ага только не когда у тебя 20 справочников и в каждом по 1000 элементов
28 dart909
 
03.08.15
12:15
(23) нет не каждый.
29 gigi789
 
03.08.15
12:17
(28) Удиви конфой в которой 20 справочников у которых Длина наименования 0 представление кода числовое
30 dart909
 
03.08.15
12:19
(29) Поправлю, эта обработка для  стандартных реквизитов не работает.
31 gigi789
 
03.08.15
12:20
Для реального ускорения нужно вот эту часть
Пока ВыборкаСправочника.Следующий() Цикл
                    ОбВыборки = ВыборкаСправочника.Ссылка.ПолучитьОбъект();
                    //ОбВыборки.РазмерПункта = Объект.НовоеЗначениеРеквизитов ;

                    ОбВыборки.РазмерПункта = СтрЗаменить(ОбВыборки.РазмерПункта,Объект.СтароеЗначениеРеквизитов,Объект.НовоеЗначениеРеквизитов);
                    ОбВыборки.Записать();                    
                КонецЦикла    
В фоне делать
А лучше еще разбивать на пакеты чтоб ускорится
32 Рэйв
 
03.08.15
12:20
Не устаю поражаться желаниям неофитов УФ.....
33 1Сергей
 
03.08.15
12:22
Всё-равно не пойму зачем тут запрос. К метаданным в запросе ты всё-равно не обратишься. Можно, разве что, отобрать элементы где в реквизите встречается СтароеЗначениеРеквизитов. Но, опять же придётся для каждого справочника выполнять свой запрос. Так себе оптимизация
34 gigi789
 
03.08.15
12:30
(33) Либо динамически строить запрос с унион но все равно обход метаданных получится. Единственный способ это создать либо справочник, либо регистр, либо на худой конец сформировать тз и выгружать в файл. Тогда реально обход метаданных будет проходить 1 раз Для формирования а потом можно и в сторону запроса смотреть.
Компьютеры — это как велосипед. Только для нашего сознания. Стив Джобс