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)
КОНЕЦ
(2)+ пока с ошибками
(4) расскажи про них (ошибки)
хм, а функция запроса Предсталвение(. ) не помогает?
(6) Очередной теоретик?
ALL: Всегда интересовало: зачем, как и куда «это» надо — дата строкой в запросе? Неужели так «неординарно» мыслят, что не могут запрос в «типовые» рамки уложить?
(6) в (0) написано, что не помогает. Не веришь — проверь на Справочнике ДоговорыКонтрагентов.
(7) :))) нет конечно! Вот если бы в запросе результат ПРЕДСТАВЛЕНИЕ() было именно таким, как оно описано в доках (типа, это строка), можно было бы ординарно сделать.
(9) реальный пример, который заставил «не уложиться»: справочник ДоговорыКонтрагентов имеет помимо «Наименования» поля «Номер» и «Дата».
Хочется прям в запросе получить строку типа «Договор №_ от «»__ 200_»
безо всяких обработок выборки потом.
(9) Вся проблема в бедности встроенных функций языка запросов,
а люди хотят получить готовый результат от запроса. Вот и мучаются
Как преобразовать строку в дату 1С 8.3

Значение типа Дата – один из самых простых типов данных в 1С, который встречается практически постоянно. Ее значение содержит дату григорианского календаря с 01 января 0001 года с точностью до 0,1 миллисекунды.
Создание переменной типа дата приравнивается к переменной строки цифр ‘ГГГГММДДччммсс’, где ГГГГ – год, ММ – месяц, чч – часы (в формате 24 часа), мм – минуты, сс – секунды.
Часто возникают ситуации при работе в 1С перевести строку в дату. Например, при написании даты в формате 18.12.18, 18/12/2018, или другие варианты. Если часы, минуты, секунды опустить, то они приравняются к нулю. Если мы опускаем дату, то она считается равной 1.
Далее мы рассмотрим, как можно сделать преобразование строки в дату. Это действие несложное, но требует определенных знаний. Если у вас возникнут вопросы, обращайтесь за консультацией по программе 1С к нашим специалистам – мы с радостью вам поможем.
Рассмотрим, как можно сделать преобразование строки в дату.
- Преобразование строки вида «20181218»
// Преобразование строки вида 20181218 в дату Дата = Дата("20181218"); // 18.12.2018
- Преобразование строки вида «18.12.2018»
// Преобразование строки вида 18.12.1018 в дату Дата = Дата("2018.12.18"); // 18.12.2018
- Преобразование строки вида «2019, 1, 1»
// Преобразование строки вида 2019,1,1 в дату Дата = Дата("2019,1,1"); // 01.01.2019
- Преобразование строки вида «2018-12-18»
// Преобразование строки вида 2018-12-18 в дату СтрокаДата="2018-12-18"; СтрокаДата=СтрЗаменить(СтрокаДата,"-",""); НоваяДата = Дата(СтрокаДата); // 18.12.2018
- Преобразование строки вида «2018/12/18»
// Преобразование строки вида 2018/12/18 в дату СтрокаДата="2018/12/18"; СтрокаДата=СтрЗаменить(СтрокаДата,"/",""); НоваяДата = Дата(СтрокаДата); // 18.12.2018
В последних двух примерах удаляется лишний символ в написании даты. Это может быть любой символ разделитель, главное – его или убрать, или заменить точкой.
Предположим нам надо преобразовать дату, в которой сначала указано время, а затем сама дата.
- Преобразование строки вида «21:31:02 2018:12:18»
// Преобразование строки вида 21:31:02 2018:12:18 в дату СтрокаДата="21:31:02 2018:12:18"; СтрокаДата=СтрЗаменить(СтрокаДата,":",""); НоваяДата=Дата(Прав(СтрокаДата,8)+ЛевСтрокаДата,6);//18.12.2018 21.31.01
В данном примере мы заменяем символ «:» и берем 8 чисел справа (дату – год, месяц, день), затем приписываем к ним 6 чисел слева (время – часы, минуты, секунды).
Преобразовать строковое представление даты в значение типа дата, можно также используя функцию СтрВДату. Это более универсальная функция, поэтому она справляется с любым форматом написания даты, даже текстовым.
Сообщить(СтрВДату("18/12\2018 21-31-02")); Сообщить(СтрВДату("5/9/18")); Сообщить(СтрВДату("17/9/19")); Сообщить(СтрВДату("18 декабря 18 г. 21:31:02")); Сообщить(СтрВДату("1 янв. 2019 г ::"));
На примерах мы рассмотрели возможность преобразования строки в дату. Используя различные функции можно преобразовать строковое представление даты, введенное различными вариантами написания в значение типа дата. Такие преобразования необходимы, ведь бывает, что пользователь при вводе даты, используя дополнительную клавиатуру, установит как разделитель косую черту, запятую или другой знак, или из написанной текстом даты возникает необходимость ее преобразовать. Во всех этих случаях данные функции будут полезны.
Если у вас регулярно возникают вопросы по настройке программы, обратитесь к нашим специалистам: мы проконсультируем вас и сделаем соответствующие настройки, подобрав при этом оптимальный тариф на сопровождение 1С, исходя из ваших индивидуальных потребностей.
Дата в запросе 1С 8.3

Тип «Дата» в 1С входит в число 4 основных типов данных наряду с числом, строкой и булево. В конфигурациях даты встречаются повсеместно – при разработке невозможно избежать работы с этим типом данных. Поэтому лучше начинать писать запросы, уже понимая, как обрабатывать даты, какие есть возможности для работы с ними, как они хранятся, а до этого «безопаснее» использовать услуги программистов по доработке 1С, которые предоставляют большинство компаний-франчайзи. Рассмотрим на примерах все нюансы написания запросов с различными датами.
Примеры работы с датами в запросах 1С
В первую очередь, необходимо получить дату в запросе в нужном формате – со временем или без него. Выполнить эту задачу можно несколькими путями:
- Передать через параметр. Получить текущую дату сеанса можно только этим методом;
- Получить дату в запросе из поля выборки;
- Преобразовать из числовых значений с помощью функции ДАТАВРЕМЯ().
Самой распространенной задачей при работе с документами является проверка на пустую дату в запросе 1С. В этом случае легче всего сравнить переменную или поле с пустой датой, которая получается с помощью функции ДАТАВРЕМЯ(1,1,1):
ДАТАВРЕМЯ (1, 1, 1)
Аналогичной командой можно получить произвольную дату и время в запросе. При этом их можно указать с точностью до секунды, задав в качестве параметров 6 чисел. Если же используется только 3 числа, то часы, минуты и секунды будут приравнены к 0 (начало дня). Например, нам необходимо в запросе выбрать документы за первые 10 дней января 2018 года:
ВЫБРАТЬ ПоступлениеНаРасчетныйСчет.Ссылка КАК Ссылка ИЗ Документ.ПоступлениеНаРасчетныйСчет КАК ПоступлениеНаРасчетныйСчет ГДЕ ПоступлениеНаРасчетныйСчет.Дата МЕЖДУ ДАТАВРЕМЯ(2018, 1, 1, 0, 0, 0) И ДАТАВРЕМЯ(2018, 1, 10, 23, 59, 59)
В запросе на встроенном языке 1С можно не только выбирать различные поля и получать параметры. Существует множество функций, облегчающих форматирование даты под нужды конкретной задачи.
Если вы часто работаете с датами в запросе, то вы должны знать эти команды:
- НАЧАЛОПЕРИОДА. В качестве параметров указывается дата и промежуток времени, в разрезе которого необходимо получить начало даты. Используется, чтобы преобразовать дату к формату без времени. Для этого необходимо задать второй параметр – «ДЕНЬ»;
НАЧАЛОПЕРИОДА(, ) НАЧАЛОПЕРИОДА(&Дата, ДЕНЬ)
- КОНЕЦПЕРИОДА. Аналогичная команда, возвращающая последнюю дату в разрезе указанных в параметрах единиц;
- ДОБАВИТЬКДАТЕ. Позволяет получить дату, большую на заданное количество указанных единиц времени. В качестве параметров функции указывают дату, единицу измерения времени и число;
ДОБАВИТЬКДАТЕ(, , ) ДОБАВИТЬКДАТЕ(&Дата, ДЕНЬ, 10)
- РАЗНОСТЬДАТ. Получает разницу между датами в указанных единицах измерения;
РАЗНОСТЬДАТ(, , ) РАЗНОСТЬДАТ(&Дата1, &Дата2, ДЕНЬ)
- ДЕНЬНЕДЕЛИ. Вернет порядковый номер одного из дней недели.
Грамотно применяя эти функции, разработчик может решать достаточно нетривиальные задачи. К примеру, получение наименования дня недели текущей даты в запросе в виде строки:
ВЫБОР КОГДА ДЕНЬНЕДЕЛИ(&ТекущаяДата) = 1 ТОГДА "понедельник" КОГДА ДЕНЬНЕДЕЛИ(&ТекущаяДата) = 2 ТОГДА "вторник" КОГДА ДЕНЬНЕДЕЛИ(&ТекущаяДата) = 3 ТОГДА "среда" КОГДА ДЕНЬНЕДЕЛИ(&ТекущаяДата) = 4 ТОГДА "четверг" КОГДА ДЕНЬНЕДЕЛИ(&ТекущаяДата) = 5 ТОГДА "пятница" КОГДА ДЕНЬНЕДЕЛИ(&ТекущаяДата) = 6 ТОГДА "суббота" ИНАЧЕ "Воскресенье" КОНЕЦ
Преобразование типов в запросе 1С из числа или строки в дату – трудоемкое занятие. Из чисел можно получить дату с помощью функции ДАТАВРЕМЯ, из строки – комбинируя функцию ПОДСТРОКА и конструкцию ВЫБОР КОГДА ТОГДА ИНАЧЕ. Исходя из этого, разработчики предпочитают получать дату из других типов в модуле и передавать ее в запрос с помощью параметра. К сожалению, это не всегда реализуемо, поэтому приходится менять формат даты в запросе.
Есть возможность указать дату в запросе 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)