Как построчно заполнить таблицу в OO из 1с #623767


#0 by Карась
Здравствуйте! Я хочу перенести табличную часть из 1с в оо, мне сказали что сделать это можно только через цикл Строка=Элементы.Товары.ТекущийЭлемент;   Строки=Объект.Товары; Для Каждого Строка Из Строки  Цикл   КонецЦикла; А как мне сделать, чтобы он потом построчно переносил строки табличной части 1с в OO  в виде строки У меня есть Закладка в документе, как мне в нее все это передать?
#1 by Карась
Мне подсказали что можно сделать с помощью метода insertByIndex, но пока адаптировать его под себя я не могу
#2 by Карась
Надеюсь на Вашу помощь.
#3 by ICWiner
ОО - общество ортодоксов?
#4 by Карась
Open Office
#5 by Карась
Конкретнее Open Office writer
#6 by MaXpaT
Карась, позвал бы ты лучше программиста .... или есть ещё вариант! Правой кнопкой в табличное поле - вывести список - файл - сохранить копию - и выбери то что нужно тебе
#7 by ICWiner
Нашел в просторах интернетов... Как раз ваш случай: Необходимо заменить в шаблоне ключевые слова в скобках {}, на указанные значения, вот примерный код обработки: Код 1C v 7.x //рдТаблицаЗамен - Таблица значений: // {Организация} ООО "Контора" // {Контрагент} ООО "Должник" // {Директор} Дядя Вася ПечатьИзШаблона(рдТаблицаЗамен, "Primer.doc"); // Функция преобразует Windows имя файла в URL OpenOffice                       Функция ПреобразоватьВURL(ИмяФайла)    Возврат "file:///" + СтрЗаменить(ИмяФайла, "", "/");     КонецФункции Функция ОбработкаФайлаШаблона(ИмяШаблона) Экспорт                                                      ИмяФайла = КаталогВременныхФайлов + "doc.tmp";                                                                                              Путь = "";    Имя = "";    ФайлОбработки = РасположениеФайла(Путь, Имя);        КаталогШаблонов = Путь;          ПолноеИмяШаблона = КаталогШаблонов + ИмяШаблона;        РезультатОбработки = 0;                                // Проверка на существование    ЕстьШаблон = 0;    Если ФС.СуществуетФайл(КаталогШаблонов + ИмяШаблона) = 0 Тогда          Сообщить("Файл " + ИмяШаблона + " не найден в каталоге шаблонов печатных форм! Обратитесь к системному администратору!", "!!!");                                      Иначе        ЕстьШаблон = 1;    КонецЕсли;                          // Копирование во временный каталог                                Если ЕстьШаблон = 1 Тогда        ФС.КопироватьФайл(ПолноеИмяШаблона, ИмяФайла, 0);    КонецЕсли;                                                                    // Проверка копирования        Если ФС.СуществуетФайл(ИмяФайла) = 1 Тогда        РезультатОбработки = 1;      Иначе        Сообщить("Не удалось скопировать шаблон во временный файл.");    КонецЕсли;        Возврат РезультатОбработки;         КонецФункции Процедура ОткрытьТекстовыйПроцессор(ИмяФайла, ТаблицаЗамен)          ТекПроцессор = рдТекстовыйПроцессор.ПолучитьЗначение(рдТекстовыйПроцессор.ТекущаяСтрока);        Если ТекПроцессор = "OOoWriter" Тогда                // Открыть OpenOffice                ServiceManager = СоздатьОбъект("com.sun.star.ServiceManager");        Desktop        = ServiceManager.createInstance("com.sun.star.frame.Desktop");                        Scr = СоздатьОбъект("MSScriptControl.ScriptControl");        Scr.Language="javascript";        Scr.Eval("Args=new Array");        Args = Scr.Eval("Args");        Scr.AddObject("ServiceManager", ServiceManager);                // Откроем шаблон                ТекстовыйПроцессор = Desktop.LoadComponentFromURL(ПреобразоватьВURL(ИмяФайла), "_blank", 0, Args);                // Заменяем ключевые поля на нужные значения                                        Replace = ТекстовыйПроцессор.CreateReplaceDescriptor;                Для x=1 По ТаблицаЗамен.КоличествоСтрок Цикл                        Replace.SearchString  = ТаблицаЗамен.ПолучитьЗначение(x, 1);            Replace.ReplaceString = ТаблицаЗамен.ПолучитьЗначение(x, 2);            ТекстовыйПроцессор.ReplaceAll(Replace);                    КонецЦикла;            Иначе                                                // Открываем MS Office Word                Попытка            ТекстовыйПроцессор = СоздатьОбъект("Word.Application");        Исключение                        Сообщить("Не удалось создать объект Microsoft Office Word!", "!!!");            Возврат;                    КонецПопытки;                        // Открываем шаблон                ТекстовыйПроцессор.Visible = 0;        ТекстовыйПроцессор.Documents.Open(ИмяФайла,, -1);        Fnd = ТекстовыйПроцессор.ActiveDocument.Range.Find;        Fnd.ClearFormatting;        Fnd.Forward = -1;                  // Заменяем ключевые поля на нужные значения                ТаблицаЗамен.ВыбратьСтроки;        Пока ТаблицаЗамен.ПолучитьСтроку = 1 Цикл              Fnd.Execute(ТаблицаЗамен.Найти,,,,,,,,, ТаблицаЗамен.Заменить, 2);          КонецЦикла;                  ТекстовыйПроцессор.Visible = -1;            ТекстовыйПроцессор.Activate;            КонецЕсли;     КонецПроцедуры //***************************************************************************** Процедура ПечатьИзШаблона(ТаблицаЗамен, ИмяФайлаШаблона) Экспорт                    // Проверим, есть ли нужный шаблон        Если ОбработкаФайлаШаблона(ИмяФайлаШаблона) = 0 Тогда        Возврат;    КонецЕсли;                      ИмяФайла = КаталогВременныхФайлов + "doc.tmp";            // Открываем в текстовом процессоре файл шаблона        ОткрытьТекстовыйПроцессор(ИмяФайла, ТаблицаЗамен);     КонецПроцедуры
#8 by Карась
, я сама стажер-программист, я на практике, так что звать кого-то -не вариант
#9 by ICWiner
Кури
#10 by Карась
буду пробовать, спасибо
#11 by ICWiner
Это для 7.7, так что код в восьмерке работать не будет. Но методы работы с опен офисом те же...
#12 by Карась
ааа спасибо, ну мне там по сути только три строки нужны все остальное у меня под 8-ку уже описано
#13 by Карась
Для x=1 По ТаблицаЗамен.КоличествоСтрок Цикл                     Replace.SearchString  = ТаблицаЗамен.ПолучитьЗначение(x, 1);           Replace.ReplaceString = ТаблицаЗамен.ПолучитьЗначение(x, 2);           ТекстовыйПроцессор.ReplaceAll(Replace);                 КонецЦикла; Вот этот кусочек, а где здесь указывается закладка куда это все передавать?
#14 by smaharbA
никуяпля, не надоело же инету бодягу разводить, мусоля залежный тавар
#15 by smaharbA
не канает Вам все выше написанное
#16 by Карась
чего?
#17 by Карась
ну если знаете как то подскажите, я пока не понимаю как мне правильно заполнит метод insertbyindex
#18 by Карась
я знаю, что уже много тем избила на эти темы, но что мне делать, если у меня опыта мало, сложно приходится
#19 by smaharbA
нужно для работы или для учебы ?
#20 by smaharbA
и еще - нужно на место закладки вогнать содержимое табличной части документа ?
#21 by Карась
Опишу ситуацию полностью, я студент, пошла на практику, прошла курс 1с по программированию, пришла на практику, мне поставили задачу, чтобы учиться, но сдать надо сегодня, так как время истекает, а это единственный нюанс, который осталось решить.
#22 by Карась
да
#23 by Карась
я сутра сижу, пытаюсь сделать
#24 by Карась
и честно, очень хочу сделать, но пока не знаю как
#25 by smaharbA
понял, помогу, но не торопите, а займитесь пока другим там делов на 5 строк, но лениво ( суть Вариант 1. Создаете таблицу с числом строк равным числу строк ТЧ и вставляете ее кнтекст в место закладки, заполняете получая номер строки и колонки по индексу. Вариант 2. Создаете таблицу без ничего - в цикле по строкам ТЧ создаете строки таблицы, попутно создавая колонки и заполняя их
#26 by Карась
хорошо, пока попытаюсь сама, торопить не буду,тогда пока больше не буду трогать эту тему
#27 by smaharbA
код 77 для примера
#28 by Карась
в таблицуООО я кладу свою табличную часть?
#29 by Карась
И как вот эту процедуру описать? ТЗ=СоздатьОбъект("ТаблицаЗначений");
#30 by Карась
Ааа с таблицейООО поняла
#31 by Карась
И нужен ли мне весь этот код? Мне нужно создать таблицу из трех колонок и заполнить их и табличной части и вставить все это в закладку
#32 by Карась
Я пока тут кое что придумала вот +Code Строка=Элементы.Товары.ТекущийЭлемент;   Строки=Объект.Товары; Для Каждого Строка Из Строки  Цикл            Закладки11=Строка.Количество;    Закладки10=Строка.Продукт;    Якорь10.SetString(""+Закладки10+"");    Якорь11.SetString(""+Закладки11+"");    Курсор10.gotoRange(Якорь10, 0); КонецЦикла; Но он у меня каждую новую запись поверх старой пишет, можно ли сделать перевод строки?
#33 by Карась
Я не могу пока адаптировать ваш код под свой
#34 by Карась
Я пока сделала так ТЗ=Объект.Товары.Выгрузить; //ТЗ.НоваяКолонка("Номер"); //    ТЗ.НоваяКолонка("Продукт"); //    ТЗ.НоваяКолонка("Количество"); //    ТЗ.Номер=Строки.НомерСтроки; //    ТЗ.Продукт=Строки.Продукт; //    ТЗ.Количество=Строки.Количество;                    ТаблицаООО=Document.createInstance("com.sun.star.text.TextTable");    ТаблицаООО.initialize(ТЗ.КоличествоСтрок+1,ТЗ.КоличествоКолонок);    Текст.insertTextContent(Курсор10,ТаблицаООО,0);                    Для Кол=1 По ТЗ.КоличествоКолонок Цикл        Ячейка=ТаблицаООО.getCellByPosition(Кол-1,0);        Ячейка.getText.setString(""+ТЗ.ПолучитьПараметрыКолонки(Кол));    КонецЦикла;    Для Сч=1 По ТЗ.КоличествоСтрок Цикл        Для Кол=1 По ТЗ.КоличествоКолонок Цикл            Ячейка=ТаблицаООО.getCellByPosition(Кол-1,Сч);            Ячейка.getText.setString(""+ТЗ.ПолучитьЗначение(Сч,Кол));        КонецЦикла;    КонецЦикла;
#35 by Карась
но он не работает
#36 by Карась
Или же как к моему варианту просто сделать, чтобы он не добавлял вместо уже существующих, а просто прибавлял новые?
#37 by smaharbA
смотрите внимательно в случае у Вас типо так (восьмерку не знаю)
#38 by Карась
ТаблицаООО.initialize(ТЗ.Количество,ТЗ.Колонки.Количество); вот это строка не работает(
#39 by Карась
Все ту сделала, а теперь вот эта не хочет Ячейка=ТаблицаООО.getCellByPosition(Кол-1,Сч);
#40 by smaharbA
Сч-1
#41 by smaharbA
+ в забыл Текст.insertTextContent(Курсор,ТаблицаООО,0);
#42 by Карась
понятно, а он все равно жалуется
#43 by Бертыш
Дуа блин
#44 by Карась
ну просвятите
#45 by Карась
ТаблицаООО=Document.createInstance("com.sun.star.text.TextTable"); ТаблицаООО.initialize(ТЗ.Количество,ТЗ.Колонки.Количество); Текст.insertTextContent(Курсор10,ТаблицаООО,0); Для Сч=1 По ТЗ.Количество Цикл    Колонки=ТЗ.Колонки;    Для Кол=1 По Колонки.Количество Цикл        Ячейка=ТаблицаООО.getCellByPosition((Кол-1),(Сч-1));        Ячейка.getText.setString(""+ТЗ.Получить(Сч-1).Получить(Кол-1));    КонецЦикла; КонецЦикл вот так заработало, осталось это все в нужную закладку передать в нужное место
#46 by Карась
извините, что Вас эти разозлила
#47 by smaharbA
нисколько, "разозлило" это (весело когда постят перепись кода при живом)
#48 by Карась
а как мне теперь передать это все в определенную закладку?
#49 by smaharbA
Перестраивайте под себя (тут много "лишнего", ибо некая совместимость с 77)
#50 by smaharbA
+ в восьмерке абсолютный профан
#51 by Карась
Во так делает как надо, вставляет куда необходимо Закладки10=ТЗ; ТаблицаООО=Document.createInstance("com.sun.star.text.TextTable"); ТаблицаООО.initialize(ТЗ.Количество,ТЗ.Колонки.Количество); Курсор10.gotoRange(Якорь10, 0); Текст.insertTextContent(Курсор10,ТаблицаООО,0); Для Сч=1 По ТЗ.Количество Цикл    Колонки=ТЗ.Колонки;    Для Кол=1 По Колонки.Количество Цикл        Ячейка=ТаблицаООО.getCellByPosition((Кол-1),(Сч-1));        Ячейка.getText.setString(""+ТЗ.Получить(Сч-1).Получить(Кол-1));    КонецЦикла; КонецЦикла;
#52 by smaharbA
идеологически правильнее для восьмерки наверное делать Для Каждого Из... (метаданные восьмерки абсолютно не знаю)
#53 by Vladal
Я вот с ИТС взял конфигурацию демо ОпенОффис    // Если у документ OpenOffice до сих пор не создан    Если OOДокумент = Неопределено Тогда        // Открыть OpenOffice        ServiceManager = Новый COMОбъект("com.sun.star.ServiceManager");        Reflection = ServiceManager.createInstance("com.sun.star.reflection.CoreReflection");        Desktop = ServiceManager.createInstance("com.sun.star.frame.Desktop");        Broadcaster = ServiceManager.createInstance("com.sun.star.frame.GlobalEventBroadcaster");        // Удалить временный файл, если есть        Если ВременныйФайл <> Неопределено Тогда            УдалитьФайлы(ВременныйФайл);        КонецЕсли;        // Получить имя временного файла для хранения документа        ИмяФайла = ПолучитьИмяВременногоФайла(".odt");        // Получим данные файла        ДанныеФайла = СправочникОбъект.Файл.Получить;        Если ДанныеФайла = Неопределено Тогда            // Создать новый документ, если не был создан до этого            Args = Новый COMSafeArray("VT_DISPATCH", 1);            OOДокумент = Desktop.loadComponentFromURL("private:factory/swriter", "_blank", 0, Args);            // И сохранить его во временный файл            OOДокумент.storeAsURL(ПреобразоватьВURL(ИмяФайла), Args);        Иначе            // Записать данные во временный файл            ДанныеФайла.Записать(ИмяФайла);            // Открыть документ OpenOffice и добавить обработчик закрытия документа            Args = Новый COMSafeArray("VT_DISPATCH", 1);            OOДокумент = Desktop.loadComponentFromURL(ПреобразоватьВURL(ИмяФайла), "_blank", 0, Args);        КонецЕсли;        // Добавим обработчик события от документа OpenOffice        OOОбработчик = Новый COMОбъект("OOEvents.EventHandler");        ДобавитьОбработчик OOОбработчик.notifyEvent, ОбработкаСобытий;        Broadcaster.AddEventListener(OOОбработчик);    КонецЕсли;    // Если документ открыт, активизировать его    OOДокумент.getCurrentController.getFrame.getContainerWindow.setFocus;
#54 by smaharbA
это хорошо когда есть сейфмассив, но не всегда это так
#55 by smaharbA
и когда ИТС есть, то же хорошо
#56 by Карась
Я с ИТС только начинаю дружить, но понимаю-вещь полезная!
#57 by smaharbA
в случае ООо вещь никчемная - это невозможно понять, в это надо просто верить.
#58 by smaharbA
кто не верит, возвращается, а не редко еще и учит тех кто устриц не то что бы кушал, а прямо Жрал.
#59 by Карась
Ну мне очень повезло, что Вы оказались на этом форуме
#60 by smaharbA
мне льстит и важности добавляет
#61 by Карась
ну а что Вы хотите, чтобы я еще что-нибудь спросила, я могу, вопросов много))
#62 by smaharbA
нехочу, у меня такая же доча учится асуп по существу веток - убей руководителя практики. Совет искренен, пусть купят нормальный софт и не умничают.
#63 by smaharbA
+ руководитель 27 - 28 летний пацан ?
#64 by Карась
Неа, ему 39
#65 by Карась
А с софтом я надеюсь в скором времени все решится, очень надеюсь)
#66 by smaharbA
конченый неадекват, не исправимо
#67 by Карась
Ну не знаю, я не берусь судить, маленькая еще
#68 by smaharbA
да ладно, эмоционален может где. Не нравятся "адепты" ооо кои в большинстве представления об оном не имеющие а так - полезно и ооо позырить, начнете понимать что есть не есть.
#69 by smaharbA
успехов
#70 by Карась
Спасибо)
#71 by Oleg_Kag
Внесите в книгу знаний, т.к. с начала и до конца разобран пример работы с кальком
#72 by Карась
это не Calc это writer
#73 by Карась
Я в нем работала, но в принципе суть метода та же
#74 by Карась
Маленький нюанс, если надо, чтобы выводились все колонки табличной части, то можно использовать этот код, он будет выводить и колонку со значениями ссылок. Но если колонка со ссылками не нужна то в строке ТаблицаООО.initialize(ТЗ.Количество,ТЗ.Колонки.Количество-1); указываем Количество-1 и в строке Для Кол=1 По Колонки.Количество-1 Цикл так же ставим минус1, тогда последняя колонка со ссылками включаться не будет
#75 by Карась
возможно, совсем простые вещи объяснила, но для меня это оказалось важно
Тэги: Админ
Ответить:
Комментарии доступны только авторизированным пользователям

В этой группе 1С