Имя: Пароль:
1C
1С v8
Выгрузка из 1С в Word через макет Active Document ☑
0 Nixnix
 
18.06.22
✎
17:26
На форме документа есть серверная процедура которая формирует Word из заполненных реквизитов и табличной части. Все работает, но выводится только 1 строка из ТЧ.
1 Nixnix
 
18.06.22
✎
17:27
&НаСервере
     Процедура Серверная ()
         Счет = РеквизитФормыВЗначение("Объект").ПолучитьМакет("Счет");
     MSWord = Счет.Получить();
     ДатаСчета = Формат(ТекущаяДата(), "ДЛФ=D");
    
     Запрос = Новый Запрос;
                Запрос.УстановитьПараметр("ТекущийДокумент", Объект.Ссылка);
                Запрос.Текст=
                "ВЫБРАТЬ
                |    ПродажаТоваровПереченьНоменклатуры.НомерСтроки КАК НомерСтроки,
                |    ПродажаТоваровПереченьНоменклатуры.Номенклатура КАК Номенклатура,
                |    ПродажаТоваровПереченьНоменклатуры.НаборСвойств КАК НаборСвойств,
                |    ПродажаТоваровПереченьНоменклатуры.Количество КАК Количество,
                |    ПродажаТоваровПереченьНоменклатуры.Валюта КАК Валюта,
                |    ПродажаТоваровПереченьНоменклатуры.Курс КАК Курс,
                |    ПродажаТоваровПереченьНоменклатуры.Цена КАК Цена,
                |    ПродажаТоваровПереченьНоменклатуры.Сумма КАК Сумма
                |ИЗ
                |    Документ.ПродажаТоваров.ПереченьНоменклатуры КАК ПродажаТоваровПереченьНоменклатуры
                |ГДЕ
                |    ПродажаТоваровПереченьНоменклатуры.Ссылка = &ТекущийДокумент";
              Результат = Запрос.Выполнить();
              Выборка = Результат.Выбрать();

    
     Попытка
             Документ = MSWord.Application.Documents(1);
            Документ.Activate();
            // Заменяемые слова
            Замена = Документ.Content.Find;
            Замена.Execute("<Дата>", Ложь, Истина, Ложь, , , Истина, , Ложь, ""+  Объект.Дата  + "");
            Замена = Документ.Content.Find;
            Замена.Execute("<НомерДокумента>", Ложь, Истина, Ложь, , , Истина, , Ложь, ""+  Объект.Номер  + "");
            Замена = Документ.Content.Find;
            Замена.Execute("<СкладДокумента>", Ложь, Истина, Ложь, , , Истина, , Ложь, ""+ Объект.Склад   + "");
            Замена = Документ.Content.Find;
            Замена.Execute("<Мастер>", Ложь, Истина, Ложь, , , Истина, , Ложь, ""+ Объект.Мастер   + "");
            Замена = Документ.Content.Find;
            Замена.Execute("<Клиент>", Ложь, Истина, Ложь, , , Истина, , Ложь, ""+ Объект.Клиент   + "");
            
                            Пока Выборка.Следующий() Цикл
            //тут выберим что нужно нам
                        //номер строки
              Если Выборка.НомерСтроки = Неопределено или Выборка.НомерСтроки = NULL тогда
                Сообщить("Не заполнен номер строки");
            Иначе
                Замена = Документ.Content.Find;
                Замена.Execute("<НомерСтроки>", Ложь, Истина, Ложь, , , Истина, , Ложь,"" + Выборка.НомерСтроки+ "");
            КонецЕсли;    
            
            Если Выборка.НомерСтроки = Неопределено или Выборка.Номенклатура = NULL тогда
                Сообщить("Не заполнен номер строки");
            Иначе
                Замена = Документ.Content.Find;
                Замена.Execute("<Номенклатура>", Ложь, Истина, Ложь, , , Истина, , Ложь,"" + Выборка.Номенклатура+ "");
            КонецЕсли;
            
            Если Выборка.НаборСвойств = Неопределено или Выборка.НаборСвойств = NULL тогда
                Сообщить("Не заполнен номер строки");
            Иначе
                Замена = Документ.Content.Find;
                Замена.Execute("<НаборСвойств>", Ложь, Истина, Ложь, , , Истина, , Ложь,"" + Выборка.НаборСвойств+ "");
            КонецЕсли;
            
            Если Выборка.Количество = Неопределено или Выборка.Количество = NULL тогда
                Сообщить("Не заполнен номер строки");
            Иначе
                Замена = Документ.Content.Find;
                Замена.Execute("<Количество>", Ложь, Истина, Ложь, , , Истина, , Ложь,"" + Выборка.Количество+ "");
            КонецЕсли;
            
            Если Выборка.Валюта = Неопределено или Выборка.Валюта = NULL тогда
                Сообщить("Не заполнен номер строки");
            Иначе
                Замена = Документ.Content.Find;
                Замена.Execute("<Валюта>", Ложь, Истина, Ложь, , , Истина, , Ложь,"" + Выборка.Валюта+ "");
            КонецЕсли;
            
            Если Выборка.Курс = Неопределено или Выборка.Курс = NULL тогда
                Сообщить("Не заполнен номер строки");
            Иначе
                Замена = Документ.Content.Find;
                Замена.Execute("<Курс>", Ложь, Истина, Ложь, , , Истина, , Ложь,"" + Выборка.Курс+ "");
            КонецЕсли;
            
            Если Выборка.Цена = Неопределено или Выборка.Цена = NULL тогда
                Сообщить("Не заполнен номер строки");
            Иначе
                Замена = Документ.Content.Find;
                Замена.Execute("<Цена>", Ложь, Истина, Ложь, , , Истина, , Ложь,"" + Выборка.Цена+ "");
            КонецЕсли;
            
            Если Выборка.Сумма = Неопределено или Выборка.Сумма = NULL тогда
                Сообщить("Не заполнен номер строки");
            Иначе
                Замена = Документ.Content.Find;
                Замена.Execute("<Сумма>", Ложь, Истина, Ложь, , , Истина, , Ложь,"" + Выборка.Сумма+ "");
            КонецЕсли;
            
        КонецЦикла;
Word = MSWord.Application;
Word.Visible = Истина;
  Исключение
               Сообщение=  Новый СообщениеПользователю();
            Сообщение.Текст = ОписаниеОшибки();
            Сообщение.Сообщить();
            MSWord.Application.Quit();
     КонецПопытки;
КонецПроцедуры
2 Мимохожий Однако
 
18.06.22
✎
21:28
Сделай макрос руками с добавлением строк в таблицу и перенеси фрагмент кода в свою процедуру.
Компьютер — устройство, разработанное для ускорения и автоматизации человеческих ошибок.