Нужно было актуализировать базу CRM, а так как планировалась рассылка печатной продукции, решили одновременно с этим в каждый конверт контактным лицам вкладывать письмо на трех листах:
- сопроводительное лист;
- данные самого предприятия для проверки;
- данные всех контактных лиц контрагентов для проверки.
Отчет решено было сделать через Word, т.к. печатные формы не поддерживают режим одновременного вывода страниц и в альбомной и в книжной ориентацией.
Как это работает
В обработке содержится два макета Word:
- частично заполненный для формирования отчета по каждому предприятию
- пустой итоговый файл (но с настройкой границ страницы), в который будут интегрироваться другие заполненные отчеты
Так вот, в частично заполненный как раз и будет заполняться программно:
- в поля DOCVARIABLE - определенный текст
- в верхние таблицы "Реквизиты предприятия" и "Контактные лица" - будет добавляться нужное количество строк в которые будет попадать текст
Как только отчет будет сформирован - он будет сохранен в системной временной папке, затем встроен в Итоговый файл Word.
Так будет происходить с каждым отчетом, пока все отчеты не будут встроены в итоговый файл Word.
В итоге получится 1 файл Word с вложенными в него сотнями других файлов Word, но когда пользователь его откроет - он не заметит разницы между единым файлом и файлом с встроенными файлами.
Форма для обработки была создана исключительно чтобы Вы могли протестировать производительность формирования таких писем.
На компьютере Pentium Dual-Core E5400 2.7Ghz с 4GB RAM и Windows 7 x86 скорость формирования 10 писем около 29 секунд.
Значит, чтобы сгенерировать 100 писем, понадобится 5 минут.
По нажатию кнопки Выполнена - прогресс стартует и из одного шаблона создаются десятки файлов, которые интегрируются в один единый, который можно в пару кликов пустить на печать:
Чтобы понять как работает система, ниже представлен весь код обработки. Он намеренно был упрощен, чтобы Вы поняли сам принцип формирования отчета через встраивание.
Процедура ПриОткрытии()
ЭлементыФормы.Прогонов.Значение = 3;
КонецПроцедуры
Процедура КнопкаВыполнитьНажатие(Кнопка)
ЭлементыФормы.Прогресс.Значение = 0;
ЭлементыФормы.Прогресс.МаксимальноеЗначение = Прогонов;
ЭлементыФормы.Старт.Заголовок = "Старт в " + ТекущаяДата();
// Открываем итоговый документ
ДокументИтоговый = ПолучитьМакет("ИтоговыйWord").Получить();
ДокументИтоговый.Application.Visible = 1;
Selection = ДокументИтоговый.Application.Selection;
Для Номер = 1 По Прогонов Цикл
// Открываем шаблон
ДокументШаблон = ПолучитьМакет("ШаблонWord").Получить();
ДокументШаблон.Application.Visible = 0;
// Заполняем его
ДокументШаблон.Variables.Item("НомерПисьма").Value = "1025";
ДокументШаблон.Variables.Item("ДатаПисьма").Value = Формат(ТекущаяДата(), "ДФ=dd.MM.yyyy");
ДокументШаблон.Variables.Item("КомуДолжность").Value = "Генеральному директору " + Номер;
ДокументШаблон.Variables.Item("Предприятие").Value = "ОАО «Наименование» " + Номер;
ДокументШаблон.Variables.Item("КомуФИО").Value = "И.И. Иванову " + Номер;
ДокументШаблон.Variables.Item("Город").Value = "г. Москва " + Номер;
ДокументШаблон.Variables.Item("Телефон").Value = "(495) 123-45-67 " + Номер;
ДокументШаблон.Variables.Item("Обращение").Value = "Уважаемый Иван Иванович!";
ДокументШаблон.Fields.UpDate();
// Заполняем таблицу на втором листе
Table1 = ДокументШаблон.Tables(2);
Для Строка = 3 По 5 Цикл
Если Строка > 3 Тогда
NewRow = Table1.Rows.Add();
КонецЕсли;
Table1.Cell(Строка,1).Range.Text = "ТипИнфы" + Строка;
Table1.Cell(Строка,2).Range.Text = "ЗначениеИнфы" + Строка;
КонецЦикла;
Table2 = ДокументШаблон.Tables(4);
Для Строка = 3 По 5 Цикл
Если Строка > 3 Тогда
NewRow = Table2.Rows.Add();
КонецЕсли;
Table2.Cell(Строка, 1).Range.Text = "ДолжностьКЛ" + Строка;
Table2.Cell(Строка, 2).Range.Text = "ФИОКЛ" + Строка;
Table2.Cell(Строка, 3).Range.Text = "ТелефоныКЛ" + Строка;
Table2.Cell(Строка, 4).Range.Text = "EmailКЛ" + Строка;
КонецЦикла;
// Сохраняем его во временный каталог
ИмяФайла = КаталогВременныхФайлов() + "actual" + Номер + ".doc";
ДокументШаблон.SaveAs(ИмяФайла);
ДокументШаблон.Close(False);
// Вставляем заполненный шаблон в конец итогового документа
Selection.InsertFile(ИмяФайла, "", False, False, False);
ЭлементыФормы.Прогресс.Значение = Номер;
КонецЦикла;
ИтоговыйФайл = КаталогВременныхФайлов() + "actualItog.doc";
ДокументИтоговый.SaveAs(ИтоговыйФайл);
ДокументИтоговый.Close(False);
Объект = ПолучитьCOMОбъект(ИтоговыйФайл);
// Покажем документ
Объект.Application.Visible = 1;
ЭлементыФормы.Финиш.Заголовок = "Финиш в " + ТекущаяДата();
КонецПроцедуры