Разработка и Конфигурация · 11 мин
Как получить текущий год в 1С
Как получить текущий год в 1С: функция Год(), ТекущаяДатаСеанса(), ТекущаяДата(), различия клиент-серверного вызова, форматирование и типичные ошибки с примерами кода.
Получить текущий год в 1С можно одной строкой кода: Год(ТекущаяДатаСеанса()). Функция ТекущаяДатаСеанса() возвращает дату и время сеанса на сервере, а функция Год() извлекает из этой даты номер года в виде числа. Этот подход корректно работает и в тонком клиенте, и в веб-клиенте, и на сервере, поэтому именно его рекомендует использовать типовая методология разработки.
На практике задача встречается постоянно: подстановка года в номер документа, формирование заголовков отчётов, расчёт сроков годности, проверка периода в запросах, вывод копирайта в печатных формах. В зависимости от контекста — модуль формы, общий модуль, запрос или макет — оптимальный способ отличается, и неправильный выбор может дать рассинхронизацию дат между клиентом и сервером.
Ниже разобраны все рабочие варианты: базовый синтаксис, различия между ТекущаяДата() и ТекущаяДатаСеанса(), получение года в запросе, преобразование в строку без разделителей групп и типичные ошибки, из-за которых в документах появляется не тот год.
Базовый способ: функция Год() совместно с ТекущаяДатаСеанса()
Функция Год(<Дата>) принимает значение типа Дата и возвращает число — номер года. Чтобы получить именно текущий год, в качестве параметра передают результат ТекущаяДатаСеанса():
ТекущийГод = Год(ТекущаяДатаСеанса());
Сообщить(ТекущийГод); // например, 2026
Функция ТекущаяДатаСеанса() доступна и на сервере, и на клиенте (в том числе в тонком и веб-клиенте). При вызове на клиенте платформа выполняет серверный вызов, поэтому в циклах и при массовых обращениях её стоит вызывать один раз и сохранять результат в переменную — иначе производительность формы заметно просядет.
Результат имеет числовой тип, что удобно для сравнений и арифметики: Год(ТекущаяДатаСеанса()) - 1 даст предыдущий год, а сравнение Год(Документ.Дата) = Год(ТекущаяДатаСеанса()) проверит, относится ли документ к текущему году.
ТекущийГод = Год(ТекущаяДатаСеанса());
ПрошлыйГод = ТекущийГод - 1;
ЭтоТекущийГод = (Год(ДокументОбъект.Дата) = ТекущийГод);ТекущаяДата() или ТекущаяДатаСеанса(): что выбрать
Во встроенном языке есть две похожие функции. ТекущаяДата() возвращает дату и время компьютера, на котором исполняется код: на клиенте — время рабочей станции пользователя, на сервере — время сервера. ТекущаяДатаСеанса() всегда возвращает время сервера сеансов, скорректированное с учётом часового пояса сеанса.
Разница становится критичной, когда часы на компьютере пользователя сбиты или филиал работает в другом часовом поясе. Если нумерация документов привязана к году и используется ТекущаяДата(), то в ночь с 31 декабря на 1 января разные пользователи могут создать документы с разными годами в номере — и префиксация «сломается».
Поэтому правило простое: для учётных данных, нумерации, проверок периодов и всего, что хранится в базе, используйте ТекущаяДатаСеанса(). Функцию ТекущаяДата() допустимо применять только для отображения локального времени пользователю без записи в базу.
Сравнение вариантов
Единое серверное время для всех пользователей. Подходит для документов, нумерации, проверок. Недоступна вне серверного контекста внешних компонентов.
Время локального компьютера. Подходит только для отображения на клиенте. Риск расхождения дат между пользователями.
Дата, заданная пользователем в настройках. Подходит, когда учёт ведут «задним числом» в рамках рабочей даты, но требует дисциплины пользователей.
Получение года из произвольной даты
Часто требуется не текущий год, а год конкретной даты: документа, элемента справочника, параметра отчёта. Синтаксис тот же — Год() принимает любое значение типа Дата:
ГодДокумента = Год(СсылкаНаДокумент.Дата);
ГодРождения = Год(Сотрудник.ДатаРождения);
Если переменная может оказаться пустой датой ('00010101'), функция вернёт 1 — год минимальной даты. Перед использованием результата в логике проверяйте заполненность даты через ЗначениеЗаполнено(), иначе условие вида «год равен текущему» молча не сработает, а найти причину будет непросто.
Для границ периода удобны функции НачалоГода() и КонецГода(): они возвращают соответственно 1 января 00:00:00 и 31 декабря 23:59:59 указанного года. Например, отбор документов за текущий год строится как диапазон от НачалоГода(ТекущаяДатаСеанса()) до КонецГода(ТекущаяДатаСеанса()).
Текущий год в запросе
В языке запросов 1С есть собственная функция ГОД(), которая извлекает год из поля даты. Передать текущую дату в запрос следует через параметр — вызывать функции встроенного языка внутри текста запроса нельзя:
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| ГОД(&ТекущаяДата) КАК ТекущийГод";
Запрос.УстановитьПараметр("ТекущаяДата", ТекущаяДатаСеанса());
Выборка = Запрос.Выполнить().Выбрать();
Выборка.Следующий();
Сообщить(Выборка.ТекущийГод);
Более практичный сценарий — отбор записей за текущий год без вычисления границ в коде:
"ВЫБРАТЬ
| Реализация.Ссылка
|ИЗ
| Документ.РеализацияТоваровУслуг КАК Реализация
|ГДЕ
| ГОД(Реализация.Дата) = ГОД(&ТекущаяДата)"
Учтите, что условие ГОД(Реализация.Дата) = ... не использует индекс по полю Дата — на больших таблицах такой запрос выполняется заметно дольше. Для производительности лучше передавать в запрос два параметра, НачалоГода и КонецГода, и писать условие Реализация.Дата МЕЖДУ &НачалоГода И &КонецГода.
Год в виде строки: форматирование и подводные камни
Функция Год() возвращает число, а числа при преобразовании в строку в 1С по умолчанию получают разделитель групп разрядов: вместо «2026» можно получить «2 026» с неразрывным пробелом. В номере документа или наименовании такой пробел недопустим.
Правильные способы преобразования:
ГодСтрокой = Формат(Год(ТекущаяДатаСеанса()), "ЧГ=0");
// или через формат даты
ГодСтрокой = Формат(ТекущаяДатаСеанса(), "ДФ=гггг");
// короткий вариант — две последние цифры
ГодКратко = Формат(ТекущаяДатаСеанса(), "ДФ=гг");
Параметр ЧГ=0 отключает группировку разрядов числа. Форматная строка ДФ=гггг сразу даёт четырёхзначный год, а ДФ=гг — двузначный, что удобно для префиксов нумерации вида «РТ-26-00123». В макетах печатных форм год обычно выводят именно через Формат(), чтобы не делать лишних преобразований в коде.
Практические сценарии использования
Год в номере документа
Типовая задача — сбрасывать нумерацию каждый год и включать год в префикс. В подписке на событие ПриУстановкеНовогоНомера год получают из даты документа, а не из текущей даты сеанса: документ могут вводить задним числом, и номер обязан соответствовать дате документа.
ПрефиксГода = Формат(Источник.Дата, "ДФ=гг");
НовыйНомер = "РТ-" + ПрефиксГода + "-" + Прав(НовыйНомер, 5);
Проверка, что дата попадает в текущий год
Для контроля ввода удобно сравнивать года напрямую. Такая проверка не зависит от месяца и дня и корректно работает на границе года:
Если Год(ВведеннаяДата) <> Год(ТекущаяДатаСеанса()) Тогда
Сообщить("Дата должна быть в пределах текущего года");
КонецЕсли;
Год в заголовках отчётов и печатных форм
В СКД текущий год обычно вычисляют через параметр с выражением Год(&ТекущаяДата) или задают стандартный период «Этот год». В печатных формах достаточно Формат(ТекущаяДатаСеанса(), "ДФ=гггг") при заполнении параметра макета.
- 1Определите контекст: код на сервере, на клиенте или запрос.
- 2Для учётных данных возьмите ТекущаяДатаСеанса() и сохраните в переменную.
- 3Извлеките год функцией Год() — получите число.
- 4Если нужна строка, примените Формат(..., "ЧГ=0") или ДФ=гггг.
- 5Проверьте результат в отладчике: тип, значение, отсутствие пробелов в строке.
Проверка результата и границы применения
Проверить полученное значение проще всего в отладчике или через Сообщить(): убедитесь, что тип значения — Число (если использовали Год()) и что в строковом представлении нет пробелов. Для кода, работающего в новогоднюю ночь, полезно мысленно «прогнать» сценарий на датах 31.12 23:59 и 01.01 00:00 — большинство дефектов нумерации всплывает именно на этой границе.
Отдельный случай — рабочая дата. Если в настройках пользователя установлена рабочая дата и учётная политика требует оперировать ею, текущий год следует брать из неё: Год(РабочаяДата) либо через функциональную опцию БСП ТекущаяДатаСеанса() из общего модуля ОбщегоНазначения, которая в типовых конфигурациях уже учитывает нужную логику. В конфигурациях на БСП предпочтительно использовать именно её, а не прямой вызов платформенной функции.
Ограничение, о котором часто забывают: в коде, исполняемом в фоновых заданиях и регламентных операциях, клиентские функции недоступны, но ТекущаяДатаСеанса() работает корректно. А вот внешние компоненты и COM-соединения получают время своего окружения — при интеграциях дату лучше передавать параметром из основного сеанса 1С.
Как проверить результат
Число, например 2026
Строка с пробелом «2 026» — значит, применено Строка() вместо Формат()
У всех пользователей одинаковый год в номерах
Часть документов с другим годом — где-то используется ТекущаяДата()
Условие по границам периода, запрос быстрый
ГОД(Поле) в условии, полное сканирование таблицы
Часто задаваемые вопросы
Как получить текущий год одной строкой в 1С?
Используйте выражение Год(ТекущаяДатаСеанса()) — оно вернёт число текущего года по времени сервера. Это универсальный вариант для сервера, тонкого и веб-клиента.
Чем ТекущаяДата() отличается от ТекущаяДатаСеанса()?
ТекущаяДата() берёт время компьютера, где исполняется код, поэтому у разных пользователей результат может различаться. ТекущаяДатаСеанса() возвращает единое время сервера сеансов с учётом часового пояса сеанса и подходит для учётных данных.
Почему вместо 2026 выводится «2 026»?
Функция Год() возвращает число, а при преобразовании числа в строку платформа добавляет разделитель групп разрядов. Используйте Формат(Год(ТекущаяДатаСеанса()), "ЧГ=0") или Формат(ТекущаяДатаСеанса(), "ДФ=гггг").
Как получить текущий год в запросе 1С?
Передайте текущую дату параметром и примените функцию ГОД(): ГОД(&ТекущаяДата). Для отбора записей за год эффективнее передавать границы периода параметрами и использовать условие МЕЖДУ, чтобы работал индекс по дате.
Как получить две последние цифры года для префикса номера?
Примените форматную строку: Формат(ТекущаяДатаСеанса(), "ДФ=гг") вернёт, например, «26». Альтернатива — Прав(Формат(Год(ТекущаяДатаСеанса()), "ЧГ=0"), 2), но вариант с ДФ короче и надёжнее.
Что вернёт Год(), если дата не заполнена?
Для пустой даты (01.01.0001) функция вернёт число 1, без ошибки. Поэтому перед сравнением года реквизита с текущим проверяйте дату через ЗначениеЗаполнено().
Что важно запомнить
Текущий год получают выражением Год(ТекущаяДатаСеанса()). Для строк используйте Формат() с ЧГ=0 или ДФ=гггг, в запросах передавайте дату параметром и отбирайте по границам периода, а для учётных данных всегда берите серверное время, а не время клиентского компьютера.