gifts2017

Квадратный корень в запросе 1С

Опубликовал Сергей Карташев (Elisy) в раздел Программирование - Практика программирования

Язык запросов 1С не позволяет вычислить квадратный корень 1С. Квадратный корень может пригодиться при вычислении среднеквадратического отклонения или геометрических вычислениях.

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

Важно: На Инфостарт появилась разработка от agrustny: Обработка с обычным (не СКД) запросом, извлекающим корни нужной степени

Язык запросов 1С не позволяет вычислить квадратный корень 1С. Квадратный корень может пригодиться при вычислении среднеквадратического отклонения или геометрических вычислениях. Предложенный метод имеет ограничение на верхнее значение.

Для вычисления квадратного корня в запросе предлагается использовать метод Герона, когда последовательно вычисляется формула 



Проблемой является найти начальное значение. Предлагается взять его методом грубой оценки.
 принимается равным , а
Грубое значение будет вычислено как:

Учитывая вышесказанное, запрос по вычислению квадратного корня можно написать так:

ВЫБРАТЬ	0.012345678 КАК Значение
ПОМЕСТИТЬ СписокЗначений
ОБЪЕДИНИТЬ ВСЕ
ВЫБРАТЬ	1
ОБЪЕДИНИТЬ ВСЕ
ВЫБРАТЬ	9
ОБЪЕДИНИТЬ ВСЕ
ВЫБРАТЬ	123.45
ОБЪЕДИНИТЬ ВСЕ
ВЫБРАТЬ	12345678
ОБЪЕДИНИТЬ ВСЕ
ВЫБРАТЬ	123456789012345678
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
	SQRTS.X КАК Значение,
	(((SQRTS.Y + SQRTS.X / SQRTS.Y) / 2 + SQRTS.X / ((SQRTS.Y + SQRTS.X / SQRTS.Y) / 2)) / 2 + SQRTS.X / (((SQRTS.Y + SQRTS.X / SQRTS.Y) / 2 + SQRTS.X / ((SQRTS.Y + SQRTS.X / SQRTS.Y) / 2)) / 2)) / 2 КАК КореньКвадратный
ИЗ
	(ВЫБРАТЬ
		СписокЗначений.Значение КАК X,
		ВЫБОР
			КОГДА СписокЗначений.Значение < 0
				ТОГДА NULL
			КОГДА СписокЗначений.Значение < 0.000001
				ТОГДА 0.0005623413251903491
			КОГДА СписокЗначений.Значение < 0.00001
				ТОГДА 0.001778279410038923
			КОГДА СписокЗначений.Значение < 0.0001
				ТОГДА 0.005623413251903491
			КОГДА СписокЗначений.Значение < 0.001
				ТОГДА 0.01778279410038923
			КОГДА СписокЗначений.Значение < 0.01
				ТОГДА 0.05623413251903491
			КОГДА СписокЗначений.Значение < 0.1
				ТОГДА 0.1778279410038923
			КОГДА СписокЗначений.Значение < 1
				ТОГДА 0.5623413251903491
			КОГДА СписокЗначений.Значение < 10
				ТОГДА 1.778279410038923
			КОГДА СписокЗначений.Значение < 100
				ТОГДА 5.623413251903491
			КОГДА СписокЗначений.Значение < 1000
				ТОГДА 17.78279410038923
			КОГДА СписокЗначений.Значение < 10000
				ТОГДА 56.23413251903491
			КОГДА СписокЗначений.Значение < 100000
				ТОГДА 177.8279410038923
			КОГДА СписокЗначений.Значение < 1000000
				ТОГДА 562.3413251903491
			КОГДА СписокЗначений.Значение < 10000000
				ТОГДА 1778.279410038923
			КОГДА СписокЗначений.Значение < 100000000
				ТОГДА 5623.413251903491
			ИНАЧЕ NULL
		КОНЕЦ КАК Y
	ИЗ
		СписокЗначений КАК СписокЗначений) КАК SQRTS

Запрос ограничен числом 10^8. Попытка вычислить квадратный корень свыше этого числа приведет к значению NULL.

Скачать файлы

Наименование Файл Версия Размер
СКДКвадратныйКорень.xml 9
.xml 4,63Kb
15.11.13
9
.xml 4,63Kb Скачать

См. также

Вознаграждение за ответ
Сумма: 0 $m
Добавили:
анд гру (agrustny) (0.01 $m)
Подписаться Добавить вознаграждение

Комментарии

1. Сергей Ожерельев (Поручик) 24.10.13 13:05
2. Сергей Ожерельев (Поручик) 24.10.13 13:11
10^8 - это даже больше, чем государственный долг США
AllexSoft; bulpi; +2 Ответить
3. andrewks 24.10.13 13:14
люблю математические феньки. практической пользы почти никакой, но - приятно :)
4. Дмитрий Глеков (glek) 24.10.13 14:53
Ага. Когда то (в пору динозавров, когда компютеров не было) высчитывал квадратный корень на бумажке. Метод уже не помню, к сожалению (лет 30 назад было)
5. Елена Пименова (Bukaska) 24.10.13 15:07
Молодцы))) Реальных математиков среди программеров ещё поискать)))
6. Иван Иванов (Famza) 24.10.13 16:04
(0) А через ряд разложить? )))
7. Марина Чирина (chmv) 24.10.13 17:11
8. Аркадий Кучер (Abadonna) 25.10.13 02:23
(5)
Реальных математиков среди программеров ещё поискать)))

Среди них и реальных программеров ещё поискать)))
1cWin; noknown; bulpi; Ks_83; Evil Beaver; +5 Ответить 1
9. Сергей Лесовой (Synoecium) 25.10.13 06:16
Баян, в теме уважаемого ildarovich http://infostart.ru/public/90367/?mid=971399, смотри комментарий 63.
Если есть необходимость вычислить квадратный корень в отчете на СКД, можно использовать вычисляемые поля, вызвав функцию из общего модуля, предварительно описав её там.
10. Сергей Карташев (Elisy) 25.10.13 07:27
(6) Famza,
Через ряд не получается - можно разложить через ряд функцию вида SQRT(1+X), где 0<X<=1. Но как ее применить к данному случаю - непонятно.
11. Сергей Карташев (Elisy) 25.10.13 07:31
(7) Для использования в дальнейших вычислениях. В моем случае задача ставилась так: найти через сигму минимальную вероятную покупку по группам товаров и проанализировать склад на наличие этого количества в течение заданного периода. В вычислении сигмы используется квадратный корень. С ограничениями 1С решение предполагает выполнение запроса, вычисление корня в цикле, выполнение другого запроса. Я попытался вычислить квадратный корень в запросе.
12. Сергей Карташев (Elisy) 25.10.13 07:42
Баян, в теме уважаемого ildarovich http://infostart.ru/public/90367/?mid=971399, смотри комментарий 63.

(9) В приведенной Вами ссылке вычисление начального значения SQRT(S) как Значение/2 не выдерживает критики. Как следствие необходимо больше итерационных операций, чтобы увеличить точность вычисления корня. А так да - формула (Xn+S/Xn)/2 - это баян. Она придумана была не нами, а Героном в трактате «Метрика», I век н. э.
13. Алексей 1 (AlX0id) 25.10.13 08:49
(11) Elisy,
А просто в компоновку запихать и использовать какие хошь функции языка никак? ) Да и в самой компоновке поболе будет возможностей..
14. Андрей Овсянкин (Evil Beaver) 25.10.13 09:40
(8) Abadonna, и тем не менее, математика научить программировать проще, чем программиста - круто матемачить :)
15. DAnry (DAnry) 25.10.13 09:49
М-да, математика рулит...
16. Алексей Николаенко (nikolal) 25.10.13 10:10
В платформе 1С:Предприятие начиная с версии 8.3.1 в языке выражений системы компоновки данных реализована функция Sqrt(). Пользуйтесь на здоровье.
17. Сергей Карташев (Elisy) 25.10.13 10:51
(13) AlX0id,
А просто в компоновку запихать и использовать какие хошь функции языка никак? ) Да и в самой компоновке поболе будет возможностей..

В данном случае не нужны "какие хошь" функции, нужен квадратный корень средствами языка запросов. Это два принципиально разных подхода: вычисление на уровне СУБД и вычисление на уровне 1С.
18. Сергей Карташев (Elisy) 25.10.13 10:53
(14) Evil Beaver,
Не математик я )))). Все формулы элементарные и подсмотрены в wikipedia, в статье формулы-картинки из нее же. Любой, если задастся целью, может повторить опыт.
19. Сергей Карташев (Elisy) 25.10.13 11:03
(16) nikolal,
В платформе 1С:Предприятие начиная с версии 8.3.1 в языке выражений системы компоновки данных реализована функция Sqrt(). Пользуйтесь на здоровье.

Опять одно и тоже. Понятно, что если нам нужно вычислить только сигму и отобразить ее, то можно добавить вычисляемое выражение. А если ее значение должно использоваться в следующем запросе пакета?
Все СУБД: MSSQL, Oracle, Postgree, db/2 содержат SQRT(N)-определение. Почему бы некоторые общие математические функции компании 1С не добавить в язык запросов? Не было бы извращений в виде этой статьи.
20. Василий Зайцев (vasiliy_b) 25.10.13 11:16
Мне кажется, что лучше всего использовать не три итерации, а четыре т.к. именно на этом этапе большинство простых корней приводятся к целому числу 9 к 3 16 к 4 625 к 25 или 5476 к 74.
21. Андрей Овсянкин (Evil Beaver) 25.10.13 11:55
(18) Elisy, а я и не говорил, что Вы математик :)
22. Сергей (ildarovich) 25.10.13 13:37
Хорошая статья, очень "нарядный" запрос.
В идеале в статье не хватает оценки точности метода: можно было бы взять все числа в диапазоне 1 - 1000 /10000/ и определить максимальную погрешность (в %, конечно). Понятно, что в задаче оценки страхового запаса высокая точность не нужна, но если предлагать это решение как универсальное, то тех, кто привык копипастить готовые фрагменты кода, нужно предупредить о погрешностях (а вдруг будут считать расход материала на изготовление медных труб?). Также нужно сказать, что данный запрос не подойдет для случаев Х<1 (будет большая погрешность - нужно другое начальное приближение).

Ну и что можно улучшить.
1) начальное приближение можно переписать компактнее. Для этого нужно понять, что метод грубой оценки - это не какая-то загадочная формула, которой нужно почему-то в точности следовать, а просто среднее значение корней из 1, 2, 3, 4, ... 10 - то есть 2,246827819 (примерно 2) или корней из 11, 12, 13, ..., 100 - 7,211051877 (примерно 6? - интересно поразмышлять почему не 7). То есть мы смотрим - в какой диапазон попадает аргумент и выбираем в качестве начального приближения корень середины этого диапазона. Тогда запрос в части табулирования начального приближения будет иметь вид:
ВЫБРАТЬ
СписокЗначений.Значение КАК Значение,
ВЫБОР
КОГДА СписокЗначений.Значение < 0
ТОГДА NULL
КОГДА СписокЗначений.Значение < 10
ТОГДА 2.246827819
КОГДА СписокЗначений.Значение < 100
ТОГДА 7.211051877
КОГДА СписокЗначений.Значение < 1000
ТОГДА 22.46827819
КОГДА СписокЗначений.Значение < 10000
ТОГДА 72.11051877
КОГДА СписокЗначений.Значение < 100000
ТОГДА 224.6827819
КОГДА СписокЗначений.Значение < 1000000
ТОГДА 721.1051877
КОГДА СписокЗначений.Значение < 10000000
ТОГДА 2246.827819
КОГДА СписокЗначений.Значение < 100000000
ТОГДА 7211.051877
ИНАЧЕ NULL
КОНЕЦ КАК КореньКвадратный
ИЗ
СписокЗначений КАК СписокЗначений
...Показать Скрыть
Можно не доверять собственным измышлениям и взять за основу 2 и 6, но делить диапазон 0 - 100 на 0 - 10 и 10 - 100 через ВЫРАЗИТЬ точно не нужно, как и проверять непопадание в проверенный диапазон.
2) в принципе, можно плотнее протабулировать начальные приближения в интересующем нас диапазоне и получать его не через ВЫБОР КОГДА ТОГДА КОНЕЦ, а соединением с таблицей известных корней (в свое время выпускались даже книжки с такими таблицами). Понятно, что по сути тут нужна логарифмическая линейка и плотность покрытия должна быть логарифмически равномерной. Я бы взял логарифм по основанию два.
3) Хотя итерации на основе вложенных запросов выглядят и красиво и понятно, возможно, стоит для скорости сразу выполнить подстановки и считать три (четыре?) итерации "за раз".
Предложения 2) и 3) - приведены как возможности альтернативных решений, а вот 1) можно было бы исправить непосредственно в данном решении.
Кстати, в статье Порождающий запрос приведено другое решение той же задачи (менее практичное), а в статье Как нарисовать граф на 1Сдля расчета расстояния между точками на плоскости применяется точно такой же метод как в данной статье, правда, с особенным для геометрии выбором начального приближения.
bulpi; CratosX; Elisy; Антон_ЭА; Synoecium; +5 Ответить 2
23. Сергей Карташев (Elisy) 26.10.13 09:31
(22) ildarovich,
В вашем комментарии есть рациональная составляющая. Запрос выглядит красивее. Но не понятен выбор за основу 2,246827819 и 7,211051877. Если посмотреть расчет грубой оценки в
http://en.wikipedia.org/wiki/Methods_of_computing_square_roots
Основа должна быть выбрана как
Sqrt(Sqrt(10)) = 1.778279410038923
Sqrt(Sqrt(1000)) = 5.623413251903491

Во вложении обработка с оценкой ошибки по 3м способам. Максимальная ошибка получилась при выборе метода из статьи, с уменьшением ошибки идет ваш способ и лучший результат показали основы 1.778279410038923 и 5.623413251903491.
Как только согласуем этот подход, можно будет перейти к п.3 вашего комментария. Думаю, оптимизация будет не лишней. Хотя всю нашу совместную работу перечеркнет добавление функции Sqrt в языке запросов ))). Пункт 2 - на любителя математики, и он может усложнить читаемость.
Прикрепленные файлы:
ГрубаяОценкаКвадратныйКорень.epf
CratosX; ildarovich; +2 Ответить 1
24. Сергей (ildarovich) 26.10.13 10:27
(22)(23) Я действительно поторопился взять за основу 2,246827819 и 7,211051877 - среднее арифметическое корней 1 и 10 и 11 и 100. Правда оказалась на стороне Википедии (как и следовало ожидать). Я также перепроверил: начальные приближения 1,77827941 и 5,623413252 оказались лучше всего (обработка проверки прилагается). Использование в качестве лучших начальных приближений не среднего арифметического (как я ошибочно думал первоначально), а СРЕДНЕГО ГЕОМЕТРИЧЕСКОГО концов отрезков объясняется тем, что начальное приближение должно быть ближе к истинному не по абсолютному Х-Х'->min, а по относительному значению X/X'->min. То есть среднее как и интервалы аппроксимации выбираются на логарифмической шкале.
Побочным результатом перепроверки является оценка точности метода. Она оказалась очень высокой! На интервале 1 - 100000 максимальная погрешность составила 0,0075844384 (семь с половиной тысячных) процента!
Такая высокая точность делает 2) совершенно ненужным. Тогда единственно, что меня еще беспокоит - это интервал 0-1, то есть отрицательные значения степеней 10. По-хорошему (для минимизации относительной погрешности), там тоже нужно для интервала 0.1-1 брать начальным приближением 0,5623413252, а для 0.01-0.1 брать 0,177827941 и так далее.
Прикрепленные файлы:
ПроверкаГрубойОценки.erf
Makushimo; Elisy; +2 Ответить 1
25. Сергей Карташев (Elisy) 28.10.13 16:09
(24) ildarovich,
Тогда единственно, что меня еще беспокоит - это интервал 0-1, то есть отрицательные значения степеней 10. По-хорошему (для минимизации относительной погрешности), там тоже нужно для интервала 0.1-1 брать начальным приближением 0,5623413252, а для 0.01-0.1 брать 0,177827941 и так далее.

Долго думал про интервал 0-1. Не все так однозначно. Не понятно, почему пристальное внимание уделять именно этому интервалу. Ведь задача может требовать интервала 1-2 или 7-8. Если встанет задача работы с интервалом 0-1, можно будет умножить начальное значение на 10^2N, вычислить корень и разделить результат на 10^N. Как вы думаете?
26. Сергей (ildarovich) 28.10.13 18:52
(25) Мне кажется, что лучше будет полностью воспроизвести метод грубого приближения из Википедии. Там он определен и для отрицательных N. Для нас это означает, что нужно расширить правило на интервалы 1-0.1-0.01-0.001-0.0001-0.00001-... . Иначе ОТНОСИТЕЛЬНАЯ погрешность будет с приближением к 0 бесконтрольно расти. Относительная погрешность - это разница между точным значением корня и посчитанным в запросе, деленная на точное значение (а абсолютная - просто разница).
Иначе правило выбора начального приближения выглядит несимметрично: для степеней больше 8 запрос выдает NULL. Почему? - Видимо, потому, что не обеспечивается достаточная точность. Хотя, взяв в качестве начального значения 6000, запрос достаточно точно определит и корень из 1000 000 000 и корень из 10 000 000 000. Тогда почему для расчета корня из 0.1 и 0.01 мы разрешаем себе пользоваться приближением 2.0? ОТНОСИТЕЛЬНАЯ погрешность вычисления корня из 0.01 при начальном приближении 2.0 будет примерно той же, что и погрешность вычисления корня из 10 000 000 000 при начальном приближении 6000.
Другой вариант - не ограничивать интервал ни сверху, ни снизу, просто указав, что точность вычислений для чисел, больших 10^8 и меньших 1 будет уменьшаться при отдалении от этого интервала.
Прикрепленные файлы:
27. ex-human ex-human (ex-human) 29.10.13 05:24
квадратный корень числа = число в степени 0,5
28. Игорь Исхаков (Ish_2) 29.10.13 18:37
(0) Квадратный корень в запросе - это , конечно, сила..
Сергей , скажи лучше что с "доминиканой" ?
29. Сергей Карташев (Elisy) 30.10.13 12:31
(26) ildarovich,
Добавим в запрос конструкцию для числе меньше 1?
				ВЫБОР
					КОГДА СписокЗначений.Значение < 0
						ТОГДА NULL
						
					КОГДА СписокЗначений.Значение < 0.00000001
						ТОГДА 0.00005623413251903491
					КОГДА СписокЗначений.Значение < 0.0000001
						ТОГДА 0.0001778279410038923
					КОГДА СписокЗначений.Значение < 0.000001
						ТОГДА 0.0005623413251903491
					КОГДА СписокЗначений.Значение < 0.00001
						ТОГДА 0.001778279410038923
					КОГДА СписокЗначений.Значение < 0.0001
						ТОГДА 0.005623413251903491
					КОГДА СписокЗначений.Значение < 0.001
						ТОГДА 0.01778279410038923
					КОГДА СписокЗначений.Значение < 0.01
						ТОГДА 0.05623413251903491
					КОГДА СписокЗначений.Значение < 0.1
						ТОГДА 0.1778279410038923
					КОГДА СписокЗначений.Значение < 1
						ТОГДА 0.5623413251903491
...Показать Скрыть
30. Сергей Карташев (Elisy) 30.10.13 14:00
(27) ex-human,
квадратный корень числа = число в степени 0,5

Очень ценная информация, правда, ума не приложу, как ее использовать.
31. Сергей (ildarovich) 30.10.13 14:14
(29) Можно и так, а еще лучше
ВЫБОР
                    КОГДА СписокЗначений.Значение < 0
                        ТОГДА NULL
                    КОГДА СписокЗначений.Значение < 0.000001
                        ТОГДА 0.0005623413251903491
                    КОГДА СписокЗначений.Значение < 0.00001
                        ТОГДА 0.001778279410038923
                    КОГДА СписокЗначений.Значение < 0.0001
                        ТОГДА 0.005623413251903491
                    КОГДА СписокЗначений.Значение < 0.001
                        ТОГДА 0.01778279410038923
                    КОГДА СписокЗначений.Значение < 0.01
                        ТОГДА 0.05623413251903491
                    КОГДА СписокЗначений.Значение < 0.1
                        ТОГДА 0.1778279410038923
                    КОГДА СписокЗначений.Значение < 1
                        ТОГДА 0.5623413251903491
...Показать Скрыть
Учитывая то, что шесть знаков после запятой - стандартная точность вычислений в запросах. Ну и отсюда будет понятен принцип, что если "рабочий диапазон" значений аргумента корня другой, то нужно аналогично поменять часть запроса, отвечающую за начальное приближение.
32. Сергей Карташев (Elisy) 02.11.13 09:51
(31) ildarovich,
Возразить ничего не могу против. Изменил запрос в статье согласно вашему коду. Думаю, проблему определения оптимального начального приближения решили.
Давайте поговорим теперь об итерационных шагах. 3х шагов достаточно?
33. Сергей Карташев (Elisy) 02.11.13 10:04
Склеивание итерационных вычислений для 3, 2 и 1 итерации выглядит так:

ВЫБРАТЬ
	SQRTS.Значение,
	(((SQRTS.КореньКвадратный + SQRTS.Значение / SQRTS.КореньКвадратный) / 2 + SQRTS.Значение / ((SQRTS.КореньКвадратный + SQRTS.Значение / SQRTS.КореньКвадратный) / 2)) / 2 + SQRTS.Значение / (((SQRTS.КореньКвадратный + SQRTS.Значение / SQRTS.КореньКвадратный) / 2 + SQRTS.Значение / ((SQRTS.КореньКвадратный + SQRTS.Значение / SQRTS.КореньКвадратный) / 2)) / 2)) / 2 КАК КореньКвадратный
ИЗ
	(ВЫБРАТЬ
		SQRTS.Значение КАК Значение,
		((SQRTS.КореньКвадратный + SQRTS.Значение / SQRTS.КореньКвадратный) / 2 + SQRTS.Значение / ((SQRTS.КореньКвадратный + SQRTS.Значение / SQRTS.КореньКвадратный) / 2)) / 2 КАК КореньКвадратный
	ИЗ
		(ВЫБРАТЬ
			SQRTS.Значение КАК Значение,
			(SQRTS.КореньКвадратный + SQRTS.Значение / SQRTS.КореньКвадратный) / 2 КАК КореньКвадратный
		ИЗ
			(ВЫБРАТЬ
				СписокЗначений.Значение КАК Значение,
				ВЫБОР
					КОГДА СписокЗначений.Значение < 0
						ТОГДА NULL
					КОГДА СписокЗначений.Значение < 0.000001
						ТОГДА 0.0005623413251903491
					КОГДА СписокЗначений.Значение < 0.00001
						ТОГДА 0.001778279410038923
					КОГДА СписокЗначений.Значение < 0.0001
...Показать Скрыть
34. Сергей (ildarovich) 07.11.13 14:56
(32)(33) Трех итераций хватает. Точность на всем диапазоне от 0.0000001 до 100000000 - семь с половиной тысячных процентов. Для трех итераций после подстановки результатов вложенных запросов в один запрос принимает вид:
ВЫБРАТЬ
	SQRTS.Х,
	(((SQRTS.У + SQRTS.Х / SQRTS.У) / 2 + SQRTS.Х / ((SQRTS.У + SQRTS.Х / SQRTS.У) / 2)) / 2 + SQRTS.Х / (((SQRTS.У + SQRTS.Х / SQRTS.У) / 2 + SQRTS.Х / ((SQRTS.У + SQRTS.Х / SQRTS.У) / 2)) / 2)) / 2 КАК КореньКвадратный
ИЗ
	(ВЫБРАТЬ
		СписокЗначений.Х КАК Х,
		ВЫБОР
			КОГДА СписокЗначений.Х < 0
				ТОГДА NULL
			КОГДА СписокЗначений.Х < 0.000001
				ТОГДА 0.0005623413251903491
			КОГДА СписокЗначений.Х < 0.00001
				ТОГДА 0.001778279410038923
			КОГДА СписокЗначений.Х < 0.0001
				ТОГДА 0.005623413251903491
			КОГДА СписокЗначений.Х < 0.001
				ТОГДА 0.01778279410038923
			КОГДА СписокЗначений.Х < 0.01
				ТОГДА 0.05623413251903491
			КОГДА СписокЗначений.Х < 0.1
				ТОГДА 0.1778279410038923
			КОГДА СписокЗначений.Х < 1
				ТОГДА 0.5623413251903491
			КОГДА СписокЗначений.Х < 10
				ТОГДА 1.778279410038923
			КОГДА СписокЗначений.Х < 100
				ТОГДА 5.623413251903491
			КОГДА СписокЗначений.Х < 1000
				ТОГДА 17.78279410038923
			КОГДА СписокЗначений.Х < 10000
				ТОГДА 56.23413251903491
			КОГДА СписокЗначений.Х < 100000
				ТОГДА 177.8279410038923
			КОГДА СписокЗначений.Х < 1000000
				ТОГДА 562.3413251903491
			КОГДА СписокЗначений.Х < 10000000
				ТОГДА 1778.279410038923
			КОГДА СписокЗначений.Х < 100000000
				ТОГДА 5623.413251903491
			ИНАЧЕ NULL
		КОНЕЦ КАК У
	ИЗ
		СписокЗначений КАК СписокЗначений) КАК SQRTS
...Показать Скрыть
Для сокращения записи первой строчки имя "КвадратныйКорень" заменено на "У". Вложенный запрос при этом понадобился всего один - для выбора начального приближения.
35. Сергей Карташев (Elisy) 15.11.13 11:49
(34) ildarovich,
Проверил запрос - работает нормально. Обновил статью с учетом вашего последнего комментария.
36. Александр Н (Alexion) 25.12.13 16:33
Подскажите как можно сделать такой запрос в динамическом списке?
Динамический список не поддерживает пакетные запросы, никак не могу додуматься.
37. Сергей Карташев (Elisy) 06.01.14 13:18
(36) Alexion,
Не понятно, что конкретно у вас вызывает затруднение. Вложенным запросом целиком в скобках можно заменить временную таблицу.
38. Алекс Ю (AlexO) 14.02.14 00:47
(17)
вычисление на уровне СУБД и вычисление на уровне 1С.

Это кто вам сказал такую глупость? Тот, кто показал, как в 1С "круто програмичить"?
Все вычисления в 1С идут через 1С. Через СУБД идет первоначальный накопление капитала сбор данных.
39. Сергей Карташев (Elisy) 14.02.14 07:31
(38) AlexO,
Это кто вам сказал такую глупость? Тот, кто показал, как в 1С "круто програмичить"?
Все вычисления в 1С идут через 1С. Через СУБД идет первоначальный накопление капитала сбор данных.

Ваше утверждение весьма спорное. Не думаю, что элементарные операции плюс, минус, делить вынесены на сторону сервера 1С. Основные конструкции языка запросов 1С соотносятся с конструкциями SQL. Думаю, что они конвертируются в SQL один-в-один. Даже, если в текущем релизе 1С это не так (зная 1С, я допускаю это), то 1С не стоит на месте. И в следующих релизах элементарные операции могут быть вынесены на сервер СУБД. Скорость при этом вырастет, и в 1С-скриптах ничего менять не нужно.
40. анд гру (agrustny) 17.04.14 10:30
(39) Уважаемый Elisy, прошу оценить мой труд http://infostart.ru/public/273699/ по мотивам Вашей разработки.
41. Сергей Карташев (Elisy) 17.04.14 14:06
(40) agrustny,
Спасибо за разработку и ценную ссылку. Добавил вашу разработку в статье. Будет видна после утверждения модератором.
42. Yurcha (Yurcha62) 18.04.14 16:53
Гы... смешно ... и как все это относится к Бухгалтерии и Торговле?.. Такое ощущение что в 1С необходимо расчитывать ядерные реакторы ...
43. анд гру (agrustny) 18.04.14 18:50
(42) Это для конкурса http://forum.infostart.ru/forum1/topic106618/, чтобы нас ФФФФ считали самыми-самыми!
44. Сергей Карташев (Elisy) 19.04.14 08:23
(42) Yurcha62,
Когда у вас встанет задача расчетов по модной в определенной среде теории N-сигм, смех, думаю, пропадет )))))))
45. Сергей Карташев (Elisy) 19.04.14 08:24
(43) agrustny,
Спасибо за ссылку - интересный конкурс
46. Алексей Рожнятовский (spetzpozh) 22.04.14 12:12
(42) Yurcha62, для развоза ИТС даже на инфостарт заходить не надо.
agrustny; +1 Ответить
47. unsafe (StaticUnsafe) 22.04.14 17:25
(38) AlexO, а кто вам сказал что это не так? )) Вас кто нибудь учил "круто программить" или вы менеджер или технарь не IT ?

Перехватите на СУБД профайлером оттранслированный в SQL 1сный запрос и посмотрите, что все вычисляется там. Если вы, конечно, понимаете о чем речь и язык SQL вам не чужд.
48. анд гру (agrustny) 22.04.14 18:05
(47) unsafe, нелепость высказывания AlexO была настолько очевидна, что на нее даже не обратили внимания.
Но!
Насколько быстро "считает" СУБД - вопрос интересный, я его задавал профессору Эльдорадовичу здесь
http://forum.infostart.ru/forum24/topic108581/#comm25 (21)
Вообще рекомендуют арифметику СУБД не использовать.
А Вы что думаете?
49. Сергей Карташев (Elisy) 23.04.14 14:22
(48) agrustny,
Зависит от ситуации, объеме данных. Думаю, процессор не работает особенным медленным образом в режиме СУБД. И почему-то есть уверенность, что MSSQL постарается распараллелить вычислениями своими силами, что даст выигрыш в производительности. Параллельности вычислений от 1С ждать не приходится.
Бывают ситуации, что вынесение арифметики на сторону 1С приводит к нескольким последовательным обращениям к СУБД, задержки от которых буду намного выше, чем потенциальные замедления арифметики СУБД.
50. Алексей Шошин (alexsh76) 03.03.15 14:53
Еще некоторое дополнение, не использовать выбор а поместить во временную таблицу и использовать связь. Удобней, и правильней (особенно когда надо извлечь корень из нескольких полей)
ВЫБРАТЬ
	0.0005623413251903491 КАК Y,
	0.000001 КАК ВерхнееЗначение,
	0 КАК НижнееЗначение
ПОМЕСТИТЬ SQRTS

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

ВЫБРАТЬ
	0.001778279410038923,
	0.00001,
	0.000001

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

ВЫБРАТЬ
	0.005623413251903491,
	0.0001,
	0.00001

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

ВЫБРАТЬ
	0.01778279410038923,
	0.001,
	0.0001

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

ВЫБРАТЬ
	0.05623413251903491,
	0.01,
	0.001

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

ВЫБРАТЬ
	0.1778279410038923,
	0.1,
	0.01

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

ВЫБРАТЬ
	0.5623413251903491,
	1,
	0.1

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

ВЫБРАТЬ
	1.778279410038923,
	10,
	1

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

ВЫБРАТЬ
	5.623413251903491,
	100,
	10

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

ВЫБРАТЬ
	17.78279410038923,
	1000,
	100

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

ВЫБРАТЬ
	56.23413251903491,
	10000,
	1000

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

ВЫБРАТЬ
	177.8279410038923,
	100000,
	10000

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

ВЫБРАТЬ
	562.3413251903491,
	1000000,
	100000

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

ВЫБРАТЬ
	1778.279410038923,
	10000000,
	1000000

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

ВЫБРАТЬ
	5623.413251903491,
	100000000,
	10000000
;

////////////////////////////////////////////////////////////­////////////////////
ВЫБРАТЬ
	100 КАК Поле1
ПОМЕСТИТЬ Набор

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

ВЫБРАТЬ
	4

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

ВЫБРАТЬ
	125

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

ВЫБРАТЬ
	625

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

ВЫБРАТЬ
	100000
;

////////////////////////////////////////////////////////////­////////////////////
ВЫБРАТЬ
	Набор.Поле1,
	SQRTS.Y,
	(((SQRTS.Y + Набор.Поле1 / SQRTS.Y) / 2 + Набор.Поле1 / ((SQRTS.Y + Набор.Поле1 / SQRTS.Y) / 2)) / 2 + Набор.Поле1 / (((SQRTS.Y + Набор.Поле1 / SQRTS.Y) / 2 + Набор.Поле1 / ((SQRTS.Y + Набор.Поле1 / SQRTS.Y) / 2)) / 2)) / 2 КАК Поле2
ИЗ
	Набор КАК Набор
		ЛЕВОЕ СОЕДИНЕНИЕ SQRTS КАК SQRTS
		ПО Набор.Поле1 < SQRTS.ВерхнееЗначение
			И Набор.Поле1 >= SQRTS.НижнееЗначение
...Показать Скрыть
51. Алексей Шошин (alexsh76) 03.03.15 15:02
(49) (48), замерил на конкретных данных. ~13500 записей. Увеличение времени выполнения запроса ~300ms
Для написания сообщения необходимо авторизоваться
Прикрепить файл
Дополнительные параметры ответа