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

26.12.22

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

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

Скачать файл

ВНИМАНИЕ: Файлы из Базы знаний - это исходный код разработки. Это примеры решения задач, шаблоны, заготовки, "строительные материалы" для учетной системы. Файлы ориентированы на специалистов 1С, которые могут разобраться в коде и оптимизировать программу для запуска в базе данных. Гарантии работоспособности нет. Возврата нет. Технической поддержки нет.

Наименование По подписке [?] Купить один файл
Простая внешняя печатная форма с корректной двусторонней печатью
.epf 9,18Kb
26
26 Скачать (1 SM) Купить за 1 850 руб.

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

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

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

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

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

Есть публикации других авторов, посвященные созданию ВПФ, например, эта: //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 ее исправили.

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

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

См. также

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

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

7200 руб.

02.08.2023    4170    15    1    

32

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

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

29400 руб.

29.06.2023    5995    14    5    

24

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

Расширение позволяет вывести в табличном документе факсимиле печати и подписей и/или вывести произвольную картинку из прикреплённых файлов организации для 1С УТ 11.5, КА 2.5, ERP 2.5, УНФ 3, Розница 3. Вывод факсимиле возможен в табличные документы УПД, УКД, Счёт-фактура, ТОРГ-12 и другие. Возможно настроить вывод для любых типовых макетов (Акт сверки, М-15, ТТН), для этого потребуется отредактировать макет и разместить на нём картинки с установленными именами. Редактирование осуществляется через типовой механизм в пользовательском интерфейсе.

3000 руб.

07.02.2023    6707    73    10    

30

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

Каждый из нас сталкивается с ситуацией, когда какой-нибудь менеджер показывает свой Excel и рассказывает, как он что-то из 1С копирует в него, снабжает пояснениями, выделяет цветом и т.д. и т.п. Заканчивается все просьбой сделать вот чтобы также было в 1С. И оказывается такой человек (почти с гарантией) либо лучшим продажником, либо каким-то важным, за все отвечающим, - на ком все держится.

2 стартмани

22.04.2024    5267    dimanich70    15    

22

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

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

01.03.2024    6827    dimanich70    9    

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