8.х Дубликация макетов отчета при выводе в word

Тема в разделе "Отчеты и обработки для "1С:Предприятие 8"", создана пользователем vechiy, 17 фев 2011.

  1. TopicStarter Overlay
    vechiy
    Offline

    vechiy Опытный в 1С

    Регистрация:
    18 янв 2011
    Сообщения:
    202
    Симпатии:
    0
    Баллы:
    26
    Обработка выводит печатную форму в ворд с заполнением нужных параметров. Вопрос - как добиться вывода макета с разными подстановками параметров в ОДИН документ.
    Функция печати:

    Попытка
    Договор = ПолучитьМакет("Макет");
    ОбъектWord = Договор.Получить();
    ДокументWord = ОбъектWord.Application.Documents(1);
    ДокументWord.Activate();



    Исключение
    Сообщить(ОписаниеОшибки(),СтатусСообщения.ОченьВажное);
    Возврат Неопределено;
    КонецПопытки;

    СоздатьИЗаполнитьТЗподстановок();

    Для Каждого Стр ИЗ ТЗп Цикл
    ПоискИЗаменаВВорде(ДокументWord,Стр.Шаблон,Стр.СтрокаЗамены);
    КонецЦикла;



    ОбъектWord.Application.Visible=Истина;
    ОбъектWord.Activate();

    Возврат Неопределено;
  2. TopicStarter Overlay
    vechiy
    Offline

    vechiy Опытный в 1С

    Регистрация:
    18 янв 2011
    Сообщения:
    202
    Симпатии:
    0
    Баллы:
    26
    Ап! Подскажите плз
  3. mialord
    Offline

    mialord Модераторы Команда форума Модератор

    Регистрация:
    31 июл 2009
    Сообщения:
    5.400
    Симпатии:
    40
    Баллы:
    54
    Здраствуйте!
    Я так понимаю под параметром подстановки понимается некий текст с каким-то идентификаторов, тогда что нам мешает использовать другие идетификаторы?
    Что содержится в ТЗп и что делает эта процедура СоздатьИЗаполнитьТЗподстановок() и вот эта ПоискИЗаменаВВорде. Код их покажите.
  4. Наташа
    Offline

    Наташа Опытный в 1С

    Регистрация:
    14 авг 2010
    Сообщения:
    1.442
    Симпатии:
    2
    Баллы:
    29
    Копипаст! :)
    Код:
    Макет = ПолучитьМакет("Макет"); 
    // Получить объект из макета. 
    MSWord = Макет.Получить();
    Документ = MSWord.Application.Documents(1);
    Документ.Activate();
    // копируем содержимое
    Документ.Content.Copy();
    // встаем в начало документа
    Документ = MSWord.Range(0,0);
    Выборка = СформироватьЗапросДляПечати("ПоТабличнойЧастиДокумента").Выбрать();
    Индекс = 0;
    Пока Выборка.Следующий() Цикл
    Индекс = Индекс + 1;
    Если Индекс > 1 Тогда
    // вторая и последующие итерации
    // встаем в начало документа
    Документ = MSWord.Range(0,0);
    // вставляем разрыв страницы
    Документ.InsertBreak();
    //опять встаем в начало документа (перед разрывом)
    Документ = MSWord.Range(0,0);
    // вставляем содержимое буфера
    Документ.Paste();
    КонецЕсли;
    Сотрудник = Выборка.Сотрудник;
    // заполнение параметров ...
    КонецЦикла;
    
    
    Таким образом у меня реализован вывод доп.соглашений к приказу о кадровом перемещении сотрудников. И на одного и на нескольких печатается нормально - через разрыв страницы ) Единственное - в обратном порядке, так как не сообразила, как на конец документа спозиционироваться, но сортировку можно добавить в ваш запрос :)
  5. TopicStarter Overlay
    vechiy
    Offline

    vechiy Опытный в 1С

    Регистрация:
    18 янв 2011
    Сообщения:
    202
    Симпатии:
    0
    Баллы:
    26
    Метод объекта не обнаружен (InsertBreak)
    :( платформа 8.1.15.14
    а нет ли где faq'а по работе с application.documents?
  6. Наташа
    Offline

    Наташа Опытный в 1С

    Регистрация:
    14 авг 2010
    Сообщения:
    1.442
    Симпатии:
    2
    Баллы:
    29
    Хммм, странно. Попробуйте без разрыва страницы, он вам нужен вобще?
    FAQ, наверное, где-то и есть, но можно просто через запись макросов в Wordе :) Начинаете запись, выполняете нужные действия, потом смотрите, какой код сформировался и те же функции пишете в своей обработке.
  7. TopicStarter Overlay
    vechiy
    Offline

    vechiy Опытный в 1С

    Регистрация:
    18 янв 2011
    Сообщения:
    202
    Симпатии:
    0
    Баллы:
    26
    Хрень какая-то.. не видит методы Paste и InsertBreak.
    Activate же видит.
    офис 2010 стоит
    при записи макроса, вставляю разрыв страницу - пишет функцию InsertBreak
  8. Наташа
    Offline

    Наташа Опытный в 1С

    Регистрация:
    14 авг 2010
    Сообщения:
    1.442
    Симпатии:
    2
    Баллы:
    29
    А у вас там в процессе переменная Документ не переопределяется случаем? Поставьте точку останова, посмотрите, это по прежнему документ Word, или вы туда уже какой-то свой документ записали? :)
  9. TopicStarter Overlay
    vechiy
    Offline

    vechiy Опытный в 1С

    Регистрация:
    18 янв 2011
    Сообщения:
    202
    Симпатии:
    0
    Баллы:
    26
    Да, это комобъект, документ ворд. А как можно было туда ещё что то записать??оО
  10. Наташа
    Offline

    Наташа Опытный в 1С

    Регистрация:
    14 авг 2010
    Сообщения:
    1.442
    Симпатии:
    2
    Баллы:
    29
    Ну в цикле написать что-то вроде
    Код:
    Документ = "Реализация";
    
    А у строковой переменной нет никаких методов :)
    Покажите что ли код..
  11. TopicStarter Overlay
    vechiy
    Offline

    vechiy Опытный в 1С

    Регистрация:
    18 янв 2011
    Сообщения:
    202
    Симпатии:
    0
    Баллы:
    26
    Код:
    Попытка
    Договор = ПолучитьМакет("Макет");
    ОбъектWord = Договор.Получить();
    ДокументWord = ОбъектWord.Application.Documents(1);
    ДокументWord.Activate();
    
    
    
    Исключение
    Сообщить(ОписаниеОшибки(),СтатусСообщения.ОченьВажное);
    Возврат Неопределено;
    КонецПопытки;
    
    СоздатьИЗаполнитьТЗподстановок();
    
    Для Каждого Стр ИЗ ТЗп Цикл
    ПоискИЗаменаВВорде(ДокументWord,Стр.Шаблон,Стр.СтрокаЗамены);
    КонецЦикла;
    
    
    
    ОбъектWord.Application.Visible=Истина;
    ОбъектWord.Activate();
    
    Возврат Неопределено;
    
    Предположим, я хочу в произвольном месте вставить разрыв страницы и ещё раз макет. Что сделать? Или домой пойти.. совсем уже не соображаю ничего)
  12. Наташа
    Offline

    Наташа Опытный в 1С

    Регистрация:
    14 авг 2010
    Сообщения:
    1.442
    Симпатии:
    2
    Баллы:
    29
    А где программа ругается то, где у вас копипаст?
    Видимо, нужно смотреть текст процедуры ПоискИЗаменаВВорде, который Вы от нас благополучно скрыли :angry:
  13. TopicStarter Overlay
    vechiy
    Offline

    vechiy Опытный в 1С

    Регистрация:
    18 янв 2011
    Сообщения:
    202
    Симпатии:
    0
    Баллы:
    26
    Код:
    Функция ПоискИЗаменаВВорде(ОбъектВорд,знач ТекстПоиска = "",знач ТекстЗамены = "",ЗаменитьВсе = Истина)
    
    ДЛя н = 1 по 3 цикл
    
    Замена=ОбъектВорд.Content.find;
    Замена.Execute(ТекстПоиска,Ложь,Истина,Ложь,,,Истина,,Ложь,ТекстЗамены);
    
    конеццикла;
    
    возврат истина;
    
    ДляВозврата = Ложь;
    
    ТекстЗамены = Строка(ТекстЗамены);
    ТекстПоиска = Строка(ТекстПоиска);
    Если ПустаяСтрока(ТекстПоиска) И ПустаяСтрока(ТекстЗамены) Тогда
    Возврат	ДляВозврата;	
    КонецЕсли;
    ПродолжитьЦикл = Истина;
    Пока ПродолжитьЦикл Цикл
    Если НЕ ЗаменитьВсе Тогда
    ПродолжитьЦикл = Ложь;			
    КонецЕсли;
    ОбъектВорд.Selection.Collapse();
    ОбъектВорд.Selection.Find.Forward = True;
    ОбъектВорд.Selection.Find.Text = ТекстПоиска;
    Если ОбъектВорд.Selection.Find.Execute() Тогда
    ОбъектВорд.Selection.Delete();
    ОбъектВорд.Selection.InsertAfter(ТекстЗамены);			
    ДляВозврата = Истина;
    Иначе
    ОбъектВорд.Selection.Find.Forward = False;
    Если ОбъектВорд.Selection.Find.Execute() Тогда
    ОбъектВорд.Selection.Delete();
    ОбъектВорд.Selection.InsertAfter(ТекстЗамены);
    ДляВозврата = Истина;
    Иначе
    ПродолжитьЦикл = Ложь;
    ДляВозврата = Ложь;			
    <span style='cursor: pointer; color:red' Onclick="window.open('http://www.1c-pro.ru/wiki/index.php/конецесли')">			КонецЕсли			</span>
    КонецЕсли;	
    ОбработкаПрерыванияПользователя();
    КонецЦикла; 
    
    Возврат ДляВозврата;
    
    КонецФункции
    
    
  14. Наташа
    Offline

    Наташа Опытный в 1С

    Регистрация:
    14 авг 2010
    Сообщения:
    1.442
    Симпатии:
    2
    Баллы:
    29
    А зачем вы после трех замен в цикле Возврат поставили? %) Оно же дальше никуда не идет.
  15. mialord
    Offline

    mialord Модераторы Команда форума Модератор

    Регистрация:
    31 июл 2009
    Сообщения:
    5.400
    Симпатии:
    40
    Баллы:
    54
    Не прошло и пол года, увидел я код обработки можно и дальше работать :angry:
    Я бы порекомендовал Вам работать в другом направлении. Изучите представленный материал.
  16. TopicStarter Overlay
    vechiy
    Offline

    vechiy Опытный в 1С

    Регистрация:
    18 янв 2011
    Сообщения:
    202
    Симпатии:
    0
    Баллы:
    26
    Обработка найденная) мне всего то надо, что добавлять макет на след. страницу ворда и делать в нём замену...
    что надо сделать с ДокументWord, чтобы вставить в него ещё раз макет??
  17. TopicStarter Overlay
    vechiy
    Offline

    vechiy Опытный в 1С

    Регистрация:
    18 янв 2011
    Сообщения:
    202
    Симпатии:
    0
    Баллы:
    26
    Помогите, плз. Я совсем с com-объектами запутался

    Мне надо просто скопировать макет в документ ворд, сделать замену, и скопировать в него на след. страницу ещё один макет. И т.д.


    Код:
    Договор = ПолучитьМакет("Макет");
    ОбъектWord = Договор.Получить();
    
    
    
    ПриложениеWord = Новый COMОбъект("Word.Application");
    ВременныйДокументWord = ПриложениеWord.Documents.Add();
    ОбластьДокументаWord = ВременныйДокументWord.Range(0, 0);
    ОбластьДокументаWord.InsertBefore("какой-то текст");
    ОбластьДокументаWord.InsertBefore(ОбъектWord.Content);
    
    
    
    
    Этот код выводит текст, но без необходимого форматирования((

Поделиться этой страницей