Имя: Пароль:
1C
1С v8
Запрос по НоменклатураГТД
,
0 The_ka6a4ok
 
13.11.20
10:23
добрых дней. задача: взять названия номенклатура из Справочники.НомеклатураГТД.Владелец и сравнить их с названиями Справочники.Номенклатура.Наименование, то есть, они должны совпадать, при этом у второго справочника, в поле НоменклатураГТД должна быть пустая ссылка на первый справочник. Есть два моих "решения", которые не работают как задумано, вот я и пытаюсь узнать, что делаю не так, вот код из консоли запросов:
Выбрать
    Номенклатура.Наименование КАК Имя,
    Номенклатура.НоменклатураГТД КАК КодУКТВЭД,
    НоменклатураГТД.Владелец КАК Владелец
    ИЗ Справочник.Номенклатура как Номенклатура
    ЛЕВОЕ СОЕДИНЕНИЕ Справочник.НоменклатураГТД
    ПО НоменклатураГТД.Владелец = Номенклатура.Наименование
    ГДЕ Номенклатура.НоменклатураГТД = Значение(Справочник.НоменклатураГТД.ПустаяСсылка)

Если убрать условие, все равно не тот результат, но скорее всего из-за того, что я связываю именно вторую таблицу с первой, а не наоборот, увы но Правое Соединение вовсе крашит консоль, не понимаю почему.

Есть и второе решение, оно подразумевает выборку в цикле, я реализовал это уже в конфигураторе:
    ЗапросГТД = новый Запрос();
    ЗапросГТД.Текст = "Выбрать
    |    НоменклатураГТД.Владелец как Имя,
    |    НоменклатураГТД.КодУКТВЭД как Код
    |    ИЗ Справочник.НоменклатураГТД как НоменклатураГТД";
    ВыборкаГТД = ЗапросГТД.Выполнить().Выбрать();
    Пока ВыборкаГТД.Следующий() Цикл
        Запрос = Новый Запрос();
        Запрос.Текст = "Выбрать
        |    Номенклатура.Наименование КАК Имя,
        |    Номенклатура.НоменклатураГТД КАК КодУКТВЭД
        |    ИЗ Справочник.Номенклатура как Номенклатура
        |    ГДЕ Номенклатура.Наименование = &Наименование И Номенклатура.НоменклатураГТД = Значение(Справочник.НоменклатураГТД.ПустаяСсылка)";
        Запрос.УстановитьПараметр("Наименование", ВыборкаГТД.Имя);
        Выборка = Запрос.Выполнить().Выбрать();
        Пока Выборка.Следующий() Цикл
            Сообщить(Выборка.Имя);
            Если Выборка.КодУКТВЭД = "" Тогда
                Сообщить("Основа - " + Выборка.Имя + ", ГТД - " + ВыборкаГТД.Имя + ", Код - " + ВыборкаГТД.Код);
                Прервать;
            Иначе Прервать;
            КонецЕсли;
        КонецЦикла;
    КонецЦикла;
Сдается мне что это тут так не работает, но оно действительно не работает.
1 НЕА123
 
13.11.20
10:49
>ПО НоменклатураГТД.Владелец = Номенклатура.Наименование
ПО НоменклатураГТД.Владелец.НАИМЕНОВАНИЕ = Номенклатура.Наименование
2 Волшебник
 
13.11.20
10:50
ЛЕВОЕ СОЕДИНЕНИЕ Справочник.НоменклатураГТД
    ПО НоменклатураГТД.Владелец = Номенклатура.Ссылка
3 The_ka6a4ok
 
13.11.20
11:05
(1) (2) хм, в обоих случаях ошибка "недостаточно памяти"
4 Волшебник
 
13.11.20
11:06
(3) Поставь 64-битный клиент
5 vicof
 
13.11.20
11:21
И сервер нормальный купи
6 The_ka6a4ok
 
13.11.20
11:24
(5) действительно дельный совет
7 The_ka6a4ok
 
13.11.20
11:38
я не понимаю почему когда я соединяю таблицы по условию, это условие не соблюдается, что в конфигураторе так, что в консоли
8 The_ka6a4ok
 
13.11.20
11:40
и почему правое соединение не работает
9 NeiTRoN4ik
 
13.11.20
11:56
(8) У тебя владелец - это ссылка же. А ты ее соединяешь со строкой
10 Жан Пердежон
 
13.11.20
12:00
(7) всё соблюдается - как написал так и работает
11 The_ka6a4ok
 
13.11.20
12:23
(9) если изменить "владелец" на "наименование" ничего не изменится, правое соединений все ещё дает пустой результат
12 The_ka6a4ok
 
13.11.20
12:23
(10) неужели дело в 32-битной платформе?
13 SleepyHead
 
гуру
13.11.20
12:28
(0) А регистр надо учитывать?

"Сапоги" = "САПОГИ" или нет?
14 The_ka6a4ok
 
13.11.20
12:30
(13) регистр не учитываются, наименования полностью идентичны, но почему-то ни одно не находится
15 SleepyHead
 
гуру
13.11.20
12:32
(14) Длина наименований в справочниках разная или одинаковая? Как выглядят в выборке наименования? Посмотри в консоли, есть ли пробелы справа.
16 The_ka6a4ok
 
13.11.20
12:36
(15) длина тоже одинаковая, изначально, все что находится в Справочник.НоменклатураГТД(первый) это ссылки на второй справочник, соответственно, они должны быть идентичны, разве нет?
17 NeiTRoN4ik
 
13.11.20
12:40
(11) Что значит изменить? У тебя НоменклатураГТД это подчиненный справочник Номенклатуры?
18 Волшебник
 
13.11.20
12:41
Давайте назовём Справочник.НоменклатураГТД вторым, а Справочник.Номенклатура первым
19 The_ka6a4ok
 
13.11.20
12:50
(17) нет, мне их просто нужно сравнить 2 справочника и выбрать из первого все, что есть во втором, потом, если строка кода у первого пуста, заполнить её из второго
20 NeiTRoN4ik
 
13.11.20
13:30
Думаю надо вернуться в начало. В самом первом запросе почему такое соедиенение?

ПО НоменклатураГТД.Владелец = Номенклатура.Наименование

Какой у тебя тип реквизита "Владелец"? Что с чем соединяешь то?
21 The_ka6a4ok
 
13.11.20
13:46
(20) это стандартный реквизит, тип: справочник.номенклатура
22 The_ka6a4ok
 
13.11.20
13:48
парни, а если у одного справочника тип ссылка, а у другого строка, но значения у них одинаковые, то можно ли считать, что значения одинаковы?
23 The_ka6a4ok
 
13.11.20
13:52
(22) не, все равно не
24 hhhh
 
13.11.20
14:00
(22) не,нельзя так считать.
25 Волшебник
 
13.11.20
14:12
(22) Если типы разные, то значения не будут равны, даже если равны их строковые представления.
26 NeiTRoN4ik
 
13.11.20
14:14
(21) Ну вот я тебе и говорю. Как ты соединяешь ссылку со строкой? конечно не будет работать.
" а если у одного справочника тип ссылка, а у другого строка, но значения у них одинаковые" - у разных типов не бывает одинаковых значений.
27 NeiTRoN4ik
 
13.11.20
14:22
У тебя и во втором твоем варианте та же самая ошибка.

Запрос.УстановитьПараметр("Наименование", ВыборкаГТД.Имя);

ВыборкаГТД.Имя - у тебя ссылка
28 The_ka6a4ok
 
13.11.20
14:30
кажется, работает, но долго
29 The_ka6a4ok
 
13.11.20
14:30
даже что-то записывает в справочник, в поле, по условию, не знаю, сейчас дождусь конца работы и проверю, все ли так, как задумано изначально
30 The_ka6a4ok
 
13.11.20
14:31
(27) да, теперь я знаю, что у разных типов значения тоже разные, что если спихнуть туда ссылку - скоро узнаю
31 The_ka6a4ok
 
13.11.20
16:38
парни, я сделал, вот код:

        Запрос = Новый Запрос();
    Запрос.Текст = "Выбрать
    |    Номенклатура.Ссылка КАК Ссылка
    |    ИЗ Справочник.Номенклатура как Номенклатура
    |    ГДЕ Номенклатура.НоменклатураГТД = Значение(Справочник.НоменклатураГТД.ПустаяСсылка)";
    Выборка = Запрос.Выполнить().Выбрать();
    Пока Выборка.Следующий() Цикл
        ЗапросГТД = новый Запрос();
        ЗапросГТД.Текст = "Выбрать
        |    НоменклатураГТД.Владелец как Имя,
        |    НоменклатураГТД.Ссылка как Ссылка
        |    ИЗ Справочник.НоменклатураГТД как НоменклатураГТД
        |    ГДЕ НоменклатураГТД.Владелец = &Наименование";
        ЗапросГТД.УстановитьПараметр("Наименование", Выборка.Ссылка);
        ВыборкаГТД = ЗапросГТД.Выполнить().Выбрать();
        Пока ВыборкаГТД.Следующий() Цикл
            Объект = Выборка.Ссылка.ПолучитьОбъект();
            Объект.НоменклатураГТД = ВыборкаГТД.Ссылка;
            Объект.ОбменДанными.Загрузка = истина;
            Объект.Записать();
        КонецЦикла;
    КонецЦикла;
32 NeiTRoN4ik
 
13.11.20
17:01
(31) ай молодец! xD
А теперь все-таки через 1 запрос давай )
Вообще конечная интересная ситуация, писать запросы и не знать что ссылка и строка разные вещи)