Есть периодический регистр сведений с поле "Период" и справочник с символьным кодом. Код представляет собой датой в виде ГГГГ-ММ-ДД.

Требуется связать в запросе НАЧАЛОПЕРИОДА(РегистрСведений.Период) с кодом справочника. Можно ли как-то извратиться с ВЫРАЗИТЬ(), ПОДСТРОКА() и т.д.?

Делать в справочнике дополнительное поле с типом "Дата" не хочу.
---
изящное - поставить 8.3.20 и воспользоваться новыми возможностями языка запросов.
https://wonderland.v8.1c.ru/blog/novye-funktsii-yazyka-zaprosov-i-sistemy-komponovki-dannykh/
---
Делать в справочнике дополнительное поле с типом "Дата" не хочу.
Что на самом деле было бы правильным решением.
Если хотите извращаться, то вот - https://infostart.ru/1c/articles/331805/
---
Что на самом деле было бы правильным решением. ...
Согласен.

(0) Запросто:

```1c
    ВЫБРАТЬ
    НАЧАЛОПЕРИОДА(ЗаказыКлиентов.Период, ДЕНЬ) КАК Период
    ПОМЕСТИТЬ ВТДаты
    ИЗ
    РегистрНакопления.ЗаказыКлиентов КАК ЗаказыКлиентов
    ;

    ////////////////////////////////////////////////////////////­////////////////////
    ВЫБРАТЬ
    ВТДаты.Период КАК Период,
    ВЫБОР
    КОГДА ГОД(ВТДаты.Период) = 2000 ТОГДА "2000"
    КОГДА ГОД(ВТДаты.Период) = 2001 ТОГДА "2001"
    КОГДА ГОД(ВТДаты.Период) = 2002 ТОГДА "2002"
    КОГДА ГОД(ВТДаты.Период) = 2003 ТОГДА "2003"
    КОГДА ГОД(ВТДаты.Период) = 2004 ТОГДА "2004"
    КОГДА ГОД(ВТДаты.Период) = 2005 ТОГДА "2005"
    КОГДА ГОД(ВТДаты.Период) = 2006 ТОГДА "2006"
    КОГДА ГОД(ВТДаты.Период) = 2007 ТОГДА "2007"
    КОГДА ГОД(ВТДаты.Период) = 2008 ТОГДА "2008"
    КОГДА ГОД(ВТДаты.Период) = 2009 ТОГДА "2009"
    КОГДА ГОД(ВТДаты.Период) = 2010 ТОГДА "2010"
    КОГДА ГОД(ВТДаты.Период) = 2011 ТОГДА "2011"
    КОГДА ГОД(ВТДаты.Период) = 2012 ТОГДА "2012"
    КОГДА ГОД(ВТДаты.Период) = 2013 ТОГДА "2013"
    КОГДА ГОД(ВТДаты.Период) = 2014 ТОГДА "2014"
    КОГДА ГОД(ВТДаты.Период) = 2015 ТОГДА "2015"
    КОГДА ГОД(ВТДаты.Период) = 2016 ТОГДА "2016"
    КОГДА ГОД(ВТДаты.Период) = 2017 ТОГДА "2017"
    КОГДА ГОД(ВТДаты.Период) = 2018 ТОГДА "2018"
    КОГДА ГОД(ВТДаты.Период) = 2019 ТОГДА "2019"
    КОГДА ГОД(ВТДаты.Период) = 2020 ТОГДА "2020"
    КОГДА ГОД(ВТДаты.Период) = 2021 ТОГДА "2021"
    КОГДА ГОД(ВТДаты.Период) = 2022 ТОГДА "2022"
    КОГДА ГОД(ВТДаты.Период) = 2023 ТОГДА "2023"
    КОГДА ГОД(ВТДаты.Период) = 2024 ТОГДА "2024"
    ИНАЧЕ "ХХХХ"
    КОНЕЦ + "-" + ВЫБОР
    КОГДА МЕСЯЦ(ВТДаты.Период) = 1 ТОГДА "01"
    КОГДА МЕСЯЦ(ВТДаты.Период) = 2 ТОГДА "02"
    КОГДА МЕСЯЦ(ВТДаты.Период) = 3 ТОГДА "03"
    КОГДА МЕСЯЦ(ВТДаты.Период) = 4 ТОГДА "04"
    КОГДА МЕСЯЦ(ВТДаты.Период) = 5 ТОГДА "05"
    КОГДА МЕСЯЦ(ВТДаты.Период) = 6 ТОГДА "06"
    КОГДА МЕСЯЦ(ВТДаты.Период) = 7 ТОГДА "07"
    КОГДА МЕСЯЦ(ВТДаты.Период) = 8 ТОГДА "08"
    КОГДА МЕСЯЦ(ВТДаты.Период) = 9 ТОГДА "09"
    КОГДА МЕСЯЦ(ВТДаты.Период) = 10 ТОГДА "10"
    КОГДА МЕСЯЦ(ВТДаты.Период) = 11 ТОГДА "11"
    ИНАЧЕ "12"
    КОНЕЦ + "-" + ВЫБОР
    КОГДА ДЕНЬ(ВТДаты.Период) = 1 ТОГДА "01"
    КОГДА ДЕНЬ(ВТДаты.Период) = 2 ТОГДА "02"
    КОГДА ДЕНЬ(ВТДаты.Период) = 3 ТОГДА "03"
    КОГДА ДЕНЬ(ВТДаты.Период) = 4 ТОГДА "04"
    КОГДА ДЕНЬ(ВТДаты.Период) = 5 ТОГДА "05"
    КОГДА ДЕНЬ(ВТДаты.Период) = 6 ТОГДА "06"
    КОГДА ДЕНЬ(ВТДаты.Период) = 7 ТОГДА "07"
    КОГДА ДЕНЬ(ВТДаты.Период) = 8 ТОГДА "08"
    КОГДА ДЕНЬ(ВТДаты.Период) = 9 ТОГДА "09"
    КОГДА ДЕНЬ(ВТДаты.Период) = 10 ТОГДА "10"
    КОГДА ДЕНЬ(ВТДаты.Период) = 21 ТОГДА "21"
    КОГДА ДЕНЬ(ВТДаты.Период) = 22 ТОГДА "22"
    КОГДА ДЕНЬ(ВТДаты.Период) = 23 ТОГДА "23"
    КОГДА ДЕНЬ(ВТДаты.Период) = 24 ТОГДА "24"
    КОГДА ДЕНЬ(ВТДаты.Период) = 25 ТОГДА "25"
    КОГДА ДЕНЬ(ВТДаты.Период) = 26 ТОГДА "26"
    КОГДА ДЕНЬ(ВТДаты.Период) = 27 ТОГДА "27"
    КОГДА ДЕНЬ(ВТДаты.Период) = 28 ТОГДА "28"
    КОГДА ДЕНЬ(ВТДаты.Период) = 29 ТОГДА "29"
    КОГДА ДЕНЬ(ВТДаты.Период) = 30 ТОГДА "30"
    ИНАЧЕ "31"
    КОНЕЦ КАК ДатаСтрокой
    ИЗ
    ВТДаты КАК ВТДаты
```
---
Можно "переходную" таблицу из строки в дату программно создать и добавить в запрос. А там уже через соединение.
---
можно и через СКД. Программное формирование и вывод в ТЗ. И уже работать с ТЗ.
---
Два запроса вместо одного и цикл - 5 минут времени.
---
Единственно, тут надо ловить, чтобы не попался ГОД, КОТОРОГО У НАС НЕТ.
---
Делать в справочнике дополнительное поле с типом "Дата" не хочу.
Что на самом деле было бы правильным решением.
Если хотите извращаться, то вот - https://infostart.ru/1c/articles/331805/
---
Что на самом деле было бы правильным решением. ...
Согласен.

(0) Запросто:

```1c
    ВЫБРАТЬ
    НАЧАЛОПЕРИОДА(ЗаказыКлиентов.Период, ДЕНЬ) КАК Период
    ПОМЕСТИТЬ ВТДаты
    ИЗ
    РегистрНакопления.ЗаказыКлиентов КАК ЗаказыКлиентов
    ;

    ////////////////////////////////////////////////////////////­////////////////////
    ВЫБРАТЬ
    ВТДаты.Период КАК Период,
    ВЫБОР
    КОГДА ГОД(ВТДаты.Период) = 2000 ТОГДА "2000"
    КОГДА ГОД(ВТДаты.Период) = 2001 ТОГДА "2001"
    КОГДА ГОД(ВТДаты.Период) = 2002 ТОГДА "2002"
    КОГДА ГОД(ВТДаты.Период) = 2003 ТОГДА "2003"
    КОГДА ГОД(ВТДаты.Период) = 2004 ТОГДА "2004"
    КОГДА ГОД(ВТДаты.Период) = 2005 ТОГДА "2005"
    КОГДА ГОД(ВТДаты.Период) = 2006 ТОГДА "2006"
    КОГДА ГОД(ВТДаты.Период) = 2007 ТОГДА "2007"
    КОГДА ГОД(ВТДаты.Период) = 2008 ТОГДА "2008"
    КОГДА ГОД(ВТДаты.Период) = 2009 ТОГДА "2009"
    КОГДА ГОД(ВТДаты.Период) = 2010 ТОГДА "2010"
    КОГДА ГОД(ВТДаты.Период) = 2011 ТОГДА "2011"
    КОГДА ГОД(ВТДаты.Период) = 2012 ТОГДА "2012"
    КОГДА ГОД(ВТДаты.Период) = 2013 ТОГДА "2013"
    КОГДА ГОД(ВТДаты.Период) = 2014 ТОГДА "2014"
    КОГДА ГОД(ВТДаты.Период) = 2015 ТОГДА "2015"
    КОГДА ГОД(ВТДаты.Период) = 2016 ТОГДА "2016"
    КОГДА ГОД(ВТДаты.Период) = 2017 ТОГДА "2017"
    КОГДА ГОД(ВТДаты.Период) = 2018 ТОГДА "2018"
    КОГДА ГОД(ВТДаты.Период) = 2019 ТОГДА "2019"
    КОГДА ГОД(ВТДаты.Период) = 2020 ТОГДА "2020"
    КОГДА ГОД(ВТДаты.Период) = 2021 ТОГДА "2021"
    КОГДА ГОД(ВТДаты.Период) = 2022 ТОГДА "2022"
    КОГДА ГОД(ВТДаты.Период) = 2023 ТОГДА "2023"
    КОГДА ГОД(ВТДаты.Период) = 2024 ТОГДА "2024"
    ИНАЧЕ "ХХХХ"
    КОНЕЦ + "-" + ВЫБОР
    КОГДА МЕСЯЦ(ВТДаты.Период) = 1 ТОГДА "01"
    КОГДА МЕСЯЦ(ВТДаты.Период) = 2 ТОГДА "02"
    КОГДА МЕСЯЦ(ВТДаты.Период) = 3 ТОГДА "03"
    КОГДА МЕСЯЦ(ВТДаты.Период) = 4 ТОГДА "04"
    КОГДА МЕСЯЦ(ВТДаты.Период) = 5 ТОГДА "05"
    КОГДА МЕСЯЦ(ВТДаты.Период) = 6 ТОГДА "06"
    КОГДА МЕСЯЦ(ВТДаты.Период) = 7 ТОГДА "07"
    КОГДА МЕСЯЦ(ВТДаты.Период) = 8 ТОГДА "08"
    КОГДА МЕСЯЦ(ВТДаты.Период) = 9 ТОГДА "09"
    КОГДА МЕСЯЦ(ВТДаты.Период) = 10 ТОГДА "10"
    КОГДА МЕСЯЦ(ВТДаты.Период) = 11 ТОГДА "11"
    ИНАЧЕ "12"
    КОНЕЦ + "-" + ВЫБОР
    КОГДА ДЕНЬ(ВТДаты.Период) = 1 ТОГДА "01"
    КОГДА ДЕНЬ(ВТДаты.Период) = 2 ТОГДА "02"
    КОГДА ДЕНЬ(ВТДаты.Период) = 3 ТОГДА "03"
    КОГДА ДЕНЬ(ВТДаты.Период) = 4 ТОГДА "04"
    КОГДА ДЕНЬ(ВТДаты.Период) = 5 ТОГДА "05"
    КОГДА ДЕНЬ(ВТДаты.Период) = 6 ТОГДА "06"
    КОГДА ДЕНЬ(ВТДаты.Период) = 7 ТОГДА "07"
    КОГДА ДЕНЬ(ВТДаты.Период) = 8 ТОГДА "08"
    КОГДА ДЕНЬ(ВТДаты.Период) = 9 ТОГДА "09"
    КОГДА ДЕНЬ(ВТДаты.Период) = 10 ТОГДА "10"
    КОГДА ДЕНЬ(ВТДаты.Период) = 21 ТОГДА "21"
    КОГДА ДЕНЬ(ВТДаты.Период) = 22 ТОГДА "22"
    КОГДА ДЕНЬ(ВТДаты.Период) = 23 ТОГДА "23"
    КОГДА ДЕНЬ(ВТДаты.Период) = 24 ТОГДА "24"
    КОГДА ДЕНЬ(ВТДаты.Период) = 25 ТОГДА "25"
    КОГДА ДЕНЬ(ВТДаты.Период) = 26 ТОГДА "26"
    КОГДА ДЕНЬ(ВТДаты.Период) = 27 ТОГДА "27"
    КОГДА ДЕНЬ(ВТДаты.Период) = 28 ТОГДА "28"
    КОГДА ДЕНЬ(ВТДаты.Период) = 29 ТОГДА "29"
    КОГДА ДЕНЬ(ВТДаты.Период) = 30 ТОГДА "30"
    ИНАЧЕ "31"
    КОНЕЦ КАК ДатаСтрокой
    ИЗ
    ВТДаты КАК ВТДаты
```
---
Фундаментально! Не проще ли дату из строки собрать? Заодно из от проблемы 2000 и 2024 избавиться.
---
Так преобразований меньше.
Если собирать дату нужно:
1. Разделить строку на части
2. Каждую часть преобразовать в число (прямых функций нет)
3. Из чисел через "ДАТАВРЕМЯ" собрать дату.

А тут две операции
1. Выделение части даты числом (год, месяц, дата)
2. Собираем результат через ВЫБОР и соединение строк.
---
Единственно, тут надо ловить, чтобы не попался ГОД, КОТОРОГО У НАС НЕТ.
---
Можно. ПОДСТРОКА(), ВЫРАЗИТЬ() и ДАТАВРЕМЯ() вам в помощь. Искренне надеюсь что дальнейшие рекомендации излишни.
---
Ну как с "ПОДСТРОКА" и "ДАТАВРЕМЯ" поизвращаться понятно.
А чем на может помочь "ВЫРАЗИТЬ"? В языке запросов нет преобразования типов.
---
Вы правы. Избаловался я CAST-ом из SQL. 1С, действительно, так не умеет. В моем варианте остается только https://infostart.ru/1c/articles/170336/
---
ДАТАВРЕМЯ() работает только с литералами.

ВЫРАЗИТЬ() строку в число не получилось.

А если через СКД попробовать? Там же можно задействовать пользовательские функции. Только надо не отчёт, а что-то машино-читаемое, т. к. по этой выборке ещё алгоритм пробежаться должен. Это как-то надо с компоновщиком извращаться?
---
Можно "переходную" таблицу из строки в дату программно создать и добавить в запрос. А там уже через соединение.
---
Тогда уж проще вспомогательное поле даты в справочник прописать. Только, в отличие от Вашего решения, пользователей выгонять из базы придётся, а обидно, ведь обработка разовая. Или расширением воспользоваться?
---
Два запроса вместо одного и цикл - 5 минут времени.
---
У меня так и есть, просто хочется красиво. К тому же без связи первый запрос перерабатывать будет, а меня там 20 млн. записей.
---
Табличку можно же с любого конца построить. Как от строки в дату, так и наоборот. Естественно надо наименьшую выборку брать.
---
без связи будет перерабатывать первый запрос. Конечно, можно выгрузить второй в массив и сделать "ГДЕ ... В ...", но там 325 элементов, что тоже не фонтан.
---
т.е. поле с типом дата добавить вы не хотите ровно по той причине, что придется выгонять пользователей из БД? Серьёзно?
---
Нет, просто не люблю нарушение реляционной модели и дублирования информации
---
и каким образом поле типа дата будет нарушать реляционную модель?
чтобы не было дублирования данных, значения типа дата необходимо хранить значением типа дата, а не строка, как сделано у вас.
---
таким образом, что типа "Дата" для кода нет. Поэтому мне придётся либо проверять уникальность этого поля ручками, либо хранить 2 поля и ручками же поддерживать их соответствие.

Обидно, что в Аccess автоматическая проверка уникальности поля и условий в том числе и на несколько полей была ещё 30 лет назад.
---
контроль и соответствие двух значений выполняется парой-тройкой строк кода.
---
можно и через СКД. Программное формирование и вывод в ТЗ. И уже работать с ТЗ.
---
Кстати, о ТЗ. Можно и вручную пробежаться по ТЗ и найти её пересечение с другой. Связь-то мне для этого была нужна. Только всё решения какие-то неизящные.
---
изящное - поставить 8.3.20 и воспользоваться новыми возможностями языка запросов.
https://wonderland.v8.1c.ru/blog/novye-funktsii-yazyka-zaprosov-i-sistemy-komponovki-dannykh/
---
и напороться на критические ошибки при обновлении конфигурации по причине: Ошибка SDBL: Тип поля Code не совместим с типом литерала ...