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

Важно понимать, что в дата хранится как специальный тип данных Дата, и работа с ним имеет свои особенности. Мы рассмотрим не только стандартные методы, но и нюансы, которые помогут избежать ошибок при обработке дат в разных конфигурациях — от 1С:Бухгалтерии до 1С:Управления торговлей.

1. Встроенная функция Год() — самый простой способ

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

Синтаксис функции предельно прост:

Год(Дата)

Примеры использования:

  • 📅 Чтобы получить текущий год: Год(ТекущаяДата())
  • 📄 Для даты из документа: Год(Документ.Дата)
  • 🔍 При фильтрации в отчетах: Год(ДатаДокумента) = 2026

Функция работает во всех версиях платформы 1С:Предприятие 8 (включая 8.3 и 8.2) и не требует подключения дополнительных библиотек. Единственное ограничение — на вход можно передавать только значения типа Дата. Если передать строку или число, система выдаст ошибку.

📊 Какой версии 1С вы пользуетесь?
8.3 (обычная форма)
8.3 (управляемая форма)
8.2
Другая

2. Использование формата даты для извлечения года

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

Базовый синтаксис:

Формат(Дата, "Г=ДФ=ДЛГ")

Где "Г=ДФ=ДЛГ" — это формат, который указывает вывести только год длинным форматом (четыре цифры). Другие варианты:

Формат Пример вывода Описание
"Г" 24 Короткий год (две цифры)
"ГГ" 2026 Полный год (четыре цифры)
"ДФ=ДЛГ" 2026 Длинный формат года
"ДФ=гггг" 2026 Альтернативный синтаксис

Пример практического применения:

Сообщить(Формат(ТекущаяДата(), "ГГ") + " год");  // Выведет: "2026 год"
💡

Если вам нужно получить год в виде строки с ведущими нулями (например, для имен файлов), используйте конструкцию Строка(Год(Дата)) или Формат(Год(Дата), "ЧГ=0;ЧЦ=4")

3. Программное извлечение года через структуру даты

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

Пример кода для разбора даты:

ДатаРождения = '19850315';

ГодРождения = Год(ДатаРождения); // 1985

МесяцРождения = Месяц(ДатаРождения); // 3

ДеньРождения = День(ДатаРождения); // 15

Особенно полезен этот подход, когда нужно:

  • 📊 Сравнивать даты по годам в циклах
  • 🔄 Преобразовывать даты из одного формата в другой
  • 📂 Генерировать имена файлов или папок по годам

Убедитесь, что переменная содержит тип Дата|Проверьте результат функцией ТипЗнч()|Используйте отладчик для пошагового выполнения|Сравните вывод с ожидаемым значением-->

4. Получение года в запросах 1С

При работе с языком запросов 1С извлечение года имеет свою специфику. Здесь нельзя использовать функцию Год() напрямую — вместо этого применяется конструкция ГОД() (заглавными буквами) или функции преобразования.

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

ВЫБРАТЬ

Документ.Ссылка КАК Ссылка,

ГОД(Документ.Дата) КАК ГодДокумента

ИЗ

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

ГДЕ

ГОД(Документ.Дата) = 2026

Важные нюансы:

  • 🔹 В запросах ГОД() возвращает число, а не дату
  • 🔹 Для фильтрации по диапазону годов удобно использовать МЕЖДУ
  • 🔹 В полях вычисляемых таблиц можно комбинировать с другими функциями
Что делать если ГОД() не работает?

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

Для группировки по годам в отчетах часто используется комбинация с ПЕРИОД:

ВЫБРАТЬ

ГОД(Документ.Дата) КАК Год,

СУММА(Документ.СуммаДокумента) КАК Итого

ИЗ

Документ.ПоступлениеТоваров КАК Документ

СГРУППИРОВАТЬ ПО

ГОД(Документ.Дата)

5. Работа с годом в управляемых формах

В управляемых формах 1С 8.3 часто требуется динамически отображать год или фильтровать данные по году. Здесь можно комбинировать серверные и клиентские методы.

Пример кода для фильтрации таблицы на форме по году:

&НаСервере

Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)

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

ПараметрыВыбора.Добавить("Год", ТекущийГод);

КонецПроцедуры

Для отображения текущего года в заголовке формы:

&НаКлиенте

Процедура ПриОткрытии(Отказ)

Заголовок = "Отчет за " + Формат(ТекущаяДата(), "ГГ") + " год";

ЭлементыФормы.ЗаголовокОтчета.Заголовок = Заголовок;

КонецПроцедуры

Особенности работы с годами в формах:

  • 🖥️ На клиенте доступны те же функции Год() и Формат(), что и на сервере
  • 🔄 При изменении года в параметрах отчета не забывайте обновлять данные через Обновить()
  • 📱 В мобильном клиенте 1С форматирование дат может отличаться
💡

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

6. Обработка дат в внешних отчетах и обработках

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

Пример кода для внешней обработки, которая анализирует данные по годам:

Процедура СформироватьОтчет(Команда)

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

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

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

Запрос.Текст =

"ВЫБРАТЬ

| ГОД(Документ.Дата) КАК Год,

| СУММА(Документ.Сумма) КАК Сумма

|ИЗ

| Документ.Реализация КАК Документ

|ГДЕ

| Документ.Дата МЕЖДУ &НачалоПериода И &КонецПериода

|СГРУППИРОВАТЬ ПО

| ГОД(Документ.Дата)";

Запрос.УстановитьПараметр("НачалоПериода", НачалоПериода);

Запрос.УстановитьПараметр("КонецПериода", КонецПериода);

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

ВыводРезультата(Результат);

КонецПроцедуры

Внешние обработки позволяют:

  • 📈 Строить графики динамики по годам
  • 📊 Сравнивать показатели между разными годами
  • 🔍 Анализировать сезонность по годам
💡

Для визуализации данных по годам в внешних отчетах удобно использовать библиотеку OneScript с графическими возможностями или интеграцию с Excel через COM-объект.

7. Типичные ошибки и как их избежать

При работе с извлечением года из даты разработчики часто сталкиваются с типичными ошибками. Рассмотрим самые распространенные и способы их решения.

Ошибка 1: Передача неверного типа данных

Функция Год() ожидает на входе тип Дата. Если передать строку или число, получим ошибку:

Год("2026-12-31");  // Ошибка!

Год(20261231); // Ошибка!

Решение: всегда преобразуйте входные данные к типу Дата:

Год(Дата(2026, 12, 31));  // Правильно

Ошибка 2: Неучет високосных годов

При расчетах разницы между годами или определении количества дней в году важно помнить о високосных годах. В для этого есть функция ДнейВГоду():

Если ДнейВГоду(ТекущаяДата()) = 366 Тогда

Сообщить("Этот год високосный!");

КонецЕсли;

Ошибка 3: Проблемы с временными зонами

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

Как проверить временную зону базы?

Выполните запрос ВЫБРАТЬ ТЕКУЩАЯДАТА() КАК ТекущаяДата и сравните результат с локальным временем на клиентском компьютере. Разница покажет смещение временной зоны.

Ошибка 4: Неправильное сравнение годов

При фильтрации данных часто ошибочно сравнивают даты как строки:

// Неверно:

Если Формат(Дата, "ГГ") = "2026" Тогда

// Правильно:

Если Год(Дата) = 2026 Тогда

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

8. Практическое применение: примеры из реальных задач

Рассмотрим несколько реальных сценариев, где извлечение года из даты становится ключевым элементом решения.

Задача 1: Группировка документов по годам в отчете

Требуется создать отчет, который показывает суммы продаж по каждому году. Решение:

ВЫБРАТЬ

ГОД(Документ.Дата) КАК Год,

СУММА(Документ.СуммаДокумента) КАК СуммаПродаж

ИЗ

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

СГРУППИРОВАТЬ ПО

ГОД(Документ.Дата)

УПОРЯДОЧИТЬ ПО

Год

Задача 2: Автоматическое создание папок по годам

При выгрузке документов в файловую систему нужно создавать папки с названиями годов:

Процедура СоздатьПапкуПоГоду(ДатаДокумента)

Год = Год(ДатаДокумента);

ПутьКПапке = "C:\Выгрузка\" + Год;

Если НЕ Каталог(ПутьКПапке).Существует() Тогда

СоздатьКаталог(ПутьКПапке);

КонецЕсли;

КонецПроцедуры

Задача 3: Фильтрация данных в динамическом списке

В управляемой форме нужно отфильтровать таблицу по выбранному году:

&НаСервере

Процедура ПриИзмененииГода(Элемент)

ГодФильтра = Число(ЭлементыФормы.ПолеГода.Значение);

ДинамическийСписок.Параметры.Год = ГодФильтра;

ДинамическийСписок.Обновить();

КонецПроцедуры

Задача 4: Анализ динамики по годам в графике

Для построения графика изменения показателей по годам:

ДанныеГрафика = Новый Структура;

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

"ВЫБРАТЬ

| ГОД(Дата) КАК Год,

| СУММА(Сумма) КАК Значение

|ИЗ

| РегистрНакопления.Продажи

|СГРУППИРОВАТЬ ПО

| ГОД(Дата)

|УПОРЯДОЧИТЬ ПО

| Год");

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

Пока НЕ Результат.КонецЦикла() Цикл

ТекущаяСтрока = Результат.Получить();

ДанныеГрафика.Вставить(ТекущаяСтрока.Год, ТекущаяСтрока.Значение);

КонецЦикла;

⚠️ Внимание: При работе с большими периодами (десятилетия) учитывайте, что функция Год() корректно обрабатывает даты в диапазоне от 0001 до 9999 года. Для исторических данных или футурологических прогнозов могут потребоваться дополнительные проверки.

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

Можно ли получить год из строки с датой без преобразования к типу Дата?

Технически можно, но это не рекомендуется. Например, если у вас строка в формате "31.12.2026", вы можете извлечь год через функции работы со строками:

СтрокаДата = "31.12.2026";

Год = Число(Прав(СтрокаДата, 4)); // Вернет 2026

Однако такой подход ненадежен, так как зависит от формата строки. Лучше всегда преобразовывать строку к типу Дата стандартными средствами.

Как получить год из даты в формате ISO (YYYY-MM-DD)?

Для дат в формате ISO используйте стандартное преобразование:

ДатаISO = "2026-12-31";

Дата1С = Дата(Год(ДатаISO), Месяц(ДатаISO), День(ДатаISO));

Год = Год(Дата1С);

Или более короткий вариант:

Год = Число(Лев("2026-12-31", 4));  // 2026
  
Почему функция Год() возвращает неверное значение для дат до 1900 года?

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

  1. Обновить платформу до актуальной версии
  2. Проверить настройки параметров сеанса
  3. Использовать альтернативные методы расчета

В большинстве случаев проблема решается обновлением конфигурации.

Как получить год из даты в мобильном приложении 1С?

В мобильном клиенте доступны те же функции, что и в десктопной версии. Однако учитывайте:

  • Производительность на мобильных устройствах может быть ниже
  • Форматирование дат может отличаться в зависимости от локали устройства
  • Для сложных операций с датами лучше выносить логику на сервер

Пример кода для мобильного клиента:

&НаКлиенте

Процедура ПоказатьГод(Команда)

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

ПоказатьОповещениеПользователя(ТекущийГод);

КонецПроцедуры

Можно ли получить год из даты в отчетах СКД (Система Компоновки Данных)?

Да, в СКД можно извлекать год из даты несколькими способами:

  1. Через вычисляемые поля с использованием функции ГОД()
  2. Через параметры группировки по году
  3. Через пользовательские настройки отчета

Пример настройки вычисляемого поля:

  1. Откройте схему компоновки данных
  2. Добавьте новое вычисляемое поле
  3. В выражении укажите: ГОД(ПолеДата)
  4. Используйте это поле для группировки или отображения