В процессе разработки интерфейсов на платформе «1С:Предприятие 8» часто возникает задача предоставить пользователю возможность индивидуальной настройки визуальных элементов. Одной из таких настроек является выбор шрифта. Однако начинающие разработчики быстро сталкиваются с техническим ограничением: в списке доступных типов данных для реквизитов справочников или документов отсутствует тип Шрифт. Это связано с тем, что шрифт является сложным системным объектом, а не простым типом данных, который можно напрямую записать в таблицу базы данных.
В данной статье мы подробно разберем, как обойти это ограничение, рассмотрим несколько надежных способов сохранения шрифта и проанализируем нюансы работы с ними в управляемых формах.
Это один из самых современных и гибких методов. Суть его заключается в преобразовании объекта Шрифт в текстовую строку формата XML, которую можно сохранить в обычный строковый реквизит неограниченной длины.
Многие пытаются использовать метод СериализаторXDTO.XMLСтрока(ВыбранныйШрифт), но получают ошибку отображения типов. Это происходит потому, что XMLСтрока предназначена для простых типов. Для работы с объектом Шрифт нам необходимо использовать механизм записи XML. Разберем правильный алгоритм реализации:
// Выбор шрифта пользователем на клиенте
Диалог = Новый ДиалогВыбораШрифта;
Если Диалог.Выбрать() Тогда
ВыбранныйШрифт = Диалог.Шрифт;
// Подготавливаем запись XML
Запись = Новый ЗаписьXML();
Запись.УстановитьСтроку();
// Сериализуем объект Шрифт в XML
СериализаторXDTO.ЗаписатьXML(Запись, ВыбранныйШрифт);
// Получаем строку для записи в реквизит (например, Объект.ШрифтТекст)
СтрокаДляСохранения = Запись.Закрыть();
Объект.ШрифтТекст = СтрокаДляСохранения;
КонецЕсли;
Для обратного преобразования строки в объект Шрифт (например, при открытии формы) мы будем использовать чтение XML:
// Преобразование строки обратно в объект Шрифт
Чтение = Новый ЧтениеXML();
Чтение.УстановитьСтроку(Объект.ШрифтТекст);
ШрифтИзБазы = СериализаторXDTO.ПрочитатьXML(Чтение, Тип("Шрифт"));
Преимущество этого метода в том, что XML-структура сохраняет все нюансы объекта, включая то, является ли шрифт абсолютным или это шрифт стиля.
Этот метод считается классическим для платформы 1С. Мы создаем реквизит объекта с типом ХранилищеЗначения. Этот тип данных позволяет упаковать любой объект 1С (включая шрифты, цвета или структуры) в бинарные данные.
Проанализируем особенности работы с этим типом в управляемом приложении. Основная сложность заключается в том, что реквизит типа ХранилищеЗначения не может существовать на стороне клиента. Нам придется передавать данные на сервер.
Рассмотрим пошагово процесс сохранения:
ХранилищеЗначения и записывается в реквизит объекта.
&НаКлиенте
Процедура ВыбратьИСохранитьШрифт()
Диалог = Новый ДиалогВыбораШрифта;
Если Диалог.Выбрать() Тогда
СохранитьШрифтНаСервере(Диалог.Шрифт);
КонецЕсли;
КонецПроцедуры
&НаСервере
Процедура СохранитьШрифтНаСервере(ВыбранныйШрифт)
ОбъектДляЗаписи = РеквизитФормыВЗначение("Объект");
ОбъектДляЗаписи.РеквизитХранилищеШрифта = Новый ХранилищеЗначения(ВыбранныйШрифт);
ОбъектДляЗаписи.Записать();
ЗначениеВРеквизитФормы(ОбъектДляЗаписи, "Объект");
КонецПроцедуры
Чтобы применить сохраненный шрифт, например, к декорации или полю ввода при открытии формы, выполним обратную операцию:
&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
ШрифтОбъект = Объект.РеквизитХранилищеШрифта.Получить();
Если ШрифтОбъект <> Неопределено Тогда
Элементы.НадписьПример.Шрифт = ШрифтОбъект;
КонецЕсли;
КонецПроцедуры
Иногда нам нужно, чтобы параметры шрифта были доступны для редактирования вручную без диалогового окна или передавались во внешние системы. В этом случае мы можем разложить объект Шрифт на составляющие свойства и сохранить их в отдельные реквизиты (числовые, строковые и булево).
Выясним, какие свойства объекта Шрифт нам важны:
При таком подходе восстановление шрифта выполняется через конструктор:
// Создание шрифта из сохраненных параметров
НовыйШрифт = Новый Шрифт(Объект.ИмяШрифта, Объект.РазмерШрифта, Объект.Жирный, Объект.Наклонный);
Элементы.НужноеПоле.Шрифт = НовыйШрифт;
Важное замечание: Этот метод работает корректно только для абсолютных шрифтов. Если пользователь выберет в диалоге системный стиль (например, «Шрифт текста справки»), свойства Имя и Размер могут оказаться неопределенными, и конструктор выдаст не тот результат, который ожидался.
Разберем несколько критических ситуаций, которые могут возникнуть при работе со шрифтами в «1С:Предприятие 8».
1. Абсолютные шрифты и шрифты стилей. Как мы уже упоминали, в 1С существует два типа шрифтов. Шрифт стиля зависит от настроек операционной системы или темы оформления 1С. Если вы сохраняете шрифт как стиль, то на разных компьютерах он может выглядеть по-разному. Если вам нужна идентичность отображения у всех пользователей, старайтесь принудительно устанавливать абсолютные параметры.
2. Наличие шрифта в системе. Если вы сохранили в базе данных редкий шрифт (например, "Futura PT"), а у другого пользователя этот шрифт не установлен в Windows/Linux, платформа 1С автоматически подставит шрифт по умолчанию (обычно это Arial или MS Sans Serif). Программного способа «внедрить» файл шрифта внутрь базы 1С для автоматической установки не существует.
3. Веб-клиент. Работа в браузере накладывает свои ограничения. Список шрифтов, доступных в ДиалогеВыбораШрифта в веб-клиенте, может отличаться от тонкого клиента. Кроме того, браузеры имеют свои механизмы подстановки шрифтов (fallback), что может привести к незначительным визуальным искажениям верстки.
4. Метод ЗначениеВСтрокуВнутр. Рассмотрим еще один «старый» метод. Он позволяет превратить любой объект в специфическую строку внутреннего формата 1С. Это работает быстро, но такая строка будет абсолютно нечитаема для человека и не пригодна для обмена с другими программами. Используйте его только для внутреннего хранения в рамках одной информационной базы.
Мы проанализировали основные стратегии хранения шрифтов в 1С. Для большинства задач оптимальным выбором будет Способ 1 (XML-сериализация), так как он сочетает в себе простоту реализации и полноту сохранения данных объекта. Если же проект подразумевает хранение большого количества медиа-данных или настроек, Способ 2 (ХранилищеЗначения) станет более универсальным решением.
Выбирайте метод исходя из ваших задач: для простых интерфейсных настроек достаточно XML-строки, а для систем со сложной кастомизацией лучше использовать структуру параметров или хранилище значений.