Как сохранить выбранный шрифт в реквизит объекта 1С?

Программист 1С v8.3 (Управляемые формы) IT и автоматизация бизнеса
← На главную

В процессе разработки интерфейсов на платформе «1С:Предприятие 8» часто возникает задача предоставить пользователю возможность индивидуальной настройки визуальных элементов. Одной из таких настроек является выбор шрифта. Однако начинающие разработчики быстро сталкиваются с техническим ограничением: в списке доступных типов данных для реквизитов справочников или документов отсутствует тип Шрифт. Это связано с тем, что шрифт является сложным системным объектом, а не простым типом данных, который можно напрямую записать в таблицу базы данных.

В данной статье мы подробно разберем, как обойти это ограничение, рассмотрим несколько надежных способов сохранения шрифта и проанализируем нюансы работы с ними в управляемых формах.

Способ 1. Сериализация в XML через XDTO

Это один из самых современных и гибких методов. Суть его заключается в преобразовании объекта Шрифт в текстовую строку формата XML, которую можно сохранить в обычный строковый реквизит неограниченной длины.

Многие пытаются использовать метод СериализаторXDTO.XMLСтрока(ВыбранныйШрифт), но получают ошибку отображения типов. Это происходит потому, что XMLСтрока предназначена для простых типов. Для работы с объектом Шрифт нам необходимо использовать механизм записи XML. Разберем правильный алгоритм реализации:


// Выбор шрифта пользователем на клиенте
Диалог = Новый ДиалогВыбораШрифта;
Если Диалог.Выбрать() Тогда
    ВыбранныйШрифт = Диалог.Шрифт;
    
    // Подготавливаем запись XML
    Запись = Новый ЗаписьXML();
    Запись.УстановитьСтроку();
    
    // Сериализуем объект Шрифт в XML
    СериализаторXDTO.ЗаписатьXML(Запись, ВыбранныйШрифт);
    
    // Получаем строку для записи в реквизит (например, Объект.ШрифтТекст)
    СтрокаДляСохранения = Запись.Закрыть();
    Объект.ШрифтТекст = СтрокаДляСохранения;
КонецЕсли;

Для обратного преобразования строки в объект Шрифт (например, при открытии формы) мы будем использовать чтение XML:


// Преобразование строки обратно в объект Шрифт
Чтение = Новый ЧтениеXML();
Чтение.УстановитьСтроку(Объект.ШрифтТекст);
ШрифтИзБазы = СериализаторXDTO.ПрочитатьXML(Чтение, Тип("Шрифт"));

Преимущество этого метода в том, что XML-структура сохраняет все нюансы объекта, включая то, является ли шрифт абсолютным или это шрифт стиля.

Способ 2. Использование ХранилищаЗначения

Этот метод считается классическим для платформы 1С. Мы создаем реквизит объекта с типом ХранилищеЗначения. Этот тип данных позволяет упаковать любой объект 1С (включая шрифты, цвета или структуры) в бинарные данные.

Проанализируем особенности работы с этим типом в управляемом приложении. Основная сложность заключается в том, что реквизит типа ХранилищеЗначения не может существовать на стороне клиента. Нам придется передавать данные на сервер.

Рассмотрим пошагово процесс сохранения:

  1. На клиенте пользователь выбирает шрифт.
  2. Выбранный объект передается в серверную процедуру.
  3. На сервере объект помещается в ХранилищеЗначения и записывается в реквизит объекта.

&НаКлиенте
Процедура ВыбратьИСохранитьШрифт()
    Диалог = Новый ДиалогВыбораШрифта;
    Если Диалог.Выбрать() Тогда
        СохранитьШрифтНаСервере(Диалог.Шрифт);
    КонецЕсли;
КонецПроцедуры

&НаСервере
Процедура СохранитьШрифтНаСервере(ВыбранныйШрифт)
    ОбъектДляЗаписи = РеквизитФормыВЗначение("Объект");
    ОбъектДляЗаписи.РеквизитХранилищеШрифта = Новый ХранилищеЗначения(ВыбранныйШрифт);
    ОбъектДляЗаписи.Записать();
    ЗначениеВРеквизитФормы(ОбъектДляЗаписи, "Объект");
КонецПроцедуры

Чтобы применить сохраненный шрифт, например, к декорации или полю ввода при открытии формы, выполним обратную операцию:


&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
    ШрифтОбъект = Объект.РеквизитХранилищеШрифта.Получить();
    Если ШрифтОбъект <> Неопределено Тогда
        Элементы.НадписьПример.Шрифт = ШрифтОбъект;
    КонецЕсли;
КонецПроцедуры

Способ 3. Сохранение набором параметров (Ручной разбор)

Иногда нам нужно, чтобы параметры шрифта были доступны для редактирования вручную без диалогового окна или передавались во внешние системы. В этом случае мы можем разложить объект Шрифт на составляющие свойства и сохранить их в отдельные реквизиты (числовые, строковые и булево).

Выясним, какие свойства объекта Шрифт нам важны:

При таком подходе восстановление шрифта выполняется через конструктор:


// Создание шрифта из сохраненных параметров
НовыйШрифт = Новый Шрифт(Объект.ИмяШрифта, Объект.РазмерШрифта, Объект.Жирный, Объект.Наклонный);
Элементы.НужноеПоле.Шрифт = НовыйШрифт;

Важное замечание: Этот метод работает корректно только для абсолютных шрифтов. Если пользователь выберет в диалоге системный стиль (например, «Шрифт текста справки»), свойства Имя и Размер могут оказаться неопределенными, и конструктор выдаст не тот результат, который ожидался.

Нюансы, о которых важно помнить

Разберем несколько критических ситуаций, которые могут возникнуть при работе со шрифтами в «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-строки, а для систем со сложной кастомизацией лучше использовать структуру параметров или хранилище значений.

← На главную