Имя: Пароль:
1C
1С v8
Объект метаданных в запросе
,
0 AlexeyVM
 
01.09.17
06:32
Добрый день, подскажите пожалуйста
как мне правильно добавить в запрос объект метаданных справочники, чтобы запрос выполнялся по всем справочникам.
Пишу так
Для каждого Справочник из Метаданные.Справочники Цикл
Запрос = Новый Запрос;
    Запрос.Текст =
        "ВЫБРАТЬ
        |    Таблица.Код
        |ИЗ
        |    " + Справочник + " КАК Таблица";
    
    ВыборкаДетальныеЗаписи = Запрос.Выполнить().Выгрузить();

При отладке в значении "Справочник" записано название справочника (например "Номенклатура"), а как я понял надо, чтобы было записано например -  "Справочник.Номенклатура".
Пробовал через Метаданные.НайтиПоПолномуИмени(Справочник);
но не находит ничего, подскажите, как правильно получить объект метаданных для запроса.
1 Zmich
 
01.09.17
06:43
(0). Не очень понятно, в чем проблема.
"ВЫБРАТЬ
|    Таблица.Код
|ИЗ
|    Справочник." + Справочник + " КАК Таблица";
2 AlexeyVM
 
01.09.17
06:47
А ну да, точно. Только сделал по-другому (т.к. надо было значения всех справочников)
ШаблонЗапроса = "
    |ВЫБРАТЬ
    |       #Таблица.Код КАК Код
    |ИЗ
    |       #Таблица
    |";
    
    ТекстЗапроса = "";
    Для каждого ТекДанные из Метаданные.Справочники Цикл
        ТекстЗапроса = ТекстЗапроса + ?(ПустаяСтрока(ТекстЗапроса), "", "
        |ОБЪЕДИНИТЬ ВСЕ
        |")
        + СтрЗаменить(ШаблонЗапроса, "#Таблица", "Справочник." + ТекДанные.Имя);
    КонецЦикла;    
3 Fram
 
01.09.17
06:50
(2) ну, молодец, конечно.. а практический смысл этого запроса какой?
4 VladZ
 
01.09.17
06:52
(0) Зачем тебе это?
5 AlexeyVM
 
01.09.17
06:53
(3) Да мне надо будет вывести список дублей со всех справочников, по полям указанным в правилах обмена. Работы еще много. Теперь думаю как разные реквизиты подставлять в запрос, например у одного справочника надо будет искать дубли по наименованию, у другого по ИНН. Пока не представляю, как это сделать
6 Sserj
 
01.09.17
06:53
Вообще постановка задачи какая то бредовая если честно.
Но если уж совсем не в терпеж то должно быть что-то типа такого:

КоллекцияСправочников = Метаданные["Справочники"];

ТекстЗапроса = "
ВЫБРАТЬ
    Код
ИЗ
    Справочник." + КоллекцияСправочников[0].Имя;

Для индексСправочников = 1 ПО КоллекцияСправочников.Количество() - 1 Цикл
    ТекстЗапроса = ТекстЗапроса + "
      
        ОБЪЕДИНИТЬ ВСЕ
        
        ВЫБРАТЬ
            Код
        ИЗ
            Справочник." + КоллекцияСправочников.Получить[индексСправочников].Имя;

КонецЦикла;

Запрос = Новый Запрос;
Запрос.Текст = ТекстЗапроса;
7 AlexeyVM
 
01.09.17
06:54
Приведенный запрос был только для примера, чтобы объединить все справочники
8 VladZ
 
01.09.17
06:55
(7) И какой смысл их объединять?
9 AlexeyVM
 
01.09.17
06:56
хмм, ну так-то да, наверное смысла нету. Как-то потом надо будет делать группировку по справочникам
10 VladZ
 
01.09.17
06:57
(9) А группировка зачем?
11 AlexeyVM
 
01.09.17
06:58
Вывести список
Имя справочника 1
              Неуникальный код 1
                      Элемент1        КодЭлемента1


что-то вроде
Основные средства
              123
                     Машина Ваз 2112           000123
12 Sserj
 
01.09.17
07:05
(11) Ну вообще то это сделать тоже не трудно, если скорость работы не особо важна.

ВЫБРАТЬ
  '" + КоллекцияСправочников[0].Имя + "' КАК ИДСправочника
  Код КАК КодЭлемента
ИЗ
....

ОБЪЕДИНИТЬ ВСЕ
  '" + КоллекцияСправочников.Получить[индексСправочников].Имя + "
ИЗ
.....

Это все во временную таблицу индексированную по КодЭлемента

ВЫБРАТЬ

....

ГДЕ
   КодЭлемента В (ВЫБРАТЬ КодЭлемента ИЗ ВременнаяТаблица СГРУППИРОВАТЬ ПО КодЭлемента ИМЕЮИЩЕ Количество(КодЭлемента) > 1)
13 Fram
 
01.09.17
07:12
(5) если для каждого справочника отдельные условия дублирования (что логично) нафига объединять все в один запрос?
14 AlexeyVM
 
01.09.17
07:19
(12) При КоллекцияСправочников.Получить[индексСправочников].Имя
Ругается: Поле объекта не обнаружено (Получить)
15 AlexeyVM
 
01.09.17
07:21
Наверное там круглые скобки?
16 Sserj
 
01.09.17
07:35
(15) Да конечно круглые.
17 VladZ
 
01.09.17
07:39
(11) Идея хорошая. Только есть одно но...  В конфигурации куча справочников. Какие-то нужно контролировать, какие-то не нужно. Зачем анализировать ВСЕ?
18 AlexeyVM
 
01.09.17
07:44
(17) Так попросили сделать. Я понимаю, что многие справочники и сравнивать смысла нет. Все это делается, чтобы увидеть дубли в справочниках до переноса данных и исправить их вручную
19 АнализДанных
 
01.09.17
08:23
(0) У объекта метаданных есть метод "ПолноеИмя()" (с названием могу ошибиться) он возвещает то, что тебе надо "справочник.номенклатура"
20 AlexeyVM
 
01.09.17
09:49
Хотелось бы услышать советы, как в дальнейшем выбирать по какому полю искать дубли? Думал, думал, но поскольку опыта в программировании еще мало, идеи пришли на ум не очень хорошие - 1. Писать условия для каждого справочника, какие реквизиты надо вытаскивать запросом (смотреть вручную из ПКС), 2.Вытащить их из XML правил обмена, но что с ними делать потом в обработке пока не придумал, 3(Самая бредовая). Написать подзапрос для каждого справочника по разным реквизитам. 4. Использовать мой запрос для справочников, у которых объединение по коду, а что делать с остальными...
Короче идеи у меня вообще не очень, пока ничего в голову не приходит
21 dezss
 
01.09.17
09:53
(20) определить соответствие и в него запихать Имя твоего справочника и название поля для поиска дублей. Откуда заполнять - это вопрос. Либо в коде, либо откуда-то вытаскивать. Можно попробовать вытаскивать и из xml правил.
22 Мимохожий Однако
 
01.09.17
09:53
(5) Есть готовые обработки по поиску и замене дублей в УТ10.3 и УТ11 с различными отборами
23 AlexeyVM
 
01.09.17
09:56
(22)
да, я смотрел готовую обработку, там нужно самостоятельно выбрать справочник и самостоятельно выбрать поля, по которым искать дубли. А мне надо, чтобы при нажатии кнопки выводился список сразу всех справочников с дублями по полям из ПКС. Конечно, можно было ничего не писать, а пользоваться готовой по очереди по всем справочникам, но для пользователей это слишком долго.
24 AlexeyVM
 
01.09.17
09:57
(21) С соответствиями еще не сталкивался, почитаю сейчас, может быть поможет.
25 Мимохожий Однако
 
01.09.17
09:58
(23) Забота о пользователях похвальна. Лишь бы твоя разработка по времени исполнения была меньше обучения пользователей. ИМХО.
26 dezss
 
01.09.17
10:00
(24) Соответствие - это просто коллекция значений типа КлючИЗначение. Только ключи там все уникальны и оно типа индексировано.
На основании его уже строишь запрос.
27 AlexeyVM
 
01.09.17
10:01
(25) Ну это да, но использоваться она будет не часто (перед переходом с БГУ 1 на БГУ 2), так что впринципе даже если пол дня будет работать, на ночь буду запускать)
AdBlock убивает бесплатный контент. 1Сергей