Дата 1С 8 онлайн в приложении и Дата в приложении 1С

Опубликовал(а):
в: 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 = Дата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 – искомый первый (второй слева) разряд. Буквальная запись этих выражений в запросе получается очень и очень громоздкой, но существует другой путь.

Читайте также:  Инструкция по заполнению 4-ФСС за 9 месяцев 2021

Этот путь заключается в использовании для нахождения остатка от деления пары функций: СЕКУНДА и ДОБАВИТЬКДАТЕ. Дело в том, что функция СЕКУНДА фактически является функцией остатка от деления на 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

Сейчас в теме

Оцените статью
ФСС Help
Добавить комментарий