В процессе разработки конфигураций на платформе 1С:Предприятие 8 часто возникает задача предоставить пользователю возможность самостоятельно изменять внешний вид печатных форм без обращения к конфигуратору. Наиболее удобным способом является хранение макета непосредственно в элементе справочника или специальном регистре. В данной статье мы подробно разберем, как технически реализовать такой механизм, какие типы данных использовать и как обеспечить удобство редактирования для конечного пользователя.
Первым делом проанализируем, какой тип реквизита следует выбрать для хранения макета. Стандартом для платформы 1С является тип ХранилищеЗначения. Этот объект позволяет упаковать практически любые данные — будь то табличный документ, двоичные данные внешней обработки или текстовый файл скрипта — в бинарный вид для хранения в базе данных.
Рассмотрим преимущества использования ХранилищеЗначения:
ТабличныйДокумент в поток байтов при помещении в хранилище.Пример программного сохранения табличного документа в реквизит справочника:
// Предположим, ОбъектМакета — это ТабличныйДокумент, сформированный в коде или на форме
МакетДляЗаписи = Новый ХранилищеЗначения(ОбъектМакета, Новый СжатиеДанных(9));
ОбъектСправочника.ДанныеМакета = МакетДляЗаписи;
ОбъектСправочника.Записать();
Выясним, как именно макет попадает в систему. Мы можем выделить два основных подхода, в зависимости от того, где «готовится» макет:
1. Использование внешних файлов. Разберем ситуацию, когда администратор готовит макет в конфигураторе или другом приложении и загружает его в справочник. Для этого на форму справочника можно добавить кнопку «Загрузить макет», которая будет считывать файл с диска.
&НаКлиенте
Процедура ЗагрузитьМакет(Команда)
Диалог = Новый ДиалогВыбораФайла(РежимДиалогаВыбораФайла.Открытие);
Диалог.Фильтр = "Макет 1С (*.mxl)|*.mxl";
Если Диалог.Выбрать() Тогда
ДанныеФайла = Новый ДвоичныеДанные(Диалог.ПолноеИмяФайла);
ПоместитьМакетВХранилище(ДанныеФайла);
КонецЕсли;
КонецПроцедуры
2. Встроенный визуальный редактор. Это наиболее продвинутый вариант. Мы можем разместить на управляемой форме поле с типом ТабличныйДокумент. Посмотрим на алгоритм настройки формы:
ТолькоПросмотр = Ложь.ХранилищеЗначения и отображайте их в этом поле.Таким образом, пользователь сможет рисовать линии, объединять ячейки и прописывать параметры прямо в режиме «1С:Предприятие».
Существует распространенное заблуждение, что ТабличныйДокумент, сохраненный в базе как данные, теряет свойства макета из конфигуратора. Проанализируем ситуацию: на самом деле объект полностью сохраняет свою структуру. Вы по-прежнему можете использовать:
ПолучитьОбласть() будет работать точно так же, как и с макетом из общих макетов конфигурации.Рассмотрим пример кода для печати с использованием макета из справочника:
Функция СформироватьПечатнуюФорму(СсылкаНаСправочникМакетов)
// Извлекаем макет из базы
ДанныеХранилища = СсылкаНаСправочникМакетов.ДанныеМакета.Получить();
Если ТипЗнч(ДанныеХранилища) <> Тип("ТабличныйДокумент") Тогда
Возврат Неопределено;
КонецЕсли;
Макет = ДанныеХранилища;
ТабДок = Новый ТабличныйДокумент;
// Получаем область шапки по имени, заданному пользователем в редакторе
ОбластьШапка = Макет.ПолучитьОбласть("Шапка");
ОбластьШапка.Параметры.ДатаДокумента = ТекущаяДата();
ОбластьШапка.Параметры.НомерДокумента = "001";
ТабДок.Вывести(ОбластьШапка);
Возврат ТабДок;
КонецФункции
Посмотрим на рекомендации опытных разработчиков. Если макеты уникальны для каждого элемента справочника (например, индивидуальный шаблон договора для контрагента), то хранение в реквизите оправдано. Однако, если вы создаете систему переопределения стандартных печатных форм, лучше использовать Регистр сведений.
В регистре можно задать измерения: ОбъектМетаданных (строка или ссылка на идентификатор) и ИмяМакета. Это позволит быстро находить нужный пользовательский макет. В подсистеме БСП «Печать» реализован именно такой механизм через регистр ПользовательскиеМакетыПечати.
Если ваша конфигурация построена на базе БСП, крайне не рекомендуется изобретать «велосипед». Разберем, как работает типовой механизм:
ДобавитьКомандыПечати.Важный нюанс: БСП проверяет наличие пользовательского макета автоматически. Если вы используете стандартный программный интерфейс УправлениеПечатью.СформироватьПечатныеФормы, система сама найдет измененный шаблон в базе.
Постоянное чтение ХранилищеЗначения из базы данных при формировании массовых печатных форм (например, печать 1000 накладных за раз) может существенно нагрузить сервер. Проанализируем способы оптимизации:
СжатиеДанных(9), так как текстовые данные MXL отлично сжимаются, экономя место в SQL-таблицах.При предоставлении пользователю прав на редактирование макетов возрастает риск того, что макет будет испорчен (удалены важные параметры или области). Рассмотрим, как минимизировать риски:
Во-первых, можно использовать стандартную подсистему «Версионирование объектов» из БСП. Она будет сохранять копию макета при каждом изменении элемента справочника.
Во-вторых, полезно реализовать кнопку «Восстановить стандартный макет», которая будет либо удалять запись из справочника/регистра, либо перезаписывать её макетом, «зашитым» в конфигурацию по умолчанию.
Мы рассмотрели комплексный подход к хранению макетов в базе данных. Использование ХранилищеЗначения в связке с типом ТабличныйДокумент дает разработчику гибкий инструмент для кастомизации системы. Независимо от того, выберете ли вы самописное решение на справочниках или воспользуетесь мощным функционалом БСП, помните о необходимости проверки корректности заполнения параметров пользователем и оптимизации доступа к данным.