При разработке отчетов или обработок на платформе 1С часто возникает необходимость привести хранящиеся в базе данные к определенному формату. Одной из частых задач является преобразование числового значения года (например, 2024) в полноценную дату 1 января этого года. При попытке сделать это «в лоб» начинающие разработчики часто сталкиваются с ошибкой при использовании литерала ДАТАВРЕМЯ. Давайте разберемся, почему так происходит и какие существуют эффективные способы решения этой задачи.
Первое, что приходит на ум — использовать функцию ДАТАВРЕМЯ(Год, 1, 1), подставив в качестве первого аргумента поле из регистра. Однако важно помнить: в языке запросов 1С ДАТАВРЕМЯ — это не функция, а литерал. Это означает, что все параметры внутри скобок должны быть константами, известными системе на этапе написания текста запроса. Если вы попытаетесь передать туда имя поля или переменную, система выдаст синтаксическую ошибку, так как она не может вычислить значение «на лету» внутри литерала.
Если в вашем регистре год хранится в виде обычного числа, наиболее универсальным и программным способом будет использование функции ДОБАВИТЬКДАТЕ. Суть метода заключается в том, чтобы взять за точку отсчета начало нашей эры (0001 год) и прибавить к ней нужное количество лет.
Рассмотрим пример реализации такого запроса:
ВЫБРАТЬ
ДОБАВИТЬКДАТЕ(ДАТАВРЕМЯ(1, 1, 1), ГОД, РегламентированныйПроизводственныйКалендарь.Год - 1) КАК НачалоГода
ИЗ
РегистрСведений.РегламентированныйПроизводственныйКалендарь КАК РегламентированныйПроизводственныйКалендарь
Обратите внимание на важный нюанс: мы вычитаем единицу (Год - 1) из числового значения. Это необходимо потому, что базовая точка ДАТАВРЕМЯ(1, 1, 1) уже является первым годом нашей эры. Если мы прибавим 2024 года к первому году, мы получим 2025-й. Поэтому для корректного соответствия текущему календарному году всегда учитывайте это смещение.
Если ваша архитектура позволяет хранить данные не только числом, но и в поле типа Дата, то самым правильным и читаемым способом будет использование функции НАЧАЛОПЕРИОДА. Это встроенный механизм платформы, который автоматически выполняет приведение даты к заданному интервалу.
Посмотрим, как это выглядит в коде:
ВЫБРАТЬ
НАЧАЛОПЕРИОДА(РегламентированныйПроизводственныйКалендарь.Дата, ГОД) КАК НачалоГода
ИЗ
РегистрСведений.РегламентированныйПроизводственныйКалендарь КАК РегламентированныйПроизводственныйКалендарь
Этот метод предпочтительнее с точки зрения производительности и читаемости кода, так как он не требует дополнительных математических манипуляций и понятен любому другому разработчику, который будет поддерживать ваш код в будущем.
Дата.ДОБАВИТЬКДАТЕ является своего рода «хаком», поэтому всегда тестируйте результат на граничных значениях (первый и последний год планирования).Мы проанализировали основные подходы к решению задачи преобразования года. Какой бы метод вы ни выбрали — ДОБАВИТЬКДАТЕ или НАЧАЛОПЕРИОДА — главное помнить об архитектурных ограничениях языка запросов 1С и всегда проверять корректность даты на выходе.