Корректная двусторонняя печать табличных документов + Простой пример создания внешней печатной формы

26.12.22

Задачи пользователя - Адаптация типовых решений

Статья посвящена двухсторонней печати табличных документов из 1С:Предприятия 8.3. А за одно рассмотрено создание Внешней печатной формы (ВПФ). Публикацию про двустороннюю печать на Инфостарте не нашел. Когда передо мной стояла такая задача, решение нашел не сразу. Делюсь, думаю, для многих эта информация будет полезной.

Скачать файлы

Наименование Файл Версия Размер
Простая внешняя печатная форма с корректной двусторонней печатью
.epf 9,18Kb
23
.epf 9,18Kb 23 Скачать

В чем проблема с двусторонней печатью?

Как известно, в настройках "Параметров страницы" печатной формы есть настройка "Двусторонняя печать" с вариантами: "Нет", "Переворот вверх", "Переворот влево", "Использовать настройки принтера".

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

Разберем ситуацию на примере. Есть задача, по заданию Заказчика нужно разработать новую печатную форму документа "Реализация товаров и услуг" (РТУ) с возможностью печати с двух сторон. Причем пользователь должен иметь возможность выделить несколько документов реализации и распечатать их комплектом.

Как известно, в таком случае первое что нужно сделать, это создать новую обработку, которая будет являться "Внешней печатной формой"(ВПФ) документа РТУ. 

Есть публикации других авторов, посвященные созданию ВПФ, например, эта: //infostart.ru/public/286059/, я же хочу привести минимально необходимый код:

1. для создания ВПФ документа;

2. для корректной работы двусторонней печати.

1. Создание простой Внешней печатной формы (ее можно скачать внизу статьи):

Как будет выглядеть печатная форма: 

 

Создаем новую обработку в Конфигураторе. Меню Файл - Новый - Внешняя обработка. У нее создаем "Макет", например, такого вида:

Дальше в "Модуле объекта" располагаем процедуру и две функции:

а)

Процедура Печать(МассивОбъектов, КоллекцияПечатныхФорм, ОбъектыПечати, ПараметрыВывода) Экспорт
	
	УправлениеПечатью.ВывестиТабличныйДокументВКоллекцию(КоллекцияПечатныхФорм, 
	"Пример двусторонней печати", "Пример двусторонней печати", 
	СформироватьПечатнуюФорму(МассивОбъектов, ОбъектыПечати)); 
	
КонецПроцедуры

- процедура Печать() обязательно должна быть у ВПФ. Она вызывается при формировании печатной форм документа (документов). Параметр МассивОбъектов - это Массив ссылок на документы, по которым мы формируем ВПФ. Параметр ОбъектыПечати - это СписокЗначений, также содержащий ссылки на документы.

б)

Функция СформироватьПечатнуюФорму(МассивОбъектов, ОбъектыПечати) Экспорт
	
	ТабДокумент = Новый ТабличныйДокумент;
	ТабДокумент.АвтоМасштаб = Истина;
	
	//для примера только в первый документ выведем 40 строк, в последующие - 5 строк.
	НапечаталиПервыйДокумент = Ложь; 
	
	Для каждого СсылкаИзМассива Из МассивОбъектов Цикл
		
		// Запомним номер строки, с которой начали выводить текущий документ. 
		// Нужно для возможности печатать покомплектно.
		НомерСтрокиНачало = ТабДокумент.ВысотаТаблицы + 1;
		
		Макет = ПолучитьМакет("Макет");
		
		Шапка = Макет.ПолучитьОбласть("Заголовок");
		Шапка.Параметры.Документ = Строка(СсылкаИзМассива);
		ТабДокумент.Вывести(Шапка);
		
		СтрокаОбласть = Макет.ПолучитьОбласть("Строка");
		
		Для сч = 1 По 40 Цикл
			//для примера только в первый документ выведем 40 строк, 
            //в последующие - 5 строк.
			Если сч > 5 И НапечаталиПервыйДокумент Тогда
				Прервать;
			КонецЕсли;
			
			СтрокаОбласть.Параметры.Номенклатура = "Товар " + Строка(сч);	
			СтрокаОбласть.Параметры.Количество = Строка(сч);	
			
			ТабДокумент.Вывести(СтрокаОбласть);
		КонецЦикла;
		
		// На последнем листе каждого документа делаем разрыв страницы.
		ТабДокумент.ВывестиГоризонтальныйРазделительСтраниц();
		
		НапечаталиПервыйДокумент = Истина;
				
	КонецЦикла;
	
	// Установим тип двусторонней печати
	ТабДокумент.ДвусторонняяПечать = ТипДвустороннейПечати.ПереворотВлево;
	
	Возврат ТабДокумент;	
	
КонецФункции

- Функция СформироватьПечатнуюФорму() может называться и другим именем. Вызывается из процедуры Печать(). Ее суть в том, чтобы создать объект ТабличныйДокумент и в цикле (по документам содержащимся в параметре "МассивОбъектов") вывести в него заполненные области "Заголовок" и "Строка". В конце функции она возвращает готовый ТабличныйДокумент обратно в Процедуру Печать().

в)

Функция СведенияОВнешнейОбработке() Экспорт
	
	ПараметрыРегистрации = ДополнительныеОтчетыИОбработки.СведенияОВнешнейОбработке("2.1.3.1");
	
	ПараметрыРегистрации.Наименование = "Пример двусторонней печати";
	ПараметрыРегистрации.Вид ="ПечатнаяФорма";
	ПараметрыРегистрации.Версия = "1.0";
	ПараметрыРегистрации.БезопасныйРежим = Истина;
	ПараметрыРегистрации.Назначение.Добавить("Документ.РеализацияТоваровУслуг");
	
	НоваяКоманда = ПараметрыРегистрации.Команды.Добавить();
	НоваяКоманда.Представление = "Пример двусторонней печати";
	НоваяКоманда.Идентификатор = "Пример двусторонней печати";
	НоваяКоманда.Использование ="ВызовСерверногоМетода";
	НоваяКоманда.ПоказыватьОповещение = Истина;
	НоваяКоманда.Модификатор = "ПечатьMXL";
	
	Возврат ПараметрыРегистрации;
	
КонецФункции

- Функция СведенияОВнешнейОбработке() - последняя функция нашего МодуляОбъекта. Она обязательна и стандартная для ВПФ. Содержит параметры, позволяющие добавить ее в "Дополнительные отчеты и обработки" (меню Администрирование - Печатные формы, отчеты, обработки).

Готово.

Теперь запускаем 1С:Предприятие. Добавляем ВПФ в "Дополнительные отчеты и обработки". Открываем список документов "Реализация товаров", выделяем например два любых документа и нажимаем "Печать" - "Пример двусторонней печати". Открывается заполненная печатная форма по двум документам. Нажимаем большую желтую кнопку "Печать" . Если все сделано правильно, то на нашем принтере, поддерживающем двустороннюю печать, распечатается два листа с двух сторон. Первая реализация на первый лист не влезет (т.к. строк в таблице 40) и закончится на одной стороне второго листа. Вторая реализация на печатается на обратной стороне второго листа. Таким образом, мы создали ВПФ и увидели проблему двусторонней печати. Рассмотрим ее решение ниже.

2. Что необходимо добавить для корректной двусторонней печати.

В функцию СформироватьПечатнуюФорму() добавляем следующий ключевой фрагмент кода:

		// В табличном документе зададим имя области, в которую был 
		// выведен объект. Нужно для возможности печатать покомплектно.
		УправлениеПечатью.ЗадатьОбластьПечатиДокумента(ТабДокумент, 
			НомерСтрокиНачало, ОбъектыПечати, СсылкаИзМассива);

- вставить его нужно перед концом цикла по "Массиву объектов":

		НапечаталиПервыйДокумент = Истина;
		
		// В табличном документе зададим имя области, в которую был 
		// выведен объект. Нужно для возможности печатать покомплектно.
		УправлениеПечатью.ЗадатьОбластьПечатиДокумента(ТабДокумент, 
			НомерСтрокиНачало, ОбъектыПечати, СсылкаИзМассива);
			
	КонецЦикла;
	
	// Установим тип двусторонней печати
	ТабДокумент.ДвусторонняяПечать = ТипДвустороннейПечати.ПереворотВлево;

- этот фрагмент выполняет вызов Процедуры ЗадатьОбластьПечатиДокумента() из общего модуля УправлениеПечатью. Суть процедуры в том, чтобы в передаваемом ТабличномДокументе выделить именованной областью каждый документ отдельно (на скриншотах подчеркнуты красным):

Начало второго документа:

Разберем параметры Процедуры УправлениеПечатью.ЗадатьОбластьПечатиДокумента():

ТабДокумент - формируемый табличный документ. НомерСтрокиНачало - передаем номер строки табличного документа с которой должна начинаться именованная область документа. ОбъектыПечати - Список значений с ссылками на документы. СсылкаИзМассива - ссылка на документ текущей итерации цикла).

Сама процедура простая и небольшая, можете посмотреть ее самостоятельно в общем модуле УправлениеПечатью, чтобы не перегружать статью лишним.

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

Проблема решена.

К сведению: В сентябре 2016г через франчайзи писал обращение разработчикам о том, что на платформе 8.3.8.2054 (а также 8.2137 и 9.1818) перестала работать двусторонняя покомплектная печать объектом ПакетОтображаемыхДокументов. Это касалось даже типовых печатных форм Счет-фактура, Счет на оплату, ТОРГ-12 и т.д. Код ошибки на bugboard.v8.1c.ru: 10167935. Начиная с 8.3.9.2033 ее исправили.

Не судите за большое количество текста, старался написать максимально доступно. Буду рад комментариям. Это первая статья.

двусторонняя двухсторонняя печать внешняя печатная форма пример табличный документ форма.

См. также

Табличная часть в доп. реквизитах и формирование таблиц в шаблоне docx для 1С:ДО 3.0

Адаптация типовых решений Платформа 1С v8.3 1С:Документооборот Россия Платные (руб)

Расширение конфигурации для «1С:Документооборот КОРП», редакция 3.0. позволяет: 1.использовать произвольные табличные части в качестве дополнительных реквизитов к документу; 2 использовать произвольные табличные части в шаблонах в формате docx для автоматического заполнения таблиц.

29400 руб.

29.06.2023    4453    9    4    

18

Расширение для 1С:УНФ. Автоматическое снятие резервов в Заказах покупателей

Логистика, склад и ТМЦ Адаптация типовых решений Платформа 1С v8.3 1С:Управление нашей фирмой 1.6 1С:Управление нашей фирмой 3.0 Россия Управленческий учет Платные (руб)

Чтобы не допустить путаницы с обещаниями клиентам и для четкого контроля исполнения заказов мы используем резервирование товаров. Мы доработали УНФ, чтобы она автоматически отменяла старые резервы и не мешала эффективно продавать.

7200 руб.

02.08.2023    2956    4    0    

19

Создать на основании - своя кнопка (БСП). Проблема двух подменю Создать на основании

БСП (Библиотека стандартных подсистем) Адаптация типовых решений Платформа 1С v8.3 1С:ERP Управление предприятием 2 Бесплатно (free)

Понадобилось в подменю "Создать на основании" добавить свою команду, которая открывает обработку. В процессе доработок появилась проблема двух подменю "Создать на основании". В статье о том, как решились проблемы.

01.03.2024    1283    dimanich70    6    

13

Доработка отчета "Связанные документы" (структура подчиненности) для вывода объектов из любого расширения

Адаптация типовых решений Платформа 1С v8.3 1С:Управление торговлей 11 Россия Абонемент ($m)

Доработка типового отчета "Связанные документы" позволяет просто и быстро расширять состав объектов для построения структуры подчиненности документов, используя объекты основной конфигурации и любых расширений.

1 стартмани

27.10.2023    1996    13    avmartynov    10    

43

Печать непроведенных документов для УТ, КА, ERP. Настройка печати по пользователям, документам и печатным формам

Пакетная печать Печатные формы Адаптация типовых решений Универсальные функции Платформа 1С v8.3 1С:ERP Управление предприятием 2 1С:Управление торговлей 11 1С:Комплексная автоматизация 2.х Россия Абонемент ($m)

Расширение для программ 1С:Управление торговлей, 1С:Комплексная автоматизация, 1С:ERP, которое позволяет распечатывать печатные формы для непроведенных документов. Можно настроить, каким пользователям, какие конкретные формы документов разрешено печатать без проведения документа.

2 стартмани

22.08.2023    2072    21    progmaster    7    

3
Комментарии
В избранное Подписаться на ответы Сортировка: Древо развёрнутое
Свернуть все
1. trans.sidorenko 31.07.17 10:45 Сейчас в теме
2. SmArtist 98 31.07.17 11:45 Сейчас в теме
3. SmArtist 98 01.08.17 06:02 Сейчас в теме
кто-нибудь сталкивался с этой темой?
4. scherbakovya 03.12.18 11:50 Сейчас в теме
Вы не сталкивались с проблемой путаницы заданий после отправки пакета на печать? Т.е. отправляются задания друг за другом ТОРГ12, СФ, доверенность и так для каждого документа, а на выходе имеем ТОРГ12, ТОРГ12, доверенность, СФ и т.п.
Если ПакетОтображаемыхДокументов сохранить в pdf и отправить на печать одним заданием, то будет ли работать правильная разбивка при двусторонней печати?
5. SmArtist 98 03.12.18 12:21 Сейчас в теме
(4) с путаницей не сталкивался. Если сами не разберетесь задайте вопрос разработчикам через партнера, возможно ошибка платформы.
2. Правильная разбивка, если в контексте моей статьи, работать не будет. Потому что платформа 1С при печати уже из ПДФ не участвует. Попробуйте да узнаете.
6. Sova123 34 09.08.19 01:27 Сейчас в теме
(5)на 8.3.14 и 8.3.12 некорректно работает двухстороння печать
7. ketr 125 05.12.19 19:32 Сейчас в теме
А если в макет выводится строка неограниченной длины с переносом строк , то как сделать чтобы она разрывалась (если не умещается на одном листе) и переносилась на новый лист?
8. SmArtist 98 06.12.19 05:05 Сейчас в теме
(7) я думаю разрывать ее не надо. А надо целиком вывести ее на новом листе после разрыва страницы. Используйте функцию ПроверитьВывод(). С двусторонней печатью это не связано.
Оставьте свое сообщение