Имя: Пароль:
1C
 
Дата в строку в запросе..
0 MoneG
 
06.02.09
12:59
В продолжение темы v8: Как преобразовать дату в строку в запросе ?,
где речь шла о номере и дате документа.
Изящный метод ".Представление" для справочника ДоговорыКонтрагентов, к сожалению, не подходит.
"Забивать" в запрос все возможные даты - тоже не вариант.

Предлагаю другое универсальное решение:

//====================================================================
"Договор № "+ВЫРАЗИТЬ(Табл.Номер КАК Строка(12))+
" от " +             //--------- день ---------
ВЫБОР КОГДА ВЫРАЗИТЬ(ДЕНЬ(Табл.Дата)/10 КАК Число(1) )*10
                   - ДЕНЬ(Табл.Дата) > 0    //округленные десятки
           ТОГДА //десятки округлены в большую сторону
               ПОДСТРОКА("0123",             //десятков + "0"
               ВЫРАЗИТЬ(ДЕНЬ(Табл.Дата)/10 КАК Число(1) )
               ,1) +
               ПОДСТРОКА("0123456789",
               ДЕНЬ(Табл.Дата)-           //единиц + "0"
               ((ВЫРАЗИТЬ(ДЕНЬ(Табл.Дата)/10 КАК Число(1)) - 1) * 10) + 1
               ,1)
           ИНАЧЕ //десятки округлены в меньшую сторону
               ПОДСТРОКА("0123",  //десятков дней не больше 3х
               ВЫРАЗИТЬ(ДЕНЬ(Табл.Дата)/10 КАК Число(1) ) + 1
               ,1) +
               ПОДСТРОКА("0123456789",
               ДЕНЬ(Табл.Дата)-
               (ВЫРАЗИТЬ(ДЕНЬ(Табл.Дата)/10 КАК Число(1) ) * 10) + 1
               ,1)
   КОНЕЦ  + "." + //---------- месяц --------------
ВЫБОР КОГДА ВЫРАЗИТЬ(МЕСЯЦ(Табл.Дата)/10 КАК Число(1) )*10
                   - МЕСЯЦ(Табл.Дата) > 0    //округленные десятки
           ТОГДА //десятки округлены в большую сторону
               ПОДСТРОКА("01",  //десятков месяцев не больше 1
               ВЫРАЗИТЬ(МЕСЯЦ(Табл.Дата)/10 КАК Число(1) )
               ,1) +
               ПОДСТРОКА("0123456789",
               МЕСЯЦ(Табл.Дата)-
               ((ВЫРАЗИТЬ(МЕСЯЦ(Табл.Дата)/10 КАК Число(1)) - 1) * 10) + 1
               ,1)
           ИНАЧЕ //десятки округлены в меньшую сторону
               ПОДСТРОКА("01",
               ВЫРАЗИТЬ(МЕСЯЦ(Табл.Дата)/10 КАК Число(1) ) + 1
               ,1) +
               ПОДСТРОКА("0123456789",
               МЕСЯЦ(Табл.Дата)-
               (ВЫРАЗИТЬ(МЕСЯЦ(Табл.Дата)/10 КАК Число(1) ) * 10) + 1
               ,1)
   КОНЕЦ    + "." + //--------- год ------------------
// сами понимаете, во что выльется "выбирание" цифр года без переменных,
// поэтому упростим :
// считаем, что кроме 0001, 19хх и 20хх - нет др годов

//тысячи и сотни года    
ВЫБОР КОГДА ГОД(Табл.Дата) <> 1
   ТОГДА
       ВЫБОР КОГДА ГОД(Табл.Дата) > 1999
           ТОГДА "20" + //десятки и единицы года
               ВЫБОР КОГДА ВЫРАЗИТЬ((ГОД(Табл.Дата) - 2000)/10 КАК Число(1) )*10
                               - (ГОД(Табл.Дата) - 2000) > 0
                   ТОГДА //десятки округлены в большую сторону
                       ПОДСТРОКА("0123456789",
                       ВЫРАЗИТЬ((ГОД(Табл.Дата) - 2000)/10 КАК Число(1) )
                       ,1) +
                       ПОДСТРОКА("0123456789",
                       (ГОД(Табл.Дата) - 2000) -
                       ((ВЫРАЗИТЬ((ГОД(Табл.Дата) - 2000)/10 КАК Число(1)) - 1) * 10) + 1
                       ,1)
                   ИНАЧЕ //десятки округлены в меньшую сторону
                       ПОДСТРОКА("0123456789",
                       ВЫРАЗИТЬ((ГОД(Табл.Дата) - 2000)/10 КАК Число(1) ) + 1
                       ,1) +
                       ПОДСТРОКА("0123456789",
                       (ГОД(Табл.Дата) - 2000) -
                       (ВЫРАЗИТЬ((ГОД(Табл.Дата) - 2000)/10 КАК Число(1) ) * 10) + 1
                       ,1)
               КОНЕЦ                
           //-------------------------
           ИНАЧЕ "19" + //десятки и единицы года
                   ВЫБОР КОГДА ВЫРАЗИТЬ((ГОД(Табл.Дата) - 1900)/10 КАК Число(1) )*10
                               - (ГОД(Табл.Дата) - 1900) > 0
                   ТОГДА //десятки округлены в большую сторону
                       ПОДСТРОКА("0123456789",
                       ВЫРАЗИТЬ((ГОД(Табл.Дата) - 1900)/10 КАК Число(1) )
                       ,1) +
                       ПОДСТРОКА("0123456789",
                       (ГОД(Табл.Дата) - 1900) -
                       ((ВЫРАЗИТЬ((ГОД(Табл.Дата) - 1900)/10 КАК Число(1)) - 1) * 10) + 1
                       ,1)
                   ИНАЧЕ //десятки округлены в меньшую сторону
                       ПОДСТРОКА("0123456789",
                       ВЫРАЗИТЬ((ГОД(Табл.Дата) - 1900)/10 КАК Число(1) ) + 1
                       ,1) +
                       ПОДСТРОКА("0123456789",
                       (ГОД(Табл.Дата) - 1900) -
                       (ВЫРАЗИТЬ((ГОД(Табл.Дата) - 1900)/10 КАК Число(1) ) * 10) + 1
                       ,1)
               КОНЕЦ

       КОНЕЦ
   ИНАЧЕ         "0001"
КОНЕЦ             + " г."                        КАК НомерДатаДоговора
1 Defender aka LINN
 
06.02.09
13:01
Жесть...
2 MoneG
 
06.02.09
13:04
Зато работает! )))
3 hhhh
 
06.02.09
13:35
(2) предлагаю другой вариант

ВЫБОР КОГДА День(Табл.Дата) < 10 ТОГДА
   ""0"" + ПОДСТРОКА("0123456789",
                       ВЫРАЗИТЬ(ДЕНЬ(Табл.Дата) КАК Число(1)
                       ,1)
ИНАЧЕ
   ПОДСТРОКА(&Параметр, (ВЫРАЗИТЬ(ДЕНЬ(Табл.Дата) КАК Число(1) - 10)*3+1
                       ,2)
КОНЕЦ
+ "." +
ВЫБОР КОГДА Месяц(Табл.Дата) < 10 ТОГДА
   ""0"" + ПОДСТРОКА("0123456789",
                       ВЫРАЗИТЬ(Месяц(Табл.Дата) КАК Число(1)
                       ,1)
ИНАЧЕ
   ПОДСТРОКА(&Параметр, (ВЫРАЗИТЬ(Месяц(Табл.Дата) КАК Число(1) - 10)*3+1
                       ,2)
КОНЕЦ
+ "." +
ВЫБОР КОГДА Год(Табл.Дата) - 2000 < 10 ТОГДА
   ""0"" + ПОДСТРОКА("0123456789",
                       ВЫРАЗИТЬ(Год(Табл.Дата)-2000 КАК Число(1)
                       ,1)
ИНАЧЕ
   ПОДСТРОКА(&Параметр, (ВЫРАЗИТЬ(Год(Табл.Дата)-2000 КАК Число(1) - 10)*3+1
                       ,2)
КОНЕЦ

здесь

&Параметр = "10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33";
4 hhhh
 
06.02.09
13:37
(2)+ пока с ошибками
5 MoneG
 
06.02.09
13:40
(4) расскажи про них (ошибки)
6 Aprobator
 
06.02.09
13:51
хм, а функция запроса Предсталвение(...) не помогает?
7 Михей
 
06.02.09
13:52
(0) ееепт...

писал УПП?
8 Defender aka LINN
 
06.02.09
13:55
(6) Очередной теоретик?
9 Serg_1960
 
06.02.09
13:55
ALL: Всегда интересовало: зачем, как и куда "это" надо - дата строкой в запросе? Неужели так "неординарно" мыслят, что не могут запрос в "типовые" рамки уложить?
10 MoneG
 
06.02.09
13:59
(6) в (0) написано, что не помогает. Не веришь - проверь на Справочнике ДоговорыКонтрагентов.
(7) :))) нет конечно! Вот если бы в запросе результат ПРЕДСТАВЛЕНИЕ() было именно таким, как оно описано в доках (типа, это строка), можно было бы ординарно сделать.
(9) реальный пример, который заставил "не уложиться": справочник ДоговорыКонтрагентов имеет помимо "Наименования" поля "Номер" и "Дата".
Хочется прям в запросе получить строку типа "Договор №_  от ""__ 200_"
безо всяких обработок выборки потом.
11 73
 
06.02.09
13:59
(9) Вся проблема в бедности встроенных функций языка запросов,
а люди хотят получить готовый результат от запроса. Вот и мучаются
12 Defender aka LINN
 
06.02.09
14:01
(10) А зачем он прямо в запросе нужен вообще?
13 MoneG
 
06.02.09
14:03
(12) > безо всяких обработок выборки потом
чтобы можно было затем, к примеру, что-то такое сделать без "опасений":
Табл.Загрузить(Запрос.Выполнить.Выгрузить());
или
ЗаполнитьЗначенияСвойств();
14 Aprobator
 
06.02.09
14:07
(10) не метод .Представление, а ПРЕДСТАВЛЕНИЕ(ТвояДата).
15 MoneG
 
06.02.09
14:13
(14)ПРЕДСТАВЛЕНИЕ() в отличие от .Представление нельзя использовать совместно с чем-нибудь ещё.. т.е.
"№1 от " + ПРЕДСТАВЛЕНИЕ(Дата) // - невозможно
"№1 от " + Ссылка.Представление // - возможно, но не дает результат

При этом, ПРЕДСТАВЛЕНИЕ() - вроде как строка (как в описании), но никакими средствами запроса (кроме результата запроса) как строка не распознается.
16 KalachevDV
 
06.02.09
14:17
Если указать например вот так
ВЫБРАТЬ
   ПРЕДСТАВЛЕНИЕ(ЗаказПокупателя.Дата)
ИЗ
   Документ.ЗаказПокупателя КАК ЗаказПокупателя

Результат - строка.
17 Defender aka LINN
 
06.02.09
14:17
(13) Я и так всегда так делаю.
Хотя иногда неудобно, да.
18 Defender aka LINN
 
06.02.09
14:17
(16) Это на выходе из запроса оно строка. В запросе - нет.
19 Serg_1960
 
06.02.09
14:20
А если я Вам сообщу более короткий алгоритм - Вы будете счастливы?
20 mikecool
 
06.02.09
14:21
(11,12) все что можно надо получать запросом и нех дополнительно обрабатывать данные на клиенте. Вот бедность языка запросов 1С - это да.
21 73
 
06.02.09
14:29
(20) с числами в строку - тоже проблема.
А по поводу доп обработок обнаруживается:
В клиент-серверном варианте при больших выборках время выполнения запроса
на сервере на порядок меньше, чем дальнейшая обработка в клиенте 1С.
Поэтому и хочется побольше отдать на сервер, т.е. в запросе обработать
как можно больше.
22 Serg_1960
 
06.02.09
14:30
(20) Ща... подождите... напишу сначала...
23 Serg_1960
 
06.02.09
14:32
Воот, получите... и будьте счастливы :)

   ЧислоСтрокой = "00";
   Для N = 0 По 99 Цикл
       ЧислоСтрокой = ЧислоСтрокой + Формат(N,"ЧЦ=2; ЧВН=");
   КонецЦикла;
   
   Запрос = Новый Запрос();
   Запрос.УстановитьПараметр("ЧислоСтрокой",    ЧислоСтрокой);
   Запрос.УстановитьПараметр("ТекДата",        ТекущаяДата());
   
   Запрос.Текст = "
   |ВЫБРАТЬ
   |    ""Договор №___ от "" + ВЫБОР
   |    КОГДА ГОД(&ТекДата) > 1900
   |    ТОГДА ""20"" + ПОДСТРОКА(&ЧислоСтрокой, (ГОД(&ТекДата) - 2000) * 2 + 1, 2)
   |    ИНАЧЕ ""19"" +    ПОДСТРОКА(&ЧислоСтрокой, (ГОД(&ТекДата) - 1900) * 2 + 1, 2) КОНЕЦ + ""/"" +
   |    ПОДСТРОКА(&ЧислоСтрокой, МЕСЯЦ(&ТекДата) * 2 + 1, 2) + ""/"" +
   |    ПОДСТРОКА(&ЧислоСтрокой, ДЕНЬ(&ТекДата) * 2 + 1, 2) КАК ДатаСтрокой";
   
   Выборка = Запрос.Выполнить().Выбрать();
   Выборка.Следующий();
   Сообщить(Выборка.ДатаСтрокой);
   
   Возврат;
24 73
 
06.02.09
14:36
(23) А с числами произвольной длины?
25 Serg_1960
 
06.02.09
14:37
(24) А где аплодисменты и крики "Браво!", "Бис!" ??? :))
26 73
 
06.02.09
14:40
(25) "Браво!", "Бис!" - это к Автору.
Я тут так, за державу обидно...
От себя - АПЛОДИСМЕНТЫ!
27 Serg_1960
 
06.02.09
14:43
(26) Угу... За державу обидно... почему разработчики преобразование типов не сделали в ВЫРАЗИТЬ...
28 73
 
06.02.09
14:47
(27) Хотя бы.
СКЛ может гораздо больше. Там функций даже в стандарте... молчу.
29 AndOne
 
06.02.09
15:18
вот скажете, почему не использовать компоновку?
а в запросе выполнять много операций лишних кажется не эффективно, да и компоновка табличным полем быстрее работает.
30 MoneG
 
06.02.09
16:08
(25) за оптимизацию - безусловно, аплодисменты! Зарезюмировал )