Как в 1С 7.7 получить двухзначный номер года из даты и почему не работает форматная строка ДФ

Программист 1С v7.7 IT и автоматизация бизнеса
← На главную

При переходе с платформы 1С:Предприятие 8 на версию 7.7 или при совместной поддержке конфигураций разработчики часто сталкиваются с неожиданным поведением функции Формат(). Попытка применить шаблон формата даты вида "ДФ='yy'" или произвольные комбинации букв не приводит к желаемому результату — вместо двух цифр года система возвращает полную дату.

Разберем причины такого поведения платформы 1С 7.7 и рассмотрим все корректные способы получения двухзначного представления года из значения типа Дата.

Почему синтаксис ДФ не поддерживается в 1С:Предприятии 7.7

Выясним причину возникновения ошибки. Конструкция ДФ=... (формат даты) является частью синтаксиса платформы 1С:Предприятие 8. В платформе 1С 7.7 механизм форматирования устроен совершенно иначе:

  1. Фиксированные шаблоны: функция Формат() для типа Дата принимает только строго определенный перечень системных шаблонов (например, "ДДДММГГ", "ДДДММГГГГ", "ДГГММДД", "ДГГГГММДД", "ДДД ММММ ГГГГ").
  2. Отсутствие произвольной компоновки: составить произвольный шаблон только из букв года (например, "ДГГ" или "Д ГГ") невозможно. Платформа не умеет разбирать произвольные маски.
  3. Поведение по умолчанию при ошибке: если в функцию Формат() передана нераспознанная или некорректная строка формата, 1С 7.7 не вызывает исключительную ситуацию, а просто выводит дату в стандартном системном представлении (ДД.ММ.ГГ или ДД.ММ.ГГГГ).
  4. Невозможность получить часть даты только форматированием: средствами одной лишь функции Формат() в 1С 7.7 нельзя извлечь только число, только месяц или только год. Для этого всегда требуется комбинировать функции работы со строками, датами или числами.

Способ 1. Получение года через стандартный формат и функцию Прав

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


ГодСтр = Прав(Формат(ДатаДок, "ДДММГГ"), 2);
Сообщить(ГодСтр); // Выведет "17" для даты 2017 года

Этот метод удобен тем, что шаблон "ДДММГГ" возвращает фиксированную строку из 8 символов (например, 07.07.17), и последние 2 символа всегда гарантированно соответствуют двухзначному году.

Способ 2. Использование формата с годом в начале и функции Лев

Рассмотрим альтернативный строковый вариант. Если применить предопределенный шаблон "ДГГММДД", год будет расположен в самом начале строки. Для его извлечения применим функцию Лев():


ГодСтр = Лев(Формат(ДатаДок, "ДГГММДД"), 2);
Сообщить(ГодСтр); // Выведет "17"

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


ПолныйГод = Лев(Формат(ДатаДок, "ДГГГГММДД"), 4);
Сообщить(ПолныйГод); // Выведет "2017"

Способ 3. Использование встроенной функции ДатаГод

Разберем по шагам наиболее универсальный и семантически правильный подход. Встроенный язык 1С 7.7 содержит специализированную функцию ДатаГод(), возвращающую числовое значение года (например, 2017). Чтобы получить из него две последние цифры в виде строки, преобразуем результат в строку и возьмем два правых символа:


ГодЧислом = ДатаГод(ДатаДок);
ГодСтр = Прав(Строка(ГодЧислом), 2);
Сообщить(ГодСтр);

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

Способ 4. Математический расчет с форматированием числа

Посмотрим на пример математического решения. Если необходимо вычислить остаток от деления года на 100 с гарантированным сохранением ведущего нуля (актуально для годов с 2000 по 2009, где должно получиться "05", а не "5"), применим числовой формат "Ч(0)2.0":


ГодЧисло = ДатаГод(ДатаДок);
ДвухзначныйГод = ГодЧисло - Цел(ГодЧисло / 100) * 100;
ГодСтр = Формат(ДвухзначныйГод, "Ч(0)2.0");
Сообщить(ГодСтр);

Итоги

В платформе 1С 7.7 невозможно получить двухзначный год одной только форматной строкой, так как маски типа "ДФ='yy'" появились только в 1С:Предприятии 8. Оптимальными и надежными решениями в 7.7 являются вызов Прав(Формат(ДатаДок, "ДДММГГ"), 2) или использование комбинации Прав(Строка(ДатаГод(ДатаДок)), 2).

← На главную