Опубликовал(а):
в: 11.04.2022
Ранее я уже встречался с проблемой перевода даты в строку в языке запросов 1С. Сегодня при написании запроса в 1C столкнулся с проблемой выражения числа как строки. На просторах сети Интернет я нашел следующее решение, которое сохраню здесь (думаю, что тоже не раз пригодится мне в будущем):
ПОДСТРОКА(«0123456789», 1 + (ВЫРАЗИТЬ(Объект. Число / 100 — 0.5 КАК ЧИСЛО(14, 0))) — (ВЫРАЗИТЬ(Объект. Число / 1000 — 0.5 КАК ЧИСЛО(14, 0))) * 10, 1)
+ ПОДСТРОКА(«0123456789», 1 + (ВЫРАЗИТЬ(Объект. Число / 10 — 0.5 КАК ЧИСЛО(14, 0))) — (ВЫРАЗИТЬ(Объект. Число / 100 — 0.5 КАК ЧИСЛО(14, 0))) * 10, 1)
+ ПОДСТРОКА(«0123456789», 1 + Объект. Число — (ВЫРАЗИТЬ(Объект. Число / 10 — 0.5 КАК ЧИСЛО(14, 0))) * 10, 1)
+ «.»
+ ПОДСТРОКА(«0123456789», 1 + (ВЫРАЗИТЬ(Объект. Число / 0.1 — 0.5 КАК ЧИСЛО(14, 0))) — (ВЫРАЗИТЬ(Объект. Число / 1 — 0.5 КАК ЧИСЛО(14, 0))) * 10, 1)
+ ПОДСТРОКА(«0123456789», 1 + (ВЫРАЗИТЬ(Объект. Число / 0.01 — 0.5 КАК ЧИСЛО(14, 0))) — (ВЫРАЗИТЬ(Объект. Число / 0.1 — 0.5 КАК ЧИСЛО(14, 0))) * 10, 1)
+ ПОДСТРОКА(«0123456789», 1 + (ВЫРАЗИТЬ(Объект. Число / 0.001 — 0.5 КАК ЧИСЛО(14, 0))) — (ВЫРАЗИТЬ(Объект. Число / 0.01 — 0.5 КАК ЧИСЛО(14, 0))) * 10, 1)
+ ПОДСТРОКА(«0123456789», 1 + (ВЫРАЗИТЬ(Объект. Число / 0.0001 — 0.5 КАК ЧИСЛО(14, 0))) — (ВЫРАЗИТЬ(Объект. Число / 0.001 — 0.5 КАК ЧИСЛО(14, 0))) * 10, 1)
+ ПОДСТРОКА(«0123456789», 1 + (ВЫРАЗИТЬ(Объект. Число / 0.00001 — 0.5 КАК ЧИСЛО(14, 0))) — (ВЫРАЗИТЬ(Объект. Число / 0.0001 — 0.5 КАК ЧИСЛО(14, 0))) * 10, 1)
+ ПОДСТРОКА(«0123456789», 1 + (ВЫРАЗИТЬ(Объект. Число / 0.000001 — 0.5 КАК ЧИСЛО(14, 0))) — (ВЫРАЗИТЬ(Объект. Число / 0.00001 — 0.5 КАК ЧИСЛО(14, 0))) * 10, 1)
1c, convert, float, numeric, query, string, substr, выразить, подстрока, строка, число
- ДобавитьКДате в запросе 1С
- Дата в 1С запросе
- Как передать текущую дату в запрос?
- Как получить начало текущего месяца?
- Конец текущего года?
- Как получить полдень текущей даты?
- Как получить дату без времени (0
- Как задать дату-константу в запросе 1С?
- Возможно задать дату с точностью до секунды?
- А до милисекунды?
- Как получить день недели?
- Сколько осталось до Нового года?
- Преобразовать строку в дату в запросе
- ВЫРАЗИТЬ КАК СТРОКА в запросе
- Синтаксис функции
- Другие особенности использования ВЫРАЗИТЬ КАК СТРОКА
- V8 Язык запросов. Как получить дату строкой?
- Популярные сообщения из этого блога
ДобавитьКДате в запросе 1С
Функция ДобавитьКДате позволяет произвести выборку данных, за период отталкиваясь от одного значения даты на определенное количество единиц времени.
В синтаксисе языка аналог — функция ДобавитьМесяц, для остальных значений даты расчет всегда производится посекундно: Дата1 = Дата2+24*3600*7.
В запросе же добавить период к значению можно гораздо гибче используя всего одну функцию.
Начальная дата может быть:
Не хватает только функции ТекущаяДата() в запросе
Секунда, Минута, Час, День, Неделя, Декада, Месяц,Квартал, Полугодие, Год
Приводит к вычислению Сдвиг*ЕдиницаВремени
Положительное число — увеличение периода
Отрицательно — уменьшение периода
Запрос, получающий дату на месяц раньше 01.10.2016
Выбрать
ДобавитьКДате(ДатаВремя(2016,10,1),МЕСЯЦ,-1)
На 3 месяца позже:
Выбрать
ДобавитьКДате(ДатаВремя(2016,10,1),МЕСЯЦ,3)
На 30 календарных дней раньше
Выбрать
ДобавитьКДате(ДатаВремя(2016,10,1),ДЕНЬ,-30)
12 часов дня
Выбрать
ДобавитьКДате(ДатаВремя(2016,10,1),Секунда,12*3600), ДобавитьКДате(ДатаВремя(2016,10,1),ЧАС,12)
Возможно использовать значения другой таблицы для указания сдвига
Например, если есть таблица которая содержит номера часов:
Выбрать 1 как Номер
То ее можно соединить с календарем и для каждой даты получить дату со временем, использовав вот такую конструкцию:
ДобавитьКДате(_КалендарьГрафиков. Дата,ЧАС,Часы. Номер) как ДатаСоВременем
Дата в 1С запросе
Дата в запросе в 1С может быть получена:
Текущая дата(и время) в запросе 1С получается только в качестве параметра.
Как передать текущую дату в запрос?
Запрос Запрос
ЗапросУстановитьПараметрТекущаяДата
тзРезультатЗапроса ЗапросВыгрузить
Далее приводятся только тексты запросов.
Как получить начало текущего месяца?
ВЫБРАТЬ
НАЧАЛОПЕРИОДА(&ТекущаяДата,МЕСЯЦ)
Конец текущего года?
ВЫБРАТЬ
КОНЕЦПЕРИОДА(&ТекущаяДата,ГОД)
Как получить полдень текущей даты?
ВЫБРАТЬ
ДОБАВИТЬКДАТЕ(НАЧАЛОПЕРИОДА(&ТекущаяДата,ДЕНЬ),ЧАС,12)
Как получить дату без времени (0
ВЫБРАТЬ
НАЧАЛОПЕРИОДА(&ТекущаяДата,ДЕНЬ)
Как задать дату-константу в запросе 1С?
ВЫБРАТЬ
ДАТАВРЕМЯ(2017,1,1)
Возможно задать дату с точностью до секунды?
ВЫБРАТЬ
ДАТАВРЕМЯ(2017,1,1,8,0,1)
А до милисекунды?
ВЫБРАТЬ
МЕСЯЦ(&ТекущаяДата) как ТекущийМесяц,
РАЗНОСТЬДАТ(НАЧАЛОПЕРИОДА(&ТекущаяДата,ГОД),КОНЕЦПЕРИОДА(&ТекущаяДата,МЕСЯЦ),МЕСЯЦ) как ПолныхПрошедшихМесяцев
Как получить день недели?
ВЫБРАТЬ
ДЕНЬНЕДЕЛИ(&ТекущаяДата) КАК НомерДня,
ВЫБОР
КОГДА ДЕНЬНЕДЕЛИ(&ТекущаяДата) = 1
ТОГДА «понедельник»
КОГДА ДЕНЬНЕДЕЛИ(&ТекущаяДата) = 2
ТОГДА «вторник»
КОГДА ДЕНЬНЕДЕЛИ(&ТекущаяДата) = 3
ТОГДА «среда»
КОГДА ДЕНЬНЕДЕЛИ(&ТекущаяДата) = 4
ТОГДА «четверг»
КОГДА ДЕНЬНЕДЕЛИ(&ТекущаяДата) = 5
ТОГДА «пятница»
КОГДА ДЕНЬНЕДЕЛИ(&ТекущаяДата) = 6
ТОГДА «суббота»
ИНАЧЕ «Воскресенье»
КОНЕЦ КАК НаименованиеДняНедели
Сколько осталось до Нового года?
Дата в запросах может фигурировать не только в полях выборки, и вычислениях, но также передаваться, как параметры виртуальных таблиц.
Допустимо задание дат-констант и использование параметров, также обработка их выше приведенными функциями.
Но нельзя дату передать в параметры виртуальных таблиц из полученных ранее в этом запросе полей выборки.
Сортировка даты в запросе производится в рамках секунды.
Момент времени документа не является датой, он сортирует более глубже, чем дата документа, т.е. при наличии документов в одну секунду времени, сортировка по дате производится в недопустимом порядке: например в виде представления. Используйте для этого момент времени.
Внешнее представление даты определяется представлением операционной системы, управлять из запроса, а также приводить в строковое представление в классическом запросе невозможно в отличии от СКД, где возможна пост-обработка и условное оформление.
Допускается применение функции МАКСИМУМ(),МИНИМУМ() к дата в запросе, как в группировке так и в итогах запроса.
Ошибка «неверные параметры» возникает в случае, когда вместо даты передается null, число или что-то иное.
Преобразовать строку в дату в запросе
Специальных функций нет. но возможно преобразование через функцию ПОДСТРОКА и конструкцию ВЫБОР КОГДА
////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
Расчеты. Параметр,
Расчеты. ВерныйПараметр,
ВЫБОР
КОГДА Расчеты.символ1 = «2»
ТОГДА 2
КОГДА Расчеты.символ1 = «1»
ТОГДА 1
ИНАЧЕ 0
КОНЕЦ * 1000 + ВЫБОР
КОГДА Расчеты.символ2 = «0»
ТОГДА 0
КОГДА Расчеты.символ2 = «1»
ТОГДА 1
КОГДА Расчеты.символ2 = «2»
ТОГДА 2
КОГДА Расчеты.символ2 = «3»
ТОГДА 3
КОГДА Расчеты.символ2 = «4»
ТОГДА 4
КОГДА Расчеты.символ2 = «5»
ТОГДА 5
КОГДА Расчеты.символ2 = «6»
ТОГДА 6
КОГДА Расчеты.символ2 = «7»
ТОГДА 7
КОГДА Расчеты.символ2 = «8»
ТОГДА 8
ИНАЧЕ 9
КОНЕЦ * 100 + ВЫБОР
КОГДА Расчеты.символ3 = «0»
ТОГДА 0
КОГДА Расчеты.символ3 = «1»
ТОГДА 1
КОГДА Расчеты.символ3 = «2»
ТОГДА 2
КОГДА Расчеты.символ3 = «3»
ТОГДА 3
КОГДА Расчеты.символ3 = «4»
ТОГДА 4
КОГДА Расчеты.символ3 = «5»
ТОГДА 5
КОГДА Расчеты.символ3 = «6»
ТОГДА 6
КОГДА Расчеты.символ3 = «7»
ТОГДА 7
КОГДА Расчеты.символ3 = «8»
ТОГДА 8
ИНАЧЕ 9
КОНЕЦ * 10 + ВЫБОР
КОГДА Расчеты.символ4 = «0»
ТОГДА 0
КОГДА Расчеты.символ4 = «1»
ТОГДА 1
КОГДА Расчеты.символ4 = «2»
ТОГДА 2
КОГДА Расчеты.символ4 = «3»
ТОГДА 3
КОГДА Расчеты.символ4 = «4»
ТОГДА 4
КОГДА Расчеты.символ4 = «5»
ТОГДА 5
КОГДА Расчеты.символ4 = «6»
ТОГДА 6
КОГДА Расчеты.символ4 = «7»
ТОГДА 7
КОГДА Расчеты.символ4 = «8»
ТОГДА 8
ИНАЧЕ 9
КОНЕЦ КАК НомерГода
ПОМЕСТИТЬ Цифры
ИЗ
Расчеты КАК Расчеты
;
Про использование пустой даты в запросе.
ВЫРАЗИТЬ КАК СТРОКА в запросе
Данная конструкция в 1С используется в запросе для усечения длины строки,а также для приведения строки неограниченной длины к переменной строке с фиксированным ограничением.
Синтаксис функции
Никаких пробелов в конце короткой строки не добавляется.
Другие особенности использования ВЫРАЗИТЬ КАК СТРОКА
Передача NULL в качестве параметра не вызывает ошибки, но на выходе будет NULL (не строкой).
Передача для преобразования других типов вызывает ошибку «Несовместимые типы ВЫРАЗИТЬ».
Преобразовать число как строку в запросе или же ссылку как строку в данной функции (да и в любых других функциях запроса невозможно). Это отличает TSQL запрос select cast(‘321’ as numeric
от запроса в 1С.
Функция ПРЕДСТАВЛЕНИЕ(ЧИСЛО), может на выходе запроса выдать строку, но внутри запроса ее результат использовать невозможно даже в качестве параметра для ВЫРАЗИТЬ.
Конкантенация (сложение) строк допустима и с результатом ВЫРАЗИТЬ:
«321»+ ВЫРАЗИТЬ («Строка» КАК СТРОКА(100))
Идентификатор ссылочного объекта в запросе получить невозможно и ожидаемое многими начинающими программистами 1С в КАЧЕСТВЕ ВЫРАЗИТЬ(ССЫЛКА как СТРОКА()) не работает: ни наименования, ни кода, ни идентификатора не получится — будет ошибка несовместимости типов.
Вот такая простая функция без особых сюрпризов.
Возможно когда-нибудь в платформе 8.4 1С исправит ситуацию с преобразованиями типов в запрос, а может тут дело в поддержании совместимости всех баз данных.
Единственные настоящие поэты нашего времени служат в рекламных агентствах.
V8 Язык запросов. Как получить дату строкой?
Задался вопросом приведения Даты к строке в запросе. Решение с мисты
ЧислоСтрокой = «»;
N =
ЧислоСтрокой = ЧислоСтрокой + (N,»»);
;
Запрос = Запрос();
Запрос. УстановитьПараметр(«», ЧислоСтрокой);
Запрос. УстановитьПараметр(«», ());
Запрос. Текст = «»;
Выборка = Запрос. Выполнить(). Выбрать();
Выборка. Следующий();
(Выборка. ДатаСтрокой);
;
Ветка, Пост, Автор
ЧислоСтрокой = »
Популярные сообщения из этого блога
Вводная Если на форме есть элемент управления со списком выбора, в моем конкретном примере это Колонка Значение (Число (3,0)) с настроенным списком выбора. По умолчанию платформа отображает именно строковое значения, а не текст представления из списка выбора (когда как при выборе значения из списка показываются именно представления). Решение Для Управляемых форм необходимо настроить правила условного оформления, для обычных форм — оформление ячеек при выводе данных.
Когда нужно в макете (табличном документе) изменить ширину колонки для конкретных строк: 1. Выделить всю строку (строки). Именно всю, фокус для выделенной области не работает. 2. Нажимаем и не отпускает Ctrl 3. С помощью мыши изменяют ширину любой из колонок — будет задан вопрос об создании нового формата строк — соглашаемся. Как же прекрасен мир, где для модификаций не достаточно просто использовать контекстное меню и диалог редактора свойств, где нужно знать заветные слова и таинства танца. 90ые, моё почтение. UPD Программно, тоже самое, можно сделать через ТабДок = Новый ТабличныйДокумент(); ТабДок. Область(1,,1,). СоздатьФорматСтрок(); ТабДок. Область(1,1). ШиринаКолонок = 70; ТабДок. Область(1,2). ШиринаКолонок = 30; ТабДок. Область(2,,2,). СоздатьФорматСтрок(); ТабДок. Область(2,1). ШиринаКолонок = 30; ТабДок. Область(2,2). ШиринаКолонок = 70; ТабДок. Показать();
Вводная: реализовать ввод Заказа поставщику на основании Заказа на Ремонт. решить через расширения конфигурации. Хочу обратить ваше внимание, не нужно добавлять в расширение критерий отбора, для 8.3.12 нам не доступно добавлениеизменение состава критерия. Более того может зависать конфигуратор (столкнулся с последней версией 8.3.14 + ERP) Разработку рекомендую вести с применением хранилища и для расширения. Иначе устанете потом выгребать чего лишнего включили в расширение при добавлении таких или схожих обектов с составными типами и подобное. Все текущие типовые решения сейчас идут в режиме совместимости 8.3.12, в прочем и для 8.3.14 (и даже 8.3.15 ничего не поменялось). Что нам нужно было бы сделать при отказе от поддержки: 1) добавить наш документ в Критерий отбора (состав, реквизиты); 2) в раздел Ввод на основании целевого документа. И что с целью сохранения поддержки. Как сделать это же для расширения: 1) Добавить реквизит расширения Документы. ЗаказПоставщику._За
Предлагаю другое универсальное решение:
КОНЕЦ
ИНАЧЕ «0001»
КОНЕЦ + » г.» КАК НомерДатаДоговора
Defender aka LINN
Зато работает! )))
предлагаю другой вариант
ВЫБОР КОГДА День(Табл. Дата) < 10 ТОГДА
«»0″» + ПОДСТРОКА(«0123456789»,
ВЫРАЗИТЬ(ДЕНЬ(Табл. Дата) КАК Число
,1)
ИНАЧЕ
ПОДСТРОКА(&Параметр, (ВЫРАЗИТЬ(ДЕНЬ(Табл. Дата) КАК Число
— 10)*3+1
,2)
КОНЕЦ
+ «.» +
ВЫБОР КОГДА Месяц(Табл. Дата) < 10 ТОГДА
«»0″» + ПОДСТРОКА(«0123456789»,
ВЫРАЗИТЬ(Месяц(Табл. Дата) КАК Число
,1)
ИНАЧЕ
ПОДСТРОКА(&Параметр, (ВЫРАЗИТЬ(Месяц(Табл. Дата) КАК Число
— 10)*3+1
,2)
КОНЕЦ
+ «.» +
ВЫБОР КОГДА Год(Табл. Дата) — 2000 < 10 ТОГДА
«»0″» + ПОДСТРОКА(«0123456789»,
ВЫРАЗИТЬ(Год(Табл. Дата)-2000 КАК Число
,1)
ИНАЧЕ
ПОДСТРОКА(&Параметр, (ВЫРАЗИТЬ(Год(Табл. Дата)-2000 КАК Число
— 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»;
+ пока с ошибками
расскажи про них (ошибки)
Очередной теоретик?
ALL: Всегда интересовало: зачем, как и куда «это» надо — дата строкой в запросе? Неужели так «неординарно» мыслят, что не могут запрос в «типовые» рамки уложить?
в (0) написано, что не помогает. Не веришь — проверь на Справочнике ДоговорыКонтрагентов.
:))) нет конечно! Вот если бы в запросе результат ПРЕДСТАВЛЕНИЕ() было именно таким, как оно описано в доках (типа, это строка), можно было бы ординарно сделать.
реальный пример, который заставил «не уложиться»: справочник ДоговорыКонтрагентов имеет помимо «Наименования» поля «Номер» и «Дата».
Хочется прям в запросе получить строку типа «Договор №_ от «»__ 200_»
безо всяких обработок выборки потом.
Вся проблема в бедности встроенных функций языка запросов,
а люди хотят получить готовый результат от запроса. Вот и мучаются
А зачем он прямо в запросе нужен вообще?
не метод . Представление, а ПРЕДСТАВЛЕНИЕ(ТвояДата).
ПРЕДСТАВЛЕНИЕ() в отличие от . Представление нельзя использовать совместно с чем-нибудь ещё. т.е.
«№1 от » + ПРЕДСТАВЛЕНИЕ(Дата) // — невозможно
«№1 от » + Ссылка. Представление // — возможно, но не дает результат
При этом, ПРЕДСТАВЛЕНИЕ() — вроде как строка (как в описании), но никакими средствами запроса (кроме результата запроса) как строка не распознается.
Если указать например вот так ВЫБРАТЬ ПРЕДСТАВЛЕНИЕ(ЗаказПокупателя. Дата) ИЗ Документ. ЗаказПокупателя КАК ЗаказПокупателя
Результат — строка.
Я и так всегда так делаю.
Хотя иногда неудобно, да.
Это на выходе из запроса оно строка. В запросе — нет.
А если я Вам сообщу более короткий алгоритм — Вы будете счастливы?
(11,12) все что можно надо получать запросом и нех дополнительно обрабатывать данные на клиенте. Вот бедность языка запросов 1С — это да.
с числами в строку — тоже проблема.
А по поводу доп обработок обнаруживается:
В клиент-серверном варианте при больших выборках время выполнения запроса
на сервере на порядок меньше, чем дальнейшая обработка в клиенте 1С.
Поэтому и хочется побольше отдать на сервер, т.е. в запросе обработать
как можно больше.
ЧислоСтрокой = «00»;
Для N = 0 По 99 Цикл
ЧислоСтрокой = ЧислоСтрокой + Формат(N,»ЧЦ=2; ЧВН=»);
КонецЦикла;
Запрос = Новый Запрос();
Запрос. УстановитьПараметр(«ЧислоСтрокой», ЧислоСтрокой);
Запрос. УстановитьПараметр(«ТекДата», ТекущаяДата());
Выборка = Запрос. Выполнить(). Выбрать();
Выборка. Следующий();
Сообщить(Выборка. ДатаСтрокой);
А с числами произвольной длины?
А где аплодисменты и крики «Браво!», «Бис!» ??? :))
вот скажете, почему не использовать компоновку?
а в запросе выполнять много операций лишних кажется не эффективно, да и компоновка табличным полем быстрее работает.
за оптимизацию — безусловно, аплодисменты! Зарезюмировал )
А вот еще один вариант в стиле
ВЫБРАТЬ
ПОДСТРОКА(«0123456789», ЧАС(ДобавитьКДате(&Дата, МИНУТА, 6 * День(&Дата))) + 1, 1)
+ ПОДСТРОКА(«0123456789», МИНУТА(ДобавитьКДате(&Дата, МИНУТА, 6 * День(&Дата))) / 6 + 1, 1)
+ «/»
+ ПОДСТРОКА(«0123456789», ЧАС(ДобавитьКДате(&Дата, МИНУТА, 6 * Месяц(&Дата))) + 1, 1)
+ ПОДСТРОКА(«0123456789», МИНУТА(ДобавитьКДате(&Дата, МИНУТА, 6 * Месяц(&Дата))) / 6 + 1, 1)
+ «/»
+ ПОДСТРОКА(«0123456789», ЧАС(ДобавитьКДате(&Дата, МИНУТА, 6 * (Год(&Дата) — 1900))) + 1, 1)
+ ПОДСТРОКА(«0123456789», МИНУТА(ДобавитьКДате(&Дата, МИНУТА, 6 * (Год(&Дата) — 1900))) / 6 + 1, 1)
Предполагается, что параметр &Дата время не содержит. Если это не так, запись будет подлиннее
ВЫБРАТЬ
ПОДСТРОКА(«0123456789», ЧАС(ДОБАВИТЬКДАТЕ(ДАТАВРЕМЯ(1, 1, 1, 0, 0, 0), МИНУТА, 6 * ДЕНЬ(&Дата))) + 1, 1)
+ ПОДСТРОКА(«0123456789», МИНУТА(ДОБАВИТЬКДАТЕ(ДАТАВРЕМЯ(1, 1, 1, 0, 0, 0), МИНУТА, 6 * ДЕНЬ(&Дата))) / 6 + 1, 1)
+ «/»
+ ПОДСТРОКА(«0123456789», ЧАС(ДОБАВИТЬКДАТЕ(ДАТАВРЕМЯ(1, 1, 1, 0, 0, 0), МИНУТА, 6 * МЕСЯЦ(&Дата))) + 1, 1)
+ ПОДСТРОКА(«0123456789», МИНУТА(ДОБАВИТЬКДАТЕ(ДАТАВРЕМЯ(1, 1, 1, 0, 0, 0), МИНУТА, 6 * МЕСЯЦ(&Дата))) / 6 + 1, 1)
+ «/»
+ ПОДСТРОКА(«0123456789», ЧАС(ДОБАВИТЬКДАТЕ(ДАТАВРЕМЯ(1, 1, 1, 0, 0, 0), МИНУТА, 6 * (ГОД(&Дата) — 1900))) + 1, 1)
+ ПОДСТРОКА(«0123456789», МИНУТА(ДОБАВИТЬКДАТЕ(ДАТАВРЕМЯ(1, 1, 1, 0, 0, 0), МИНУТА, 6 * (ГОД(&Дата) — 1900))) / 6 + 1, 1)
Предлагается новый и более компактный метод преобразования даты и числа в строку в запросе
В языке запросов отсутствуют встроенные функции преобразования одних типов данных в другие, например, строк в числа или даты и наоборот. В работе «Выразить строку как число и строку как дату в запросе» были предложены достаточно компактные способы преобразований «из строки». Теперь дошла очередь до обратных к ним преобразований «в строку».
Основной проблемой рассматриваемого преобразования в строку является выделение каждого конкретного разряда исходного числа. Например, число 123 состоит из трех разрядов. Пусть разряды нумеруются справа налево, начиная с нуля. Разряды отличаются весом: нулевой разряд в десятичной позиционной системе счисления имеет вес 1, первый – 10, второй – 100 и так далее. Для выделения каждого разряда требуется найти целое от деления числа на вес разряда, а затем – остаток от деления полученного целого на 10. Первый (второй слева) разряд, таким образом, получится так: 123 разделим на 10, получим 12,3. Затем возьмем целое, получим 12. Затем найдем остаток от деления на 10, получим 2 – искомый первый (второй слева) разряд. Буквальная запись этих выражений в запросе получается очень и очень громоздкой, но существует другой путь.
Этот путь заключается в использовании для нахождения остатка от деления пары функций: СЕКУНДА и ДОБАВИТЬКДАТЕ. Дело в том, что функция СЕКУНДА фактически является функцией остатка от деления на 60 числа секунд, прошедшего с начала времен. Чтобы превратить ее в функцию расчета остатка от деления на 10 достаточно считать секунды шестерками. То есть требуемая функция будет записываться так:
СЕКУНДА(ДОБАВИТЬКДАТЕ(ДАТАВРЕМЯ(1, 1, 1), СЕКУНДА, Икс * 6) ) / 6
Эта функция выделяет самый правый (нулевой) разряд числа Икс. Чтобы выделить первый разряд, нужно использовать функцию
СЕКУНДА(ДОБАВИТЬКДАТЕ(ДАТАВРЕМЯ(1, 1, 1), СЕКУНДА, Икс * 0.6) ) / 6
А чтобы выделить второй – функцию
СЕКУНДА(ДОБАВИТЬКДАТЕ(ДАТАВРЕМЯ(1, 1, 1), СЕКУНДА, Икс * 0.06) ) / 6
И так далее. Множитель 60 позволяет выделить разряд десятых долей, 600 – сотых и так далее.
Ограничением рассмотренного подхода является максимальное число секунд при работе с датами. Оно таково, что мы можем выделить не более 10-ти десятичных знаков в числе. Если число значащих знаков больше, исходное число потребуется предварительно разделить на две части «обычным» способом с использованием операции ВЫРАЗИТЬ КАК.
Приведем пример запроса для случая ЧИСЛО(10, 2)
ВЫБРАТЬ
ПОДСТРОКА(«0123456789», &Число / 10000000 + 1, 1)
+ ПОДСТРОКА(«0123456789», СЕКУНДА(ДОБАВИТЬКДАТЕ(ДАТАВРЕМЯ(1, 1, 1), СЕКУНДА, &Число * 0.000006)) / 6 + 1, 1)
+ ПОДСТРОКА(«0123456789», СЕКУНДА(ДОБАВИТЬКДАТЕ(ДАТАВРЕМЯ(1, 1, 1), СЕКУНДА, &Число * 0.00006)) / 6 + 1, 1)
+ ПОДСТРОКА(«0123456789», СЕКУНДА(ДОБАВИТЬКДАТЕ(ДАТАВРЕМЯ(1, 1, 1), СЕКУНДА, &Число * 0.0006)) / 6 + 1, 1)
+ ПОДСТРОКА(«0123456789», СЕКУНДА(ДОБАВИТЬКДАТЕ(ДАТАВРЕМЯ(1, 1, 1), СЕКУНДА, &Число * 0.006)) / 6 + 1, 1)
+ ПОДСТРОКА(«0123456789», СЕКУНДА(ДОБАВИТЬКДАТЕ(ДАТАВРЕМЯ(1, 1, 1), СЕКУНДА, &Число * 0.06)) / 6 + 1, 1)
+ ПОДСТРОКА(«0123456789», СЕКУНДА(ДОБАВИТЬКДАТЕ(ДАТАВРЕМЯ(1, 1, 1), СЕКУНДА, &Число * 0.6)) / 6 + 1, 1)
+ ПОДСТРОКА(«0123456789», СЕКУНДА(ДОБАВИТЬКДАТЕ(ДАТАВРЕМЯ(1, 1, 1), СЕКУНДА, &Число * 6)) / 6 + 1, 1)
+ «.»
+ ПОДСТРОКА(«0123456789», СЕКУНДА(ДОБАВИТЬКДАТЕ(ДАТАВРЕМЯ(1, 1, 1), СЕКУНДА, &Число * 60)) / 6 + 1, 1)
+ ПОДСТРОКА(«0123456789», СЕКУНДА(ДОБАВИТЬКДАТЕ(ДАТАВРЕМЯ(1, 1, 1), СЕКУНДА, &Число * 600)) / 6 + 1, 1) КАК Строка
Чтобы сделать запись чуть более короткой, две постоянные — цепочку цифр «0123456789» и начало времен можно вынести во вложенный запрос
ВЫБРАТЬ
ПОДСТРОКА(Ц, &Число / 10000000 + 1, 1)
+ ПОДСТРОКА(Ц, СЕКУНДА(ДОБАВИТЬКДАТЕ(О, СЕКУНДА, &Число * 0.000006)) / 6 + 1, 1)
+ ПОДСТРОКА(Ц, СЕКУНДА(ДОБАВИТЬКДАТЕ(О, СЕКУНДА, &Число * 0.00006)) / 6 + 1, 1)
+ ПОДСТРОКА(Ц, СЕКУНДА(ДОБАВИТЬКДАТЕ(О, СЕКУНДА, &Число * 0.0006)) / 6 + 1, 1)
+ ПОДСТРОКА(Ц, СЕКУНДА(ДОБАВИТЬКДАТЕ(О, СЕКУНДА, &Число * 0.006)) / 6 + 1, 1)
+ ПОДСТРОКА(Ц, СЕКУНДА(ДОБАВИТЬКДАТЕ(О, СЕКУНДА, &Число * 0.06)) / 6 + 1, 1)
+ ПОДСТРОКА(Ц, СЕКУНДА(ДОБАВИТЬКДАТЕ(О, СЕКУНДА, &Число * 0.6)) / 6 + 1, 1)
+ ПОДСТРОКА(Ц, СЕКУНДА(ДОБАВИТЬКДАТЕ(О, СЕКУНДА, &Число * 6)) / 6 + 1, 1)
+ «.»
+ ПОДСТРОКА(Ц, СЕКУНДА(ДОБАВИТЬКДАТЕ(О, СЕКУНДА, &Число * 60)) / 6 + 1, 1)
+ ПОДСТРОКА(Ц, СЕКУНДА(ДОБАВИТЬКДАТЕ(О, СЕКУНДА, &Число * 600)) / 6 + 1, 1) КАК Строка
ИЗ (ВЫБРАТЬ «0123456789» Ц, ДАТАВРЕМЯ(1, 1, 1) О) КАК Константы
Аналогичным образом можно преобразовать число в строку в двоичной системе счисления. Вот запрос для записи в виде строки восьми младших двоичных разрядов заданного числа:
ВЫБРАТЬ
ПОДСТРОКА(«01», СЕКУНДА(ДОБАВИТЬКДАТЕ(ДАТАВРЕМЯ(1, 1, 1), СЕКУНДА, &Число * 30 / 128)) / 30 + 1, 1)
+ ПОДСТРОКА(«01», СЕКУНДА(ДОБАВИТЬКДАТЕ(ДАТАВРЕМЯ(1, 1, 1), СЕКУНДА, &Число * 30 / 64)) / 30 + 1, 1)
+ ПОДСТРОКА(«01», СЕКУНДА(ДОБАВИТЬКДАТЕ(ДАТАВРЕМЯ(1, 1, 1), СЕКУНДА, &Число * 30 / 32)) / 30 + 1, 1)
+ ПОДСТРОКА(«01», СЕКУНДА(ДОБАВИТЬКДАТЕ(ДАТАВРЕМЯ(1, 1, 1), СЕКУНДА, &Число * 30 / 16)) / 30 + 1, 1)
+ ПОДСТРОКА(«01», СЕКУНДА(ДОБАВИТЬКДАТЕ(ДАТАВРЕМЯ(1, 1, 1), СЕКУНДА, &Число * 30 / 8)) / 30 + 1, 1)
+ ПОДСТРОКА(«01», СЕКУНДА(ДОБАВИТЬКДАТЕ(ДАТАВРЕМЯ(1, 1, 1), СЕКУНДА, &Число * 30 / 4)) / 30 + 1, 1)
+ ПОДСТРОКА(«01», СЕКУНДА(ДОБАВИТЬКДАТЕ(ДАТАВРЕМЯ(1, 1, 1), СЕКУНДА, &Число * 30 / 2)) / 30 + 1, 1)
+ ПОДСТРОКА(«01», СЕКУНДА(ДОБАВИТЬКДАТЕ(ДАТАВРЕМЯ(1, 1, 1), СЕКУНДА, &Число * 30)) / 30 + 1, 1) КАК Строка
Побочным следствием использованных закономерностей является то, что выражение
СЕКУНДА(ДОБАВИТЬКДАТЕ(ДАТАВРЕМЯ(1, 1, 1), СЕКУНДА, Икс * 30) ) = 0
можно использовать в запросе для проверки четности числа Икс.
Для перевода даты в строку достаточно перевести в строку по отдельности число дней, месяцев и лет исходной даты. В итоге получается следующий запрос
ВЫБРАТЬ
ПОДСТРОКА(«0123456789», ДЕНЬ(&Дата) / 10 + 1, 1)
+ ПОДСТРОКА(«0123456789», СЕКУНДА(ДОБАВИТЬКДАТЕ(ДАТАВРЕМЯ(1, 1, 1), СЕКУНДА, 6 * ДЕНЬ(&Дата))) / 6 + 1, 1)
+ «/»
+ ПОДСТРОКА(«0123456789», МЕСЯЦ(&Дата) / 10 + 1, 1)
+ ПОДСТРОКА(«0123456789», СЕКУНДА(ДОБАВИТЬКДАТЕ(ДАТАВРЕМЯ(1, 1, 1), СЕКУНДА, 6 * МЕСЯЦ(&Дата))) / 6 + 1, 1)
+ «/»
+ ПОДСТРОКА(«0123456789», ГОД(&Дата) / 1000 + 1, 1)
+ ПОДСТРОКА(«0123456789», СЕКУНДА(ДОБАВИТЬКДАТЕ(ДАТАВРЕМЯ(1, 1, 1), СЕКУНДА, ГОД(&Дата) * 0.06)) / 6 + 1, 1)
+ ПОДСТРОКА(«0123456789», СЕКУНДА(ДОБАВИТЬКДАТЕ(ДАТАВРЕМЯ(1, 1, 1), СЕКУНДА, ГОД(&Дата) * 0.6)) / 6 + 1, 1)
+ ПОДСТРОКА(«0123456789», СЕКУНДА(ДОБАВИТЬКДАТЕ(ДАТАВРЕМЯ(1, 1, 1), СЕКУНДА, ГОД(&Дата) * 6)) / 6 + 1, 1) КАК Строка
Как видно, используемые для преобразования в строку выражения довольно просты и компактны, особенно если сравнить их с тем, что приходилось использовать до сих пор.
2.
alex-l19041
Сейчас в теме
3.
alex-l19041
Сейчас в теме
5.
NatalkaBal
Сейчас в теме
alex-l19041, не использую СКД(
11.
herfis
Сейчас в теме
4.
NatalkaBal
Сейчас в теме
8.
bmk74
Сейчас в теме
6.
NatalkaBal
Сейчас в теме
Мне нужен поле (столбик) таблице в котором будет соединятся два значения даты. Как это можно сделать в запросе?
7.
alex-l19041
Сейчас в теме
9.
NatalkaBal
Сейчас в теме
Выходит это преобразование только в ТаблицеЗначения в модуле делать? или тоже не получится?
10.
R_G_B
Сейчас в теме
Попробуйте функцию
ПРЕДСТАВЛЕНИЕ() — «предназначена для получения строкового представления значения произвольного типа»
12.
NatalkaBal
Сейчас в теме
ТабЗначений = ПолучитьЗапрос();
Макет = ПолучитьМакет(«Макет»);
ОбластьЗаголовок = Макет. ПолучитьОбласть(«Заголовок»);
ТабДок. Вывести(ОбластьЗаголовок);
ОбластьСтрока = Макет. ПолучитьОбласть(«Строка»);
Для каждого Параметр Из ТабЗначений Цикл
?????
?????
ТабДок. Вывести(ОбластьСтрока);
КонецЦикла;
ТабДок. Показать();
Знаю что можно каждый параметр вывести как ОбластьСтрока. Параметры. ФизЛицо = Параметр. ФизЛицо;
Но интересует более короткий способ, что то типа Выгрузить, Заполнить
13.
alex-l19041
Сейчас в теме