При переходе с платформы 1С:Предприятие 8 на версию 7.7 или при совместной поддержке конфигураций разработчики часто сталкиваются с неожиданным поведением функции Формат(). Попытка применить шаблон формата даты вида "ДФ='yy'" или произвольные комбинации букв не приводит к желаемому результату — вместо двух цифр года система возвращает полную дату.
Разберем причины такого поведения платформы 1С 7.7 и рассмотрим все корректные способы получения двухзначного представления года из значения типа Дата.
Выясним причину возникновения ошибки. Конструкция ДФ=... (формат даты) является частью синтаксиса платформы 1С:Предприятие 8. В платформе 1С 7.7 механизм форматирования устроен совершенно иначе:
Формат() для типа Дата принимает только строго определенный перечень системных шаблонов (например, "ДДДММГГ", "ДДДММГГГГ", "ДГГММДД", "ДГГГГММДД", "ДДД ММММ ГГГГ")."ДГГ" или "Д ГГ") невозможно. Платформа не умеет разбирать произвольные маски.Формат() передана нераспознанная или некорректная строка формата, 1С 7.7 не вызывает исключительную ситуацию, а просто выводит дату в стандартном системном представлении (ДД.ММ.ГГ или ДД.ММ.ГГГГ).Формат() в 1С 7.7 нельзя извлечь только число, только месяц или только год. Для этого всегда требуется комбинировать функции работы со строками, датами или числами.Проанализируем наиболее распространенный вариант решения. Мы форматируем дату в компактный строковый вид и с помощью строковой функции Прав() отсекаем два последних символа, в которых содержится год:
ГодСтр = Прав(Формат(ДатаДок, "ДДММГГ"), 2);
Сообщить(ГодСтр); // Выведет "17" для даты 2017 года
Этот метод удобен тем, что шаблон "ДДММГГ" возвращает фиксированную строку из 8 символов (например, 07.07.17), и последние 2 символа всегда гарантированно соответствуют двухзначному году.
Рассмотрим альтернативный строковый вариант. Если применить предопределенный шаблон "ДГГММДД", год будет расположен в самом начале строки. Для его извлечения применим функцию Лев():
ГодСтр = Лев(Формат(ДатаДок, "ДГГММДД"), 2);
Сообщить(ГодСтр); // Выведет "17"
Если же вам требуется получить полный четырехзначный год, можно использовать схожую конструкцию:
ПолныйГод = Лев(Формат(ДатаДок, "ДГГГГММДД"), 4);
Сообщить(ПолныйГод); // Выведет "2017"
Разберем по шагам наиболее универсальный и семантически правильный подход. Встроенный язык 1С 7.7 содержит специализированную функцию ДатаГод(), возвращающую числовое значение года (например, 2017). Чтобы получить из него две последние цифры в виде строки, преобразуем результат в строку и возьмем два правых символа:
ГодЧислом = ДатаГод(ДатаДок);
ГодСтр = Прав(Строка(ГодЧислом), 2);
Сообщить(ГодСтр);
Такой подход не зависит от региональных настроек вывода даты в операционной системе и работает быстрее строкового форматирования всей даты.
Посмотрим на пример математического решения. Если необходимо вычислить остаток от деления года на 100 с гарантированным сохранением ведущего нуля (актуально для годов с 2000 по 2009, где должно получиться "05", а не "5"), применим числовой формат "Ч(0)2.0":
ГодЧисло = ДатаГод(ДатаДок);
ДвухзначныйГод = ГодЧисло - Цел(ГодЧисло / 100) * 100;
ГодСтр = Формат(ДвухзначныйГод, "Ч(0)2.0");
Сообщить(ГодСтр);
В платформе 1С 7.7 невозможно получить двухзначный год одной только форматной строкой, так как маски типа "ДФ='yy'" появились только в 1С:Предприятии 8. Оптимальными и надежными решениями в 7.7 являются вызов Прав(Формат(ДатаДок, "ДДММГГ"), 2) или использование комбинации Прав(Строка(ДатаГод(ДатаДок)), 2).