Имя: Пароль:
1C
 
Почему сравнение с NULL не работает ожидаемым образом?
, ,
0 Гений 1С
 
гуру
20.05.22
14:45
В запросе пришлось добавить ЕСТЬNULL

    "ВЫБРАТЬ
    |    ТБ.Цена КАК БазоваяЦена,
    |    ТЦ.Цена КАК Цена,
    |    &НоваяЦена КАК НоваяЦена,
    |    ТБ.Номенклатура КАК Номенклатура,
    |    ТБ.Характеристика КАК Характеристика,
    |    ТБ.ЕдиницаИзмерения КАК ЕдиницаИзмерения
    |ИЗ
    |    РегистрСведений.ЦеныНоменклатуры.СрезПоследних(&Дата, ВидЦен = &ВидЦенБ) КАК ТБ
    |        ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ЦеныНоменклатуры.СрезПоследних(&Дата, ВидЦен = &ВидЦен) КАК ТЦ
    |        ПО ТБ.Номенклатура = ТЦ.Номенклатура
    |            И ТБ.Характеристика = ТЦ.Характеристика
    |ГДЕ
    |    ЕСТЬNULL(ТЦ.Цена, 0) <> &НоваяЦена";    


Новая цена - это сложное условие, зависящее от ТБ.Цена.

По сути, если старая цена ТЦ.Цена <> новой расчетной цене, то по этой позиции должна записываться новая цена.

Но не работало, попадали только те записи, где была хоть одна запись по цене, т.е. перерасчет цен работал, а добавление новой цены не работало.

Почему так? Оно что, считало что NULL <> Произвольное число - всегда истина?
171 Said_We
 
23.05.22
11:00
Про именование переменных, это вечный спор о вечном. :-)
172 Гений 1С
 
гуру
23.05.22
12:13
(169) и почему же?
173 Said_We
 
23.05.22
12:59
(172) ответ в (40), (46), (47).
174 Said_We
 
23.05.22
13:55
(172) Я ответил на вопрос: Почему?
175 vi0
 
23.05.22
15:15
(171) это про комменты
А именование +- регламентировано
176 Said_We
 
23.05.22
15:33
(175) Комментарии не нужны, если код написан нормально. Собственно идеально когда код написан так, что бы комментировать не было необходимости.
Если имена переменных очень понятны, но они километровые, то логика алгоритма теряется за длиной имен переменных.
Поэтому должен быть консенсус.

По запросам ещё проще. Конструкции стандартные, количество операторов наверное меньше чем команд в ассемблере.
Комментировать особо не чего. Тут практически не алгоритм, а описание результата. Если таблиц штук пять или меньше и связи простые, то фиолетово какие будут имена у таблиц. FROM всегда где-то рядом. Можно просто т1, т2...
Если есть вложенная одинокая таблица в подзапросе, то внутри можно просто т. По умолчанию предлагает ВложенныйЗапрос, но проще просто т.

Т.е.
Выбрать
     ИмяТаблицы1.Поле1
    ,ИмяТаблицы2.Поле1
ИЗ
     ИмяТаблицы1 как ИмяТаблицы1
    ,(выбрать т.Поле1 из КакаяТоТаблица как т где т.Поле1 = 0) как ИмяТаблицы2

Я про алиас "т" таблицы "КакаяТоТаблица", который внутри подзапроса.
177 Kassern
 
23.05.22
15:38
(176) "По запросам ещё проще" - ага, когда 100500 таблиц во менеджерах временных таблиц. А потом еще всякие вложенные таблицы внутри вложенных таблиц и все обезличенные - ммм какая красота, как же все легко читается и понятно, что автор хотел в этом запросе)
178 Said_We
 
23.05.22
15:42
(177) Прикинь и это только в 1С такой треш. А знаешь почему? SQL стандарт 10-ти летней давности. + Недостаток функционала в тех же функциях. Математические функции только добавили.

Это я к чему. Ко скольким физическим таблицам обращается этот километровый запрос?
179 vi0
 
23.05.22
15:44
(176)  я не спрашивал, нужны ли комментарии
180 Said_We
 
23.05.22
16:05
(179) Извини, но я так понял твой пост.
181 Конструктор1С
 
23.05.22
16:06
(178) трэш в запросах, потому что 1сники повадились напичкивать запросы сложной логикой, где только можно. Коллективная такая болезнь
182 Said_We
 
23.05.22
16:10
(181) Какая ещё сложная логика? А чем речь?
183 Конструктор1С
 
23.05.22
16:13
(182) ну когда начинаются невнятные условия соединений, портянки выбор когда... тогда..., переливания данных через пятнадцать временных таблиц
184 Конструктор1С
 
23.05.22
16:16
вот такое авно в том или ином виде растеклось по 100500 модулям в типовых конфигурациях


    Сумма * ВЫБОР
        КОГДА Номенклатура.СтавкаНДС = ЗНАЧЕНИЕ(Перечисление.СтавкиНДС.НДС18)
                ИЛИ Номенклатура.СтавкаНДС = ЗНАЧЕНИЕ(Перечисление.СтавкиНДС.НДС18_118)
            ТОГДА 0.18
        КОГДА Номенклатура.СтавкаНДС = ЗНАЧЕНИЕ(Перечисление.СтавкиНДС.НДС10)
                ИЛИ Номенклатура.СтавкаНДС = ЗНАЧЕНИЕ(Перечисление.СтавкиНДС.НДС10_110)
            ТОГДА 0.1
        КОГДА Номенклатура.СтавкаНДС = ЗНАЧЕНИЕ(Перечисление.СтавкиНДС.НДС0)
                ИЛИ Номенклатура.СтавкаНДС = ЗНАЧЕНИЕ(Перечисление.СтавкиНДС.БезНДС)
            ТОГДА 0
        КОГДА Номенклатура.СтавкаНДС = ЗНАЧЕНИЕ(Перечисление.СтавкиНДС.НДС20)
                ИЛИ Номенклатура.СтавкаНДС = ЗНАЧЕНИЕ(Перечисление.СтавкиНДС.НДС20_120)
            ТОГДА 0.2
        ИНАЧЕ 0
    КОНЕЦ КАК СуммаНДС
185 Kassern
 
23.05.22
16:17
(184) это вы еще лесенку с родителями не скинули))
186 vi0
 
23.05.22
16:18
да, болезнь называется "я такой крутой программист, что смог всю логику запихать в запрос"
187 Said_We
 
23.05.22
16:20
(183) "портянки выбор когда... тогда..." - Для простых конструкций есть короткая конструкция IIF(Условие, РезультатЕслиИстина, РезультатЕслиЛожь), но только не в 1С.
"переливания данных через пятнадцать временных таблиц" - это как правило из-за отсутствия оконных функций, а так же простых функций без временных таблиц RANK(),  DENSE_RANK(), ROW_NUMBER().

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

(186) Нет. Подобные задачи не в 1С тоже решают с помощью SQL запроса, но выглядит это всё компактно и понятно.
188 vi0
 
23.05.22
16:22
(187) какие "подобные"? я не говорил ни о каких то конкретных задачах
189 Конструктор1С
 
23.05.22
16:24
(187) так про то и речь, что 1сный SQL чрезвычайно ограниченный. На кой в него пихать то, что гораздо проще сделать на встроенном языке? Код на встроенном языке обладает несравнимо большей гибкостью, чем запросы. Ну получи ты данные из табличек, соедини их, а потом во встроенном языке прогони через код
190 Said_We
 
23.05.22
16:25
(188) Любые подобные. Не решает же 1С какие-то задачи, которые решает только 1С. Скорее наоборот - 1С не решает многих задач, которые решают не на 1С. Собственно так можно не только про 1С говорить. Всегда есть какой-то аналогичный инструмент, который может решать аналогичные задачи.
191 Said_We
 
23.05.22
16:27
(189) Запрос даст в общем случае более быстрый результат. Бывают какие-то исключения, но это как правило задачки олимпиадные, которые в промышленном коде не решают. :-)
192 Конструктор1С
 
23.05.22
16:29
(191) например, что запрос может ускорить в (184)?
193 vi0
 
23.05.22
16:29
(190) вообще слово "подобные" подразумевает сравнение
я говорю о сотруднике который пишет цикл или условие в одну строку или пихает всю логику в запрос, только лишь по той причине что в этот момент он чуствует себя тру-програмистом
194 Said_We
 
23.05.22
16:29
Мне таки интересно Серёжа ответит на мой вопрос в (174).
"(172) Я ответил на вопрос: Почему?"
195 vi0
 
23.05.22
16:30
(191) общий случай - называется преждевременной оптимизацией, если ты понимаешь о чем я
196 Конструктор1С
 
23.05.22
16:36
(195) вот да, преждевременная оптимизация - отдельный вид зла. Который не намного лучше дублирования в коде. А уродливые запросы это прям комбо. Тут и дублирование (одно и то же растаскивается по множеству запросов), и преждевременная оптимизация
197 Said_We
 
23.05.22
16:36
(192) Цепонуть сразу короткую таблицу, в которой напротив каждой ставки уже свой коэффициент: 0, 0.1, 0.18, 0.2...
По скорости внутреннее соединение короткой таблицы, будет быстро, а копипаста минимум.
Что бы не было по "100500 модулям в типовых конфигурациях". Таблица же статическая. При запуске создал и юзай везде.
198 Said_We
 
23.05.22
16:39
При добавлении новой ставки в 17%, достаточно при запуске поправить создание таблицы. Код будет статичный.
199 Конструктор1С
 
23.05.22
16:45
(197) ну реальность-то таковая, что в тысяче запросов накрошили "выбор когда тогда" с конкретными ставками

(198) так не сделали этого сразу же. Поэтому добавление двух несчастных значений в перечисление привело к исправлениям в 100500 запросам. Самое интересное, отдельной таблички со ставками тут и не нужно было. Достаточно было при обходе выборки звать функцию вычисления ставки НДС. Если СКД, то в вычисляемых полях ту же функцию дёргать
200 Конструктор1С
 
23.05.22
16:46
Вот, запросная наркомания из типовой. Запрос сам себя дублирует

ВЫБРАТЬ
    ВЫБОР
        КОГДА КорректировкаПоступленияТовары.КоличествоДоИзменения >= КорректировкаПоступленияТовары.Количество
            ТОГДА &ИсправляемыйДокументПоступления
        ИНАЧЕ &СчетФактура
    КОНЕЦ КАК СчетФактура,
    &ИсправляемыйДокументПоступления КАК Партия,
    &Склад КАК Склад,
    ЗНАЧЕНИЕ(Перечисление.ВидыЦенностей.ПустаяСсылка) КАК ВидЦенности,
    КорректировкаПоступленияТовары.Номенклатура КАК Номенклатура,
    КорректировкаПоступленияТовары.СтавкаНДС КАК СтавкаНДС,
    КорректировкаПоступленияТовары.Количество - КорректировкаПоступленияТовары.КоличествоДоИзменения КАК Количество,
    ВЫБОР
        КОГДА НЕ КорректировкаПоступленияТовары.Ссылка.СуммаВключаетНДС
            ТОГДА КорректировкаПоступленияТовары.Сумма + КорректировкаПоступленияТовары.СуммаНДС - (КорректировкаПоступленияТовары.СуммаДоИзменения + КорректировкаПоступленияТовары.СуммаНДСДоИзменения)
        ИНАЧЕ КорректировкаПоступленияТовары.Сумма - КорректировкаПоступленияТовары.СуммаДоИзменения
    КОНЕЦ КАК Стоимость,
    КорректировкаПоступленияТовары.СчетУчета КАК СчетУчета,
    КорректировкаПоступленияТовары.СчетУчетаНДС КАК СчетУчетаНДС,
    КорректировкаПоступленияТовары.Ссылка.Дата КАК Период,
    КорректировкаПоступленияТовары.Ссылка.Организация КАК Организация,
    КорректировкаПоступленияТовары.НомерСтроки КАК НомерСтроки,
    КорректировкаПоступленияТовары.Ссылка КАК Регистратор,
    ЛОЖЬ КАК НоваяСтрока,
    ВЫБОР
        КОГДА КорректировкаПоступленияТовары.СтавкаНДС = ЗНАЧЕНИЕ(Перечисление.СтавкиНДС.НДС20)
                ИЛИ КорректировкаПоступленияТовары.СтавкаНДС = ЗНАЧЕНИЕ(Перечисление.СтавкиНДС.НДС20_120)
            ТОГДА 20 / 120
        КОГДА КорректировкаПоступленияТовары.СтавкаНДС = ЗНАЧЕНИЕ(Перечисление.СтавкиНДС.НДС18)
                ИЛИ КорректировкаПоступленияТовары.СтавкаНДС = ЗНАЧЕНИЕ(Перечисление.СтавкиНДС.НДС18_118)
            ТОГДА 18 / 118
        КОГДА КорректировкаПоступленияТовары.СтавкаНДС = ЗНАЧЕНИЕ(Перечисление.СтавкиНДС.НДС10)
                ИЛИ КорректировкаПоступленияТовары.СтавкаНДС = ЗНАЧЕНИЕ(Перечисление.СтавкиНДС.НДС10_110)
            ТОГДА 10 / 110
        ИНАЧЕ 0
    КОНЕЦ КАК СтавкаНДСМножитель
ИЗ
    Документ.КорректировкаПоступления.Товары КАК КорректировкаПоступленияТовары
ГДЕ
    КорректировкаПоступленияТовары.Ссылка = &Ссылка
    И (КорректировкаПоступленияТовары.КоличествоДоИзменения - КорректировкаПоступленияТовары.Количество <> 0
            ИЛИ КорректировкаПоступленияТовары.СуммаНДСДоИзменения - КорректировкаПоступленияТовары.СуммаНДС <> 0
            ИЛИ КорректировкаПоступленияТовары.СуммаДоИзменения - КорректировкаПоступленияТовары.Сумма <> 0)
    И КорректировкаПоступленияТовары.КоличествоДоИзменения <> 0
    И НЕ КорректировкаПоступленияТовары.СчетУчета.Забалансовый

ОБЪЕДИНИТЬ ВСЕ

ВЫБРАТЬ
    &СчетФактура,
    &ИсправляемыйДокументПоступления,
    &Склад,
    ЗНАЧЕНИЕ(Перечисление.ВидыЦенностей.ПустаяСсылка),
    КорректировкаПоступленияТовары.Номенклатура,
    КорректировкаПоступленияТовары.СтавкаНДС,
    КорректировкаПоступленияТовары.Количество,
    ВЫБОР
        КОГДА НЕ КорректировкаПоступленияТовары.Ссылка.СуммаВключаетНДС
            ТОГДА КорректировкаПоступленияТовары.Сумма + КорректировкаПоступленияТовары.СуммаНДС
        ИНАЧЕ КорректировкаПоступленияТовары.Сумма
    КОНЕЦ,
    КорректировкаПоступленияТовары.СчетУчета,
    КорректировкаПоступленияТовары.СчетУчетаНДС,
    КорректировкаПоступленияТовары.Ссылка.Дата,
    КорректировкаПоступленияТовары.Ссылка.Организация,
    КорректировкаПоступленияТовары.НомерСтроки,
    КорректировкаПоступленияТовары.Ссылка,
    ИСТИНА,
    ВЫБОР
        КОГДА КорректировкаПоступленияТовары.СтавкаНДС = ЗНАЧЕНИЕ(Перечисление.СтавкиНДС.НДС20)
                ИЛИ КорректировкаПоступленияТовары.СтавкаНДС = ЗНАЧЕНИЕ(Перечисление.СтавкиНДС.НДС20_120)
            ТОГДА 20 / 120
        КОГДА КорректировкаПоступленияТовары.СтавкаНДС = ЗНАЧЕНИЕ(Перечисление.СтавкиНДС.НДС18)
                ИЛИ КорректировкаПоступленияТовары.СтавкаНДС = ЗНАЧЕНИЕ(Перечисление.СтавкиНДС.НДС18_118)
            ТОГДА 18 / 118
        КОГДА КорректировкаПоступленияТовары.СтавкаНДС = ЗНАЧЕНИЕ(Перечисление.СтавкиНДС.НДС10)
                ИЛИ КорректировкаПоступленияТовары.СтавкаНДС = ЗНАЧЕНИЕ(Перечисление.СтавкиНДС.НДС10_110)
            ТОГДА 10 / 110
        ИНАЧЕ 0
    КОНЕЦ
ИЗ
    Документ.КорректировкаПоступления.Товары КАК КорректировкаПоступленияТовары
ГДЕ
    КорректировкаПоступленияТовары.Ссылка = &Ссылка
    И (КорректировкаПоступленияТовары.КоличествоДоИзменения - КорректировкаПоступленияТовары.Количество <> 0
            ИЛИ КорректировкаПоступленияТовары.СуммаНДСДоИзменения - КорректировкаПоступленияТовары.СуммаНДС <> 0
            ИЛИ КорректировкаПоступленияТовары.СуммаДоИзменения - КорректировкаПоступленияТовары.Сумма <> 0)
    И КорректировкаПоступленияТовары.КоличествоДоИзменения = 0
    И НЕ КорректировкаПоступленияТовары.СчетУчета.Забалансовый
201 Said_We
 
23.05.22
16:50
(199) СКД это в основном вывод результата в читабельном виде с динамическими группировками и колонками. Не нужно в СКД совать логику расчетную, которая не в отчет.
Не сделал, так зачем было править при добавлении ставки путем добавлении везде - сразу переписать. Это проблемы проектирования конфигураций 1С. Особенно в последнее время. Создадут кучу реквизитов, а потом удаляют и создают новые такие же.
Не знать заранее что в нашей стране ставка НДС может меняться хоть каждый день... Ну как бы не первый раз они меняются и не последний.
202 Выпрь
 
23.05.22
16:51
(200) а как надо было?
203 Конструктор1С
 
23.05.22
16:51
(201) проблема со ставками НДС не была бы проблемой, если бы 1сники не вычисляли её в запросе
204 Выпрь
 
23.05.22
16:52
(201) справочник все равно не поможет ибо жесткая привязка колонок к ставкам
205 Said_We
 
23.05.22
16:52
(200) Я так понимаю разница тут:
В выбрать
ЛОЖЬ КАК НоваяСтрока,

и в условии

И КорректировкаПоступленияТовары.КоличествоДоИзменения = 0
    И НЕ КорректировкаПоступленияТовары.СчетУчета.Забалансовый

(202) Выбор когда добавь и радуйся.
206 Kassern
 
23.05.22
16:52
(202) вангую КорректировкаПоступленияТовары.СтавкаНДС.Множитель и все - без всяких выбор когда))
207 Конструктор1С
 
23.05.22
16:53
(202) простейшим запросов выбрать данные из ТЧ, потом обойти в цикле, делая вычисления. Код стал бы и короче, и намного читабельнее. Самое главное, его не пришлось бы перепахивать при появлении новых ставок НДС
208 Конструктор1С
 
23.05.22
16:55
(205) во-во-во! Отдельный ребус найти разницу в этих двух почти одинаковых запросах. Отдельная удача не допустить ошибку при их доработке...
209 Said_We
 
23.05.22
16:59
(207) Не проще. Если этот код при проведении, то вот эти туды-сюды данных ооооочень медленно.
И зачем вычислять, если можно просто соединить и получить нужный коэффициент сразу. Вопрос только в отсутствии таблицы, построенной по статическим данным "Перечисление.СтавкаНДС". Создать служебный РС строить его при запуске 1С и не жужжать.
210 shuhard
 
23.05.22
17:01
(207) для типовой это сомнительные плюсы
211 Конструктор1С
 
23.05.22
17:02
(209) а зачем туды-сюды? Один раз получил данные запросом, и шлифуй их в коде. Один фиг ты притащишь эти данные на сервер, чтобы запихать в наборы записей

>>И зачем вычислять

Вот и у меня вопрос. Зачем делать вычисления в запросе? Они уродливые и приводят к дублированию
212 Said_We
 
23.05.22
17:02
"Строить при запуске 1С" - имеется ввиду при необходимости. При обновлении, например, когда это необходимо.
213 Said_We
 
23.05.22
17:03
Мне таки интересно Серёжа ответит на мой вопрос в (174).

Звучал он примерно так: "(172) Я ответил на вопрос: Почему?".
214 Конструктор1С
 
23.05.22
17:05
(210) это так кажется, оттого что слаще брюквы ничего не едовал, краше типового кода ничего не видовал. К сожалению, копаться в дерьмовом и задублированном коде настолько привычно для нашего брата 1сника, что давно стало обыденностью
215 СвинТуз
 
23.05.22
18:31
(0)
Хорошо когда о причине введения функции ЕстьNULL() задумываешься не после собеседования, а в результате тестирования своего запроса.
Опыт ценен. Лучше поздно (с несколькими сертификатами), чем никогда.

Казалось бы парадокс "NULL <> NULL", но с другой стороны отсутствие значения в разных физических таблицах дает один и тот же NULL.
И приравнивать их это терять физический смысл.
Ввели эту функцию, что бы разработчик обозначил пустые значения.
216 СвинТуз
 
23.05.22
18:33
(0)
Убивать за такие запросы надо )))
Шутка. Не рационально.
217 СвинТуз
 
23.05.22
18:40
Если "Характеристика" это измерение, то еще интереснее. )
Если оно не используется, то зачем в итоговую таблицу выбирать?
Если используется активно, то ... .

Если реквизит, то видимо другое дело.

Короче я в шоке ))). Вникать не хочется в чужую кухню.

Удачи Серега.
218 СвинТуз
 
23.05.22
18:43
Да нет поспешил вроде норм. Конец дня.
Но все равно я бы по другому написал.
Все мы разные.

(217) взад беру.

(216) оставлю

Типа мое мнение ) Которое не имеет смысла )
219 СвинТуз
 
23.05.22
18:45
Яркий пример что сертификаты ничего не гарантирую )
220 Гений 1С
 
гуру
23.05.22
21:06
(218) Перфекционист что ли? НЕ люблю перфекционистов, они убогие стандарты 1с-разработки пишут.
221 Said_We
 
23.05.22
23:43
(220) Мне таки интересно Серёжа ответит на мой вопрос в (174).
Звучал он примерно так: "(172) Я ответил на вопрос: Почему?".

Уже чисто спортивный интерес.
222 ДедМорроз
 
24.05.22
00:00
Если кто-то говорит,что в 1с сложные запросы,то пусть чистый sql посмотрит,где хранимые процедуры - вот где внсело и интересно,когда те же "модули",но внутри sql.
223 vi0
 
24.05.22
01:20
(222) а для чего смотреть некие абстрактные процедуры? Если смотреть то процедуры конкретные, в конкретных условиях разработки
224 Гений 1С
 
гуру
24.05.22
07:48
(221) сформулируй вопрос целиком. Если ты считаешь, что IN лучше чем JOIN, то мы на разных сторонах силы. ОК?
225 СвинТуз
 
24.05.22
09:14
(220)

Норм. Не обиделся.

Всегда потом можно деньги на оптимизации взять.
Кто-то костыли ставит. Кто-то снимает.
Так и зарабатываем.

Некоторые любят посидеть подождать пока запрос отработает )
Особенно если почасовка идет.
226 Said_We
 
24.05.22
13:06
(224) У тебя в IN всего два значения и этот IN в параметрах виртуальной таблицы.
Можешь написать не IN а "Условие1" ИЛИ "Условие2". Опа, и нет никакого IN.

А у тебя две выборки из одного источника данных, да ещё и левое соединение потом. Ты соединяешь таблицу саму с собой, при этом таблица используется как есть.
Т.е. одно дело ты в таблице нашел МАКС или МИН или ещё что и потом соединяешь уже преобразованную таблицу с исходной таблицей. А другое дело просто саму исходную таблицу саму с собой - в этом нет никакого смысла. Она у тебя и при первой выборки уже есть.
227 Гений 1С
 
гуру
25.05.22
12:37
(199) там они молятся на то, чтобы все вычисления были в запросах. поэтому я и не уважаю стандарты 1С-совместимо. Это не практическое руководство, а религиозное
228 Гений 1С
 
гуру
25.05.22
12:39
(194) таки сформулируй вопрос целиком, я запутался в твоих цикличных ссылках
229 Said_We
 
25.05.22
14:42
(228) Чего его там формулировать. Зачем левое соединение таблицы самой с собой?
230 Галахад
 
гуру
25.05.22
14:49
(227) Это в каком стандарте описано?
231 Конструктор1С
 
25.05.22
15:35
(227) бред же. Ты стандарты даже не читал
232 Конструктор1С
 
25.05.22
15:41
из стандартов, касательно твоих болячек в (0)

Псевдонимы источников данных в запросах

Псевдоним источника данных должен быть осмысленным, чтобы было понятным его назначение в данном контексте. Требования к псевдонимам источников схожи с требованиями к именам переменных в коде.

псевдонимы следует образовывать от терминов предметной области таким образом, чтобы было понятно, как источник данных будет использоваться в запросе;
псевдонимы следует образовывать путем удаления пробелов между словами. При этом каждое слово в имени пишется с прописной буквы (например, ТоварыНаСкладах). Предлоги и местоимения из одной буквы также пишутся прописными буквами;
псевдонимы запрещается начинать с подчеркивания;
псевдонимы не должны состоять из одного символа.
233 Гений 1С
 
гуру
25.05.22
17:58
(232) а из двух можно, ггг? ну что за бред, что за иллюзии в голове этих писателей стандартов?
234 Конструктор1С
 
25.05.22
18:28
(233) бред это твой код, а в стандартах все нормально. Что, стандарт задевает твои говнокодерские привычки?
235 mikecool
 
25.05.22
18:31
у меня привычка - передаваемую ТЗ как параметр алиасить как Т
ибо такой запрос(на выборку из параметра) обычно пишу руками, привычка - ибо не сразу понял , где в конструкторе этот механизм ))
236 Said_We
 
25.05.22
18:34
(228) И.... ? Опять я не сформулировал вопрос что ли?
237 Гений 1С
 
гуру
25.05.22
20:15
(226) какой такой один источник? там две таблицы с разными видами цен.
Да, можно использовать:
РегистрСведений.ЦеныНоменклатуры.СрезПоследних(&Дата, ВидЦен = &ВидЦенБ ИЛИ ВидЦен = &ВидЦен)

Но там надо не просто макс или мин цену определить, а иметь для расчета цену ВидЦенБ (от нее расчитывается новая цена) и сравинвать с ценой ВидЦен.

То, что ты предлагаешь, может и будет работать, но мне кажется, оно сложнее и для проектирования и для осознания тем, кто будет этот код смотреть.

Но если ты считаешь что нет, будь добр, сделай рефакторинг этого запроса на:

РегистрСведений.ЦеныНоменклатуры.СрезПоследних(&Дата, ВидЦен = &ВидЦенБ ИЛИ ВидЦен = &ВидЦен)
238 Said_We
 
26.05.22
03:04
(237) В (47) же написал уже.
239 Said_We
 
26.05.22
11:54
(237) "Но там надо не просто макс или мин цену определить" - а где вообще макс или мин цена?
240 Гений 1С
 
гуру
26.05.22
12:03
(238) э нет, дядя, ты напиши весь запрос, как минимум на СГРУППИРОВАТЬ ты уже попал. Не думаю, что твоя экономия на соединить дала тебе какой-то выигрыш. Весь запрос будет монструозным, в отличии от моего, а выигрыша по производительности не будет, план запроса будет ужасным.
241 СвинТуз
 
26.05.22
12:50
Побаловался для практики )

"ВЫБРАТЬ
|    ЦеныНоменклатурыСрезПоследних.Номенклатура КАК Номенклатура,
|    ЦеныНоменклатурыСрезПоследних.Характеристика КАК Характеристика,
|    ЦеныНоменклатурыСрезПоследних.Цена КАК Цена
|ПОМЕСТИТЬ НовыеЦены
|ИЗ
|    РегистрСведений.ЦеныНоменклатуры.СрезПоследних(&Дата, ВидЦены = &ВидЦены) КАК ЦеныНоменклатурыСрезПоследних
|;
|
|////////////////////////////////////////////////////////////////////////////////
|ВЫБРАТЬ
|    ЦеныНоменклатурыСрезПоследних.Номенклатура КАК Номенклатура,
|    ЦеныНоменклатурыСрезПоследних.Характеристика КАК Характеристика,
|    ЦеныНоменклатурыСрезПоследних.Цена КАК БазоваяЦена,
|    ЦеныНоменклатурыСрезПоследних.Упаковка КАК ЕдиницаИзмерения
|ПОМЕСТИТЬ БазовыеЦены
|ИЗ
|    РегистрСведений.ЦеныНоменклатуры.СрезПоследних(&Дата, ВидЦены = &ВидЦеныБазовая) КАК ЦеныНоменклатурыСрезПоследних
|;
|
|////////////////////////////////////////////////////////////////////////////////
|ВЫБРАТЬ
|    БазовыеЦены.Номенклатура КАК Номенклатура,
|    БазовыеЦены.Характеристика КАК Характеристика,
|    БазовыеЦены.БазоваяЦена КАК БазоваяЦена,
|    БазовыеЦены.ЕдиницаИзмерения КАК ЕдиницаИзмерения,
|    ЕстьNULL(НовыеЦены.Цена,0) КАК Цена
|ИЗ
|    БазовыеЦены КАК БазовыеЦены
|        ЛЕВОЕ СОЕДИНЕНИЕ НовыеЦены КАК НовыеЦены
|        ПО БазовыеЦены.Номенклатура = НовыеЦены.Номенклатура
|            И БазовыеЦены.Характеристика = НовыеЦены.Характеристика
|ГДЕ
|    ЕстьNULL(НовыеЦены.Цена,0) <> &НоваяЦена"
242 СвинТуз
 
26.05.22
12:52
Можно еще запросы 1 и 2 переставить и выбирать только присутствующие пары Номенклатура + Характеристика из полученной таблицы предвосхищая левое соединение,
но очень похоже что экономии не будет.
243 СвинТуз
 
26.05.22
12:54
"ВЫБРАТЬ
|    ЦеныНоменклатурыСрезПоследних.Номенклатура КАК Номенклатура,
|    ЦеныНоменклатурыСрезПоследних.Характеристика КАК Характеристика,
|    ЦеныНоменклатурыСрезПоследних.Цена КАК БазоваяЦена,
|    ЦеныНоменклатурыСрезПоследних.Упаковка КАК ЕдиницаИзмерения
|ПОМЕСТИТЬ БазовыеЦены
|ИЗ
|    РегистрСведений.ЦеныНоменклатуры.СрезПоследних(&Дата, ВидЦены = &ВидЦеныБазовая) КАК ЦеныНоменклатурыСрезПоследних
|;
|
|////////////////////////////////////////////////////////////////////////////////
|ВЫБРАТЬ
|    ЦеныНоменклатурыСрезПоследних.Номенклатура КАК Номенклатура,
|    ЦеныНоменклатурыСрезПоследних.Характеристика КАК Характеристика,
|    ЦеныНоменклатурыСрезПоследних.Цена КАК Цена
|ПОМЕСТИТЬ НовыеЦены
|ИЗ
|    РегистрСведений.ЦеныНоменклатуры.СрезПоследних(
|            &Дата,
|            ВидЦены = &ВидЦены
|                И (Номенклатура, Характеристика) В
|                    (ВЫБРАТЬ РАЗЛИЧНЫЕ
|                        БазовыеЦены.Номенклатура КАК Номенклатура,
|                        БазовыеЦены.Характеристика КАК Характеристика
|                    ИЗ
|                        БазовыеЦены КАК БазовыеЦены)) КАК ЦеныНоменклатурыСрезПоследних
|;
|
|////////////////////////////////////////////////////////////////////////////////
|ВЫБРАТЬ
|    БазовыеЦены.Номенклатура КАК Номенклатура,
|    БазовыеЦены.Характеристика КАК Характеристика,
|    БазовыеЦены.БазоваяЦена КАК БазоваяЦена,
|    БазовыеЦены.ЕдиницаИзмерения КАК ЕдиницаИзмерения,
|    ЕСТЬNULL(НовыеЦены.Цена, 0) КАК Цена
|ИЗ
|    БазовыеЦены КАК БазовыеЦены
|        ЛЕВОЕ СОЕДИНЕНИЕ НовыеЦены КАК НовыеЦены
|        ПО БазовыеЦены.Номенклатура = НовыеЦены.Номенклатура
|            И БазовыеЦены.Характеристика = НовыеЦены.Характеристика
|ГДЕ
|    ЕСТЬNULL(НовыеЦены.Цена, 0) <> &НоваяЦена"
244 СвинТуз
 
26.05.22
12:55
&НоваяЦена КАК НоваяЦена,

Смысла не имеет. Если только не используется дальше.
Проще при переборе выборки подставить куда надо константу единую для всей выборки.
245 СвинТуз
 
26.05.22
12:57
Возможно есть смысл из-за того при последнем варианте будет задействован первичный индекс.
Ну да не важно ))))
246 Said_We
 
26.05.22
14:08
(240) Ты же даже не пробовал.
247 Said_We
 
26.05.22
14:14
(0) Почему нет связи по "ЕдиницаИзмерения"?
В общем случае одна и та же номенклатура с ценой за килограмм и за центнер, упаковка и коробка 10 шт, и т.д.
Или в вашем случае у номенклатуры всегда одна "ЕдиницаИзмерения"? А вдруг кто-то двойника штук сделает?
248 Said_We
 
26.05.22
14:27
(240) Для затравки....
Запрос по характеристикам
249 Конструктор1С
 
26.05.22
15:36
(240) не-а. Твой план запроса будет плохим, а его отработает оптимально
250 Конструктор1С
 
26.05.22
15:45
+(249) не гарантированно, но с большой долей вероятности будет плохим... Про это на ИТС написано, который ты не читал

https://its.1c.ru/db/v8std/content/655/hdoc

1.1. При написании запросов не следует использовать соединения с вложенными запросами. Следует соединять друг с другом только объекты метаданных или временные таблицы. Если запрос использует соединения с вложенными запросами, то его следует переписать с использованием временных таблиц (не важно с какой стороны соединения находится вложенный запрос), кроме случая, когда вложенный запрос сканирует мало записей
...
Оптимизатор сервера СУБД (независимо от того, какую СУБД вы используете) не всегда может правильно оптимизировать подобный запрос. В данном случае, проблемой для оптимизатора является выбор правильного способа соединения. Существуют несколько алгоритмов соединения двух выборок. Выбор того или иного алгоритма зависит от того, сколько записей будет содержаться в одной и в другой выборке. В том случае, если вы соединяете две физические таблицы, СУБД может легко определить объем обоих выборок на основании имеющейся статистики. Если же одна из соединяемых выборок представляет собой вложенный запрос, то понять, какое количество записей она вернет, становится очень сложно. В этом случае СУБД может ошибиться с выбором плана, что приведет к катастрофическому падению производительности запроса.
251 Said_We
 
26.05.22
19:23
И слился....
252 Гений 1С
 
гуру
26.05.22
21:00
(246) а смысл пробовать, если очевидно, что выйдет хуже. Поэтому ты и не пишешь хотя бы примерный текст запроса, что понимаешь, что у этого Франкенштейна будут "ужасные зубы"
253 Гений 1С
 
гуру
26.05.22
21:01
(247) в нашем случае не сделают.
254 Гений 1С
 
гуру
26.05.22
21:02
(250) дружок, а где ты у меня вложенный запрос увидал? гггг
255 alarm2020
 
26.05.22
21:04
(254) Справа от левой таблицы и слева от правой )))
256 Гений 1С
 
гуру
26.05.22
21:08
(255) не гони
257 alarm2020
 
26.05.22
21:09
(256) Срез последних - это не таблица, это запрос
258 Said_We
 
26.05.22
21:18
(253) В ссылку в (248) зайди. Может что-то не очевидное увидишь.
259 Злопчинский
 
26.05.22
21:45
"Не волнуйтесь, если что-то не работает. Если бы всё работало, вас бы уволили."
260 Конструктор1С
 
27.05.22
06:18
(254) открою тебе страшную тайну: все виртуальные таблицы в запросах 1с по-факту являются вложенными запросами. Стыдно гуриям такое не знать
261 Said_We
 
27.05.22
10:28
(252) "Поэтому ты и не пишешь хотя бы примерный текст запроса" - написан примерный текст запроса ещё в (47).
262 Гений 1С
 
гуру
27.05.22
12:05
(261) это только декларация намерений. ггг..
263 Гений 1С
 
гуру
27.05.22
12:05
(260) вложенные запросы это то, что находится в операторе IN
264 Выпрь
 
27.05.22
12:06
(263) не только
265 bolobol
 
27.05.22
12:19
Оператор IN не ошибается, если используется выборка из ВТ без условий, поэтому где-то когда-то был рекомендован к использованию. А в случае замены ИЛИ - прям обязан быть использованным
266 bolobol
 
27.05.22
12:20
А виртуальные таблицы - это запрос с неизвестным объёмом результата
267 Конструктор1С
 
27.05.22
12:26
(263) не пиши ересь
268 Конструктор1С
 
27.05.22
12:29
Смотрю, кризис вайти неслабо тебя накрыл, раз элементарные вещи за столько лет не изучил
269 alarm2020
 
27.05.22
13:56
(263) Вложенный запрос - это запрос внутри запроса
270 ДедМорроз
 
28.05.22
16:22
Виртуальная таблица - это запрос с группировкой,соответственно,с одной стороны,система не знает результат,с другой,для получения первой записи его нужно выполнить целиком,то есть аналог временной таблицы будет.