1с бсп печать документа word

Демонстрация процесса формирования внешней печатной формы документа из макета Word средствами БСП, колонтитулы, коллекции, и обычные параметры

Функция СведенияОВнешнейОбработке() Экспорт
	
	// Стандартное описание сведений о внешней печатной форме

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

Процедура Печать(МассивОбъектов, КоллекцияПечатныхФорм, ОбъектыПечати, ПараметрыВывода) Экспорт
	
	// Просто передаем управление дальше если удовлетворяет условию

	Если УправлениеПечатью.НужноПечататьМакет(КоллекцияПечатныхФорм, "НазваниеКоманды") Тогда
		ПечатьДокумента(КоллекцияПечатныхФорм, МассивОбъектов, ОбъектыПечати);
	КонецЕсли;
	
КонецПроцедуры

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

Функция ПолучитьДанныеДляПечатиДокумента(МассивОбъектов)

	// здесь происходит заполнение данными для ПФ

	Данные = Новый Структура;
	Данные.Вставить("Организация", "ООО ""Рога и копыта""");
	Данные.Вставить("Контрагент", "ИП Иванов");
	Данные.Вставить("СуммаОплаты", 10523);    
	Данные.Вставить("Дата", '202110102158');  
	
	ТаблицаДанных = Новый ТаблицаЗначений;
	ТаблицаДанных.Колонки.Добавить("Номенклатура");
	ТаблицаДанных.Колонки.Добавить("Количество");
	ТаблицаДанных.Колонки.Добавить("Сумма");

	Строка = ТаблицаДанных.Добавить();
	Строка.Номенклатура = "тест";
	Строка.Количество = 2;
	Строка.Сумма = 50;
	
	Строка = ТаблицаДанных.Добавить();
	Строка.Номенклатура = "тест1";
	Строка.Количество = 3;
	Строка.Сумма = 55;
	
	Строка = ТаблицаДанных.Добавить();
	Строка.Номенклатура = "тест2";
	Строка.Количество = 4;
	Строка.Сумма = 51; 
	
	ТаблицаДанныхВМассиве = ОбщегоНазначения.ТаблицаЗначенийВМассив(ТаблицаДанных);
	
	Данные.Вставить("ТаблицаДанных", ТаблицаДанныхВМассиве);
	
	Возврат Данные;
	
КонецФункции 

Процедура ВывестиДанныеДокументаВТабличныйДокумент(КоллекцияПечатныхФорм, МассивДанныхЗаполнения, ОбъектыПечати)

	ДвоичныеДанныеМакета = ПолучитьМакет("ПФ_DOC_НазваниеМакета");
	
	Если ДвоичныеДанныеМакета <> Неопределено Тогда
		
		// Инициализируем печатную форму	
		
		ПечатнаяФорма = УправлениеПечатью.СведенияОПечатнойФорме(КоллекцияПечатныхФорм, "НазваниеКоманды");
		
		// Наличие пустого табличного документа в коллекции обязательно
		
		ПечатнаяФорма.ТабличныйДокумент = Новый ТабличныйДокумент;
		
		Макет = УправлениеПечатью.ИнициализироватьМакетОфисногоДокумента(ДвоичныеДанныеМакета,Неопределено);
		ПечатнаяФормаДокумента = УправлениеПечатью.ИнициализироватьПечатнуюФорму(Неопределено, Макет.НастройкиСтраницыМакета, Макет);		
		
		// Определим какие области в документе Word хотим заполнить 
		// Для этого у нас документ должен быть размечен конструкциями 
		// {v8 Область.НазваниеОбласти} 
		// {/v8 Область.НазваниеОбласти}
		// наличие областей обязательно
		
		// Область для заполнения обычных параметров в тексте
		
		ОбластьЗаголовок = Новый Структура;
		ОбластьЗаголовок.Вставить("ИмяОбласти", "Заголовок");
		ОбластьЗаголовок.Вставить("ТипОбласти", "Общая");
		
		// Пример определения областей коллекций (таблица и нумерованный или обычный списки)	
		ОбластьШапкаТаблицы = Новый Структура;
		ОбластьШапкаТаблицы.Вставить("ИмяОбласти", "ШапкаТаблицы");
		ОбластьШапкаТаблицы.Вставить("ТипОбласти", "Общая");
		
		ОбластьСтрокаТаблицы = Новый Структура;
		ОбластьСтрокаТаблицы.Вставить("ИмяОбласти", "СтрокаТаблицы");
		ОбластьСтрокаТаблицы.Вставить("ТипОбласти", "СтрокаТаблицы");
		
		// Область должна быть определена первым элементом списка 
		// {v8 Область.НумерованныйСписок}
		// 1.{v8 Номенклатура}
		// {/v8 Область.НумерованныйСписок}
		
		ОбластьНумерованныйСписка = Новый Структура;
		ОбластьНумерованныйСписка.Вставить("ИмяОбласти", "НумерованныйСписок");  
		ОбластьНумерованныйСписка.Вставить("ТипОбласти", "Список");
		
		// Область должна быть определена первым элементом списка 
		// {v8 Область.МаркированныйСписок}
		// • {v8 Номенклатура}
		// {/v8 Область.МаркированныйСписок}
		
		ОбластьМаркированногоСписка = Новый Структура;
		ОбластьМаркированногоСписка.Вставить("ИмяОбласти", "МаркированныйСписок");
		ОбластьМаркированногоСписка.Вставить("ТипОбласти", "Список"); 
		
		// Пример определения областей колонтитулов, эти области в документе есть по умолчанию, 
		// если колонтитулы определены в самом документе
		
		ОбластьВерхнийКолонтитул = Новый Структура;
		ОбластьВерхнийКолонтитул.Вставить("ИмяОбласти", "ВерхнийКолонтитул");
		ОбластьВерхнийКолонтитул.Вставить("ТипОбласти", "ВерхнийКолонтитул");
		
		ОбластьНижнийКолонтитул = Новый Структура;
		ОбластьНижнийКолонтитул.Вставить("ИмяОбласти", "НижнийКолонтитул");
		ОбластьНижнийКолонтитул.Вставить("ТипОбласти", "НижнийКолонтитул");
		
		// Передаем данные заполнения для заполнения печатной формы 
		// Имена параметров данных заполнения должны совпадать с размеченными параметрами в документе в виде  
		// {v8 НазваниеПараметра}
		
		Область = УправлениеПечатью.ОбластьМакета(Макет, ОбластьЗаголовок);
		УправлениеПечатью.ПрисоединитьОбластьИЗаполнитьПараметры(ПечатнаяФормаДокумента, Область, МассивДанныхЗаполнения, Ложь); 
		
		
		Область = УправлениеПечатью.ОбластьМакета(Макет, ОбластьВерхнийКолонтитул);  
		УправлениеПечатью.ПрисоединитьОбластьИЗаполнитьПараметры(ПечатнаяФормаДокумента, Область, МассивДанныхЗаполнения);
		
		Область = УправлениеПечатью.ОбластьМакета(Макет, ОбластьНижнийКолонтитул);
		УправлениеПечатью.ПрисоединитьОбластьИЗаполнитьПараметры(ПечатнаяФормаДокумента, Область, МассивДанныхЗаполнения); 
		
		Область = УправлениеПечатью.ОбластьМакета(Макет, ОбластьШапкаТаблицы);
		УправлениеПечатью.ПрисоединитьОбласть(ПечатнаяФормаДокумента, Область, Ложь);
		
		Область = УправлениеПечатью.ОбластьМакета(Макет, ОбластьСтрокаТаблицы);
		УправлениеПечатью.ПрисоединитьИЗаполнитьКоллекцию(ПечатнаяФормаДокумента, Область, МассивДанныхЗаполнения.ТаблицаДанных); 
		
		Область = УправлениеПечатью.ОбластьМакета(Макет, ОбластьНумерованныйСписка);
		УправлениеПечатью.ПрисоединитьИЗаполнитьКоллекцию(ПечатнаяФормаДокумента, Область, МассивДанныхЗаполнения.ТаблицаДанных);
		
		Область = УправлениеПечатью.ОбластьМакета(Макет, ОбластьМаркированногоСписка);
		УправлениеПечатью.ПрисоединитьИЗаполнитьКоллекцию(ПечатнаяФормаДокумента, Область, МассивДанныхЗаполнения.ТаблицаДанных);
		
		// Поместим получившийся документ в коллекцию печатных форм, в раздел ОфисныеДокументы
		// так БСП поймет что нужно открывать Word при формировании печатной формы
		
		АдресХранилищаОфисныйДокумент = УправлениеПечатью.СформироватьДокумент(ПечатнаяФормаДокумента);
		УправлениеПечатью.ОчиститьСсылки(ПечатнаяФормаДокумента, Ложь);
		УправлениеПечатью.ОчиститьСсылки(Макет);
		
		ОфисныеДокументы = Новый Соответствие;
		
		ОфисныеДокументы.Вставить(АдресХранилищаОфисныйДокумент, НСтр("ru = 'Название документа'"));
		
		ПечатнаяФорма.СинонимМакета    = НСтр("ru = 'Название документа (документ Microsoft Word)'");
		ПечатнаяФорма.ОфисныеДокументы = ОфисныеДокументы;
		
	КонецЕсли;
	
КонецПроцедуры

Комментарии

Содержание:

1.       Чек-лист разработки для создания внешней печатной формы

2.       Пример разработки в 1С 8.3 Зарплата и управление персоналом

Довольно часто пользователи 1С просят разработать печатную формы в формате файлов MS Word. Это обусловлено широкими возможностями форматирования этого типа документа либо удобством его дальнейшего использования и хранения. В этой статье я хочу описать надежный и простой алгоритм создания внешних печатных форм, который я использую для решения поставленных задач. Дополнительным преимуществом этого алгоритма является то, что не требуется вносить изменения в основную конфигурацию. Т.е. используется для конфигураций, находящихся на поддержке без возможности изменения.

Весь принцип реализации строиться на использовании расширения. Причем, добавлять в расширение объекты основной конфигурации практически не нужно. Это очень удобно для дальнейших обновлений конфигураций с расширениями. Возникает вопрос: «А при чем здесь внешняя печатная форма, ведь это расширение?». Дело в том, что расширение легко устанавливается в программу в пользовательском режиме. А если еще ее объекты обособленны от объектов основной конфигурации, то, я думаю, можно называть ее внешней.

Пожалуй, единственным ограничением является наличие в конфигурации Библиотеки стандартных подсистем (далее – БСП). Данный метод «активно» использует механизмы этой библиотеки, поэтому БСП должно быть интегрировано в конфигурацию информационной базы (далее – ИБ). Но здесь особо беспокоиться не нужно, т.к. БСП сейчас присутствует практически во всех типовых конфигурациях.

Перед тем как продемонстрировать пример разработки, предлагаю ознакомиться с чек-листом и представить общую последовательность действий.  

1. Чек-лист разработки для создания внешней печатной формы

1.Создать расширение в конфигурации ИБ

2.В расширении добавить новую обработку (далее Обработка)

3.Обработку включить в подсистему ПодключаемыеОтчетыИОбработки

4.Создать шаблон (документ в формате MS Word) с необходимым содержанием и установить параметры

5.В обработку добавить макет и загрузить в него файл шаблона, созданного в пункте 4

6.В обработку добавить форму и в модуле формы создать функцию:

·         ВыполнитьКомандуПечати – экспортная, пользовательская

7.В модуле менеджера обработки создать 3 процедуры и 4 функции:

·         ПриОпределенииНастроек — экспортная, предопределенная БСП

·         ДобавитьКомандыПечати — экспортная, предопределенная БСП

·         Печать — экспортная, предопределенная БСП

·         ПолучитьДанныеПечати — экспортная, предопределенная БСП

·         ПолучитьДанныеОбъекта – пользовательская

·         ОбластиМакетаОфисногоДокумента – пользовательская

·         НапечататьДокумент– пользовательская  

2. Пример разработки в 1С 8.3 Зарплата и управление персоналом

Давайте рассмотрим этот процесс на примере создания печатной формы дополнительного соглашения к трудовому договору в формате файла MS Word. В качестве информационной базы я буду использовать конфигурацию 1C 8.3 Зарплата и управление персоналом версии 3.1.14.183, установленную на платформе 1С:Предприятие 8.3 (8.3.17.1496). В данной конфигурации используется БСП версии 3.1.2.469.

1.Создаем расширение в конфигурации ИБ.

Запускаем 1С:Предприятие в режиме конфигуратора. Открываем список расширений с помощью команды «Расширения конфигурации» пункта меню «Конфигурация» и добавляем новое расширение. После добавления расширения в список, необходимо будет снять флажок «Безопасный режим» как это показано на Рис.1. Если безопасный режим оставить включенным, то при печати нашей формы программа будет «ругаться».

Расширение конфигурации в 1С 8.3 ЗУП

Рис. 1 Расширение конфигурации в 1С 8.3 Зарплата и управление персоналом

2.Добавляем в расширение новую обработку.

Делаем двойной клик по строке списка с нашим расширением и открываем конфигурацию расширения. В дереве конфигурации находим «Обработки» … выделяем … правая клавиша мышки … Добавить. Я назвал обработку «Расш1_ПечатьWord».

3. Включаем обработку в подсистему ПодключаемыеОтчетыИОбработки.

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

Добавление в расширение в 1С 8.3 Зарплата и управление персоналом

Рис. 2 Добавление в расширение в 1С 8.3 Зарплата и управление персоналом

Возвращаемся в окно конфигурации расширения, находим добавленную нами подсистему и уже здесь в ее состав добавляем нашу обработку.

4.Создаем шаблон-документ Word с необходимым содержанием и параметрами.

На этом этапе берем шаблон доп. соглашения – документ в формате MS Word c расширением .docx, устанавливаем разделители областей вывода, а в местах, где необходимо подставить значения из базы 1С устанавливаем маркеры параметров.

Разделитель области предназначен для того, чтобы «именовать» части документа-шаблона для дальнейшего вывода средствами встроенного языка 1С. Разделители представляют собой пару — открывающий тэг {v8 Область.<Имя области>} в самом начале области документа и закрывающий тэг {/v8 Область.<Имя области>} в самом конце области документа.

В этом примере я не буду рассматривать ситуацию с выводом нескольких областей. В большинстве случаев это и не требуется. Например, для вывода не сложной формы дополнительного соглашения к трудовому договору достаточно весь документ поместить в одну область. Так ее и назовем «ВесьДокумент».

Маркеры параметров выполняют такую же роль, как и параметры стандартных печатных макетов, и имеют следующий формат {v8 <Имя параметра>}

Документ в формате MS Word

Рис. 3 Документ в формате MS Word

5. Добавляем в обработку макет и загружаем в него файл шаблона.

Добавляем в обработку макет. Тип макета – двоичные данные. Название должно начинаться с префикса ПФ_DOC_ Для этого примера я назвал его «ПФ_DOC_ДопСоглашение».

Далее кликаем по макету печатной формы и открывается форма с кнопкой «Загрузить из файла». Загружаем наш шаблон .docx, созданный ранее(пункт 4).

6. В обработку добавляем форму.

Теперь в нашей обработке «Расш1_ПечатьWord» создаем форму. Форма должна быть основной, поэтому при создании формы важно, чтобы флажок «Назначить форму основной» был установлен.

В модуль формы копируем функцию с Рис.4

 Команда печати в 1С 8.3 Зарплата и управление персоналом

Рис. 4 Функция модуля формы в 1С 8.3 Зарплата и управление персоналом

7. В модуле менеджера обработки создадим необходимые процедуры и функции.

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

7.1 ПриОпределенииНастроек

Данная процедура является предопределенной БСП, поэтому название нужно сохранить. Изменить можно размещение (подчеркнуто красным). В моем примере команда печати должна располагаться в справочнике сотрудники.

 Команда печати в 1С 8.3 Зарплата и управление персоналом

Рис. 5 Команда печати в 1С 8.3 Зарплата и управление персоналом

7.2 ДобавитьКомандыПечати

Данная процедура является предопределенной БСП поэтому название нужно сохранить. Здесь мы описывает команду, которая будет запускать печать нашей формы. Свойство МенеджерПечати определяет нахождение модуля менеджера где располагается процедура Печать. Свойство Обработчик определяет нахождение и название клиентского обработчика команды. В нашем случае он располагается на форме обработки.

печать в 1С 8.3 Зарплата и управление персоналом

Рис. 6 Добавление команды печати в 1С 8.3 Зарплата и управление персоналом

7.3 Печать

Данная процедура является предопределенной БСП поэтому название нужно сохранить. В переменную ИдентификаторКоманды и ИмяМенеджераПечати устанавливаем имя идентификатора и менеджера печати из процедуры ДобавитьКомандуПечати (пункт 7.2).

Процедура печати в 1С 8.3 Зарплата и управление персоналом

Рис. 7 Процедура печати в 1С 8.3 Зарплата и управление персоналом

7.4 ПолучитьДанныеПечати

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

В параметр функции УправлениеПечатью.МакетПечатнойФормы устанавливаем полный путь к макету печатной формы, созданному в пункте 5 нашей статьи.

Получение данных объекта в 1С 8.3

Рис. 8 Получение данных печати в 1С 8.3 Зарплата и управление персоналом

7.5 ПолучитьДанныеОбъекта

В этой функции необходимо создать структуру с данными, которыми будет заполняться печатная форма. Ключ структуры – имя параметра шаблона Word {v8 <Имя параметра>}, а значение – значение из базы 1С. Параметр функции СсылкаНаОбъект – ссылка на объект печати. В нашем случае это ссылка на сотрудника.

Получение данных объекта в 1С 8.3 Зарплата и управление персоналом

Рис. 9 Получение данных объекта в 1С 8.3 Зарплата и управление персоналом

7.6 ОбластиМакетаОфисногоДокумента

Здесь описываем области и устанавливаем типы.

Возможные типы областей:

·         Общая – используется однократно.

·         СтрокаТаблицы – используется для вывода множества строк;

·         Список – используется для вывода множества строк;

·         ВерхнийКолонтитул;

·         НижнийКолонтитул;

документ в 1С 8.3 Зарплата и управление персоналом

Рис. 10 Области макета в 1С 8.3 Зарплата и управление персоналом

7.7 НапечататьДокумент

Эта функция отвечает за вывод и заполнение областей. В блоке, отмеченном красной линией, нужно описать последовательный вывод областей. Здесь меняем/устанавливаем только название области. В нашем случае «ВесьДокумент»

Функция напечатать документ в 1С 8.3 Зарплата и управление персоналом

Рис. 11 Функция напечатать документ в 1С 8.3 Зарплата и управление персоналом

На этом все. Запускаем печать и получаем ожидаемый результат.

Печать макета документа Word

Рис. 12 Печать макета документа Word

В заключении хотелось бы добавить, что с помощью одной такой обработки можно реализовать множество различных команд печати документа.

В интернете можно найти множество авторских методик создания внешней печатной формы в формате документа MS Word, однако, методы на основе БСП являются наиболее надежными.

Специалист компании «Кодерлайн»

Игорь Торба

Да — это просто тестовая строка специального формата для идентификации области в функции БСП.

Функция ПолучитьПозициюНачалаОбласти(Знач COMСоединение, Знач ИдентификаторОбласти)

ИдентификаторОбласти = «{v8 Область.» + ИдентификаторОбласти + «}»;

ВесьДокумент = COMСоединение.ActiveDocument.Content;

ВесьДокумент.Select();

Поиск = COMСоединение.Selection.Find;

Поиск.Text = ИдентификаторОбласти;

Поиск.ClearFormatting();

Поиск.Forward = Истина;

Поиск.execute();

Если Поиск.Found Тогда

Возврат COMСоединение.Selection.End;

КонецЕсли;

Возврат -1;

КонецФункции

Reply

В Ворде взять сам файл пустого договора.
Затянуть его в макеты документа (создать новый макет, указать тип макета Active document, выбрать нужный файл). Появится новый макет, его и вызвать при нажатии на кнопку Печать и выбором чего-то там.

В самом макете реализовать через закладки именованные области, в которые потом выводить нужные данные.

когда-то изгалялся печатать приходную накладную в конфе для обучения самого себя, вот нашел, может поможет:

&НаСервере
Процедура ПечатьАктивНаСервере(СсылкаНаДокумент)

Макет = Документы.ПриходнаяНакладная.ПолучитьМакет("МакетАктив");

Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| ПриходнаяНакладная.Номер КАК Номер,
| ПриходнаяНакладная.Дата КАК Дата,
| ПриходнаяНакладная.СуммаДокумента КАК СуммаДокумента,
| ПриходнаяНакладная.Поставщик.Наименование КАК Поставщик
|ИЗ
| Документ.ПриходнаяНакладная КАК ПриходнаяНакладная
|ГДЕ
| ПриходнаяНакладная.Ссылка = &СсылкаНаДокумент
|;
|
|////////////////////////////////////////////////////////////////////////////////
|ВЫБРАТЬ
| ПриходнаяНакладнаяТМЦ.НомерСтроки КАК НомерСтроки,
| ПриходнаяНакладнаяТМЦ.Товар.Наименование КАК Товар,
| ПриходнаяНакладнаяТМЦ.Колво КАК Колво,
| ПриходнаяНакладнаяТМЦ.Цена КАК Цена,
| ПриходнаяНакладнаяТМЦ.Сумма КАК Сумма
|ИЗ
| Документ.ПриходнаяНакладная.ТМЦ КАК ПриходнаяНакладнаяТМЦ
|ГДЕ
| ПриходнаяНакладнаяТМЦ.Ссылка = &СсылкаНаДокумент";

Запрос.УстановитьПараметр("СсылкаНаДокумент", СсылкаНаДокумент);

МассивРезультатовЗапроса = Запрос.ВыполнитьПакет();//выполняется пакет запросов
//один по шапке документа
//второй по табличной части
//получаем массив результатов выполнения запроса
//обращение к каждому результату как к элементы массива.

ВыборкаШапка = МассивРезультатовЗапроса[0].Выбрать();//выборка по первому элементу массива, т.е. по шапке документа
ВыборкаТовары = МассивРезультатовЗапроса[1].Выбрать();//выборка по второму элементу массива, т.е. по табличной части товары

ВыборкаШапка.Следующий();//в выборке всего 1 строка, поэтому на ней и позиционируемся

Word = Макет.Получить();

Word.Application.Visible = Ложь;

Doc = Word.Application.Documents(1);
Doc.Activate();

Word.Bookmarks("НомерНакладной").Select();
Word.Application.Selection.TypeText(ВыборкаШапка.Номер);
                                                               
Word.Bookmarks("ДатаНакладной").Select();
Word.Application.Selection.TypeText(Формат(ВыборкаШапка.Дата,"ДФ=dd.MM.yyyy"));

Word.Bookmarks("Поставщик").Select();
Word.Application.Selection.TypeText(ВыборкаШапка.Поставщик);

Word.Bookmarks("СуммаОбщая").Select();
Word.Application.Selection.TypeText(Формат(ВыборкаШапка.СуммаДокумента,"ЧДЦ=2"));

Word.Bookmarks("СуммаОбщаяПрописью").Select();
Word.Application.Selection.TypeText(ЧислоПрописью(ВыборкаШапка.СуммаДокумента,"L=uk_UA","гривня, гривні, гривень, ж, копійка, копійки, копійок, ж, 2"));

//ну и так далее по всем закладкам, которые могут быть в шаблоне макета

//самое интересное - вывод табличных частей
Таблица = Word.Tables.Item(1);//получаем первую таблицу в документе
//если несколько, то необходимо каждую получать таким образом
НомерСтроки=0;

Пока ВыборкаТовары.Следующий() цикл
НомерСтроки = НомерСтроки+1;
Row = Таблица.Rows.Add(Таблица.Rows(НомерСтроки+1));//начинаем добавлять со 2 строки, шапку пропускаем в таблице

Row.Cells(1).Range.Text = НомерСтроки; //Cells(i)-i колонка в текущей строке
Row.Cells(2).Range.Text = ВыборкаТовары.Товар;
Row.Cells(3).Range.Text = "шт";
Row.Cells(4).Range.Text = Формат(ВыборкаТовары.Цена,"ЧДЦ=2");
Row.Cells(5).Range.Text = ВыборкаТовары.Колво;
Row.Cells(6).Range.Text = Формат(ВыборкаТовары.Сумма,"ЧДЦ=2");

КОнецЦикла;
//Row = Таблица.Rows(НомерСтроки+1);
//Row.Cells(6).Range.Text = Формат(ВыборкаШапка.СуммаДокумента,"ЧДЦ=2");

Word.Bookmarks("СуммаОбщаяИтого").Select();
Word.Application.Selection.TypeText(Формат(ВыборкаШапка.СуммаДокумента,"ЧДЦ=2"));
Word.Application.Visible = Истина;

//Doc.Close();
//Word.Quit();

вот как раз в Word.Bookmarks(«НомерНакладной»).Select() НомерНакладной — это и есть закладка.
делается закладка так: когда уже есть макет, открыть его. Выделить текст, который должен быть чем-то заполнен из базы. В меню Вставка найти закладки (у меня под подменю ссылки есть выпадающее, там в выпадающем есть закладка). Дальше задаешь имя закладки и жмешь добавить. Таким образом по тексту договора надо создать закладки, к которым потом сможешь обратиться из кода программы и задать нужные значения.

Все чем мог — помог. У меня работало коряво, подвешивало 1С когда выводило печатную форму. Так и не разобрался почему, забил.

Шпаргалка из гл 3.38 документации БСП

     Подсистема «Печать» библиотеки  стандартных подсистем предназначена для формирования печатных форм объектов на основе табличных макетов (формат MXL) или макетов офисных документов в формате Office Open XML (docx).

Подсистема предоставляет инструменты для размещения команд печати на формах в подменю Печать, форму предпросмотра печатных форм, а также различные сервисные возможности по сохранению печатных форм в файлы, отправке по электронной почте и формированию изображений QR-кодов. Кроме того, в подсистему входит рабочее место по редактированию макетов печатных форм.

Настройка

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

Описательная часть находится в  процедуре ДобавитьКомандыПечати, а логика формирования печатной формы зависит от того, в каком виде должны формироваться печатные формы:

  • Формирование печатной формы в формате табличного документа (с предварительным просмотром или сразу на принтер).
  • Формирование комплекта табличных документов (с предварительным просмотром или сразу на принтер).
  • Формирование печатных форм с интерактивным запросом дополнительных параметров у пользователя.
  • Вывод табличного документа в один из популярных форматов (Office Open XML, Microsoft Excel, Adobe PDF,  HTML, текстовый документ и другие).
  • Формирование печатной формы в виде офисных документов в формате Office Open XML (для тех случаев, когда возможностей табличного макета недостаточно).

Подключение объектов программы

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

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

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

Процедура ДобавитьКомандыПечати(КомандыПечати) Экспорт
// Пример Счет на оплату   
КомандаПечати = КомандыПечати.Добавить();
КомандаПечати.МенеджерПечати = "Документ._ДемоСчетНаОплатуПокупателю";  
КомандаПечати.Идентификатор = "СчетЗаказ";
КомандаПечати.Представление = НСтр("ru = 'Счет на оплату'");
КомандаПечати.ПроверкаПроведенияПередПечатью = Истина; 
КонецПроцедуры
#КонецОбласти

Если предполагается, что в этом подменю может быть выведено большое количество команд (более 10), то рекомендуется добавить вложенные группы кнопок с суффиксами “Важное”, “Обычное” и “СмТакже”. Например: “ПодменюПечатьВажное”, “ПодменюПечатьОбычное” и “ПодменюПечатьСмТакже”. Суффиксы этих групп указываются в свойстве Важность тех команд, которые должны выводиться в этих группах (подробнее про это свойство см. далее в таблице «Параметры команд печати»).

Далее, в формах объектов, подключенных на предыдущем шаге, в которых требуется выводить подменю с командами печати, нужно Встроить подсистему «Подключаемые команды»

В формах журналов документов подменю Печать по умолчанию заполняется командами документов, входящих в журнал. В случаях, когда команды печати необходимо брать непосредственно в модуле менеджера журнала документов, необходимо сделать соответствующую вставку кода в процедуре ПриПолученииНастроекСпискаКомандПечати общего модуля УправлениеПечатьюПереопределяемый:

// Дополнительные настройки списка команд печати.
//
// Параметры:
//  НастройкиСписка - Структура - модификаторы списка команд печати.
//   * МенеджерКомандПечати     - МенеджерОбъекта - менеджер объекта, в котором формируется список команд печати;
//   * АвтоматическоеЗаполнение - Булево - заполнять команды печати из объектов, входящих в состав журнала.
//                                         Значение по умолчанию: Истина.
//
Процедура ПриПолученииНастроекСпискаКомандПечати(НастройкиСписка) Экспорт
    Если НастройкиСписка.МенеджерКомандПечати = ЖурналыДокументов._ДемоСкладскиеДокументы Тогда
        НастройкиСписка.АвтоматическоеЗаполнение = Ложь;
    КонецЕсли;
КонецПроцедуры

Разработка процедуры «Печать»

1 . В модуль менеджера печати, указанного в параметре МенеджерПечати, добавить экспортную процедуру Печать:

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

2. Разместить в конфигурации макет табличного и  
Добавить функцию, формирующую печатную форму (табличный документ), например:

Функция ПечатьСчетаЗаказа(МассивОбъектов, ОбъектыПечати)    . . .    Возврат ТабличныйДокумент;КонецФункции

3. В процедуре Печать разместить код для идентификации требуемой печатной формы и вызова функции по ее формированию . Например:

Процедура Печать(МассивОбъектов, ПараметрыПечати, КоллекцияПечатныхФорм, ОбъектыПечати, ПараметрыВывода) Экспорт

НужноПечататьМакет = УправлениеПечатью.НужноПечататьМакет(КоллекцияПечатныхФорм, "СчетЗаказ");
    Если НужноПечататьМакет Тогда
        УправлениеПечатью.ВывестиТабличныйДокументВКоллекцию(
        КоллекцияПечатныхФорм,
        "СчетЗаказ",
        НСтр("ru = 'Счет на оплату'"),
        ПечатьСчетаЗаказа(МассивОбъектов, ОбъектыПечати),
        ,
        "Документ._ДемоСчетНаОплатуПокупателю.ПФ_MXL_СчетЗаказ");
    КонецЕсли;

КонецПроцедуры

Формирование печатной формы в клиентском контексте

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

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

Процесс создания такой команды выглядит следующим образом:

  1. В модуле менеджера объекта в процедуре ДобавитьКомандыПечати добавить описание команды (с использованием параметра Обработчик), например:
// Счет на оплату в Microsoft Word
    КомандаПечати = КомандыПечати.Добавить();
    КомандаПечати.МенеджерПечати = "Документ._ДемоСчетНаОплатуПокупателю";
    КомандаПечати.Идентификатор = "СчетНаОплату(MSWord)";
    КомандаПечати.Представление = НСтр("ru = 'Счет на оплату в Microsoft Word'");
    КомандаПечати.Картинка = БиблиотекаКартинок.ФорматWord2007;
    КомандаПечати.ПроверкаПроведенияПередПечатью = Истина;
    КомандаПечати.Обработчик = "_ДемоСтандартныеПодсистемыКлиент.ПечатьСчетовНаОплатуПокупателю";

 2.   Добавить клиентскую экспортную функцию формирования печатной формы с единственным параметром, в который подсистема «Печать» будет передавать структуру параметров команды. Имя функции может быть произвольным, например:

Функция ПечатьСчетовНаОплатуПокупателю(ПараметрыПечати) Экспорт
    .
    .
    .
КонецФункции

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

Если клиентский контекст предполагает только запрос дополнительных параметров, а формирование табличного документа выполняется на сервере, то необходимо также выполнить инструкцию по разработке процедуры «Печать», а из клиентской функции выполнять передачу управления в процедуру УправлениеПечатьюКлиент.ВыполнитьКомандуПечати.

Like this post? Please share to your friends:
  • 1с word через com
  • 1с word как задать имя документа
  • 1с word как вывести колонтитулы
  • 1с word selection endkey
  • 1с word documents add ошибка