Имя: Пароль:
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), так что впринципе даже если пол дня будет работать, на ночь буду запускать)
Чтобы обнаруживать ошибки, программист должен иметь ум, которому доставляет удовольствие находить изъяны там, где, казалось, царят красота и совершенство. Фредерик Брукс-младший