Работа с временными метками является фундаментальной задачей для любого разработчика платформы 1С:Предприятие. Независимо от конфигурации, будь то Бухгалтерия предприятия или самописная система, часто возникает необходимость использовать текущую дату для фильтрации отчетов, расчета сроков или формирования уникальных идентификаторов.

Платформа предоставляет мощный встроенный инструментарий для манипуляций с датами, однако начинающие специалисты иногда путают понятия "текущая дата", "текущий год" и "начало года". Понимание разницы между этими сущностями критически важно для написания корректного кода, который не сломается при смене календарного периода.

В этой статье мы детально разберем синтаксис встроенных функций, рассмотрим особенности обработки дат в запросах и проанализируем типичные сценарии использования. Мы также обсудим вопросы производительности и то, как правильно извлекать числовое значение года для дальнейшей логики программы.

Базовые функции работы с датой

Для получения текущего года в языке существует специализированная функция Год(). Она принимает в качестве аргумента значение типа Дата и возвращает число типа Число, соответствующее году указанной даты. Это наиболее прямой и эффективный способ решения задачи.

Чтобы получить актуальное значение, необходимо передать в функцию системную дату. Для этого используется функция ТекущаяДата(), которая возвращает дату и время на момент вызова. Комбинация этих двух вызовов обеспечивает получение актуального года в любой момент выполнения кода.

Пример использования в модуле объекта выглядит следующим образом:

ТекущийГод = Год(ТекущаяДата());

Сообщить("Сейчас идет " + ТекущийГод + " год.");

Важно понимать, что функция Год() игнорирует месяц, день и время, выделяя только старшую часть даты. Это делает код устойчивым к изменениям внутри года, но зависимым от системных часов сервера или клиента.

⚠️ Внимание: Функция ТекущаяДата() возвращает время с точностью до секунды. Если ваш алгоритм требует сравнения дат без учета времени, обязательно используйте функцию НачалоДня() перед передачей аргумента, чтобы избежать логических ошибок при сравнении.

Существует также альтернативный способ через свойство объекта даты, если вы работаете с уже существующей переменной типа Дата. Однако для получения именно текущего момента вызов встроенной функции остается стандартом де-факто в сообществе разработчиков.

Извлечение года в запросах к базе данных

При работе с большими объемами данных использование циклов в коде 1С неэффективно. Гораздо правильнее выполнять фильтрацию или выборку данных непосредственно на стороне СУБД с помощью языка запросов. Синтаксис запросов 1С имеет свои особенности работы с датами.

Для извлечения года в тексте запроса используется функция ГОД(). Она работает аналогично встроенной функции языка, но выполняется сервером базы данных. Это позволяет строить сложные условия отбора, например, выбирать документы только за текущий календарный год.

Рассмотрим пример построения запроса с использованием параметра:

Запрос = Новый Запрос;

Запрос.Текст = "ВЫБРАТЬ

| Документы.РеализацияТоваровУслуг.Ссылка КАК Ссылка,

| ГОД(Документы.РеализацияТоваровУслуг.Дата) КАК ГодДокумента

|ИЗ

| Документ.РеализацияТоваровУслуг КАК Документы.РеализацияТоваровУслуг

|ГДЕ

| ГОД(Документы.РеализацияТоваровУслуг.Дата) = &Год";

Запрос.УстановитьПараметр("Год", Год(ТекущаяДата()));

Результат = Запрос.Выполнить();

Использование параметров в запросах (&Год) является обязательным правилом хорошего тона. Это не только защищает от SQL-инъекций (хотя в 1С механизм иной), но и позволяет серверу кэшировать план выполнения запроса, что существенно повышает производительность системы.

В табличной части отчета или обработки вы часто будете сталкиваться с необходимостью группировки данных по годам. Функция ГОД() в конструкции СГРУППИРОВАТЬ ПО позволяет агрегировать данные за произвольные периоды без написания сложного кода на клиенте.

Оптимизация запросов с датами

При использовании функций над полями в условии ГДЕ (например, ГОД(Дата) = 2026) индекс по полю Дата может не использоваться. Для максимальной скорости лучше задавать диапазон: ГДЕ Дата >= '2026.01.01' И Дата < '2026.01.01'.

Работа с началом и концом года

Часто задача получения года является промежуточным этапом для определения границ периода. В бухгалтерском и управленческом учете критически важно уметь получать дату начала года или конца года для расчета накопительных итогов.

Для этих целей в платформе предусмотрены функции НачалоГода() и КонецГода(). Они принимают дату и возвращают новую дату, соответствующую 1 января или 31 декабря соответственно. Это избавляет разработчика от ручных вычислений с месяцами и днями.

  • 📅 НачалоГода(Дата) — возвращает дату 1 января года, к которому относится переданная дата.
  • 🏁 КонецГода(Дата) — возвращает дату 31 декабря года, к которому относится переданная дата.
  • ТекущаяДата() — возвращает полную дату и время "здесь и сейчас".

Комбинирование этих функций позволяет создавать гибкие алгоритмы проверки периодов. Например, чтобы проверить, относится ли документ к текущему году, можно сравнить его дату с результатом работы НачалоГода(ТекущаяДата()).

Пример проверки принадлежности периода:

НачалоПериода = НачалоГода(ТекущаяДата());

КонецПериода = КонецГода(ТекущаяДата());

Если ДатаДокумента >= НачалоПериода И ДатаДокумента <= КонецПериода Тогда

Сообщить("Документ относится к текущему году");

КонецЕсли;

💡

Использование функций начала и конца периода предпочтительнее ручного конструирования дат, так как они автоматически учитывают високосные годы и корректно работают на разных версиях платформы.

Форматирование и вывод даты

Полученное числовое значение года часто требуется вывести пользователю в понятном виде или сохранить в строковом поле. Для этого используются механизмы форматирования строк и объекты типа ФорматированнаяСтрока.

Простая конкатенация строк подходит для служебных сообщений, но для интерфейса лучше использовать функцию Формат(). Она позволяет задать шаблон вывода, включающий не только год, но и другие компоненты даты в нужном порядке.

Примеры различных способов отображения:

ГодЧислом = Год(ТекущаяДата());

СтрокаГода = Строка(ГодЧислом); // Преобразование в "2026"

ПолнаяДата = ТекущаяДата();

Отформатировано = Формат(ПолнаяДата, "ДФ='yyyy'"); // Только год через шаблон

Отформатировано2 = Формат(ПолнаяДата, "ДФ='dd.MM.yyyy'"); // Полная дата

Использование шаблона "ДФ='yyyy'" является наиболее гибким методом, так как позволяет извлекать год непосредственно из объекта даты без промежуточного вызова функции Год(), если конечная цель — именно строковое представление.

При выводе данных в печатные формы или отчеты типа Табличный документ, форматирование играет ключевую роль. Неправильный формат может привести к тому, что год отобразится как двухзначное число (например, "24" вместо "2026"), что недопустимо в официальных документах.

Особенности работы в управляемых формах

В современной архитектуре управляемых приложений (Такси) существуют ограничения на выполнение тяжелых операций на клиенте. Получение текущей даты относится к легким операциям, но контекст выполнения все же имеет значение.

Функция ТекущаяДата() доступна как на клиенте, так и на сервере. Однако значения могут различаться, если часы на рабочем месте пользователя и на сервере 1С рассинхронизированы. Для задач, связанных с проведением документов и расчетом итогов, всегда используйте серверный контекст.

Если вам нужно отобразить текущий год в поле формы при открытии, это можно сделать в обработчике ПриСозданииНаСервере. Присваивание значения напрямую в модуле формы без серверного вызова возможно, но менее надежно с точки зрения единого времени системы.

📊 Где вы чаще всего получаете текущий год?
В модуле объекта
В запросе
В модуле формы
В консольных командах

⚠️ Внимание: В тонком клиенте время может отличаться от серверного из-за настроек часового пояса или ручной подстройки пользователем. Критичная бизнес-логика (проводки, закрытие периодов) должна опираться исключительно на серверное время.

Типичные ошибки и отладка

Разработчики часто совершают ошибки при сравнении дат, забывая о временной составляющей. Попытка сравнить дату документа (которая может быть 15.01.2026 10:00) с датой начала года (01.01.2026 00:00) через функцию Год() безопасна, но прямое сравнение дат требует осторожности.

Еще одна распространенная проблема — работа с "нулевыми" датами. Если переменная типа Дата не заполнена, попытка получить от нее год приведет к ошибке выполнения. Всегда проверяйте дату на пустоту перед использованием функций извлечения частей даты.

Пример безопасного кода с проверкой:

Если Не ПустаяДата(ВходящаяДата) Тогда

ЗначениеГода = Год(ВходящаяДата);

Иначе

ЗначениеГода = 0; // Или обработка ошибки

КонецЕсли;

При отладке сложных алгоритмов удобно использовать окно отладки и watch-списки. Отслеживайте не только значение года, но и полный объект даты, чтобы убедиться, что функция ТекущаяДата() возвращает ожидаемый результат в момент шага по коду.

Функция / Метод Возвращаемый тип Описание Контекст
Год(Дата) Число Извлекает номер года (например, 2026) Клиент / Сервер
ТекущаяДата() Дата Возвращает текущие дату и время системы Клиент / Сервер
ГОД() (в запросе) Число Аналог функции для языка запросов Сервер (СУБД)
НачалоГода(Дата) Дата Возвращает дату 1 января указанного года Клиент / Сервер

☑️ Проверка корректности работы с годом

Выполнено: 0 / 4

Часто задаваемые вопросы (FAQ)

Как получить текущий год в виде строки "2026"?

Используйте комбинацию функций: Строка(Год(ТекущаяДата())). Это преобразует числовое значение года в строковый тип данных.

В чем разница между Год() и НачалоГода()?

Функция Год() возвращает число (например, 2026), а функция НачалоГода() возвращает дату (01.01.2026 00:00:00). Выбор зависит от того, что нужно для дальнейшей логики.

Можно ли использовать Год() в условиях отбора СКД?

Да, в Системе Компоновки Данных (СКД) можно использовать функцию ГОД() в выражениях полей и условиях отбора, синтаксис аналогичен обычным запросам.

Почему на клиенте и сервере год может отличаться?

Это возможно, если часы на компьютере пользователя и на сервере 1С показывают разное время или установлены в разных часовых поясах. Для отчетности всегда используйте серверное время.

Как получить год из строки "15.01.2026"?

Сначала преобразуйте строку в дату с помощью функции Дата() или ПолучитьДату(), а затем примените функцию Год() к полученному значению.