7.7 Печать табличной части документа в word'e

Тема в разделе "Конфигурирование на платформе "1С:Предприятие 7.7"", создана пользователем anutiks, 9 дек 2008.

  1. TopicStarter Overlay
    anutiks
    Offline

    anutiks

    Регистрация:
    26 ноя 2008
    Сообщения:
    16
    Симпатии:
    0
    Баллы:
    1
    Помогите, плиз! Никак не получается выгрузить табличную часть документа из 1С (v 7.7) в word :unsure: C простыми полями управилась через создание в ворде полей формы, а как заполнить таблицу, если количество строк может быть разным?
  2. bob
    Offline

    bob Опытный в 1С

    Регистрация:
    7 май 2008
    Сообщения:
    386
    Симпатии:
    0
    Баллы:
    26
    а почему именно ворд, чем эксель не устраивает?
  3. bons
    Offline

    bons Опытный в 1С

    Регистрация:
    7 авг 2008
    Сообщения:
    94
    Симпатии:
    0
    Баллы:
    26
    я использовал шаблон ворда. Файл типа dot. хотя можно наверное и простой doc сразу использовать...

    в нем я создавал шапку табличного поля
    потом в ворде смотришь макрос как добавляется новая строчка, переводишь этет макрос на язык понятный 1С, ну и потом обращаешься к полям таблички и пишешь туда значения из 1С.
  4. ASh
    Offline

    ASh Опытный в 1С

    Регистрация:
    10 сен 2008
    Сообщения:
    568
    Симпатии:
    0
    Баллы:
    26
    Так и динамически нет проблем составить док. Вот пример кода создания и заполнения таблиц:
    Код:
        МСВорд = СоздатьОбъект("Word.Application"); 
    Документ = МСВорд.Documents;
    Документ.Add();
    Документ = МСВорд.ActiveDocument();
    Документ.Paragraphs.Add();
    Диапазон = Документ.Paragraphs(Документ.Paragraphs.Count()).Range;
    //Добавим таблицу фиксированного размера 3х2
    Документ.Tables.Add(Диапазон,3,2);
    Документ.Tables(1).Range.Select(); 
    Выбор = МСВорд.Selection();
    Выбор.Style = "Сетка таблицы";
    //Установим ширину обоих колонок по 8 см
    Документ.Tables(1).Columns(1).Width= МСВорд.CentimetersToPoints(8);
    Документ.Tables(1).Columns(2).Width= МСВорд.CentimetersToPoints(8);
    //Заполнение
    Документ.Tables(1).Cell(1,1).Range.Text = "Это первая сирока, первая колонка";
    Документ.Tables(1).Cell(2,1).Range.Text = "";
    Документ.Tables(1).Cell(3,1).Range.Text = "";
    Документ.Tables(1).Cell(1,2).Range.Text = "";
    Документ.Tables(1).Cell(2,2).Range.Text = "";
    Документ.Tables(1).Cell(3,2).Range.Text = "Это третья строка, вторая колонка";
    
    //Добавим таблицу с произвольным количеством строк, для примера возьмем 4 колонки
    //Сначала выведем заголовок таблицы
    Документ.Paragraphs.Add();
    Диапазон = Документ.Paragraphs(Документ.Paragraphs.Count()).Range;
    Документ.Tables.Add(Диапазон,1,4);
    Документ.Tables(2).Range.Select(); 
    Выбор = МСВорд.Selection();
    Выбор.Style = "Сетка таблицы";
    Выбор.Rows.AllowBreakAcrossPages = 0; 
    //Зададим ширину колонок
    Документ.Tables(2).Columns(1).Width= МСВорд.CentimetersToPoints(2);
    Документ.Tables(2).Columns(2).Width= МСВорд.CentimetersToPoints(4);
    Документ.Tables(2).Columns(3).Width= МСВорд.CentimetersToPoints(4);
    Документ.Tables(2).Columns(4).Width= МСВорд.CentimetersToPoints(10);
    //Заполнение шапки таблицы
    Документ.Tables(2).Cell(1,1).Range.Paragraphs(1).Alignment = 1;
    Документ.Tables(2).Cell(1,1).Range.Text = "№";
    Документ.Tables(2).Cell(1,2).Range.Paragraphs(1).Alignment = 1;
    Документ.Tables(2).Cell(1,2).Range.Text = "Колонка 2";
    Документ.Tables(2).Cell(1,3).Range.Paragraphs(1).Alignment = 1;
    Документ.Tables(2).Cell(1,3).Range.Text = "Колонка 3";
    Документ.Tables(2).Cell(1,4).Range.Paragraphs(1).Alignment = 1;
    Документ.Tables(2).Cell(1,4).Range.Text = "Примечание";
    //Теперь выведем таблицу по таблице значений
    Для А = 1 По ТЗ.КоличествоСтрок() Цикл
    //Добавим строку в таблицу
    Выбор.InsertRowsBelow(1); 
    Документ.Tables(2).Cell(А+1,1).Range.Text = Строка(А);//номер строки
    Документ.Tables(2).Cell(А+1,2).Range.Text = ТЗ.ПолучитьЗначение(А,1);
    Документ.Tables(2).Cell(А+1,3).Range.Text = ТЗ.ПолучитьЗначение(А,2);
    Документ.Tables(2).Cell(А+1,4).Range.Text = ТЗ.ПолучитьЗначение(А,3);
    КонецЦикла; 
    //Запишем Док
    Документ.SaveAs("ПутьИИмяДокумента",0); 
    Документ.Close();
    
    
  5. TopicStarter Overlay
    anutiks
    Offline

    anutiks

    Регистрация:
    26 ноя 2008
    Сообщения:
    16
    Симпатии:
    0
    Баллы:
    1
    А что такое ТЗ? Это реквизит или документ? Если вместо ТЗ я подставляю реквизит табличной части, то он ругается: "Значение не представляет агрегатный объект (ПолучитьЗначение)". Почему?
  6. ASh
    Offline

    ASh Опытный в 1С

    Регистрация:
    10 сен 2008
    Сообщения:
    568
    Симпатии:
    0
    Баллы:
    26
    ТЗ - это таблица значений.
    Для документа можно так цикл организовать:
    Предположим, что Док - это документ, тогда

    Код:
    Для А =1 По Док.КоличествоСтрок() Цикл
    Док.ПолучитьСтрокуПоНомеру(А);
    Выбор.InsertRowsBelow(1); 
    Документ.Tables(2).Cell(А+1,1).Range.Text = Строка(А);//номер строки
    Документ.Tables(2).Cell(А+1,2).Range.Text = Док.РеквизитТабличнойЧастиДокумента1;
    Документ.Tables(2).Cell(А+1,3).Range.Text = Док.РеквизитТабличнойЧастиДокумента2;
    Документ.Tables(2).Cell(А+1,4).Range.Text = Док.РеквизитТабличнойЧастиДокумента3;
    КонецЦикла;
    
    
  7. TopicStarter Overlay
    anutiks
    Offline

    anutiks

    Регистрация:
    26 ноя 2008
    Сообщения:
    16
    Симпатии:
    0
    Баллы:
    1
    Супер!!! Вот спасибки! :smile:
    Столько времени убила, а тут все по полочкам разложили :unsure:
  8. TopicStarter Overlay
    anutiks
    Offline

    anutiks

    Регистрация:
    26 ноя 2008
    Сообщения:
    16
    Симпатии:
    0
    Баллы:
    1
    Я так обрадовалась, а он ругается ((( :
    Выбор.InsertRowsBelow(1);
    Метод или свойство недоступны, поскольку некоторые или все объекты не ссылаются на таблицу.
    Что это значит?
  9. ASh
    Offline

    ASh Опытный в 1С

    Регистрация:
    10 сен 2008
    Сообщения:
    568
    Симпатии:
    0
    Баллы:
    26
    Ошибка говорит про то, что выделенная область присвоенная переменной "Выбор" не содержит таблицу. Соответственно, не может добавить строку. Так трудно сказать где конкретно ошибка, покажите код.
  10. TopicStarter Overlay
    anutiks
    Offline

    anutiks

    Регистрация:
    26 ноя 2008
    Сообщения:
    16
    Симпатии:
    0
    Баллы:
    1
    Нашла ошибку, но появился другой косяк. Почему если я пишу ПолеНаФорме=КоличествоСтрок() он показывает верно - 2 строки, а когда я пишу:
    Код:
    Для НомерСтроки=1 по КоличествоСтрок() цикл
    Док.ПолучитьСтрокуПоНомеру(НомерСтроки);
    Выбор.InsertRowsBelow(1); 	
    Документ.Tables(2).Cell(НомерСтроки+1,1).Range.Text = РеквизитТабличнойЧастиДокумента;
    КонецЦикла;
    
    происходит зацикливание, создает строки до тех пор, пока принудительно не остановишь выполнение?
  11. TopicStarter Overlay
    anutiks
    Offline

    anutiks

    Регистрация:
    26 ноя 2008
    Сообщения:
    16
    Симпатии:
    0
    Баллы:
    1
    И еще вопросик - как включать/выключать границы ячейки в таблице?
  12. ASh
    Offline

    ASh Опытный в 1С

    Регистрация:
    10 сен 2008
    Сообщения:
    568
    Симпатии:
    0
    Баллы:
    26
    Вы бы писали код с префиксами, типа МойДокумент.КоличествоСтрок() вместо КоличествоСтрок(), а то так непонятно что и откуда берется. На вскидку, попробуйте поменять итератор, напишите вместо "НомерСтроки" например "НС". Все таки "НомерСтроки" ключевое слово, может он как-то влияет.
  13. ASh
    Offline

    ASh Опытный в 1С

    Регистрация:
    10 сен 2008
    Сообщения:
    568
    Симпатии:
    0
    Баллы:
    26
    Управление границами первой ячейки в первой таблице

    Код:
    Документ.Tables(1).Cell(1,1).Borders(1).LineStyle=1; //Borders(1) - Верхняя граница
    Документ.Tables(1).Cell(1,1).Borders(2).LineStyle=0; //Borders(2) - Левая граница
    Документ.Tables(1).Cell(1,1).Borders(3).LineStyle=1; //Borders(3) - Нижняя граница
    Документ.Tables(1).Cell(1,1).Borders(4).LineStyle=0; //Borders(4) - Правая граница
    //Присваиваемые значения: 0 - нет границы, 1 - сплошная, 2- пунктир и т.д.
    
  14. TopicStarter Overlay
    anutiks
    Offline

    anutiks

    Регистрация:
    26 ноя 2008
    Сообщения:
    16
    Симпатии:
    0
    Баллы:
    1
    Обозвала по другому - не помогло, выкрутилась через проверку заполненности строки. :unsure:

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