Внешняя печатная форма в 1С — это файл внешней обработки (.epf), который добавляет в меню «Печать» документа ещё один пункт, не трогая конфигурацию. В типовых решениях на БСП с управляемыми формами (Бухгалтерия 3.0, УТ 11, КА 2, ERP 2 и другие) такой файл подключают через «Дополнительные отчеты и обработки», и конфигурация остаётся на поддержке. Ниже — рабочий шаблон для 1С 8.3, макет, подключение, отладка и частые ошибки.
Подсистема «Дополнительные отчеты и обработки» узнаёт о файле из его «паспорта». В модуле объекта обработки обязательны два экспортных метода:
СведенияОВнешнейОбработке() — возвращает вид обработки, список документов и команды для меню «Печать»;Печать(МассивОбъектов, КоллекцияПечатныхФорм, ОбъектыПечати, ПараметрыВывода) — вызывается на сервере по команде и кладёт готовый табличный документ в коллекцию печатных форм.Остальное делает БСП: открывает результат в своей стандартной форме печати, откуда его отправляют на принтер, сохраняют в файл или по почте. Собственное окно предпросмотра не нужно.
В конфигураторе выполните «Файл → Новый → Внешняя обработка», задайте имя без пробелов, добавьте макет типа «Табличный документ» с именем Макет и откройте модуль объекта. Шаблон ниже печатает упрощённую накладную по документу РеализацияТоваровУслуг. Имена реквизитов сверьте со своей конфигурацией.
// Внешняя печатная форма «Накладная (внешняя)» для конфигураций на БСП 2.3.3+ и 3.x.
// Модуль объекта внешней обработки. В обработке есть макет «Макет» (табличный документ).
// Имена документа и реквизитов замените на имена из своей конфигурации.
#Если Сервер Или ТолстыйКлиентОбычноеПриложение Или ВнешнееСоединение Тогда
#Область ПрограммныйИнтерфейс
// «Паспорт» обработки: БСП читает его при загрузке файла в справочник.
Функция СведенияОВнешнейОбработке() Экспорт
ПараметрыРегистрации = ДополнительныеОтчетыИОбработки.СведенияОВнешнейОбработке("2.2.2.1");
ПараметрыРегистрации.Вид = ДополнительныеОтчетыИОбработкиКлиентСервер.ВидОбработкиПечатнаяФорма();
ПараметрыРегистрации.Версия = "1.1";
ПараметрыРегистрации.Информация = НСтр("ru = 'Упрощенная накладная по документу реализации'");
ПараметрыРегистрации.Назначение.Добавить("Документ.РеализацияТоваровУслуг");
Команда = ПараметрыРегистрации.Команды.Добавить();
Команда.Представление = НСтр("ru = 'Накладная (внешняя)'");
Команда.Идентификатор = "НакладнаяВнешняя";
Команда.Использование = ДополнительныеОтчетыИОбработкиКлиентСервер.ТипКомандыВызовСерверногоМетода();
Команда.ПоказыватьОповещение = Ложь;
Команда.Модификатор = "ПечатьMXL";
Возврат ПараметрыРегистрации;
КонецФункции
// Вызывается БСП на сервере, когда пользователь выбирает команду в меню «Печать».
Процедура Печать(МассивОбъектов, КоллекцияПечатныхФорм, ОбъектыПечати, ПараметрыВывода) Экспорт
Если УправлениеПечатью.НужноПечататьМакет(КоллекцияПечатныхФорм, "НакладнаяВнешняя") Тогда
ТабличныйДокумент = СформироватьНакладную(МассивОбъектов, ОбъектыПечати);
УправлениеПечатью.ВывестиТабличныйДокументВКоллекцию(КоллекцияПечатныхФорм,
"НакладнаяВнешняя", НСтр("ru = 'Накладная (внешняя)'"), ТабличныйДокумент);
КонецЕсли;
КонецПроцедуры
// Собирает табличный документ. От коллекции БСП не зависит:
// функцию можно вызвать и из тестовой формы при отладке.
Функция СформироватьНакладную(МассивОбъектов, ОбъектыПечати) Экспорт
ТабличныйДокумент = Новый ТабличныйДокумент;
// Сначала умолчания, потом ключ: при установке ключа подгружаются
// настройки печати, которые пользователь сохранил раньше.
ТабличныйДокумент.ОриентацияСтраницы = ОриентацияСтраницы.Портрет;
ТабличныйДокумент.АвтоМасштаб = Истина;
ТабличныйДокумент.КлючПараметровПечати = "ПАРАМЕТРЫ_ПЕЧАТИ_НакладнаяВнешняя";
Макет = ПолучитьМакет("Макет");
ОбластьЗаголовок = Макет.ПолучитьОбласть("Заголовок");
ОбластьШапкаТаблицы = Макет.ПолучитьОбласть("ШапкаТаблицы");
ОбластьСтрока = Макет.ПолучитьОбласть("Строка");
ОбластьИтоги = Макет.ПолучитьОбласть("Итоги");
ОбластьПодписи = Макет.ПолучитьОбласть("Подписи");
// Реквизит валюты: в БП 3.0 - ВалютаДокумента, в УТ 11 и ERP - Валюта.
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| Док.Ссылка КАК Ссылка,
| Док.Номер КАК Номер,
| Док.Дата КАК Дата,
| ПРЕДСТАВЛЕНИЕ(Док.Организация) КАК Организация,
| ПРЕДСТАВЛЕНИЕ(Док.Контрагент) КАК Контрагент,
| Док.ВалютаДокумента КАК Валюта
|ИЗ
| Документ.РеализацияТоваровУслуг КАК Док
|ГДЕ
| Док.Ссылка В (&МассивОбъектов)
|
|УПОРЯДОЧИТЬ ПО
| Дата,
| Ссылка
|;
|
|////////////////////////////////////////////////////////////////////////////////
|ВЫБРАТЬ
| Товары.Ссылка КАК Ссылка,
| Товары.НомерСтроки КАК НомерСтроки,
| ПРЕДСТАВЛЕНИЕ(Товары.Номенклатура) КАК Номенклатура,
| Товары.Количество КАК Количество,
| Товары.Цена КАК Цена,
| Товары.Сумма КАК Сумма
|ИЗ
| Документ.РеализацияТоваровУслуг.Товары КАК Товары
|ГДЕ
| Товары.Ссылка В (&МассивОбъектов)
|
|УПОРЯДОЧИТЬ ПО
| НомерСтроки";
Запрос.УстановитьПараметр("МассивОбъектов", МассивОбъектов);
Результаты = Запрос.ВыполнитьПакет();
Шапки = Результаты[0].Выбрать();
ТаблицаСтрок = Результаты[1].Выгрузить();
ТаблицаСтрок.Индексы.Добавить("Ссылка");
Пока Шапки.Следующий() Цикл
// Каждый следующий документ пачки начинаем с новой страницы.
Если ТабличныйДокумент.ВысотаТаблицы > 0 Тогда
ТабличныйДокумент.ВывестиГоризонтальныйРазделительСтраниц();
КонецЕсли;
НомерСтрокиНачало = ТабличныйДокумент.ВысотаТаблицы + 1;
ОбластьЗаголовок.Параметры.Заполнить(Шапки);
// Номер без префиксов и ведущих нулей. В БСП до 2.3.3 функция называется ПолучитьНомерНаПечать.
ОбластьЗаголовок.Параметры.Номер =
ПрефиксацияОбъектовКлиентСервер.НомерНаПечать(Шапки.Номер, Истина, Истина);
ОбластьЗаголовок.Параметры.ДатаДокумента = Формат(Шапки.Дата, "ДЛФ=D");
ТабличныйДокумент.Вывести(ОбластьЗаголовок);
ТабличныйДокумент.Вывести(ОбластьШапкаТаблицы);
СтрокиДокумента = ТаблицаСтрок.НайтиСтроки(Новый Структура("Ссылка", Шапки.Ссылка));
НомерПП = 0;
Итого = 0;
Для Каждого СтрокаТовара Из СтрокиДокумента Цикл
НомерПП = НомерПП + 1;
ОбластьСтрока.Параметры.Заполнить(СтрокаТовара);
ОбластьСтрока.Параметры.НомерПП = НомерПП;
ТабличныйДокумент.Вывести(ОбластьСтрока);
Итого = Итого + СтрокаТовара.Сумма;
КонецЦикла;
// Итог считаем по напечатанным строкам, чтобы он всегда сходился с таблицей.
// Сумма прописью - в валюте документа (подсистема БСП «Валюты»).
ОбластьИтоги.Параметры.Итого = Итого;
ОбластьИтоги.Параметры.СуммаПрописью =
РаботаСКурсамиВалют.СформироватьСуммуПрописью(Итого, Шапки.Валюта);
ТабличныйДокумент.Вывести(ОбластьИтоги);
ТабличныйДокумент.Вывести(ОбластьПодписи);
// Помечаем строки этого документа, чтобы БСП могла разделить пачку по документам.
УправлениеПечатью.ЗадатьОбластьПечатиДокумента(ТабличныйДокумент, НомерСтрокиНачало,
ОбъектыПечати, Шапки.Ссылка);
КонецЦикла;
Возврат ТабличныйДокумент;
КонецФункции
#КонецОбласти
#КонецЕсли
"2.2.2.1" в ДополнительныеОтчетыИОбработки.СведенияОВнешнейОбработке — версия БСП, на которую рассчитана обработка. Указывайте версию не новее той, что стоит в базе заказчика.Назначение — массив полных имён объектов метаданных: "Документ.РеализацияТоваровУслуг", а не синоним «Реализация (акты, накладные)».Идентификатор команды — это имя печатной формы. БСП заранее создаёт в КоллекцияПечатныхФорм строку с этим именем, и именно его вы проверяете в НужноПечататьМакет.ТипКомандыВызовСерверногоМетода() + Модификатор = "ПечатьMXL" — связка для обычной табличной печатной формы: БСП сама вызовет Печать на сервере.КлючПараметровПечати — под этим ключом платформа хранит настройки печати пользователя. Умолчания задаём до ключа, иначе они затрут сохранённое. Старое ИмяПараметровПечати оставлено для совместимости.БезопасныйРежим в паспорте не задаём, остаётся значение по умолчанию Истина. Запросы, макеты и общие модули конфигурации в безопасном режиме работают. Запрещены файлы, COM-объекты, внешние компоненты, запуск приложений и интернет, а включение привилегированного режима молча игнорируется.СформироватьНакладную: документ можно собрать из тестовой формы без участия БСП.СуммаДокумента, — так он сходится с таблицей. Сумму прописью строит РаботаСКурсамиВалют.СформироватьСуммуПрописью по параметрам прописи из карточки валюты: долларовый документ не напечатается «в рублях».ЗадатьОбластьПечатиДокумента размечает, где в пачке какой документ.Две оговорки про суммы. В БП 3.0 услуги лежат в отдельной табличной части «Услуги». Их добавляют во второй запрос через ОБЪЕДИНИТЬ ВСЕ с полем-признаком порядка: номера строк в табличных частях независимы, и без признака товары и услуги перемешаются.
// Второй запрос пакета для БП 3.0: сначала товары, потом услуги.
// Замените им в шаблоне всё от второго ВЫБРАТЬ до закрывающей кавычки.
|ВЫБРАТЬ
| Товары.Ссылка КАК Ссылка,
| 1 КАК Порядок,
| Товары.НомерСтроки КАК НомерСтроки,
| ПРЕДСТАВЛЕНИЕ(Товары.Номенклатура) КАК Номенклатура,
| Товары.Количество КАК Количество,
| Товары.Цена КАК Цена,
| Товары.Сумма КАК Сумма
|ИЗ
| Документ.РеализацияТоваровУслуг.Товары КАК Товары
|ГДЕ
| Товары.Ссылка В (&МассивОбъектов)
|
|ОБЪЕДИНИТЬ ВСЕ
|
|ВЫБРАТЬ
| Услуги.Ссылка,
| 2,
| Услуги.НомерСтроки,
| ПРЕДСТАВЛЕНИЕ(Услуги.Номенклатура),
| Услуги.Количество,
| Услуги.Цена,
| Услуги.Сумма
|ИЗ
| Документ.РеализацияТоваровУслуг.Услуги КАК Услуги
|ГДЕ
| Услуги.Ссылка В (&МассивОбъектов)
|
|УПОРЯДОЧИТЬ ПО
| Порядок,
| НомерСтроки";
Второе: если НДС начисляется сверху цены, Сумма строки его не включает: печатайте Сумма + СуммаНДС (в УТ 11 и ERP есть готовое поле СуммаСНДС).
Эти параметры внешняя печатная форма получает от БСП. Сигнатуру менять нельзя: процедура вызывается по имени, и в неё передаются ровно четыре значения.
| Параметр | Тип | Что в нём |
|---|---|---|
МассивОбъектов | Массив | Ссылки на документы: один открытый документ или все, что выделены в списке. |
КоллекцияПечатныхФорм | ТаблицаЗначений | Строки печатных форм, созданные по идентификатору команды. Сюда кладётся готовый табличный документ. |
ОбъектыПечати | СписокЗначений | Соответствие «документ — область в табличном документе». Заполняется через ЗадатьОбластьПечатиДокумента. |
ПараметрыВывода | Структура | Настройки вывода. В минимальном шаблоне не используется. |
Выделите в макете строки и назовите область через «Таблица → Имена → Назначить имя». В ячейках, куда подставляются данные, в свойствах укажите «Заполнение»: Параметр (в ячейке пишется имя параметра) или Шаблон — тогда параметры пишутся прямо в тексте в квадратных скобках: Накладная № [Номер] от [ДатаДокумента].
| Область | Что внутри | Параметры |
|---|---|---|
| Заголовок | Номер и дата, поставщик, покупатель | Номер, ДатаДокумента, Организация, Контрагент |
| ШапкаТаблицы | Заголовки колонок | — |
| Строка | Одна строка товара | НомерПП, Номенклатура, Количество, Цена, Сумма |
| Итоги | Итог и сумма прописью | Итого, СуммаПрописью |
| Подписи | Места для подписей | — |
Называйте параметры так же, как поля запроса: тогда Параметры.Заполнить(Выборка) заполняет всю область, а лишние поля пропускает. Обратная сторона: опечатка в имени параметра ошибки не даёт, ячейка молча остаётся пустой. Явное присваивание ОбластьЗаголовок.Параметры.ДатаДокумента = …, наоборот, упадёт, если такого параметра в области нет.
Числа удобнее форматировать в свойствах ячейки (например, ЧДЦ=2). Номер документа в типовых печатают без префиксов и ведущих нулей, в шаблоне за это отвечает ПрефиксацияОбъектовКлиентСервер.НомерНаПечать(Шапки.Номер, Истина, Истина). Второй параметр — УдалитьПрефиксИнформационнойБазы, третий — УдалитьПользовательскийПрефикс, оба по умолчанию Ложь. Префикс организации и ведущие нули функция убирает всегда, а без флагов в номере останутся префикс информационной базы и пользовательский префикс.
Подключение такое же, как у любых дополнительных обработок 1С:
.epf. Появится предупреждение о безопасности — подтверждайте его только для файлов, в происхождении которых уверены.Новую сборку загружайте в существующую карточку, а не в новую — сохранятся размещение и доступ. Увеличивайте значение Версия в паспорте: по нему видно, какая сборка сейчас в базе.
Печать выполняется на сервере, поэтому точки останова ставятся в серверном коде. В файловом варианте это работает сразу. В клиент-серверном служба агента сервера 1С должна быть запущена с ключом -debug, а в конфигураторе в «Отладка → Подключение» → «Автоматическое подключение» должен быть отмечен предмет «Сервер».
Быстрее всего отлаживать без БСП. Добавьте в обработку основную форму с реквизитами из комментария к листингу и командой «Сформировать». Запустите 1С:Предприятие из конфигуратора в режиме отладки и откройте файл через «Файл → Открыть» — точки останова в СформироватьНакладную сработают без регистрации в справочнике.
// Модуль тестовой формы внешней обработки (только для отладки).
// Реквизиты формы: ПечатаемыйДокумент (ДокументСсылка.РеализацияТоваровУслуг),
// Результат (ТабличныйДокумент) - выведен на форму полем табличного документа.
&НаКлиенте
Процедура Сформировать(Команда)
Если Не ЗначениеЗаполнено(ПечатаемыйДокумент) Тогда
// Платформенный объект сообщения: не зависит от версии БСП.
Сообщение = Новый СообщениеПользователю;
Сообщение.Текст = НСтр("ru = 'Выберите документ'");
Сообщение.Поле = "ПечатаемыйДокумент";
Сообщение.Сообщить();
Возврат;
КонецЕсли;
СформироватьНаСервере();
КонецПроцедуры
&НаСервере
Процедура СформироватьНаСервере()
ОбработкаОбъект = РеквизитФормыВЗначение("Объект");
МассивОбъектов = Новый Массив;
МассивОбъектов.Добавить(ПечатаемыйДокумент);
Результат = ОбработкаОбъект.СформироватьНакладную(МассивОбъектов, Новый СписокЗначений);
КонецПроцедуры
На вызов из меню «Печать» основная форма не влияет: для команды «Вызов серверного метода» БСП её не открывает.
Чтобы проверить именно вызов из меню «Печать», откройте в конфигураторе тот же файл, что загружен в карточку, поставьте точку останова в Печать, запустите предприятие в режиме отладки и выберите команду. Если точка не срабатывает, чаще всего в базе лежит другая сборка — загрузите в карточку ту, что открыта в конфигураторе.
Пока форма не готова, выберите в карточке публикацию «Режим отладки»: команду увидят только пользователи с полными правами или с ролью «Добавление и изменение дополнительных отчетов и обработок».
СведенияОВнешнейОбработке, НужноПечататьМакет, ВывестиТабличныйДокументВКоллекцию, ЗадатьОбластьПечатиДокумента, СформироватьСуммуПрописью. Они есть и в БСП 2.x, и в 3.x. Исключение — НомерНаПечать: под этим именем функция появилась в БСП 2.3.3, раньше она называлась ПолучитьНомерНаПечать.РаботаСКурсамиВалют — сумму прописью тогда стройте платформенной ЧислоПрописью.| Симптом | Причина и решение |
|---|---|
| Команды нет в меню «Печать» | Ошибка в имени в Назначение, документ не отмечен в размещении, публикация отключена или форма документа была открыта до загрузки. Проверьте карточку и переоткройте форму. |
| «Метод объекта не обнаружен (Печать)» | Процедура объявлена без Экспорт или названа иначе. |
| «Метод объекта не обнаружен (НомерНаПечать)» | В базе БСП версии ниже 2.3.3 — используйте ПолучитьНомерНаПечать. |
| Форма печати открывается пустой | Идентификатор команды не совпадает со строкой в НужноПечататьМакет и ВывестиТабличныйДокументВКоллекцию. |
| Часть ячеек пустая | Имя параметра в макете не совпадает с полем запроса или у ячейки не выставлено заполнение «Параметр» / «Шаблон». |
| «Поле объекта не обнаружено (ДатаДокумента)» | Код явно присваивает параметр, которого нет в области. Добавьте его в макет. |
| «Ошибка при вызове метода контекста (ПолучитьОбласть)» | В макете нет области с таким именем — сверьте имена. |
| «Установлен безопасный режим. Выполнение операции запрещено» | Код работает с файлами, COM, внешними компонентами или интернетом — печатной форме это почти никогда не нужно. Если код рассчитывал на УстановитьПривилегированныйРежим, тот молча не включится, и ошибка будет уже про права доступа. |
Нет. Внешняя форма хранится в справочнике дополнительных обработок, конфигурация не меняется. После обновления типовой проверьте, что имена документа и реквизитов в запросе не изменились.
Добавьте в паспорт несколько команд с разными идентификаторами и в Печать обработайте каждый своим блоком Если УправлениеПечатью.НужноПечататьМакет(…). Макетов в обработке тоже может быть несколько.
Можно: добавьте в Назначение несколько имён. Но из журнала придёт смешанный массив, скажем реализации вперемешку с перемещениями. Ветку по типу первой ссылки не выбирайте: документы другого типа молча выпадут из печати. Разложите массив по типам:
// Фрагмент процедуры Печать для формы, назначенной двум документам.
// ВывестиНакладные и ВывестиПеремещения дописывают листы в переданный табличный документ.
Если Не УправлениеПечатью.НужноПечататьМакет(КоллекцияПечатныхФорм, "НакладнаяВнешняя") Тогда
Возврат;
КонецЕсли;
ПорядокТипов = Новый Массив; // типы в порядке появления в МассивОбъектов
ПоТипам = Новый Соответствие;
Для Каждого СсылкаНаДокумент Из МассивОбъектов Цикл
ТипСсылки = ТипЗнч(СсылкаНаДокумент);
Если ПоТипам[ТипСсылки] = Неопределено Тогда
ПоТипам.Вставить(ТипСсылки, Новый Массив);
ПорядокТипов.Добавить(ТипСсылки);
КонецЕсли;
ПоТипам[ТипСсылки].Добавить(СсылкаНаДокумент);
КонецЦикла;
ТабличныйДокумент = Новый ТабличныйДокумент;
ТабличныйДокумент.ОриентацияСтраницы = ОриентацияСтраницы.Портрет;
ТабличныйДокумент.АвтоМасштаб = Истина;
ТабличныйДокумент.КлючПараметровПечати = "ПАРАМЕТРЫ_ПЕЧАТИ_НакладнаяВнешняя";
Для Каждого ТипСсылки Из ПорядокТипов Цикл
Если ТипСсылки = Тип("ДокументСсылка.РеализацияТоваровУслуг") Тогда
ВывестиНакладные(ТабличныйДокумент, ПоТипам[ТипСсылки], ОбъектыПечати);
ИначеЕсли ТипСсылки = Тип("ДокументСсылка.ПеремещениеТоваров") Тогда
ВывестиПеремещения(ТабличныйДокумент, ПоТипам[ТипСсылки], ОбъектыПечати);
КонецЕсли;
КонецЦикла;
УправлениеПечатью.ВывестиТабличныйДокументВКоллекцию(КоллекцияПечатныхФорм,
"НакладнаяВнешняя", НСтр("ru = 'Накладная (внешняя)'"), ТабличныйДокумент);
Процедуры вывода дописывают листы в общий табличный документ: разметка ЗадатьОбластьПечатиДокумента должна остаться в документе, который получит БСП. Создание документа вместе с настройками печати для этого переезжает из СформироватьНакладную в Печать. Типы обходим по ПорядокТипов, потому что порядок обхода Соответствия не гарантирован.
Скорее всего, в карточке осталась публикация «Режим отладки». Если нет, проверьте права: пользователю нужен доступ к дополнительным отчётам и обработкам, а он в разных конфигурациях выдаётся разными профилями.
Через Печать — никак, у неё фиксированные параметры. Для такого сценария делают команду с типом «Открытие формы»: форма обработки запрашивает значения и сама формирует документ. Это заметно сложнее и зависит от версии БСП, так что начните с базового шаблона.
Если форма нужна строго по образцу контрагента, с QR-кодом, факсимиле или сразу для нескольких документов, быстрее отдать её программисту. Мы делаем печатные формы без снятия конфигурации с поддержки. Опишите задачу и приложите образец на странице «Разместить задание» — оценка бесплатная, ответ в течение рабочего дня.
Станьте частью сообщества!
Войдите или зарегистрируйтесь, и вы сможете участвовать в обсуждениях.