Имя: Пароль:
1C
1С v8
В 8.3.6 Запросы могут содержать логические выражения в поля выборки и в ГДЕ
, ,
0 bacila
 
30.12.15
11:18
В описании версии 8.3.6 написано следующее -
Запросы теперь могут содержать логические выражения в описании поля выборки и в выражениях фильтрации запроса (ГДЕ), таким образом использование конструкции выбора (ВЫБОР КОГДА …) снизится.

Кто нибудь понимает как это работает, пробовал в конструкторе запроса и так и эдак, не принимает "ГДЕ" ?
1 ДенисЧ
 
30.12.15
11:19
Опять режим совместимости не отключили?
2 bacila
 
30.12.15
11:21
(1) да как бы в том и дело , что выключен
3 bacila
 
30.12.15
11:22
Вообще хотелось бы увидеть пример конструкции
4 mehfk
 
30.12.15
11:25
Сравни
ВЫБРАТЬ
выбор когда поле1=поле2 тогда истина иначе ложь конец как условиеввыборке

и
выбрать
поле1=поле2 как условиеввыборке
5 mikecool
 
30.12.15
11:28
(4) это же в 8.3.7 обещают?
6 Ёпрст
 
30.12.15
11:30
ну нет чтобы, наконец, сделать

Выбрать
   (выбрать ...из ...) как Вася
из ...

А оне всё не тем занимаются, оптимизация не в том месте.
7 mikecool
 
30.12.15
11:31
(6) +1
8 ДенисЧ
 
30.12.15
11:38
Нет, чтобы сделать
ИЗМЕНИТЬ Справочник.Номенклатура
Установить Наименование = &наим
где ссылка = &ссылка
9 mikecool
 
30.12.15
11:39
(8) без этого обойдемся
10 Ёпрст
 
30.12.15
11:42
(8) да, это тоже нужно
11 Ёпрст
 
30.12.15
11:44
Ну и это заодно:

Удалить
  Ссылка
из Документ.Вася
Где Дата между &НачДата и &КонДата
12 bolobol
 
30.12.15
11:45
(8) (10) А смысл этой конструкции какой прикладной?
13 Fragster
 
гуру
30.12.15
11:45
(8) косяк всех ORM - не срабатывают обработчики, в том числе вызывающие отказ в изменении...
14 Serginio1
 
30.12.15
11:45
(6) Да хотя бы по стандарту SQL 92 сделали.
Как впрочем загрузку ВК и ComОбъектов без регистрации
Ну что! Свершилось. Релиз 8.3.7 состоялся... Обсуждаем!
15 ДенисЧ
 
30.12.15
11:45
(13) Прямо таки всех?
16 bolobol
 
30.12.15
11:47
(11) Пример, аналогичный:

ИЗМЕНИТЬ Справочник.Номенклатура
Установить ПометкаУдаления = Истина
где ссылка = &ссылка

А без контроля ссылочной целостности... Ну, знаете... Наgовнокодить захотелось срочно?
17 Живой Ископаемый
 
30.12.15
11:48
2(8) Так не будет. Даже для ВИД изменение и запись - как для РС, то есть через объектную, а не запросную (множественную) модель
18 Serginio1
 
30.12.15
11:48
(13) Но при это в ORM есть возможность и массовых изменений.
Разработчик сам может решить, что нужно. А так приходится прямым доступом пользоваться. Хотелось бы аналога 1С++
19 bolobol
 
30.12.15
11:59
(18) Ээээ - не сравнивайте прямой доступ с возможностью платформы прямиком из текста запроса отработать все те механизмы, что заложены в ".Записать(".
Но и отрицать оптимальность массового изменения на уровне платформы, вместо обработки текста модуля для каждого объекта, не буду, однако, такой запрос при большом количестве измененяющихся объектов - наглухо подвесит систему транзакцией SQL, т.к. завершить её будет нельзя, пока 1С платформа для каждого из объектов не завершит выполнение всех предусмотренных действий (обработки До/При/После.Записи, Подписки, регистрация изменений)
20 Serginio1
 
30.12.15
12:04
(19) Когда будешь обновлять миллионные прайсы, сразу поймешь преймущества прямого доступа. Я не говорю уже про возможности использования всех возможностей SQL, а не урезанного по самое немогу 1С SQL
21 bolobol
 
30.12.15
12:05
+(19) Не говоря уже, что через ..тцать..минут обработки, может выясниться, что один из объектов записать невозможно...
Да ещё если сообщения пользователю надо выводить при записи... - толк от реализации "ИЗМЕНИТЬ..." - вообще ноль.
А делать с ограничениями... В общем, в отсутствии этой возможности и есть суть платформы - объектная модель. А запросы - это для логики и отчётов.
22 mehfk
 
30.12.15
12:05
(5) Это в 8.3.6
23 Serginio1
 
30.12.15
12:07
Кстати в 1С во внутренних механизмах не хватает Merge что бы зизменять только измененые, добавлять только новые и удалять отсутствующие в наборе строки
24 bolobol
 
30.12.15
12:09
(20) Обновлять прайсы??? Опишите задачу, пожалуйста. Что именно вы там нашли обновлять, для необходимости прямого доступа? По 800 000 объектов я каждый месяц "обновляю" - в 10 минут укладывается вся обработка.
25 Serginio1
 
30.12.15
12:10
(24) У меня были 60 миллионые каждый день по несколько минут
26 Живой Ископаемый
 
30.12.15
12:11
2(24) ну, просто когда получается нужно обновлять не только справочник номенклатуры, но и его табличную часть (доп. реквизиты), характеристики, и цены (РС). Я не думаю что это долго в итоге, просто муторно писать
27 bolobol
 
30.12.15
12:13
(23) Во внутренних механизмах 1С не хватает компиляции и оптимизации. Оттого внутренний язык тормозит, да и сама платформа еле шевелится. Говорят, что С++ писана, но, видимо, на интерпретаторе С++, иначе - мне не объяснимо сие)

(25) "Ой, всё..." ))) 60млн записи - это не тот фокус, на который разрабы ориентируются, однозначно. Тут только бубен и шаманства, да
28 Serginio1
 
30.12.15
12:16
(27) Проблема при обновлении записей смотри 23.
Во всяком случае раньше весь набор удалялся и записывался новый.
29 bacila
 
30.12.15
12:27
(4)  такую конструкцию и без режима совместимости, конструктор съедает, все таки хотелось пример с ГДЕ
30 mehfk
 
30.12.15
12:29
(29) Попробуй то же на 8.3.5
31 bacila
 
30.12.15
12:30
(30) ну 8.3.5 нет под рукой, есть 8.3.6 в режиме совместимости,  нет у кого нибудь 8.3.5 что бы проверить?
32 mehfk
 
30.12.15
12:32
(31) У тебя есть причины не доверять вендору?
33 bacila
 
30.12.15
12:34
(32) ну я  исходя из описания, ожидал увидеть в  конструкции слово ГДЕ
34 mehfk
 
30.12.15
12:39
Про условие в где - ищи в гугле ошибку проведения заказ-наряда в альфа-авто 5, там если запрос не исправить, на 8.3.5 была ошибка.
35 bolobol
 
30.12.15
12:40
(28) Ибо "удаление" дешевле, чем перезапись, т.к. новые данные _дозаписываются_ в таблицу, а старые в игнор ставятся. Весь пакет записей по отбору находится в одном месте, ускоряется и чтение данных.
36 patria0muerte
 
30.12.15
12:48
(33) А откуда у тебя там лишнее ГДЕ возьмется. Вендор тебе русским по белому пишет, что теперь можно писать запросы не такие:

ВЫБРАТЬ
ВЫБОР КОГДА А = Б ТОГДА ИСТИНА ИНАЧЕ ЛОЖЬ КОНЕЦ КАК ПОЛЕ
ГДЕ
ВЫБОР КОГДА НЕ В = Г ТОГДА ИСТИНА ИНАЧЕ ЛОЖЬ КОНЕЦ

, а такие

ВЫБРАТЬ
А = Б КАК ПОЛЕ
ГДЕ
НЕ В = Г
37 patria0muerte
 
30.12.15
12:49
(36) Правда в ГДЕ и раньше можно было так писать.
38 ObjectRelation Model
 
30.12.15
13:46
(6) быдлостайл, имхо
39 mehfk
 
30.12.15
14:00
(38) Зря. Просто у тебя не было случаев когда это было нужно.
40 vhl
 
30.12.15
14:04
(8) Лучше так:
СОКРАТИТЬ ТАБЛИЦА
    Справочник.Номенклатура
41 Ёпрст
 
30.12.15
14:06
(38) нравится, как сейчас, получать срез последних на каждую дату запроса через вложенные запросы с кучей левых соединений ?
42 Dotoshin
 
30.12.15
14:06
(38) Чой-та быдлостайл? Можешь обосновать почему так нельзя делать?
43 Dotoshin
 
30.12.15
14:07
+ (41) Кстати да.
44 Локи-13
 
30.12.15
14:15
(6) а можно живой пример?
А то выбрать вложенный запрос как Вася?
В чем смысл?
45 mehfk
 
30.12.15
14:17
(44) Там выбрать первые 1 из Пети
46 bolobol
 
30.12.15
14:20
(44) а это у (38) надо спрашивать - только он понял о чём там речь)
47 Локи-13
 
30.12.15
14:22
(45) А полный запрос можно?
Выбрать
   (выбрать ссылка из номенклатура) как Вася
из Регистр.ПроизводственныйКалендарь

Так?) Что за конструкция?
48 mehfk
 
30.12.15
14:26
(47) Ты же понимаешь, что реального медитативного примера ввиду отсутствия такового платформой не будет?
49 Локи-13
 
30.12.15
14:29
(48) Я вообще не понимаю эту конструкцию.
50 mehfk
 
30.12.15
14:33
(49) Тогда забей, это тебе не нужно.
51 bolobol
 
30.12.15
14:36
(49) У (38) спросите! Он опознал, даже "быдло-стайл" узнал)
52 Ёпрст
 
30.12.15
14:49
(47)

select
   (select top 1 a from table1) as a,
   (select max(a) from table1) as a2
from table2

так, понятнее ?
53 Локи-13
 
30.12.15
14:49
(51) так у (39) были даже случаи, однако описать смысл он не может.
54 Ёпрст
 
30.12.15
14:50
ну и до кучи, чтоб он еще и коррелированным был
55 Локи-13
 
30.12.15
14:52
(52) а если
select
   (select top 1 a,b,c from table1) as a

В "а" будет поле какого типа?
56 Ёпрст
 
30.12.15
14:54
(55) будет ошибка
57 Ёпрст
 
30.12.15
14:55
Вы че, t-sql  запросов не писали што ле ?
58 mehfk
 
30.12.15
14:58
(57)+ срочно инъекцию 1с++ :)
59 Ёпрст
 
30.12.15
14:58
Если б реализовали, то можно писать было бы..

Выбрать
   Товарчик.ссылка как Товар,
  (Выбрать первые 1 Цена из хрензнаетОткуда Где Товар = Товарчик.ССылка) как Цена
ИЗ Справочник.Товары как Товарчик

и им подобные запросы.

А не извратом как сейчас, с кучей временных таблиц и нелепым левым соединением.
60 mehfk
 
30.12.15
15:00
(59) Просто у них человек, котрый занимается запросами еще не весь Books Online прочитал.
61 Ёпрст
 
30.12.15
15:02
(60) наверное )
62 bolobol
 
30.12.15
15:04
(59) Так вы и написали левое соединение...
63 Локи-13
 
30.12.15
15:05
(59) что ? таблиц?

Выбрать
   Товарчик.ссылка как Товар,
   хрензнаетОткуда.Цена как Цена
ИЗ Справочник.Товары как Товарчик
   левое соединение регистрСведений.Цены.срезпоследних как хрензнаетОткуда
   по хрензнаетОткуда.Товар = Товарчик.ССылка
64 bolobol
 
30.12.15
15:08
(63) Верно! Только добавить осталось "Среднее(хрензнаетОткуда.Цена) как Цена" и "Группировать по Товар" - чтоб вся бесполезность этого запроса была налицо)
65 Serginio1
 
30.12.15
15:10
(35) Это с каккого удаление дешевле, чем измененbе (Update)?
При удалении и добавлении записей главная проблема это изменения в индексах. А индексов может быть несколько. Удаление и вставка очень дорогие операции. Это на порядки дольше, чем просто изменение записей.
А чтение как раз будет быстрее, чем быстрее запись.
По Б+ деревьям можно почитать http://rsdn.ru/article/alg/tlsd.xml
66 bolobol
 
30.12.15
15:13
(65) Вас определённо нужно рекомендовать консультантом в группу, например, разработчиков "ВКонтакте". Они там не то что записи текстовые - видосы не удаляют! Потому что так "оптимально". Срочно надо их проконсультировать!
67 mehfk
 
30.12.15
15:14
(63) Выбрать один последний по дате/времени документ взаиморасчетов по всем контрагентам из всех.
68 bolobol
 
30.12.15
15:14
(67) Последний - значит: Максимум(Дата), не?
69 Serginio1
 
30.12.15
15:18
(66) Еще раз посмотри на Merge https://msdn.microsoft.com/ru-ru/library/bb510625(v=sql.120).aspx

Её специально придумали, для ускорения изменения таблицы.
70 bolobol
 
30.12.15
15:18
Как тут Лефмихалыч в одной теме писал (вольная трактовка): кто не хочет делать - ищет подходящий инструмент облегчения неизбежного...
71 mehfk
 
30.12.15
15:20
(68) Это значит ...ORDER BY ... DESC
72 bolobol
 
30.12.15
15:21
(69) К чему это здесь и как относится к логике 1С ? Мерже используется для дозаписи отсутствующего набора, верно? Зачем в 1С _дозапись_?
73 bolobol
 
30.12.15
15:22
(71) Оно и так, как правило, того
74 Лефмихалыч
 
30.12.15
15:24
(0) примеры

ГДЕ
  ПолеБулевскогоТИпа



ГДЕ
  ЭтоГруппа или ПометкаУдаления
75 Serginio1
 
30.12.15
15:27
(72) Ну ты молодец. Ты бы ссылку почитал бы
MERGE (Transact-SQL)

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

Я как раз пользуюсь MERGE для обновления набора. И разница в скорости десятки раз.

Например у тебя в документе 1000 записей. Ты изменил всего 1 запись. При Merge будет изменена всего 1 запись, вместо удаления 1000 и записи 1000
76 ДенисЧ
 
30.12.15
15:29
(75) Merge при больших объёмах часто может к full scan привести... Что не есть хорошо
77 Локи-13
 
30.12.15
15:33
(67) хм.. ну тут конструкция будет чуть потяжелее

возможно этот вариант и был бы проще

а как будет выглядеть запрос в профайлере? или скуль прям так их кушает?
78 Serginio1
 
30.12.15
15:36
75+ Почитай что такое
WHEN MATCHED THEN
WHEN NOT MATCHED
WHEN NOT MATCHED BY SOURCE

(76) Это не проблема. Чтение быстрая операция. Кроме того есть OPTION (<query_hint> [ ,...n ] )


Указывает, что для настройки способа, которым компонент Database Engine обрабатывает инструкцию, используются подсказки оптимизатора.  Дополнительные сведения см. в разделе Указания запросов (Transact-SQL).


Да и при Merge записи которых нет в источнике должны удаляться.
Просто если ты используешь, только WHEN MATCHED THEN то тогда можешь указать соединение по

{ LOOP | MERGE | HASH } JOIN  


Указывает, что все операции соединения во всем запросе выполняются с помощью рекомендаций LOOP JOIN, MERGE JOIN или HASH JOIN.  Если задано больше одного указания соединения, оптимизатор запросов выбирает наименее затратную стратегию из допустимых.



https://msdn.microsoft.com/ru-ru/library/ms181714(v=sql.120).aspx
А говоря об изменении документов, регистров
79 mehfk
 
30.12.15
15:36
(73) Но сравни а) запрос на T-SQL и б) аналогичный на 1С, и в) что получается из запроса на T-SQL из запроса на 1С.
80 Serginio1
 
30.12.15
15:37
А говоря об изменении документов, регистров то там присутствуют все
WHEN MATCHED THEN
WHEN NOT MATCHED
WHEN NOT MATCHED BY SOURCE
81 bolobol
 
30.12.15
15:47
(79) (80) Вот тут нить я, кажется, потерял...
Но по сути работы Мерже, учитывая распространённость баз на ССД, то, кстати сказать - вполне себе и актуальное ожидание от 1С-ки.
А если учесть специфику пользователей "Посмотрел и "Записать и закрыть"" - в некотором смысле и... В общем - да, согласен - вопрос спорный, статистический.

Да, надо признать - мир шире, чем кругозор)
82 rs_trade
 
30.12.15
15:50
куча кейсов как раз от скудости языка запросов 1С. они плять синтаксис упростили. нет бы возможностей добавить.
83 bolobol
 
30.12.15
15:54
(82) Эммм - Мерже - это не к скудости языка запросов 1С, это уже в платформе так сделали - запись всегда, одним блоком в таблицу. Вне ССД - это рулит, т.к. запись может быть долгой, потому что сама по-себе операция долгая, но чтение - должно быть оптимизировано по максимуму.
84 rs_trade
 
30.12.15
15:55
(83) при чем тут это вообще? я по теме.
85 ObjectRelation Model
 
30.12.15
15:57
86 rs_trade
 
30.12.15
15:59
(74) это и так же было.
87 ObjectRelation Model
 
30.12.15
16:00
(59) то есть тебе неважно, что за цена это, лишь бы первая, ты бы отсортировал хоть как-то
88 Serginio1
 
30.12.15
16:00
89 Лефмихалыч
 
30.12.15
16:17
(86) и то верно. Тогда не знаю, как это понять.
90 ObjectRelation Model
 
30.12.15
16:23
(89) я думаю имелось ввиду, что теперь и не только в секции ГДЕ, но в секциях ВЫБРАТЬ, СГРУППИРОВАТЬ ПО, УПОРЯДОЧИТЬ ПО

там не было работы с логическими операторами без ВЫБОР КОГДА ТОГДА
91 Лефмихалыч
 
30.12.15
16:27
(90) в ВЫБРАТЬ я только что на 8.3.5 проверял - есть такая возможность. А вот в

ПОРЯДОЧИТЬ ПО
    ПометкаУдаления или ЭтоГруппа


работает только в 8.3.6
92 rs_trade
 
30.12.15
16:35
(91) Да, так и есть.
93 rs_trade
 
30.12.15
16:35
какой то косяк видимо в описании
94 Serginio1
 
30.12.15
16:45
Кстати Merge есть и в PostgreSQL

https://wiki.postgresql.org/wiki/MergeTestExamples
95 Лефмихалыч
 
30.12.15
16:52
(93) видимо имелось в виду, что логические выражения теперь могут быть не только в...
Компьютеры — прекрасное средство для решения проблем, которых до их появления не было.