При формировании печатных форм в среде «1С:Предприятие» разработчики регулярно сталкиваются с необходимостью тонкой настройки выводимого текста. Типичный пример — вывод красивой шапки документа, где требуется скомбинировать статичный текст, динамические данные (например, название подразделения) и дату в определенном формате. При этом часто возникают две сложности: сбои при форматировании даты (когда вместо аккуратного месяца выводится полная дата со временем) и необходимость выделить (подчеркнуть, сделать жирным) только одно конкретное слово внутри ячейки.
В рамках этой статьи мы подробно разберем, почему возникают ошибки при работе с функцией Формат, как правильно конструировать форматные строки для дат и каким образом современные версии платформы «1С:Предприятие» (начиная с 8.3.24) позволяют элегантно решить проблему частичного оформления текста без «костылей» и дробления макета.
Проанализируем ситуацию, с которой столкнулся автор темы. При попытке вывести дату в формате «Месяц Год» (например, «Август 2018г.») без разделительной точки разработчик убрал точку из форматной строки, после чего система вместо ожидаемого результата выдала длинную строку вида 01.08.2018 0:00:00 2018г..
Выясним причину такого поведения платформы. Функция Формат в 1С крайне чувствительна к синтаксису параметра форматной строки (конструктор ДФ). Когда мы убираем точку между шаблонами месяца и года, пробел или другие нешаблонные символы начинают восприниматься парсером платформы как синтаксическая ошибка. Не сумев распознать некорректно составленную шаблонную строку, платформа «откатывается» к стандартному системному представлению даты по умолчанию — с выводом часов, минут и секунд.
Чтобы избежать этой ошибки, необходимо строго соблюдать правила экранирования символов в форматной строке:
ДФ должны быть обязательно заключены в одинарные кавычки '.ММММ (в верхнем или нижнем регистре), а для вывода четырехзначного года — шаблон гггг (для русской локализации) или yyyy (допускается платформой).Посмотрим на пример правильного написания форматной строки, которая решает проблему с лишней точкой и корректно выводит год с пробелом:
// Пример корректного форматирования даты без лишних знаков препинания
ФорматированнаяДата = Формат(НачалоПериода, "ДФ='ММММ гггг ""г.""'");
// Результат: "Август 2018 г."
Согласно стандартам разработки фирмы «1С» для обеспечения мультиязычности и корректной локализации, любые жестко заданные текстовые литералы внутри форматных строк рекомендуется оборачивать в функцию НСтр. Разберем по шагам, как это выглядит на практике:
// Форматирование даты в соответствии со стандартами 1С:ИТС
ФорматированнаяДата = Формат(НачалоПериода, НСтр("ru='ДФ=''ММММ гггг """"г."""'''"));
Следующая задача, которую озвучил автор — сделать так, чтобы название месяца выводилось исключительно прописными (заглавными) буквами (например, «АВГУСТ»). Для этого в платформе «1С:Предприятие» предусмотрена встроенная функция ВРег (В Регистр).
Проанализируем ситуацию: если мы применим функцию ВРег ко всей строке даты, то заглавными станут и другие символы, что в данном случае не критично для цифр, но может повлиять на сопутствующий текст. Правильным подходом будет изолированное форматирование названия месяца и последующая сборка итоговой строки.
Рассмотрим пример кода, решающий задачу приведения месяца к верхнему регистру:
// Извлекаем название месяца и приводим его к верхнему регистру
ИмяМесяцаВРег = ВРег(Формат(НачалоПериода, "ДФ=ММММ")); // Получим: "АВГУСТ"
ГодСтрока = Формат(НачалоПериода, "ДФ='гггг ""г.""'"); // Получим: "2018 г."
// Собираем строку для вывода
ИтоговыйТекст = "в месяце " + ИмяМесяцаВРег + " " + ГодСтрока;
Исторически в платформе 1С существовало серьезное ограничение: свойства оформления (шрифт, цвет, подчеркивание, жирность) применялись исключительно ко всей ячейке табличного документа целиком. Нельзя было выделить жирным шрифтом одно слово в середине предложения, если все это предложение находилось в одной ячейке макета.
Разработчикам приходилось использовать обходные пути («костыли»), которые в сообществе часто называют «мазохизмом»:
Начиная с версии платформы 8.3.24, разработчики фирмы «1С» устранили это многолетнее ограничение. Теперь ячейки табличного документа полноценно поддерживают тип данных ФорматированнаяСтрока.
Этот объект позволяет программно собирать текстовые блоки с различным визуальным оформлением (разные шрифты, цвета, размеры, стили начертания) и передавать их напрямую в параметры ячеек макета. Начиная с версии 8.3.27, эта технология получила развитие и в Системе компоновки данных (СКД), что позволяет использовать форматированные строки в отчетах.
Давайте подробно разберем по шагам, как решить задачу автора темы с помощью объекта ФорматированнаяСтрока без изменения структуры колонок макета.
Сначала мы получаем нужные текстовые переменные, переводя название месяца в верхний регистр с помощью функции ВРег.
Для создания подчеркнутого текста нам понадобится специальный объект Шрифт. Конструктор этого объекта принимает несколько параметров. Шестой параметр отвечает за подчеркивание текста. Мы передадим туда значение Истина.
Мы создаем объект ФорматированнаяСтрока, передавая в него последовательно обычные текстовые фрагменты и фрагменты, оформленные особым шрифтом.
Проанализируем программный код реализации этого алгоритма:
// 1. Формируем текстовые составляющие даты
МесяцВРег = ВРег(Формат(НачалоПериода, "ДФ=ММММ")); // Получаем "АВГУСТ"
ГодСтрока = Формат(НачалоПериода, "ДФ='гггг ""г.""'"); // Получаем "2018 г."
// 2. Определяем шрифт с подчеркиванием
// Параметры конструктора: ИмяШрифта, Размер, Жирный, Наклонный, Подчеркнутый
ШрифтПодчеркнутый = Новый Шрифт(,,,,, Истина);
// 3. Создаем элементы форматирования
Часть1 = "в месяце ";
Часть2_Подчеркнутая = Новый ФорматированнаяСтрока(МесяцВРег, ШрифтПодчеркнутый);
Часть3 = " " + ГодСтрока;
// 4. Объединяем части в единый объект ФорматированнаяСтрока
ИтоговыйЗаголовок = Новый ФорматированнаяСтрока(Часть1, Часть2_Подчеркнутая, Часть3);
// 5. Передаем готовую форматированную строку в параметр ячейки макета
ОбластьМакета = Макет.ПолучитьОбласть("Шапка");
ОбластьМакета.Параметры.Заголовок = ИтоговыйЗаголовок;
// Выводим область в результирующий табличный документ
ТабличныйДокумент.Вывести(ОбластьМакета);
Использование этого подхода полностью исключает необходимость разбивать ячейку макета на множество мелких ячеек. Вы получаете чистый, красивый и легко поддерживаемый код, а печатная форма сохраняет строгость и адаптивность при любых изменениях данных.
Если текст в ячейке статичен и вам не требуется собирать его программно из переменных базы данных, настроить частичное форматирование можно интерактивно прямо в режиме конфигуратора (для версий платформы 8.3.24 и выше):
Таким образом, современные возможности платформы «1С:Предприятие» полностью закрывают старые архитектурные пробелы, предоставляя разработчикам гибкие и удобные инструменты для создания качественных печатных форм и отчетов, соответствующих любым дизайнерским и техническим требованиям.