3 в 1: отчеты 1С в Word: динамические таблицы, разная ориентация страниц, объединение тысячи отчетов в один файл word

28.12.12

Разработка - Работа с интерфейсом

Рассмотрим 3 вещи, по которым очень часто возникают вопросы: 1. как выводить динамически формируемые таблицы с разным количеством строк (программно добавлять строки в файл word); 2. как в одном отчете в Word сделать одну страницу в книжной ориентации, а другие - в альбомных; 3. как в одном файле Word получить сразу 1000 отчетов с разной ориентацией страниц, с разными динамически сформированными таблицами.

Скачать исходный код

Наименование Файл Версия Размер
Печать писем
.epf 73,10Kb
100
.epf 73,10Kb 100 Скачать

Нужно было актуализировать базу 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;


    ЭлементыФормы.Финиш.Заголовок = "Финиш в " + ТекущаяДата();
КонецПроцедуры

См. также

Богатый редактор картинок, хранимых в базе, с возможностью РИСОВАНИЯ. Редактор внешних файлов картинок. Объект, расширяющий возможности работы с картинками из встроенного языка (Три в одном) + Обработка «Стандартизация картинок»

Работа с интерфейсом Рабочее место Платформа 1С v8.3 Управляемые формы Конфигурации 1cv8 Платные (руб)

Обработка предназначена для редактирования картинок в режиме «Предприятие», с возможностью РИСОВАТЬ на них. Поддерживается работа как в обычных формах (толстый клиент) так и на управляемых формах (тонкий клиент). Обработка позволяет редактировать как картинки, хранимые в базе, так и графические файлы с диска на файловой системе. Помимо базовых функций (изменение размеров, преобразование формата, обрезание картинки, повороты и т.п.) – редактор имеет богатый набор инструментов для рисования. Доступна функция вставки изображения из буфера обмена. Также обработка может быть использована из встроенного языка как объект для редактирования картинок. Объект может быть использован: на стороне клиента, на стороне сервера, из внешнего соединения. Данная обработка будет особенно полезна тем, кто вносит картинки в базу (изображения номенклатуры, фотографии физических лиц и т.п.). Функционал реализуется с использованием JavaScript и бесплатного ПО ImageMagick (без использования внешних компонент).

6000 руб.

16.01.2015    62042    43    59    

81

[Расширения] Динамическое управление видимостью и доступностью элементов форм (УФ) (8.3.6+)

Работа с интерфейсом Платформа 1С v8.3 Управляемые формы Конфигурации 1cv8 Платные (руб)

Механизм «Динамическое управление доступом к элементам форм объектов 1С8» предназначен для обеспечения возможности оперативного управления видимостью и доступностью элементов форм документов и справочников продуктов фирмы «1С» «1С:Предприятие 8». Решение универсальное, встраивается в любую конфигурацию с минимальными доработками, что позволяет без проблем обновлять типовые решения.

5000 руб.

14.01.2016    54665    16    21    

42

Управление дашбордами

Работа с интерфейсом Платформа 1С v8.3 Конфигурации 1cv8 Платные (руб)

Обработка предназначена для создания и управления дашбордами.

2400 руб.

29.06.2020    16889    22    4    

36

Новогоднее оформление для 1С

Работа с интерфейсом Платформа 1С v8.3 1С:Бухгалтерия 3.0 1С:Управление торговлей 11 1С:Зарплата и Управление Персоналом 3.x 1С:Управление нашей фирмой 3.0 Бесплатно (free)

Добавьте новогоднего настроения! Расширение создает декорацию в виде гирлянды на некоторых формах объектов.

27.12.2023    11128    760    elcoan    45    

106

Конструктор HTML, CSS и javascript

Инструментарий разработчика Работа с интерфейсом Платформа 1С v8.3 Конфигурации 1cv8 Абонемент ($m)

Подходит для создания web-страниц для замены управляемых форм 1С, красивых отчетов, интерфейса мобильного приложения на платформе 1С и для простых страниц веб-сайтов.

2 стартмани

10.04.2023    9867    153    acces969    31    

119

Модель состояния для MVC

Работа с интерфейсом Платформа 1С v8.3 Конфигурации 1cv8 Абонемент ($m)

"MVC плохо применима в 1С" - познакомьтесь с моделью состояния и, возможно, ваше мнение поменяется! Представленное решение является эволюционным развитием идеи реализации MVC для 1С. В новой версии добавлены DSL для описания модели состояния, а также параметризация свойств параметров и элементов формы.

1 стартмани

05.07.2022    3916    kalyaka    4    

29

Табло очереди заказов на экран телевизора

WEB-интеграция Работа с интерфейсом Платформа 1С v8.3 1С:Розница 2 Платные (руб)

Связка из веб-приложения и расширения для 1С: Розница 2.3.

3600 руб.

29.04.2022    12270    1    5    

10

Условное оформление элементов форм в пользовательском режиме 1С (управление видимостью и доступностью элементов форм)

Работа с интерфейсом Платформа 1С v8.3 Платные (руб)

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

6000 руб.

18.01.2022    8933    1    2    

6
Комментарии
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
1. Lyns_owner 355 30.12.12 11:39 Сейчас в теме
ДокументШаблон.Variables.Item("Предприятие").Value = "ОАО «Катконефть» " + Номер;
ДокументШаблон.Variables.Item("КомуФИО").Value = "И.И. Иванову " + Номер;
ДокументШаблон.Variables.Item("Город").Value = "г. Октябрьский " + Номер;
ДокументШаблон.Variables.Item("Телефон").Value = "(34767) 3-33-33 " + Номер;
ДокументШаблон.Variables.Item("Обращение").Value = "Уважаемый Иван Иванович!";


Что это за хурма?!
2. Flashill 994 30.12.12 12:34 Сейчас в теме
(1) Lyns_owner, ))) это тестовые данные, чтобы проверить что информация выводится. Чтобы выводились данные, которые нужны Вам - можно вместо цикла "Для Номер = 1 По Прогонов Цикл" написать свой цикл (например по выборке из запроса) и в поля эти подставлять свою информацию примерно так:
ДокументШаблон.Variables.Item("Предприятие").Value = Выборка.Предприятие;
ДокументШаблон.Variables.Item("КомуФИО").Value = Выборка.КомуФИО;
ДокументШаблон.Variables.Item("Город").Value = Выборка.Город;
ДокументШаблон.Variables.Item("Телефон").Value = Выборка.Город;

Если все понятно объяснил - прошу снять минус :)
9. Поручик 4674 09.01.13 03:02 Сейчас в теме
Неплохой материал, надо бы запомнить.

(2) зы этот fuxic опять ни за что минус поставил. Твари.
3. higs 05.01.13 13:25 Сейчас в теме
Очень даже неплохой вариант, вполне применимо.
Я, правда, копировал и вставлял на следующий лист в общем файле содержимое предварительно заполненного листа по конкретному предприятию, чтобы в итоге получилось примерно то же самое, но обычной вставкой, а не импорта файла. Но вариант с DOCVARIABLES лично мне понравился
4. Новенький_2209 06.01.13 19:54 Сейчас в теме
Что-нибудь про формирование печатной формы на основе макетов офисных документов (кстати, не только Word) из БСП, автор слышал?
5. Flashill 994 06.01.13 20:02 Сейчас в теме
(4) Новенький_2209, нет, где можно почитать?
6. TMV 14 06.01.13 20:16 Сейчас в теме
(5) Андрей Буравов,
где можно почитать?
видимо там, где вам сказали (и даже посмотреть)
из БСП
7. RomanUzmov 40 07.01.13 11:24 Сейчас в теме
8. RomanUzmov 40 07.01.13 11:26 Сейчас в теме
Публикация, в принципе, полезная - не все же на управляемых формах работают и БСП юзают... Автору - плюс.
10. Sasha255n 25.01.13 15:49 Сейчас в теме
Интересно как это работает обязательно скачаю посмотрю
11. Sasha255n 25.01.13 15:50 Сейчас в теме
Да и конечно большое спасибо автору я думаю очень пригодится
12. Sasha255n 25.01.13 16:31 Сейчас в теме
"На УПП не проверял, однако работать должна, т.к. работает с метаданными.
Или Вы (a31) про запрос на поиск дублей, если в УПП сотрудники хранятся в справочнике "СотрудникиОрганизаций", то работать будет:), кстати можно этим запросом искать не только задвоенных по коду но и по другому полю, достаточно заменить поле "код" на другое поле. Правда, если нужно искать по нескольким полям, тогда еще в итогах дорисовать нужно поля. С другой стороны, как минимум, из запроса можно использовать идею выбора "одного элемента из нескольких" внутри запроса (другой пример, когда нужно выбрать контрагента и любой 1 договор этого контрагента).
Не будет работать только на управляемых формах. "
13. Sasha255n 25.01.13 16:32 Сейчас в теме
Проситите предыдушие это не сюда
Оставьте свое сообщение