При работе с программными продуктами 1С у многих пользователей и разработчиков возникает потребность в модификации стандартных печатных форм. Это может быть связано с необходимостью добавить новые поля, изменить оформление, шрифт или общую структуру документа. Однако прямое изменение типовой конфигурации, особенно если она находится на поддержке, крайне нежелательно, поскольку это усложняет процесс обновления и может привести к потере внесенных доработок. В данной статье мы подробно рассмотрим, как правильно подходить к решению этой задачи в 1С:Бухгалтерия 8.3 на управляемых формах, сохраняя возможность типовых обновлений.
Прежде чем мы перейдем к решению, давайте выясним, почему прямое изменение стандартных макетов и кода конфигурации — это не лучший путь:
Именно поэтому рекомендуется использовать механизмы, позволяющие расширять функциональность без изменения основной конфигурации, такие как внешние печатные формы.
Одним из наиболее эффективных и безопасных способов модификации печатных форм является использование механизма внешних печатных форм (ВПФ). Этот подход позволяет реализовать необходимую логику печати в отдельном файле (.epf), который затем подключается к информационной базе в режиме 1С:Предприятие. При этом основная конфигурация остается типовой и легко обновляется. Часто за основу берутся уже готовые решения, например, внешний счет на оплату покупателю, которые адаптируются под нужды конкретной организации — для этого подойдёт внешняя печатная форма счета-договора для 1С:Бухгалтерии.
Для начала нам потребуется получить исходный макет, который мы хотим изменить. Мы сделаем его копию, чтобы затем доработать.
Общие -> Макеты.СчетНаОплату или ПечатнаяФормаСчета, который относится к документу СчетНаОплатуПокупателю. Точное имя макета может варьироваться в зависимости от версии конфигурации.Сохранить как... или в меню Файл -> Сохранить как.... Сохраните макет в формате .mxl (например, МойСчетНаОплату.mxl)..epf)Теперь мы создадим контейнер для нашей внешней печатной формы.
Файл -> Новый -> Внешняя обработка.Макеты в новой обработке.Добавить и выберите Табличный документ. Назовите его, например, МойМакетСчета.МойСчетНаОплату.mxl (меню Файл -> Открыть и выберите ваш .mxl файл).Свойства) и настройте параметры шрифта..epf (например, МойСчетНаОплатуВПФ.epf).Для того чтобы 1С "узнала" о вашей внешней печатной форме и смогла её вызвать, необходимо реализовать в модуле внешней обработки две экспортные функции: СведенияОВнешнейОбработке() и Печать().
СведенияОВнешнейОбработке()Эта функция предоставляет системе информацию о вашей обработке: ее тип, название, объекты, к которым она относится, и команды печати. Она должна возвращать структуру с определенным набором полей.
Откройте модуль объекта вашей внешней обработки (дважды кликните по названию обработки в дереве конфигурации, затем перейдите на вкладку Модуль объекта) и добавьте следующий код:
// Внешняя печатная форма для документа "Счет на оплату покупателю"
Функция СведенияОВнешнейОбработке() Экспорт
РегистрационныеДанные = Новый Структура;
РегистрационныеДанные.Вставить("Вид", "ПечатнаяФорма"); // Обязательно указываем, что это печатная форма
РегистрационныеДанные.Вставить("Наименование", "Счет на оплату (мой вариант)"); // Название, которое будет видно в списке
РегистрационныеДанные.Вставить("Версия", "1.1"); // Версия вашей ВПФ
РегистрационныеДанные.Вставить("БезопасныйРежим", Истина); // Рекомендуется для типовых решений
РегистрационныеДанные.Вставить("Информация", "Добавлены поля в шапку, изменен шрифт."); // Краткое описание
// Устанавливаем объекты, к которым будет прикреплена ВПФ
// Здесь мы указываем имя метаданных документа, например, "Документ.СчетНаОплатуПокупателю"
// Важно: имя должно быть точным, как в конфигураторе
МассивОбъектовНазначения = Новый Массив;
МассивОбъектовНазначения.Добавить("Документ.СчетНаОплатуПокупателю");
РегистрационныеДанные.Вставить("ОбъектыНазначения", МассивОбъектовНазначения);
// Команды печати, которые будут отображаться в форме документа
Команды = Новый Массив;
Команда = Новый Структура;
Команда.Вставить("Идентификатор", "ПечатьМоегоСчета"); // Уникальный идентификатор команды
Команда.Вставить("Представление", "Печать моего Счета"); // Текст кнопки в меню "Печать"
Команда.Вставить("Модификатор", "Печать"); // Определяет группу команд в меню
Команда.Вставить("ПоказыватьОповещение", Истина); // Показывать ли уведомление о начале печати
Команды.Добавить(Команда);
РегистрационныеДанные.Вставить("Команды", Команды);
Возврат РегистрационныеДанные;
КонецФункции
Обратите особое внимание на поле ОбъектыНазначения. Здесь необходимо точно указать полное имя объекта метаданных, к которому будет привязываться ваша печатная форма (например, Документ.СчетНаОплатуПокупателю).
Печать()Эта функция содержит основную логику формирования печатной формы. Она принимает на вход массив объектов, для которых нужно сформировать печатную форму, а возвращает структуру с табличным документом.
Важный момент: В большинстве случаев, чтобы корректно сформировать печатную форму, вам придется скопировать и адаптировать существующую логику формирования из типовой конфигурации. Просто подменить макет в стандартной функции печати обычно не получится, так как логика тесно завязана на области стандартного макета и их параметры. Например, если вашей целью является счет-фактура с указанием договора по новым требованиям законодательства, вам потребуется детально проработать алгоритм получения данных о договоре.
Давайте посмотрим, как это сделать. Мы добавим скелет функции Печать(), а затем обсудим адаптацию типовой логики.
Функция Печать(МассивОбъектов, ОбъектыПечати, ПараметрыПечати) Экспорт
РезультатПечати = Новый Структура("ТабличныйДокумент", Неопределено);
ТабДокумент = Новый ТабличныйДокумент;
// Получаем наш измененный макет, который мы добавили в обработку
Макет = ПолучитьМакет("МойМакетСчета"); // Имя макета, как вы его назвали в ВПФ
Для Каждого ТекущийОбъект Из МассивОбъектов Цикл
// Здесь будет основная логика формирования печатной формы.
// --- Пример адаптации типовой логики ---
// Инициализация параметров
ПараметрыМакета = Новый Структура;
// Заполняем основные параметры из текущего объекта документа
ПараметрыМакета.Вставить("НомерДокумента", ТекущийОбъект.Номер);
ПараметрыМакета.Вставить("ДатаДокумента", Формат(ТекущийОбъект.Дата, "ДФ=dd.MM.yyyy"));
ПараметрыМакета.Вставить("ОрганизацияНаименование", ТекущийОбъект.Организация.Наименование);
ПараметрыМакета.Вставить("КонтрагентНаименование", ТекущийОбъект.Контрагент.Наименование);
// Например, если вы реализуете вывод в «Основание» печатной формы УПД строки без ограничений,
// то вы добавляете логику получения значения из дополнительного реквизита.
// Выводим области макета
ОбластьШапка = Макет.ПолучитьОбласть("Шапка");
ОбластьШапка.Параметры.Заполнить(ПараметрыМакета);
ТабДокумент.Вывести(ОбластьШапка);
// Вывод табличной части документа
ОбластьТабличнаяЧастьЗаголовок = Макет.ПолучитьОбласть("ТабличнаяЧастьШапка");
ТабДокумент.Вывести(ОбластьТабличнаяЧастьЗаголовок);
ОбластьСтрокаТабличнойЧасти = Макет.ПолучитьОбласть("СтрокаТабличнойЧасти");
Для Каждого СтрокаТЧ Из ТекущийОбъект.Товары Цикл
ОбластьСтрокаТабличнойЧасти.Параметры.Номенклатура = СтрокаТЧ.Номенклатура;
ОбластьСтрокаТабличнойЧасти.Параметры.Количество = СтрокаТЧ.Количество;
ОбластьСтрокаТабличнойЧасти.Параметры.Цена = СтрокаТЧ.Цена;
ОбластьСтрокаТабличнойЧасти.Параметры.Сумма = СтрокаТЧ.Сумма;
ТабДокумент.Вывести(ОбластьСтрокаТабличнойЧасти);
КонецЦикла;
ОбластьПодвал = Макет.ПолучитьОбласть("Подвал");
ОбластьПодвал.Параметры.Заполнить(ПараметрыМакета);
ТабДокумент.Вывести(ОбластьПодвал);
// Установка параметров страницы
ТабДокумент.ПараметрыСтраницы.ОриентацияСтраницы = ОриентацияСтраницы.Портрет;
ТабДокумент.АвтоМасштаб = Истина;
КонецЦикла;
РезультатПечати.ТабличныйДокумент = ТабДокумент;
Возврат РезультатПечати;
КонецФункции
Как найти типовую логику печати?
Мы предлагаем несколько способов найти исходный код для копирования и адаптации:
УправлениеПечатью или ПечатьДокументов. Если вам требуется специфическая доработка, например, генерация QR кодов для типового УПД, стоит изучить, как система формирует данные для вывода графических объектов.Аналогичным образом можно реализовать и другие специфические формы, такие как ТОРГ-13 для перемещений между сотрудниками, где логика получения данных может существенно отличаться от стандартной реализации.
После создания файла .epf и написания необходимого кода, нам нужно подключить его к базе 1С.
Администрирование -> Печатные формы, отчеты и обработки.Дополнительные отчеты и обработки.Создать и укажите путь к вашему файлу .epf.Назначение и нажмите кнопку Записать и закрыть.Теперь мы можем проверить, как работает наша внешняя печатная форма. Откройте нужный документ, нажмите кнопку Печать и выберите вашу новую команду.
В некоторых случаях, для очень простых изменений, существует более простой путь. Если вам нужно быстро создавать шаблоны без глубокого погружения в код, можно использовать гибкий конструктор печатных форм для объектов базы 1С, который позволяет пользователям самостоятельно настраивать оформление в пользовательском интерфейсе — для этого подойдёт конструктор печатных форм без программирования для 1С.
Администрирование -> Печатные формы, отчеты и обработки.Макеты печатных форм.Важно: Этот способ не позволяет напрямую модифицировать стандартные макеты без создания их копии или использования специализированных инструментов расширения функционала.
Печать().Таким образом, мы рассмотрели подробный и наиболее правильный способ модификации стандартных печатных форм в 1С:Бухгалтерия 8.3. Использование ВПФ позволяет сохранить конфигурацию на поддержке и упрощает процесс обновлений, предоставляя при этом гибкие возможности для кастомизации. Несмотря на то, что это требует определенных навыков программирования, такой подход является наиболее рекомендованным для стабильной работы системы.