Каждый разработчик 1С рано или поздно сталкивается с простой, на первый взгляд, задачей: извлечь год из значения типа Дата и представить его в виде строки (например, для вывода в печатную форму или отчет как «2026 год»). Однако стандартный подход с использованием функций Год() и Строка() преподносит неприятный сюрприз — в результирующей строке появляется странный пробел: «2 026» вместо ожидаемого «2026».
В этой статье мы подробно разберем, откуда берется этот загадочный пробел, почему стандартная функция СтрЗаменить() с обычным пробелом не решает проблему, и изучим самые надежные и изящные способы получения года без лишних символов группировки.
Давайте проанализируем, почему возникает эта проблема. Функция Год(Объект.Дата) возвращает обычное число (тип Число). Когда мы пытаемся преобразовать это число в строку неявно или с помощью функции Строка(), платформа 1С автоматически применяет к нему региональные настройки операционной системы.
В большинстве русскоязычных локалей для удобства чтения чисел принято разделять группы разрядов (тысячи, миллионы) пробелами. Именно поэтому число 2026 превращается в строку «2 026». Но самое главное скрывается внутри этой строки: разделителем выступает не обычный пробел (код символа 32), а так называемый неразрывный пробел (символ с кодом 160 или Символы.НПП в терминологии 1С).
Попытка убрать его с помощью конструкции:
Результат = СтрЗаменить(Строка(Год(Объект.Дата)), " ", "") + " год";
заканчивается неудачей, так как обычный пробел в кавычках " " не соответствует неразрывному пробелу, который находится внутри строки. Символ просто не обнаруживается системой, и строка остается неизменной.
Ниже мы подробно рассмотрим несколько профессиональных подходов к решению этой задачи.
Самый простой, лаконичный и методологически правильный способ получить год в виде готовой строки — применить функцию Формат() непосредственно к исходной дате, минуя промежуточное получение числа.
Для этого используется конструктор форматной строки и параметр ДФ (формат даты). Рассмотрим этот пример на практике:
ГодСтрокой = Формат(Объект.Дата, "ДФ=гггг");
// Результат: "2026"
Если вам требуется сразу добавить к полученному значению слово «год», это можно сделать непосредственно внутри форматной строки. Любой произвольный текст в маске формата необходимо заключать в одинарные кавычки:
ГодС Текстом = Формат(Объект.Дата, "ДФ='гггг ""год""'");
// Результат: "2026 год"
В зависимости от требований к интерфейсу или печатной форме, платформа 1С поддерживает различные шаблоны форматирования года:
ДФ=гггг (или ДФ=yyyy) — выводит четырехзначный год (например, «2026»).ДФ=гг (или ДФ=yy) — выводит двузначный год с лидирующим нулем для первых годов века (например, «26» или «05»).ДФ=г (или ДФ=y) — выводит двузначный год без лидирующего нуля (например, для 2005 года вернет «5»).Если по каким-то причинам в вашем коде уже используется функция Год() и вы работаете с числовым представлением, его можно правильно преобразовать в строку без разделения разрядов. Для этого используется параметр форматной строки ЧГ=0 (Группировка Числа = 0):
ГодЧислом = Год(Объект.Дата);
ГодСтрокой = Формат(ГодЧислом, "ЧГ=0");
// Результат: "2026"
Параметр ЧГ=0 явно указывает платформе 1С:Предприятие, что число не нужно разбивать на группы по тысячам. Этот вариант полностью исключает появление любых неразрывных пробелов независимо от региональных настроек операционной системы пользователя.
Существует еще один очень элегантный и быстрый способ преобразовать год в чистую строку без использования тяжелой функции Формат(). Это встроенная функция платформы XMLСтрока(). Она предназначена для сериализации данных в XML-формат в соответствии со стандартами XML Schema:
ГодСтрокой = XMLСтрока(Год(Объект.Дата));
// Результат: "2026"
Почему это работает и в чем преимущества:
XMLСтрока() гарантированно возвращает число без каких-либо пробелов, запятых или апострофов.XMLСтрока() работает значительно быстрее, чем вызов универсальной функции Формат(), так как не требует парсинга форматной строки. Это может быть критично при обработке больших массивов данных в циклах.Если вам все же необходимо очистить уже готовую строку, полученную стандартными методами, обычная замена СтрЗаменить(Строка, " ", "") не сработает. Нам нужно явно передать функции СтрЗаменить() неразрывный пробел.
Сделать это можно двумя способами:
// Вариант А: Использование системного перечисления Символы
ГодСтрокой = СтрЗаменить(Строка(Год(Объект.Дата)), Символы.НПП, "");
// Вариант Б: Использование функции Символ() с кодом 160
ГодСтрокой = СтрЗаменить(Строка(Год(Объект.Дата)), Символ(160), "");
Важное предупреждение: Использование ручной очистки строки через Символы.НПП в стандартах разработки «1С:Предприятие 8» считается плохим стилем (anti-pattern). Если у пользователя в региональных настройках системы в качестве разделителя разрядов установлена не запятая или неразрывный пробел, а, например, апостроф (что часто встречается в швейцарской или немецкой локали), данный код не удалит разделитель. Число преобразуется в строку вида «2'026», и замена не сработает. Всегда отдавайте предпочтение методам Формат() или XMLСтрока().
Если задача извлечения года решается на этапе выборки данных из базы данных, наиболее производительным решением будет получение года непосредственно внутри текста запроса с помощью встроенной функции ГОД():
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| ГОД(Продажи.Период) КАК ГодПродаж
|ИЗ
| РегистрНакопления.Продажи КАК Продажи";
В результате выполнения этого запроса поле ГодПродаж будет иметь чистый числовой тип данных. Важно понимать, что на уровне СУБД никаких пробелов в этом числе нет. Неразрывные пробелы появятся только в тот момент, когда вы попытаетесь вывести это число на форму, в табличный документ или преобразуете его в строку в коде 1С. Форматировать и очищать значение нужно именно на этапе вывода информации пользователю.
Подведем итог и определимся, какой метод выбрать в зависимости от контекста разработки:
Формат(Дата, "ДФ=гггг"). Это гарантирует корректное представление информации с учетом выбранного языка интерфейса.XMLСтрока(Год(Дата)). Данный метод полностью исключает влияние настроек операционной системы и гарантирует стабильную работу обменов данными.СтрЗаменить() совместно с Символы.НПП для очистки чисел, так как это снижает надежность и переносимость вашего программного кода.