При работе с программными продуктами на платформе 1С:Предприятие 8 под управлением Библиотеки стандартных подсистем (БСП) пользователи часто используют великолепную возможность — редактирование макетов печатных форм (например, ТОРГ-12, Счет на оплату, Акт выполненных работ) прямо в пользовательском режиме (в режиме «1С:Предприятие»). Это позволяет быстро изменить логотип, переставить местами строки, добавить нужный текст или изменить шрифт без привлечения программиста и внесения изменений в конфигурацию.
Однако при переносе этих изменений из одной информационной базы в другую (например, из тестовой базы в рабочую или при разделении баз) администраторы и программисты сталкиваются с трудностями. Обычное копирование содержимого макета через буфер обмена ломает структуру колонок, а интерфейс БСП не предоставляет очевидной кнопки «Загрузить макет из файла». В этой статье мы подробно разберем четыре эффективных способа решения этой задачи: от секретов правильного интерактивного копирования до автоматизации процесса программными средствами.
Давайте выясним причину, почему стандартное выделение ячеек через комбинацию клавиш Ctrl+A, копирование Ctrl+C и последующая вставка Ctrl+V в новой базе приводят к тому, что макет «плывет», а колонки теряют свою исходную ширину. Дело в том, что при выделении «всех ячеек» буфер обмена Windows копирует только свойства самих ячеек (текст, цвет, границы, шрифт, формат данных). При этом параметры сетки табличного документа (ширина колонок и высота строк, которые жестко заданы для всего документа или его секций) не переносятся. В результате в базе-приемнике макет пытается «натянуться» на стандартную сетку нового документа, что полностью искажает внешний вид печатной формы.
Ниже мы подробно рассмотрим проверенные способы, которые помогут перенести макет в первозданном виде.
Рассмотрим первый, самый быстрый способ, который не требует программирования или использования сторонних обработок. Нам нужно заставить платформу скопировать не просто ячейки, а весь объект ТабличныйДокумент целиком, включая его структуру.
Разберем этот процесс по шагам:
Ctrl+A, найдем глазами левый верхний угол таблицы. Нам нужно кликнуть левой кнопкой мыши на серый пустой прямоугольник, который находится на пересечении шкал заголовков (левее наименования колонки «А» и выше наименования строки «1»).Ctrl+C для копирования данных в буфер обмена.Ctrl+V.Посмотрим на результат: макет перенесся идеально. Все объединенные ячейки, сложные форматы строк, цвета, а главное — индивидуальная ширина каждой колонки встали ровно в те же координаты, что и в базе-источнике.
Если макетов много или ручной перенос через буфер обмена вам кажется ненадежным, проанализируем архитектуру хранения этих данных. Все пользовательские изменения макетов БСП сохраняет в специализированном регистре сведений. Он называется ПользовательскиеМакетыПечати.
Каждая запись в этом регистре содержит ключевые измерения:
Объект — имя объекта метаданных (например, Документ.РеализацияТоваровУслуг);ИмяМакета — системное имя макета (например, ТОРГ12).Самое главное — в ресурсе Макет хранится объект типа ХранилищеЗначений, внутри которого в бинарном виде находится весь наш настроенный табличный документ.
Поскольку наши базы абсолютно идентичны по структуре конфигурации, мы можем перенести записи этого регистра напрямую. Для этого отлично подойдет стандартная обработка от фирмы 1С «Выгрузка и загрузка данных XML» (ее можно скачать на портале ИТС).
Выполним следующие действия:
ПользовательскиеМакетыПечати и отметим его галочкой.ИмяМакета (например, равен "ТОРГ12") или по конкретному объекту метаданных. Если нужно перенести абсолютно все пользовательские изменения, отборы ставить не нужно.Программа запишет бинарные данные напрямую в базу-приемник. Перенос завершен, система сразу начнет использовать новые макеты без необходимости перезапуска сеансов пользователей.
Иногда требуется дать возможность конечным пользователям или администраторам самостоятельно загружать ранее сохраненные файлы макетов формата .mxl в базу, не прибегая к установке расширений конфигурации или открытию небезопасных обработок выгрузки XML.
Для решения этой задачи мы можем написать простейшую внешнюю обработку (файл .epf), которая будет считывать файл макета с диска и записывать его в регистр сведений БСП. Нам поможет объект ТабличныйДокумент и его метод Прочитать().
Посмотрим на пример программного кода, который решает эту задачу на стороне сервера:
&НаСервере
Процедура ЗагрузитьПользовательскийМакетНаСервере(ПутьКФайлу, ИмяОбъектаМетаданных, ИмяМакета)
// Инициализируем табличный документ и считываем данные из файла .mxl
ТабДок = Новый ТабличныйДокумент;
Попытка
ТабДок.Прочитать(ПутьКФайлу);
Исключение
ВызватьИсключение "Не удалось прочитать файл макета! Ошибка: " + ОписаниеОшибки();
КонецПопытки;
// Работаем с регистром сведений БСП
НаборЗаписей = РегистрыСведений.ПользовательскиеМакетыПечати.СоздатьНаборЗаписей();
НаборЗаписей.Отбор.Объект.Установить(ИмяОбъектаМетаданных);
НаборЗаписей.Отбор.ИмяМакета.Установить(ИмяМакета);
// Создаем новую запись для нашего измененного макета
НоваяЗапись = НаборЗаписей.Добавить();
НоваяЗапись.Объект = ИмяОбъектаМетаданных;
НоваяЗапись.ИмяМакета = ИмяМакета;
// Помещаем табличный документ в ХранилищеЗначений и активируем его использование
НоваяЗапись.Макет = Новый ХранилищеЗначений(ТабДок);
НоваяЗапись.Использование = Истина;
// Записываем набор в базу данных
Попытка
НаборЗаписей.Записать();
Сообщить("Макет успешно загружен и активирован!");
Исключение
Сообщить("Ошибка записи в базу данных: " + ОписаниеОшибки());
КонецПопытки;
КонецПроцедуры
Этот простой скрипт можно обернуть в красивую форму внешней обработки, где пользователь сможет выбрать файл на диске, указать из списка печатную форму и нажать одну кнопку для импорта. Это полностью исключит ошибки ручного переноса.
В завершение нашего анализа разберем ситуацию с точки зрения долгосрочной поддержки информационной системы. Если макет печатной формы подвергается регулярным и значительным изменениям, использование механизма «Пользовательских макетов печати» может стать источником проблем. Любой пользователь с правами на редактирование может случайно нажать кнопку «Использовать стандартный макет», что мгновенно сбросит все настройки, а при обновлении конфигурации или изменении структуры метаданных есть риск повредить области макета.
Рекомендуем следующее решение:
Перенесите измененный макет и логику его заполнения во Внешнюю печатную форму (ВПФ).
Преимущества данного подхода очевидны:
.epf.Таким образом, мы рассмотрели все возможные варианты решения проблемы — от простых интерактивных действий до продвинутых инструментов администрирования и программирования. Выбирайте наиболее подходящий способ в зависимости от ваших задач и уровня доступа к системе!