Вход | Регистрация
 
1С:Предприятие :: 1С:Предприятие 8 общая

Запрос по НоменклатураГТД

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

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

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

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

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

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

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

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


Список тем форума
Рекламное место пустует  Рекламное место пустует
ВНИМАНИЕ! Если вы потеряли окно ввода сообщения, нажмите Ctrl-F5 или Ctrl-R или кнопку "Обновить" в браузере.