При разработке отчетов в системе 1С:Предприятие 8 разработчики часто сталкиваются с необходимостью нестандартного отображения временных меток. Стандартные поля типа «Дата» выводят информацию в формате, заданном в операционной системе или настройках пользователя, что не всегда соответствует требованиям технического задания.
Для решения этой задачи используется механизм схемы компоновки данных (СКД) и специальная функция ВЫРАЗИТЬ. Она позволяет принудительно изменить тип данных прямо в запросе, обеспечивая единообразие вывода информации в печатных формах и аналитических таблицах.
В этой статье мы детально разберем синтаксис преобразования, нюансы работы с локалью и распространенные ошибки, возникающие при попытке «сплющить» дату в текстовое поле без потери смысла.
Синтаксис функции ВЫРАЗИТЬ в запросе СКД
Функция ВЫРАЗИТЬ является частью языка запросов 1С и предназначена для явного приведения типов. В контексте схемы компоновки данных она вызывается непосредственно в тексте запроса, который формируется системой автоматически или задается вручную в макете.
Базовая структура вызова выглядит следующим образом: необходимо указать исходное поле, целевой тип данных и, опционально, формат. Если вы хотите получить строковое представление даты, вторым аргументом указывается тип Строка.
Пример простейшего преобразования без дополнительных параметров выглядит так:
ВЫРАЗИТЬ(Период.ДатаНачала КАК Строка) КАК ДатаСтрока
Однако такой подход редко используется в чистом виде, так как результат зависит от системных настроек. Для полного контроля над внешним видом данных необходимо использовать третий параметр — форматную строку.
Используйте функцию ВЫРАЗИТЬ прямо в выражениях полей макета компоновки данных, чтобы не создавать лишние вычисляемые поля в наборе данных.
Форматирование даты при конвертации в строку
Самая частая причина использования приведения типов — необходимость получить дату в конкретном виде, например, ДД.ММ.ГГГГ или ГГГГ-ММ-ДД для выгрузки в сторонние системы. Для этого в функции ВЫРАЗИТЬ используется третий аргумент.
Форматная строка передается в виде текстового литерала. В ней используются специальные символы-заполнители, которые система заменяет на соответствующие части даты. Важно соблюдать регистр символов, так как 1С чувствительна к написанию спецификаторов формата.
Рассмотрим основные коды форматирования, которые доступны для использования:
- 📅 ДФ — день месяца (от 01 до 31)
- 📆 ММ — номер месяца (от 01 до 12)
- 🗓️ ГГГГ — год в четырехзначном формате
- ⏰ ЧЧ — часы (от 00 до 23)
- ⏱️ ММ (в контексте времени) — минуты
Чтобы собрать дату в привычном российском формате, запрос будет выглядеть следующим образом:
ВЫРАЗИТЬ(Период.ДатаНачала КАК Строка, "ДФ.ММ.ГГГГ") КАК ДатаТекст
Если же требуется формат для сортировки или экспорта в ISO-стандарт, порядок символов меняется:
ВЫРАЗИТЬ(Период.ДатаНачала КАК Строка, "ГГГГ-ММ-ДФ") КАК ДатаISO
Секреты разделителей
Вы можете использовать любые символы в качестве разделителей в форматной строке. Точки, дефисы, слеши или даже пробелы будут выведены в результирующую строку буквально. Например, формат "ДФ/ММ/ГГГГ" даст результат "25/12/2023".
Влияние региональных настроек и локали
Одной из скрытых проблем при работе с датами в СКД является зависимость от настроек локали пользователя. Даже если вы явно указали формат, система может попытаться адаптировать вывод под язык интерфейса, если это не запрещено явно.
В некоторых конфигурациях, особенно старых версиях платформы, форматная строка может игнорироваться, если в свойствах поля отчета стоит галочка «Автоформат». Это приводит к тому, что вместо ожидаемой строки пользователь видит дату в формате операционной системы.
⚠️ Внимание: При использовании функции ВЫРАЗИТЬ в отчетах, предназначенных для печати в разных часовых поясах, убедитесь, что исходная дата хранится в формате UTC или локальном времени сервера, чтобы избежать сдвига на несколько часов при конвертации.
Чтобы избежать неоднозначности, рекомендуется отключать автоматическое форматирование для полей, которые были приведены к строке вручную. Это делается в настройках макета компоновки данных на вкладке «Дополнительные настройки».
Также стоит учитывать, что названия месяцев и дней недели (если вы используете форматы типа ДД Месяц ГГГГ) будут выводиться на языке, установленном в профиле пользователя. Для жесткой фиксации языка можно использовать специальные модификаторы в строке формата, хотя это поддерживается не во всех версиях платформы.
Таблица популярных форматов даты и времени
Для удобства разработки ниже приведена сводная таблица с наиболее востребованными шаблонами форматирования. Вы можете копировать эти строки непосредственно в свой код запроса.
| Описание формата | Строка формата | Пример результата |
|---|---|---|
| Краткая дата (RU) | "ДФ.ММ.ГГ" | 31.12.23 |
| Полная дата (RU) | "ДФ.ММ.ГГГГ" | 31.12.2023 |
| Дата с месяцем словом | "ДФ ММММ ГГГГ" | 31 Декабрь 2023 |
| Дата и время | "ДФ.ММ.ГГГГ ЧЧ:ММ" | 31.12.2023 14:30 |
| ISO 8601 (для обмена) | "ГГГГ-ММ-ДФТЧЧ:ММ:СС" | 2023-12-31T14:30:00 |
Использование готовых шаблонов из таблицы ускоряет процесс написания отчета и снижает вероятность опечаток в спецификаторах. Обратите внимание на сочетание букв: ММ может означать как месяц, так и минуты, в зависимости от контекста surrounding символов.
Особенности работы с периодами и интервалами
В отчетах часто используются поля типа Период, которые содержат два значения: дату начала и дату конца. При выводе таких данных в одну строку возникает необходимость конкатенации (склеивания) результатов.
Функция ВЫРАЗИТЬ применяется к каждому полю отдельно, а затем они объединяются оператором сложения строк. Важно не забыть добавить разделитель между датами, иначе строки сольются в нечитаемый набор цифр.
Пример формирования строки периода:
ВЫРАЗИТЬ(Период.ДатаНачала КАК Строка, "ДФ.ММ.ГГГГ")
+ " - " +
ВЫРАЗИТЬ(Период.ДатаОкончания КАК Строка, "ДФ.ММ.ГГГГ")
Такой подход позволяет гибко управлять отображением интервалов. Вы можете менять разделитель на слово «по», добавлять переносы строк (символ | или Символы.ПС в зависимости от контекста исполнения) или выделять даты разными цветами через условное оформление.
При склеивании дат периода всегда проверяйте, что обе даты приведены к одному формату, иначе отчет будет выглядеть неаккуратно.
Альтернативные способы преобразования типов
Хотя функция ВЫРАЗИТЬ является основным инструментом в запросах, в СКД существуют и другие механизмы работы с представлением данных. Иногда целесообразнее использовать встроенные функции форматирования на уровне макета, а не менять тип данных в запросе.
Например, в выражениях макета можно использовать функцию Формат. Она работает аналогично, но применяется уже к готовым данным набора. Это полезно, когда нужно изменить отображение только для конкретной таблицы или диаграммы, не затрагивая логическую структуру данных.
Синтаксис выглядит так:
Формат(Период.ДатаНачала, "ДФ=дд.ММ.гггг")
Разница между подходами заключается в том, что ВЫРАЗИТЬ меняет тип данных на уровне базы данных или промежуточного набора (превращая Дату в Строку), а Формат оставляет тип «Дата», но меняет только визуальное отображение. Выбор метода зависит от того, планируете ли вы дальше выполнять над этим полем математические операции или сортировку.
⚠️ Внимание: Если вы преобразуете дату в строку через ВЫРАЗИТЬ, сортировка по этому полю будет происходить лексически (по алфавиту), а не хронологически. Это может привести к неверному порядку строк (например, 01.02.2023 встанет после 31.01.2023, но 10.01.2023 встанет перед 2.01.2023, если формат не фиксирован по длине).
Для сохранения правильной сортировки при текстовом выводе всегда используйте форматы с фиксированной длиной разрядов (добавляйте ведущие нули: ДФ вместо Д, ММ вместо М).
☑️ Чек-лист перед сохранением отчета
Частые ошибки и способы их устранения
Разработчики нередко сталкиваются с ситуацией, когда запрос выполняется без ошибок, но в результате вместо даты отображается пустая строка или набор символов «###». Это часто связано с несовместимостью типов или ошибкой в синтаксисе форматной строки.
Первая распространенная ошибка — использование недопустимых символов в формате. Язык запросов 1С строг: если вы напишете "dd.mm.yyyy" (строчными буквами) вместо "ДФ.ММ.ГГГГ", система может не распознать шаблон и вернуть значение по умолчанию или ошибку.
Вторая проблема возникает при попытке вывести дату в поле, тип которого в метаданных жестко определен как Число или Булево. В таких случаях СКД выдаст ошибку выполнения: «Невозможно привести тип Дата к типу...». Решение — создать новое вычисляемое поле в наборе данных с типом «Строка».
Третья ситуация связана с NULL-значениями. Если в базе дата не заполнена, функция ВЫРАЗИТЬ вернет пустую строку. Это корректное поведение, но его нужно учитывать при написании условий отбора, чтобы не потерять записи с незаполненными датами.
Можно ли использовать функцию ВЫРАЗИТЬ для времени?
Да, функция универсальна. Вы можете привести поле типа «Время» к строке, используя те же спецификаторы (ЧЧ:ММ:СС). Логика работы идентична работе с датой.
Почему сортировка по строковой дате работает неверно?
Сортировка строки происходит посимвольно. Чтобы даты сортировались правильно, формат должен быть «перевернутым» (ГГГГ-ММ-ДД) или иметь фиксированную длину всех компонентов с ведущими нулями.
Влияет ли ВЫРАЗИТЬ на производительность отчета?
Минимально. Преобразование типа происходит в памяти при формировании результата. Однако, если вы используете сложные вычисления в условиях отбора на основе преобразованной строки, это может замедлить выборку, так как индекс по дате не будет использоваться эффективно.
Как сделать дату прописью (например, «первое января»)?
Стандартными средствами функции ВЫРАЗИТЬ это сделать сложно. Для таких задач лучше использовать встроенные функции формата 1С на стороне клиента или расширенные настройки макета, поддерживающие вывод чисел и дат прописью.
Можно ли изменить язык месяца в строке формата?
Напрямую в строке формата функции ВЫРАЗИТЬ спецификатор языка отсутствует. Язык зависит от локали пользователя. Для жесткой фиксации требуется использование функций форматирования на уровне приложения с явным указанием культуры.