Как преобразовать число в дату в запросе?

1. drugoi_mir 15 25.10.12 00:51 Сейчас в теме
Вообщем в скд в параметрах есть Год - тип число( 4 0 неотрицательное). Так же есть соответственно Параметр Дата. Для него в выражении Нужно задать функцию, которая преобразует Наше число к формату Дата. Как это сделать???



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

PS. ДатаВремя() не подходит, т.к. аргументы могут быть только константами.
По теме из базы знаний
Ответы
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
6. logos 214 25.10.12 08:44 Сейчас в теме
(1) drugoi_mir, Виноват, действительно программисты платформы ниасилили такое простое действие, как подставление полей таблиц в функции, как и многое другое.Тут я был неправ. Однако есть обходное решение:
ВЫБРАТЬ
	12 КАК Год,
	5 КАК Месяц,
	14 КАК День
ПОМЕСТИТЬ ВТДаты

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

ВЫБРАТЬ
	12,
	6,
	14

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

ВЫБРАТЬ
	13,
	12,
	31
;

////////////////////////////////////////////////////////////­////////////////////
ВЫБРАТЬ
	ВТДаты.Год,
	ВТДаты.Месяц,
	ВТДаты.День,
	ДОБАВИТЬКДАТЕ(ДОБАВИТЬКДАТЕ(ДОБАВИТЬКДАТЕ(ДАТАВРЕМЯ(1, 1, 1), ГОД, ВТДаты.Год), МЕСЯЦ, ВТДаты.Месяц), ДЕНЬ, ВТДаты.День) КАК Дата
ИЗ
	ВТДаты КАК ВТДаты
Показать


Сделал с точностью до дня, но принцип общий, ничего не меняется для других вариантов
7. drugoi_mir 15 25.10.12 09:29 Сейчас в теме
(6) Ты не понял. Такой запрос не получиться вставить в поле выражение(скд->параметры)
8. Win98 25.10.12 09:32 Сейчас в теме
(7) drugoi_mir, параметры это зло :) в СКД надо юзать отборы :)
11. logos 214 25.10.12 09:36 Сейчас в теме
(7) drugoi_mir, Это ты не понял. В такой запрос можно вставить параметр СКД.
ВЫБРАТЬ
	ДОБАВИТЬКДАТЕ(ДАТАВРЕМЯ(1, 1, 1), ГОД, &Период-1) КАК ГОД

Например так, раз не хватило прошлого примера. "Период" - это параметр СКД в этом примере
user717534; user1338849; +2 Ответить
46. loginfo 03.04.13 15:34 Сейчас в теме
(11) Вот это как раз подошло!
47. пользователь 31.08.17 08:19
Сообщение было скрыто модератором.
...
2. awk 744 25.10.12 01:20 Сейчас в теме
Попробуй функцию ГОД(Период) = &Год
3. feikaa 40 25.10.12 03:21 Сейчас в теме
а нельзя сразу параметр сделать типа Дата нужного формата?
4. oleg974 123 25.10.12 06:58 Сейчас в теме
Пробывал на закладке "Параметры" в СКД в графе "Параметры редактирования" задать "Формат редактирования": "ДФ=yyyy" ?
Или в свойствах Поля ввода установить Формат?
9. drugoi_mir 15 25.10.12 09:32 Сейчас в теме
(4). Точно, даже не подумал об этом,спасибо!
5. logos 214 25.10.12 08:36 Сейчас в теме
PS. ДатаВремя() не подходит, т.к. аргументы могут быть только константами.

Вот это утверждение вызывает кучу сомнений.
10. mymyka 25.10.12 09:33 Сейчас в теме
Пользователь будет вводить Год в поле ввода формы? Почему бы не преобразовать число в дату в модуле и подсунуть в скд уже готовый параметр? Зачем лезть в тухлые дебри преобразования типов в запросе?
12. logos 214 25.10.12 09:38 Сейчас в теме
(10) mymyka, Тухлые дебри это исключительно из-за лени разработчиков 1С, тот же sql отлично умеет перегонять дату в строку и обратно, но вот незадача, кое кто поленился транслировать эти вызовы из языка запросов 1С
13. Win98 25.10.12 10:24 Сейчас в теме
(12) logos, мы имеем то что есть, можно сколько угодно ругать 1С но приходится с ней работать. Так что если есть форма то, имхо, правильно в форме все и сделать.
14. logos 214 25.10.12 10:29 Сейчас в теме
(13) Win98, Какая форма? Мы вроде про запрос говорим.
15. Win98 25.10.12 10:45 Сейчас в теме
(14) logos, мы говорим про СКД, 1С и
Вообще это делается для красоты, чтобы пользователь вводил Год, а дальше уже за этот год выводился отчет.

Где-то же он его вводит?
16. logos 214 25.10.12 11:30 Сейчас в теме
(15) Win98, Вопрос не так прост. Что лучше: делать форматирование на клиенте или преобразование типов на сервере?
18. mymyka 25.10.12 11:36 Сейчас в теме
(16)Ясное дело на клиенте, т.к. там возможностей значительно больше, да и всевозможные проверки введенного значения описать куда проще.
(17) А параметр &Год ты каким образом собрался передавать в скд? Разница лишь в значении, которое будет передано, изначально обработанное на предмет ошибок и типа, или сырое.
20. Win98 25.10.12 11:37 Сейчас в теме
(16) logos, а зачем нам решать этот вопрос? Я конечно понимаю что совсем правильно решить так чтобы больше этой проблемы ни у кого, никогда и нигде не возникало, но в данном случае, имхо, проще пареной репы, в форме превратить число в дату и подставить в отбор. Но, конечно, можно попробовать решить проблему неправильного мироустройства ;)
17. logos 214 25.10.12 11:35 Сейчас в теме
(10) mymyka, Опять же, что проще: сделать выражение содержащее параметр в запросе вместо параметра или расколупывать скд, чтоб оно формировалось не штатно, а с предварительно обработанными параметрами? :) Мне так кажется, мой вариант по трудозатратам в разы меньше, а для пользователя одинаково прозрачен.
21. Win98 25.10.12 11:40 Сейчас в теме
(17) logos, параметры это зло, все/всё в отборы, вдруг потом этим отчетом будет пользоваться продвинутый юзер? Вот пусть и играется с отборами хоть до 1024-го пришествия :)
23. logos 214 25.10.12 11:59 Сейчас в теме
(21) Win98, Вот тут есть нехороший нюанс. Отборы СКД осуществляются средствами 1с сервера, а не СУБД, так что я опасаюсь за их эффективность.
24. mymyka 25.10.12 12:10 Сейчас в теме
(23)Этот вопрос уже обсуждался. В вебинаре Гилева на конкретном примере(через консоль СКД) показывается, что отборы все равно приводятся к параметрам в конечном запросе, формируемом на основе макета СКД(который от описанного в макете может отличаться кардинально).
26. AlexO 135 25.10.12 12:16 Сейчас в теме
(24) mymyka,
ну, чтобы понять, что равно все пропускается через 1С-сервер, а данные - в любом случае первично выбираются в СУБД (если таковая есть) - по-моему, для этого вебинары проводить не обязательно :))
27. mymyka 25.10.12 12:26 Сейчас в теме
(26)В в случае обычного запроса он как есть передается транслятору(серверу приложения), который получает текст скуль запроса и отправляет его в БД. В СКД же есть макет запроса, который приводится к более менее оптимальному виду на основе введенных данных(в частности отборов) и только потом передается транслятору. И по-этому отборы(трансформированные процессором скд в параметры виртуальных таблиц) применяются именно на стороне СУБД, а не на сервере приложения.
28. AlexO 135 25.10.12 12:36 Сейчас в теме
(27) mymyka,
все умные слова означают только:) :
- запросы обрабатывает 1С-сервер и передает их для построения плана запроса в SQL
- запросы СКД обрабатывает предпроцессор СКД, передает в 1С-сервер, а оттуда - для построения плана в SQL
Т.е. в любом случае все проходит через 1С-платформу (а то и кружится там, и не только в предпроцессорах), и только потом выдается в транслятор СУБД. Потом процесс идет в обратном направлении - СУБД выдает данные, 1с-платформа их обрабатывает и возвращает вызвавшему объекту.
И 1с-обработка в любом направлении медленней обработки в СУБД.
Для вот этого надо создавать вебинар? :)
31. mymyka 25.10.12 13:33 Сейчас в теме
(28)Я хз как еще объяснить.
Во-первых, это был только один из огромного списка вопросов по СКД, рассмотренных в том вебинаре.
Во-вторых, время на трансляцию запроса из "1Сного" в "скульный" ничтожно мало и им можно пренебречь, как и формирование оптимального текста "1Сного" запроса из макета. Существенное время занимает обработка выборки на предмет условий "ГДЕ бла бла бла" на сервере приложений. Процессор СКД же создает запрос с параметрами виртуальной таблицы, а не примитивными условия ГДЕ, т.о. вся обработка ведется на стороне СУБД и нет никакой "1с-платформа их обрабатывает", там нечего "обрабатывать", выборка содержит именно те данные и именно в тех объемах, что были запрошены.
32. AlexO 135 25.10.12 13:40 Сейчас в теме
(31) mymyka,
СКД же создает запрос с параметрами виртуальной таблицы

т.е. по-вашему - SQL работает напрямую с продвинутыми виртуальными таблицами 1С без участия 1с-сервера, а не с примитивными планами с условием ГДЕ?
34. mymyka 25.10.12 13:54 Сейчас в теме
(32) Скуль работает с тем, что ему выдал транслятор запросов. Параметры виртуальной таблицы включаются в скульный запрос, т.к. необходимы при формирование этих самых таблиц, условия - обрабатываются на сервере приложений.
(33) Возьми КонсольСКД да глянь итоговый запрос. Я не Гилев какой-нить, чтобы ванговать текст запроса по ТЗ.
35. AlexO 135 25.10.12 14:40 Сейчас в теме
(34) mymyka,
Возьми КонсольСКД да глянь итоговый запрос.

зачем мне глядеть на 1с изнутри 1С, чтобы понять, что на выходе - нет виртуальных таблиц?
Это как раз вам надо смотреть, раз говорите, что SQL работает "с параметрами виртуальных таблиц" (и к чему он эти параметры прикладывает?), да еще и без "примитивных ГДЕ".
Процессор СКД же создает запрос с параметрами виртуальной таблицы, а не примитивными условия ГДЕ, т.о. вся обработка ведется на стороне СУБД

К чему сейчас разговоры о "десятках" 1с-преобразований, когда и так ясно, что 1с лопатит запрос, чтобы дать его в ПОНЯТНОЙ (но не оптимальной) форме для СУБД??
Параметры виртуальной таблицы включаются в скульный запрос, т.к. необходимы при формирование этих самых таблиц

вот так берутся и включаются? без образования вложенных подзапросов обычного формата к таблицам "типа виртуальным"?
условия - обрабатываются на сервере приложений

выборки всегда обрабатываются на 1с-сервере, если только они не настолько "примитивны" (в логике вашей и 1С), что полностью один-в-один ложатся в план запроса SQL.
Я не Гилев какой-нить

Я не собираюсь Гилеву в рот смотреть, тем более - он так же обманут недоговорками 1С. Но, в отличие от меня, обманываться рад.
37. mymyka 25.10.12 15:42 Сейчас в теме
(35) ты разницу между формированием запроса и транляцией запроса улавливаешь вообще? Не? Я лишь говорю, что СКД оптимально строит "1сный" запрос там, где это возможно(читай используются виртуальные таблицы).
(36) Будет сделано 2 запроса к физическим таблицам в СУБД, а потом результаты обоих перелопачены на сервере приложений согласно связи. Какое это вообще имеет отношение к обсуждаемому вопросу? Мб все таки рассмотрим пример где возможны виртуальные таблицы?
38. logos 214 25.10.12 16:02 Сейчас в теме
(37) mymyka, А это и есть вполне себе случай виртуальной таблицы, только зашитой не на уровне платформы, как это делается в случае с РН.Остатки(), а на уровне СКД. Если засунуть всё в 1 набор, то будет 1 запрос с нормальным планом, прилетят на сервер предприятия только данные за 1 день по 1 организации. А вот как сейчас работает СКД - прилетит шапка за 1 день, а табличная часть вообще вся, распухнет резко рпхост и потом по мегаэффективному алгоритму будут скомпонованы 2 набора. А так нет, никакого отношения не имеет
39. mymyka 25.10.12 16:16 Сейчас в теме
(38)Этот запрос у меня по данным за год(1372 РТиУ, в среднем 5 записей ТЧ на документ, отбор по 1 организации из 4) формируется в СКД за 0.798 сек согласно замеру производительности. За 5 лет(8611 РТиУ) формирование занимает 2.148 сек(нелинейный прирост). Я хз где тут "распухший рпхост" и чудовищные таблицы. Более того, в итоговом запросе видно, что СКД исключила из выборки неиспользуемые поля(не указанные в списке отборов или выводимых полей) дабы не создавать лишних соединений, что свидетельствует о более менее "интеллектуальном" подходе к формированию запроса даже в таком простом случае.
40. logos 214 25.10.12 16:22 Сейчас в теме
(39) mymyka, А Вы профайлером наконец посмотрите какие запросы формируются. И пухнет он ненавечно, но можете свято верить в непогрешимость и офигенность системы компоновки. Дело сугубо ваше
36. logos 214 25.10.12 14:43 Сейчас в теме
(34) mymyka, При чём здесь ванговать, Гилев и КонсольСКД? Я предлагаю Вам взять в руки профилировщик и смоделировать мой пример. Я знаю что будет сделано, а вот знаете ли Вы? ;)
33. logos 214 25.10.12 13:43 Сейчас в теме
(31) mymyka, А вот скажите пожалуйста, какие запросы sql будут созданы если сделать такую схему компоновки:
НаборДанных1 (типа запрос) содержит выборку таблицы шапки документа реализация товаров и услуг с отбором по организации и периоду.
НаборДанных2 (тоже запрос) содержит выборку таблицы товаров документа реализация товаров и услуг без отборов.
Оба эти набора связаны по полю Ссылка.
25. AlexO 135 25.10.12 12:14 Сейчас в теме
(23) logos,
Отборы СКД осуществляются средствами 1с сервера, а не СУБД

а что, 1С уже работает вне 1с-сервера? :)
29. logos 214 25.10.12 12:49 Сейчас в теме
(25) AlexO, Был неправ, действительно отбор транслируется в условие sql запроса, в отличие от связи наборов данных.
19. AlexO 135 25.10.12 11:37 Сейчас в теме
(10) mymyka,
Зачем лезть в тухлые дебри преобразования типов в запросе?

а они есть в запросах 1С? :)
22. mymyka 25.10.12 11:47 Сейчас в теме
(19)С примитивными типами вполне справиться можно, особенно если передать форматную строку. Другое дело, что анализ значения внутри запроса нужен исключительно в СКД, которая, кстати, умеет использовать внешние функции в вычисляемых полях. В любом другом случае, проще обработать результат выборки.
30. _Avril_ 25.10.12 13:03 Сейчас в теме
Если это отчет, то можно в процедуре ПриКомпоновкеРезультата считать значение параметра год преобразовать подставить в парметры периода
41. logos 214 25.10.12 16:25 Сейчас в теме
8611 РТиУ
Это за 5 лет - право слово смешно. У меня было по 800 РТиУ в сутки стабильно каждый день. И это далеко не самая интенсивная по документообороту база. Естественно Вы не заметили каких либо проблем с памятью. А так, на больших объемах заметно, что СКД тормознее, чем аналогичный отчет, например на построителе.
44. mymyka 25.10.12 17:07 Сейчас в теме
(41) Вот бывают же упертые )Или это из серии "раньше и солнце было ярче и трава зеленее"? Запрос на базе универсального отчета - 7.217 сек. Еще идеи будут?
45. logos 214 25.10.12 17:12 Сейчас в теме
(44) mymyka, Упираетесь тут Вы. Я уже 2 раза предложил посмотреть формируемые sql запросы, а Вы всё цифрами разбрасываетесь. Естественно кроме замеров времени выполнения Вы покажете счетчики: свободной памяти, процессорного времени, очереди обращения к жесткому диску, предположите где использовались индексы при получении данных, были ли они в кэше и ещё тысячу других причин, по которым нерепрезентативные выборки могут давать поразительно нелогичные результаты?
42. YODDHA 50 25.10.12 16:40 Сейчас в теме
"ВЫБРАТЬ
| ДАТАВРЕМЯ(2010, 1, 1, 0, 0, 0) КАК Дата"

Где 2010 это ГОД
а все остальные цифры ну в общем произвольно
43. logos 214 25.10.12 16:43 Сейчас в теме
(42) YODDHA, Проблема Датавремя, что Вы не можете в поле ГОД, например, положить поле таблицы, только константу или параметр. А автору это не подходило.
48. user1468592 01.03.21 19:36 Сейчас в теме
Извините, я только начинаю

  ДатаГода = '20120101';
	
	Г =  Строка(Год(ДатаГода));
	М= Строка(Месяц(ДатаГода));
	Д = Строка(День(ДатаГода));
	
	Даты = Дата(Г, М, Д); //01.01.2012 0:00:00
Оставьте свое сообщение

Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот