Разработка и Конфигурация · 9 мин
Как из даты получить год в 1С
Как получить год из даты в 1С: функция Год(), Формат с шаблоном ДФ=yyyy, функция ГОД в запросах. Примеры кода, разбор ошибок и проверка результата.
Извлечь год из даты в 1С можно несколькими способами: функцией встроенного языка Год(), функцией Формат() с шаблоном, а в запросах — функцией ГОД() языка запросов. Выбор зависит от того, где выполняется код: в модуле, в запросе, в СКД или при выводе на печать.
Функция Год() возвращает число — именно число, а не строку и не дату. Это важно для дальнейших сравнений и вычислений: результат можно сразу использовать в арифметике и условиях без дополнительных преобразований.
Ниже разобраны все рабочие способы с примерами кода, особенности работы в запросах и типовые ошибки, из-за которых вместо года получают пустую строку, неверное число или ошибку исполнения.
Функция Год() во встроенном языке
Основной способ — встроенная функция Год(). Она принимает один параметр типа «Дата» и возвращает значение типа «Число» от 1 до 9999.
ДатаДокумента = Документ.Дата;
ГодДокумента = Год(ДатаДокумента); // вернёт число, например 2026
// Можно сразу от текущей даты
ТекущийГод = Год(ТекущаяДатаСеанса());
// И от литерала даты
ГодИзЛитерала = Год('20260315'); // 2026
Обратите внимание на тип результата. Если дальше год подставляется в строку сообщения или заголовок, число будет автоматически приведено к строке, но без разделителей разрядов, если использовать строковые функции аккуратно. При конкатенации через оператор «+» платформа сама преобразует число в строку.
Если передать в функцию Год() пустую дату ('00010101'), результатом будет 1 — год от начала отсчёта календаря. Это частая причина «странных» единиц в отчётах: проверяйте заполненность даты до вызова функции.
ГодДокумента = Год(Документ.Дата);
Сообщить("Год документа: " + ГодДокумента);Получение года функцией Формат()
Когда год нужен как строка определённого вида, удобнее Формат() с параметром форматной строки. Шаблон ДФ=yyyy выводит четырёхзначный год, ДФ=yy — две последние цифры.
ГодСтрокой = Формат(ТекущаяДатаСеанса(), "ДФ=yyyy"); // "2026"
КороткийГод = Формат(ТекущаяДатаСеанса(), "ДФ=yy"); // "24"
Разница принципиальна: Год() возвращает число для вычислений, Формат() — строку для отображения. Если результат планируется сравнивать с числом или участвовать в арифметике, используйте Год(). Если нужно вывести год в печатную форму, заголовок отчёта или имя файла — подойдёт Формат().
Учтите, что форматная строка чувствительна к регистру символов шаблона: yyyy — год, а YYYY может интерпретироваться иначе в некоторых контекстах локализации. Рекомендуется использовать строчные буквы для года в шаблонах ДФ.
Год из даты в запросе: функция ГОД()
В языке запросов 1С есть одноимённая функция ГОД(), которая работает с полями типа «Дата» и возвращает число. Это правильный способ группировать и фильтровать данные по году на уровне СУБД, без выборки и построчной обработки.
ВЫБРАТЬ
ГОД(Продажи.Период) КАК Год,
СУММА(Продажи.СуммаОборот) КАК Сумма
ИЗ
РегистрНакопления.Продажи.Обороты КАК Продажи
СГРУППИРОВАТЬ ПО
ГОД(Продажи.Период)
УПОРЯДОЧИТЬ ПО
Год
Функцию ГОД() можно использовать и в условии ГДЕ, но с осторожностью: условие вида ГДЕ ГОД(Документ.Дата) = &Год не позволяет оптимизатору использовать индекс по дате, и на больших таблицах запрос замедлится. Эффективнее передать границы периода параметрами.
ГДЕ
Документ.Дата МЕЖДУ &НачалоГода И &КонецГода
Год в СКД и вычисляемых полях
В системе компоновки данных год обычно получают двумя путями. Первый — функция ГОД() прямо в тексте запроса набора данных, как показано выше. Второй — вычисляемое поле на языке выражений СКД, где доступна та же функция Год().
Для группировок по периодам в СКД есть и встроенный механизм периодичности: если поле даты добавить в группировку и указать тип периода «Год», компоновка сама выполнит усечение даты. Это удобно для отчётов с динамическими периодами — пользователь сможет менять детализацию без изменения запроса.
При выводе года в ресурсы или заголовки отчёта предпочтительнее вычислять его в запросе: тогда значение доступно и для группировки, и для отбора, и для сортировки одновременно.
Способы получить год
Возвращает число. Подходит для вычислений, условий и передачи параметрами. Не даёт строкового формата.
Возвращает строку для вывода в сообщения, печатные формы, имена файлов. Не подходит для арифметики без обратного преобразования.
Вычисляется на стороне СУБД, подходит для группировок и итогов. В условии ГДЕ может замедлять запрос на больших таблицах.
Не требует кода, настраивается в группировке. Подходит только для отчётов на СКД, недоступна в произвольном коде.
Смежные задачи: начало и конец года, возраст, разница лет
На практике год редко нужен сам по себе — чаще из него строят границы периода. Для этого во встроенном языке есть функции НачалоГода() и КонецГода(), а в запросах — НАЧАЛОПЕРИОДА(Дата, ГОД) и КОНЕЦПЕРИОДА(Дата, ГОД).
НачалоТекущегоГода = НачалоГода(ТекущаяДатаСеанса());
КонецТекущегоГода = КонецГода(ТекущаяДатаСеанса());
// Собрать дату из года "вручную"
ДатаИзГода = Дата(ГодДокумента, 1, 1);
Для вычисления возраста или стажа в полных годах простого вычитания Год(Дата2) - Год(Дата1) недостаточно: разница не учитывает, наступил ли день рождения в текущем году. Корректный расчёт сравнивает месяц и день, а в типовых конфигурациях для этого есть готовые функции общих модулей (например, в БСП — методы работы с датами в общем модуле работы с датами).
- 1Определите контекст: код модуля, запрос, СКД или вывод на печать.
- 2Выберите функцию: Год() для числа, Формат() для строки, ГОД() в запросе.
- 3Проверьте, что дата заполнена: пустая дата даст год 1.
- 4Выполните код и убедитесь, что тип результата соответствует ожиданию (число или строка).
- 5Для запросов с отбором по году замените условие на диапазон дат и проверьте скорость выполнения.
Типичные ошибки и ограничения
Первая распространённая ошибка — попытка применить Год() к строке. Если дата хранится в реквизите строкового типа (так бывает при обменах), функция вызовет ошибку исполнения. Строку нужно сначала преобразовать в дату, например через Дата() с разбором частей строки или стандартные механизмы преобразования.
Вторая ошибка — использование Формат() с последующим сравнением результата с числом: строка "2026" и число 2026 не равны, условие молча не сработает. Третья — забвение часового пояса: ТекущаяДата() на клиенте и ТекущаяДатаСеанса() могут дать разные даты на границе суток или года, если клиент и сервер в разных часовых поясах. Для серверной логики всегда используйте дату сеанса.
Отдельного внимания заслуживает перенос данных: в некоторых устаревших базах встречаются даты с годом меньше 100 или «двухзначные» годы из строковых реквизитов. Перед массовой обработкой таких данных проверьте выборочно, что Год() возвращает ожидаемые значения.
Как проверить результат
Год() — число, Формат() — строка
Ожидали число, получили строку (или наоборот) — дальнейшие сравнения некорректны
Пустые даты отфильтрованы до вызова функции
В результатах появляется год 1
Используется диапазон дат, запрос выполняется быстро
Условие ГОД(Дата) = ... на большой таблице, заметные задержки
Частые вопросы
Чем отличается Год() от Формат(Дата, "ДФ=yyyy")?
Год() возвращает число и подходит для вычислений, сравнений и передачи параметрами. Формат() возвращает строку и нужен для вывода пользователю, в печатные формы или имена файлов. Смешивать их нельзя: сравнение строки с числом даст ложь.
Как получить год в запросе 1С?
Используйте функцию языка запросов ГОД(ПолеДаты), например: ВЫБРАТЬ ГОД(Документ.Дата) КАК Год ИЗ Документ.Реализация. Для группировки добавьте то же выражение в секцию СГРУППИРОВАТЬ ПО.
Почему Год() возвращает 1?
Значит, передана пустая дата (01.01.0001). Проверьте заполненность реквизита до вызова функции: Если ЗначениеЗаполнено(Дата) Тогда ... КонецЕсли.
Как получить две последние цифры года?
Формат(Дата, "ДФ=yy") вернёт строку вида "24". Если нужно число, возьмите остаток от деления: Год(Дата) % 100.
Как отобрать документы за конкретный год без потери скорости?
Передайте в запрос два параметра — НачалоГода и КонецГода, вычисленные функциями НачалоГода() и КонецГода(), и используйте условие Дата МЕЖДУ &НачалоГода И &КонецГода. Так запрос сможет использовать индекс по полю даты.
Можно ли получить год из строки вида "15.03.2026"?
Напрямую нет — Год() принимает только тип Дата. Строку нужно разобрать на части (день, месяц, год) и собрать дату через Дата(Год, Месяц, День), либо использовать функции преобразования из библиотеки стандартных подсистем, если она внедрена в конфигурацию.
Что важно запомнить
В коде используйте Год(Дата) — это число; для вывода строкой — Формат(Дата, "ДФ=yyyy"); в запросах — ГОД(Поле). Проверяйте заполненность даты, не смешивайте строки и числа в сравнениях, а отбор по году в запросах делайте через диапазон дат, чтобы не потерять производительность.