Работа с датами в 1С:Предприятие — одна из самых частых задач, с которыми сталкиваются как разработчики, так и обычные пользователи. Нередко требуется вытащить из полной даты только год — например, для группировки отчетов, фильтрации данных или анализа динамики по годам. В этой статье мы разберем все возможные способы получения года из даты: от простых встроенных функций до программного кода и SQL-запросов.
Важно понимать, что в 1С дата хранится как специальный тип данных Дата, и работа с ним имеет свои особенности. Мы рассмотрим не только стандартные методы, но и нюансы, которые помогут избежать ошибок при обработке дат в разных конфигурациях — от 1С:Бухгалтерии до 1С:Управления торговлей.
1. Встроенная функция Год() — самый простой способ
Начнем с самого очевидного и универсального метода. В 1С есть встроенная функция Год(), которая сразу возвращает год из переданной даты. Это идеальный вариант для большинства задач, где не требуется дополнительная обработка.
Синтаксис функции предельно прост:
Год(Дата)
Примеры использования:
- 📅 Чтобы получить текущий год:
Год(ТекущаяДата()) - 📄 Для даты из документа:
Год(Документ.Дата) - 🔍 При фильтрации в отчетах:
Год(ДатаДокумента) = 2026
Функция работает во всех версиях платформы 1С:Предприятие 8 (включая 8.3 и 8.2) и не требует подключения дополнительных библиотек. Единственное ограничение — на вход можно передавать только значения типа Дата. Если передать строку или число, система выдаст ошибку.
2. Использование формата даты для извлечения года
Иногда требуется не просто получить год как число, а отформатировать его в определенном виде — например, добавить префиксы или привести к строковому типу. В таких случаях удобно использовать функцию Формат().
Базовый синтаксис:
Формат(Дата, "Г=ДФ=ДЛГ")
Где "Г=ДФ=ДЛГ" — это формат, который указывает вывести только год длинным форматом (четыре цифры). Другие варианты:
| Формат | Пример вывода | Описание |
|---|---|---|
"Г" |
24 |
Короткий год (две цифры) |
"ГГ" |
2026 |
Полный год (четыре цифры) |
"ДФ=ДЛГ" |
2026 |
Длинный формат года |
"ДФ=гггг" |
2026 |
Альтернативный синтаксис |
Пример практического применения:
Сообщить(Формат(ТекущаяДата(), "ГГ") + " год"); // Выведет: "2026 год"
Если вам нужно получить год в виде строки с ведущими нулями (например, для имен файлов), используйте конструкцию Строка(Год(Дата)) или Формат(Год(Дата), "ЧГ=0;ЧЦ=4")
3. Программное извлечение года через структуру даты
Для более сложных сценариев, где требуется не только год, но и другие компоненты даты (месяц, день), можно разобрать дату на части. В 1С для этого предусмотрен метод НачалоГода() и работа со структурой даты.
Пример кода для разбора даты:
ДатаРождения = '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: Неучет високосных годов
При расчетах разницы между годами или определении количества дней в году важно помнить о високосных годах. В 1С для этого есть функция ДнейВГоду():
Если ДнейВГоду(ТекущаяДата()) = 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 года?
В некоторых конфигурациях 1С могут быть ограничения на обработку исторических дат. Проверьте настройки поддерживаемого диапазона дат в вашей базе. Для корректной работы с датами до 1900 года может потребоваться:
- Обновить платформу до актуальной версии
- Проверить настройки параметров сеанса
- Использовать альтернативные методы расчета
В большинстве случаев проблема решается обновлением конфигурации.
Как получить год из даты в мобильном приложении 1С?
В мобильном клиенте 1С доступны те же функции, что и в десктопной версии. Однако учитывайте:
- Производительность на мобильных устройствах может быть ниже
- Форматирование дат может отличаться в зависимости от локали устройства
- Для сложных операций с датами лучше выносить логику на сервер
Пример кода для мобильного клиента:
&НаКлиенте
Процедура ПоказатьГод(Команда)
ТекущийГод = Год(ТекущаяДата());
ПоказатьОповещениеПользователя(ТекущийГод);
КонецПроцедуры
Можно ли получить год из даты в отчетах СКД (Система Компоновки Данных)?
Да, в СКД можно извлекать год из даты несколькими способами:
- Через вычисляемые поля с использованием функции
ГОД() - Через параметры группировки по году
- Через пользовательские настройки отчета
Пример настройки вычисляемого поля:
- Откройте схему компоновки данных
- Добавьте новое вычисляемое поле
- В выражении укажите:
ГОД(ПолеДата) - Используйте это поле для группировки или отображения