1с запрос выразить дату как строка

Примеры по программированию в 1с 7.7, 8.1, 8.2

понедельник, 7 ноября 2016 г.

Число и дату строкой в запросе

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

ВЫБРАТЬ РАЗРЕШЕННЫЕ
123.655 КАК Число_
ПОМЕСТИТЬ Числа

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
ПОДСТРОКА(Константы.Ц, Числа.Число_ / 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) + ПОДСТРОКА(Константы.Ц, СЕКУНДА(ДОБАВИТЬКДАТЕ(Константы.О, СЕКУНДА, Числа.Число_ * 6000)) / 6 + 1, 1) КАК Строка
ИЗ
(ВЫБРАТЬ
«0123456789» КАК Ц,
ДАТАВРЕМЯ(1, 1, 1) КАК О) КАК Константы,
Числа КАК Числа

1с предприятие 8.2 (8.2.15.289)

В табличной части документа есть поле с составным типом данных. Одним из типов является строка. Строка всегда имеет подобный вид «10.10.2012 — 10.10.2013», и даты могут быть различными.

Мне нужно в запросе каким-то образом выцепить вторую дату из строки (в данном случае «10.10.2013») и сравнить ее с параметром типа дата.

Как это можно сделать?

4 ответа 4

Начну издалека — сегодня я начал ненавидеть 1С еще сильнее.

А теперь по делу.

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

Прошу заметить, что данный запрос учитывает только один год, только один месяц, и три последних дня. Значит надо добавить сюда over9000 строк кода, чтобы просматривались еще хотя бы несколько лет (с запасом), все 12 месяцев и 31 день.

А все потому что функция ДАТАВРЕМЯ не понимает в аргументах другие функции, а если бы и понимала, то в запросе нельзя представить строку датой, кроме как вышепредставленным онанизмом.

нельзя просто так взять и написать нормальный запрос

1С:Предприятие предоставляет возможность в запросах разыменовывать ссылочные поля, т.е. обращаться к подчиненным полям «через точку». Очень удобная возможность, которая позволяет упростить текст запроса. Но следует понимать каким образом в платформе реализован данный функционал и чем он опасен. Разберемся более подробно.

При обращении к подчиненному полю «через точку» происходит неявное соединение с таблицей этого типа. Например, обращение в запросе

ВЫБРАТЬ
ЗаказыКлиентовОстатки.Номенклатура.Артикул ,
ЗаказыКлиентовОстатки.ЗаказаноОстаток
ИЗ
РегистрНакопления.ЗаказыКлиентов.Остатки КАК ЗаказыКлиентовОстатки

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

ВЫБРАТЬ
СпрНоменклатура.Артикул ,
ЗаказыКлиентовОстатки.ЗаказаноОстаток
ИЗ
РегистрНакопления.ЗаказыКлиентов.Остатки КАК ЗаказыКлиентовОстатки
ЛЕВОЕ СОЕДИНЕНИЕ Справочник.Номенклатура КАК СпрНоменклатура
ПО ЗаказыКлиентовОстатки.Номенклатура = СпрНоменклатура.Ссылка

На первый взгляд все корректно и правильно, но как система поведет себя, когда разыменовывается поле составного типа? Система будет соединяться СО ВСЕМИ таблицами, входящими в составной тип! Т.е. запрос

ВЫБРАТЬ
ЦеныНоменклатурыПоставщиков.Регистратор.Номер ,
ЦеныНоменклатурыПоставщиков.Цена
ИЗ
РегистрСведений.ЦеныНоменклатурыПоставщиков КАК ЦеныНоменклатурыПоставщиков

будет преобразован во что-то вроде:

ВЫБРАТЬ
ВЫБОР
КОГДА ЦеныНоменклатурыПоставщиков.Регистратор ССЫЛКА Документ.ЗаказПоставщику
ТОГДА ДокЗаказПоставщику.Номер
КОГДА ЦеныНоменклатурыПоставщиков.Регистратор ССЫЛКА Документ.КорректировкаРегистров
ТОГДА ДокКорректировкаРегистров.Номер
КОГДА ЦеныНоменклатурыПоставщиков.Регистратор ССЫЛКА Документ.ПоступлениеТоваровУслуг
ТОГДА ДокПоступлениеТоваровУслуг.Номер
КОГДА ЦеныНоменклатурыПоставщиков.Регистратор ССЫЛКА Документ.РегистрацияЦенНоменклатурыПоставщика
ТОГДА ДокРегистрацияЦенНоменклатурыПоставщика.Номер
КОНЕЦ КАК Номер ,
ЦеныНоменклатурыПоставщиков.Цена
ИЗ
РегистрСведений.ЦеныНоменклатурыПоставщиков КАК ЦеныНоменклатурыПоставщиков
ЛЕВОЕ СОЕДИНЕНИЕ Документ.ЗаказПоставщику КАК ДокЗаказПоставщику
ПО ЦеныНоменклатурыПоставщиков.Регистратор = ДокЗаказПоставщику.Ссылка
ЛЕВОЕ СОЕДИНЕНИЕ Документ.КорректировкаРегистров КАК ДокКорректировкаРегистров
ПО ЦеныНоменклатурыПоставщиков.Регистратор = ДокКорректировкаРегистров.Ссылка
ЛЕВОЕ СОЕДИНЕНИЕ Документ.ПоступлениеТоваровУслуг КАК ДокПоступлениеТоваровУслуг
ПО ЦеныНоменклатурыПоставщиков.Регистратор = ДокПоступлениеТоваровУслуг.Ссылка
ЛЕВОЕ СОЕДИНЕНИЕ Документ.РегистрацияЦенНоменклатурыПоставщика КАК ДокРегистрацияЦенНоменклатурыПоставщика
ПО ЦеныНоменклатурыПоставщиков.Регистратор = ДокРегистрацияЦенНоменклатурыПоставщика.Ссылка

И ко всей этой конструкции будут добавлены ограничения на уровне записей (RLS), если они используются. Все это может существенно замедлить выполнение запроса.

Иногда при написании запроса известно какая ссылка будет находиться в поле составного типа. В этом случае правильно привести составной тип к одному необходимому и избежать соединения со всеми таблицами составного типа. Для приведения составного типа к какому-то одному используется оператор

Выразить ( Выражение > КАК Тип значения >)

Параметр можно привести к ссылочному типу или к одному из примитивных типов.

Если содержит в составном типе требуемый , то приведение типа считается осуществимым, и для каждого значения указанного типа результатом будет это самое значение. Для значений других типов результатом приведения типа будет значение NULL.

Если не содержит в составном типе требуемый , то выполнение данного запроса завершится ошибкой.

Пример использования оператора Выразить, когда известно какая ссылка будет находиться в поле составного типа:

ВЫБРАТЬ
ВЫРАЗИТЬ (ЦеныНоменклатурыПоставщиков.Регистратор КАК Документ.ЗаказПоставщику).Номер КАК Номер,
ЦеныНоменклатурыПоставщиков.Цена
ИЗ
РегистрСведений.ЦеныНоменклатурыПоставщиков КАК ЦеныНоменклатурыПоставщиков
ГДЕ
ЦеныНоменклатурыПоставщиков.Регистратор ССЫЛКА Документ.ЗаказПоставщику

В запросе выше пожертвовали компактностью получения поля Номер ради производительности. В результате текст запроса получился более громоздким, но запрос выполнится быстрее за счет того, что не будет лишних ненужных соединений со всеми таблицами составного поля Регистратор.

Остались вопросы?
Спросите в комментариях к статье.

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