Подсказки «1с»
////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
ПОДСТРОКА(Константы.Ц, Числа.Число_ / 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) КАК О) КАК Константы,
Числа КАК Числа
Блог компьютерного гения
Сегодня при написании запроса в 1C столкнулся с проблемой выражения даты как строки. Операции «Выразить как строка» и «Представление» не работали, сообщая о несовместимости типов данных. Но на просторах сети Интернет я нашел следующее решение, которое сохраняю здесь (думаю, что не раз пригодится мне в будущем):
ПОДСТРОКА(«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)
Дата в 1С запросе
Текущая дата(и время) в запросе 1С получается только в качестве параметра.
Получение дат
Как передать текущую дату в запрос?
Запрос . УстановитьПараметр ( «ТекущаяДата» , ТекущаяДата ( ) ) ;
тзРезультатЗапроса = Запрос . Выполнить ( ) . Выгрузить ( ) ;
Далее приводятся только тексты запросов.
Как получить начало текущего месяца?
Конец текущего года?
Как получить полдень текущей даты?
Добавим использование функции ДОБАВИТЬКДАТЕ(ДАТА,<ГОД,КВАРТАЛ,МЕСЯЦ,ДЕКАДА,НЕДЕЛЯ,ДЕНЬ>,ЧИСЛО)
Как получить дату без времени (0:00)
Как задать дату-константу в запросе 1С?
Возможно задать дату с точностью до секунды?
А до милисекунды?
Вычисления над датами
Разность в секундах,минутах,часах, днях, неделях получается при использовании функции РАЗНОСТЬДАТ(Дата1,Дата2,<ГОД,КВАРТАЛ,МЕСЯЦ,ДЕКАДА,НЕДЕЛЯ,ДЕНЬ>)
Как получить номер текущего месяца?
ВЫБРАТЬ
МЕСЯЦ(&ТекущаяДата) как ТекущийМесяц,
РАЗНОСТЬДАТ(НАЧАЛОПЕРИОДА(&ТекущаяДата,ГОД),КОНЕЦПЕРИОДА(&ТекущаяДата,МЕСЯЦ),МЕСЯЦ) как ПолныхПрошедшихМесяцев
Как получить день недели?
ВЫБРАТЬ
ДЕНЬНЕДЕЛИ(&ТекущаяДата) КАК НомерДня,
ВЫБОР
КОГДА ДЕНЬНЕДЕЛИ(&ТекущаяДата) = 1
ТОГДА «понедельник»
КОГДА ДЕНЬНЕДЕЛИ(&ТекущаяДата) = 2
ТОГДА «вторник»
КОГДА ДЕНЬНЕДЕЛИ(&ТекущаяДата) = 3
ТОГДА «среда»
КОГДА ДЕНЬНЕДЕЛИ(&ТекущаяДата) = 4
ТОГДА «четверг»
КОГДА ДЕНЬНЕДЕЛИ(&ТекущаяДата) = 5
ТОГДА «пятница»
КОГДА ДЕНЬНЕДЕЛИ(&ТекущаяДата) = 6
ТОГДА «суббота»
ИНАЧЕ «Воскресенье»
КОНЕЦ КАК НаименованиеДняНедели
Сколько осталось до Нового года?
ВЫБРАТЬ
&ТекущаяДата > ДАТАВРЕМЯ(2017, 1, 1) КАК НовыйГодНаступил,
ВЫБОР
КОГДА &ТекущаяДата > ДАТАВРЕМЯ(2017, 1, 1)
ТОГДА «Да, наступил»
ИНАЧЕ «Нет, не наступил»
КОНЕЦ КАК Ответ,
РАЗНОСТЬДАТ(&ТекущаяДата,ДОБАВИТЬКДАТЕ(ДАТАВРЕМЯ(2017, 1, 1),СЕКУНДА,-1),ДЕНЬ) как ОсталосьДней,
РАЗНОСТЬДАТ(&ТекущаяДата,КОНЕЦПЕРИОДА(&ТекущаяДата,ДЕНЬ),ЧАС) как ОсталосьЧасов,
РАЗНОСТЬДАТ(&ТекущаяДата,КОНЕЦПЕРИОДА(&ТекущаяДата,ЧАС),Минута) как ОсталосьМинут,
РАЗНОСТЬДАТ(&ТекущаяДата,КОНЕЦПЕРИОДА(&ТекущаяДата,Минута),Секунда) как ОсталосьСекунд
Что еще следует знать про дату в запросах?
Дата в запросах может фигурировать не только в полях выборки, и вычислениях, но также передаваться, как параметры виртуальных таблиц.
- для среза последних значений в регистре сведений в качестве момента на которое берется значение. Если периодичность регистра не совпадает с переданным параметром, система обрежет лишние (секунда, дни в зависимости от), округления не происходит
- для остатков регистра накопления в качестве дата остатка
- для оборотов регистров бухгалтерии или регистра накопления (НачалоПериода,КонецПериода)
- других виртуальных таблиц
Допустимо задание дат-констант и использование параметров, также обработка их выше приведенными функциями.
Но нельзя дату передать в параметры виртуальных таблиц из полученных ранее в этом запросе полей выборки.
Сортировка даты в запросе производится в рамках секунды.
Момент времени документа не является датой, он сортирует более глубже, чем дата документа, т.е. при наличии документов в одну секунду времени, сортировка по дате производится в недопустимом порядке: например в виде представления. Используйте для этого момент времени.
Внешнее представление даты определяется представлением операционной системы, управлять из запроса, а также приводить в строковое представление в классическом запросе невозможно в отличии от СКД, где возможна пост-обработка и условное оформление.
Допускается применение функции МАКСИМУМ(),МИНИМУМ() к дата в запросе, как в группировке так и в итогах запроса.
Ошибка «неверные параметры» возникает в случае, когда вместо даты передается null, число или что-то иное.
Преобразовать строку в дату в запросе
Специальных функций нет. но возможно преобразование через функцию ПОДСТРОКА и конструкцию ВЫБОР КОГДА
[cl-popup title=»Запрос,приводится в академических целях» btn_label=»Открыть текст запроса» size=»m» border_radius=»3″] ВЫБРАТЬ
«20161012» КАК Параметр,
&Парам = «20161012» КАК ВерныйПараметр,
ПОДСТРОКА(&Парам, 1, 1) КАК символ1,
ПОДСТРОКА(&Парам, 2, 1) КАК символ2,
ПОДСТРОКА(&Парам, 3, 1) КАК символ3,
ПОДСТРОКА(&Парам, 4, 1) КАК символ4
ПОМЕСТИТЬ Расчеты
;
////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
Расчеты.Параметр,
Расчеты.ВерныйПараметр,
ВЫБОР
КОГДА Расчеты.символ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с запрос выразить дату как строку
В продолжение темы 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»
КОНЕЦ + » г.» КАК НомерДатаДоговора
(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)
КОНЕЦ
Приведение типов в языке запросов 1С.
В этой статье разберем возможности приведения типов в языке запросов 1С, которые предоставляет функция «Выразить».
Рассмотрим несколько вариантов применения этой функции.
И первый вариант – округление чисел.
Для этого необходимо использовать функцию Выразить в следующем формате:
Выразить(<Число> как Число(<ДлинаЧисла>,<Точность>))
Где:
Число — поле, параметр которое нужно округлить
ДлинаЧисла — максимальная длина числа
Точность — точность округления числа
Параметры и длинна и точность должны быть целыми положительными числами.
Посмотрите, как работает эта функция на рисунке ниже.
Второй вариант применения – приведение строк. Очень часто в конфигурациях используются строки неограниченной длинны, что накладывает некоторые ограничения. Например, мы не можем сравнивать строки неограниченной длины.
В запросе, который приведен ниже, поле ПолноеНаименование имеет тип строка неограниченной длины, и этот запрос не будет работать.
Для того что бы он работал, необходим поле неограниченной длины привести в строку с определенной длинной, делается это при помощи функции Выразить в следующем формате:
Выразить(<Строка> как Строка(<ДлинаСтроки>)
Где
ДлинаСтроки – максимальная длина, к которой будет приведена строка.
Переделаем запрос: будем в условии приводить неограниченную строку к строке с определенной длинной. Тогда ни каких ошибок не будет.
Рассмотрим последний и, я бы сказал, самый главный вариант её применения: при работе с полями составного типа.
Ниже приведены два запроса, в которых используются поля составного типа. Первый неправильный, а второй правильный.
Т.е. когда вам нужно получить поле какого-нибудь составного типа, то всегда получайте значение этого поля только после приведения типа при помощи функции Выразить. В этом случае для документов и справочников будет следующий формат:
Выразить(<Документ> как Документ.<ИмяТаблицы>)
Выразить(<Справочник> как Справочник.< ИмяТаблицы > ).
Где
ИмяТаблицы — название объекта в конфигураторе 1С.
Всегда используйте функцию выразить, когда работаете с составными типами, это существенно оптимизирует запрос.
Если Вы всё еще «плаваете» в конструкциях языка запросов, и у Вас вызывают трудности даже самые простые запросы, то рекомендую вам мой курс «Запросы в 1С от новичка до профи». Где эти и многие другие вопросы рассматриваются более подробно.
В чем особенность этого курса:
• Курс рассчитан на тех, кто не знаком с языком запросов в 1С;
• Учебный материал грамотно скомпонован и прост в освоении;
• Несколько десятков уроков;
• Полезные практические примеры;
• Все уроки изложены понятным и простым языком
Для моих читателей, купон на скидку 25%: hrW0rl9Nnx
Я стараюсь как можно чаще выпускать различные интересные бесплатные статьи и видеоуроки. Поэтому буду очень рад, если Вы поддержите мой проект перечислив любую сумму:
Можете перечислить любую сумму напрямую:
Яндекс.Деньги — 410012882996301
Web Money — R955262494655
Вступайте в мои группы:
One Reply to “Приведение типов в языке запросов 1С.”
Добрый день, в 1С нельзя кастовать типы в запросе. Функция выразить используется для полей составного типа, что бы оставить один из них.
Запросы 1С:Предприятие 8. Прочие функции
В языке запросов 1С существует большое количество различных функций и операторов, облегчающих построение запроса. Часть из них мы рассмотрели в статьях Функции работы с датами, Группировки в запросах 1С, остальные рассмотрим сейчас.
Функции работы со строками в запросах 1С
Функций и операторов для работы со строковыми данными в запросах 1С немного.
Во-первых, строки в запросах можно складывать. Для этого используется оператор «+»:
Во-вторых, можно выделить часть строки. Для этого используется функция ПОДСТРОКА. Функция аналогична функции СРЕД () встроенного языка 1С. У нее три параметра:
- Строка-источник.
- Номер символа, с которого должна начинаться выделяемая строка.
- Количество символов.
И, наконец, существует оператор, которые позволяет сравнить строку с неким шаблоном. Это оператор ПОДОБНО. О его использовании читайте в нашей статье о парамертах и операторах сравнения в запросах 1С.
Функция ЕСТЬNULL
NULL — особый тип данных на платформе 1С:Предприятие. Он же является единственным возможным значением этого типа. NULL может возникать в запросах в нескольких случаях: при соединениях источников запроса, если не было найдено соответствующего значения в одной из таблиц; при обращении к реквизитам несуществующего объекта; если NULL был указан в списке полей запроса (например при объединении результатов выборки из нескольких таблиц) и т.д.
Поскольку NULL не является ни нулем, ни пустой строкой, ни даже значением Неопределено, его часто бывает полезно заменять на какой-то более полезный тип данных. Для этого и предназначена функция ЕСТЬNULL.
Она имеет два параметра:
- Проверяемое значение.
- Значение, на которое нужно заменить первый параметр, если он оказался равен NULL.
Функции ПРЕДСТАВЛЕНИЕ и ПРЕДСТАВЛЕНИЕССЫЛКИ
Эти функции предназначены для получения строковых представлений различных значений. То есть, они преобразуют ссылки, числа, булево и т.д. в обычный текст. Разница между ними в том, что функция ПРЕДСТАВЛЕНИЕ преобразует в текст (строку) любые типы данных, а функция ПРЕДСТАВЛЕНИЕССЫЛКИ — только ссылки, а остальные значения возвращает как есть, не преобразованными.
Функции ТИП и ТИПЗНАЧЕНИЯ
Функция ТИП возвращает тип данных платформы 1С:Предприятие.
Функция ТИПЗНАЧЕНИЯ возвращает тип переданного в нее значения.
Эти функции удобно применять, например, когда нужно выяснить является ли полученное в запросе поле значением какого-то типа. Например, получим контактную информацию контрагентов из регистра сведений КонтактнаяИнформация (там хранятся контакты не только контрагентов, но и организаций, физических лиц и т.д.):
Функция ЗНАЧЕНИЕ
Функция Значение позволяет использовать в запросе объекты конфигурации 1С напрямую, без применения параметров запроса.
Дополним предыдущий пример еще одним условием. Необходимо получить только телефоны контрагентов.
Следует отметить, что эту функцию можно использовать только с предопределенными значениями, т.е. со значениями, к которым можно обратиться напрямую из конфигуратора. То есть функция ЗНАЧЕНИЕ не можно использоваться с элементами справочников, созданными пользователями, но может работать с перечислениями, с предопределенными элементами справочников, со значениями ПустаяСсылка.
Оператор ССЫЛКА
Оператор ССЫЛКА предназначен для проверки значений, получаемых запросом, на принадлежность к определенному ссылочному типу. Эту же задачу можно выполнить с помощью функций ТИП и ТИПЗНАЧЕНИЯ (которые имеют более широкую область применения и были рассмотрены выше).
Например, задачу выбора контактной информации контрагентов можно было решить и так:
Оператор ВЫРАЗИТЬ
Оператор ВЫРАЗИТЬ используется в запросах 1С в двух случаях:
- когда нужно изменить характеристики примитивного типа;
- когда нужно из поля с составным типом данных сделать поле с одиночным типом.
К примитивным типам данных относятся: число, строка, дата, булево. Некоторые из этих типов данных имеют дополнительные характеристики. Тип Число имеет длину и точность, тип Строка — длину или неограниченность.
Оператор ВЫРАЗИТЬ позволяет изменять не тип данных, а именно дополнительные характеристики. Например, он может из строки с неограниченной длиной сделать строку с длиной ограниченной. Это бывает полезно, если нужно сгруппировать результаты запроса по такому полю. Выполнять группировку по полям с неограниченной длиной нельзя, поэтому мы его преобразуем в строку с длиной 200 символов.
В ряде случаев, запросы к полям с составным типом данных могут обрабатываться платформой 1С неоптимально. Это приводит к увеличению времени выполнения запросов, поэтому бывает полезно заранее преобразовать составной тип в одиночный.
Операторы ВЫБОР и ЕСТЬ NULL
Оператор ВЫБОР аналогичен оператору ЕСЛИ во встроенном языке 1С, но имеет несколько урезанный функционал.
Допустим мы хотим получить контактные данные из регистра сведений КонтактнаяИнформация и при этом в отдельном поле запроса указать, принадлежат ли они контрагенту или физическому лицу.
Как видно из примера, в конструкции ВЫБОР всегда присутствует условие после слова КОГДА; значение, применяемое, если условие выполняется, после слова ТОГДА и значение, применяемое, если условие не выполняется, после слова ИНАЧЕ. Все три элемента конструкции ВЫБОР являются обязательными. Опустить элемент ИНАЧЕ, так же, как это делается при использовании оператора ЕСЛИ во встроенном языке 1С, нельзя. Также у оператора ВЫБОР отсутствует аналог конструкции ИНАЧЕЕСЛИ, зато можно вложить один ВЫБОР в другой, как и было сделано в нашем примере.
Оператор ЕСТЬ NULL используется в конструкции ВЫБОР для сравнения поля запроса с типом NULL.
Кроме того, оператор ЕСТЬ NULL можно использовать в условиях запроса, например в предложении ГДЕ.
Составить запрос: получить дату из строки и сравнить её с параметром типа дата
Прошу заметить, что данный запрос учитывает только один год, только один месяц, и три последних дня. Значит надо добавить сюда over9000 строк кода, чтобы просматривались еще хотя бы несколько лет (с запасом), все 12 месяцев и 31 день.
А все потому что функция ДАТАВРЕМЯ не понимает в аргументах другие функции, а если бы и понимала, то в запросе нельзя представить строку датой, кроме как вышепредставленным онанизмом.