|
Как построчно заполнить таблицу в OO из 1с | ☑ | ||
---|---|---|---|---|
0
Карась
06.08.12
✎
13:14
|
Здравствуйте! Я хочу перенести табличную часть из 1с в оо, мне сказали что сделать это можно только через цикл
Строка=Элементы.Товары.ТекущийЭлемент; Строки=Объект.Товары; Для Каждого Строка Из Строки Цикл КонецЦикла; А как мне сделать, чтобы он потом построчно переносил строки табличной части 1с в OO в виде строки У меня есть Закладка в документе, как мне в нее все это передать? |
|||
1
Карась
06.08.12
✎
13:18
|
Мне подсказали что можно сделать с помощью метода insertByIndex, но пока адаптировать его под себя я не могу
|
|||
2
Карась
06.08.12
✎
13:23
|
Надеюсь на Вашу помощь.
|
|||
3
ICWiner
06.08.12
✎
13:33
|
ОО - общество ортодоксов?
|
|||
4
Карась
06.08.12
✎
13:34
|
Open Office
|
|||
5
Карась
06.08.12
✎
13:35
|
Конкретнее Open Office writer
|
|||
6
MaXpaT
06.08.12
✎
13:40
|
Карась, позвал бы ты лучше программиста ....
или есть ещё вариант! Правой кнопкой в табличное поле - вывести список - файл - сохранить копию - и выбери то что нужно тебе |
|||
7
ICWiner
06.08.12
✎
13:41
|
Нашел в просторах интернетов... Как раз ваш случай:
Необходимо заменить в шаблоне ключевые слова в скобках {}, на указанные значения, вот примерный код обработки: Код 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
Карась
06.08.12
✎
13:49
|
(6), я сама стажер-программист, я на практике, так что звать кого-то -не вариант
|
|||
9
ICWiner
06.08.12
✎
13:50
|
Кури (7)
|
|||
10
Карась
06.08.12
✎
13:55
|
(9)буду пробовать, спасибо
|
|||
11
ICWiner
06.08.12
✎
13:59
|
Это для 7.7, так что код в восьмерке работать не будет. Но методы работы с опен офисом те же...
|
|||
12
Карась
06.08.12
✎
14:19
|
ааа спасибо, ну мне там по сути только три строки нужны все остальное у меня под 8-ку уже описано
|
|||
13
Карась
06.08.12
✎
14:32
|
Для x=1 По ТаблицаЗамен.КоличествоСтрок() Цикл
Replace.SearchString = ТаблицаЗамен.ПолучитьЗначение(x, 1); Replace.ReplaceString = ТаблицаЗамен.ПолучитьЗначение(x, 2); ТекстовыйПроцессор.ReplaceAll(Replace); КонецЦикла; Вот этот кусочек, а где здесь указывается закладка куда это все передавать? |
|||
14
smaharbA
06.08.12
✎
14:38
|
никуяпля, не надоело же инету бодягу разводить, мусоля залежный тавар
|
|||
15
smaharbA
06.08.12
✎
14:39
|
(13) не канает Вам все выше написанное
|
|||
16
Карась
06.08.12
✎
14:40
|
(13)чего?
|
|||
17
Карась
06.08.12
✎
14:41
|
(15)ну если знаете как то подскажите, я пока не понимаю как мне правильно заполнит метод insertbyindex
|
|||
18
Карась
06.08.12
✎
14:42
|
я знаю, что уже много тем избила на эти темы, но что мне делать, если у меня опыта мало, сложно приходится
|
|||
19
smaharbA
06.08.12
✎
14:43
|
(18) нужно для работы или для учебы ?
|
|||
20
smaharbA
06.08.12
✎
14:45
|
и еще - нужно на место закладки вогнать содержимое табличной части документа ?
|
|||
21
Карась
06.08.12
✎
14:45
|
(19)Опишу ситуацию полностью, я студент, пошла на практику, прошла курс 1с по программированию, пришла на практику, мне поставили задачу, чтобы учиться, но сдать надо сегодня, так как время истекает, а это единственный нюанс, который осталось решить.
|
|||
22
Карась
06.08.12
✎
14:45
|
(20)да
|
|||
23
Карась
06.08.12
✎
14:46
|
я сутра сижу, пытаюсь сделать
|
|||
24
Карась
06.08.12
✎
14:48
|
и честно, очень хочу сделать, но пока не знаю как
|
|||
25
smaharbA
06.08.12
✎
14:49
|
(21)(22) понял, помогу, но не торопите, а займитесь пока другим
там делов на 5 строк, но лениво ( суть Вариант 1. Создаете таблицу с числом строк равным числу строк ТЧ и вставляете ее кнтекст в место закладки, заполняете получая номер строки и колонки по индексу. Вариант 2. Создаете таблицу без ничего - в цикле по строкам ТЧ создаете строки таблицы, попутно создавая колонки и заполняя их |
|||
26
Карась
06.08.12
✎
14:51
|
(25)хорошо, пока попытаюсь сама, торопить не буду,тогда пока больше не буду трогать эту тему
|
|||
27
smaharbA
06.08.12
✎
15:55
|
код 77 для примера
|
|||
28
Карась
06.08.12
✎
16:06
|
(27)в таблицуООО я кладу свою табличную часть?
|
|||
29
Карась
06.08.12
✎
16:08
|
И как вот эту процедуру описать?
ТЗ=СоздатьОбъект("ТаблицаЗначений"); |
|||
30
Карась
06.08.12
✎
16:14
|
Ааа с таблицейООО поняла
|
|||
31
Карась
06.08.12
✎
16:21
|
И нужен ли мне весь этот код? Мне нужно создать таблицу из трех колонок и заполнить их и табличной части и вставить все это в закладку
|
|||
32
Карась
06.08.12
✎
16:24
|
Я пока тут кое что придумала
вот +Code Строка=Элементы.Товары.ТекущийЭлемент; Строки=Объект.Товары; Для Каждого Строка Из Строки Цикл Закладки11=Строка.Количество; Закладки10=Строка.Продукт; Якорь10.SetString(""+Закладки10+""); Якорь11.SetString(""+Закладки11+""); Курсор10.gotoRange(Якорь10, 0); КонецЦикла; Но он у меня каждую новую запись поверх старой пишет, можно ли сделать перевод строки? |
|||
33
Карась
06.08.12
✎
16:45
|
Я не могу пока адаптировать ваш код под свой
|
|||
34
Карась
06.08.12
✎
16:46
|
Я пока сделала так
ТЗ=Объект.Товары.Выгрузить(); //ТЗ.НоваяКолонка("Номер"); // ТЗ.НоваяКолонка("Продукт"); // ТЗ.НоваяКолонка("Количество"); // ТЗ.Номер=Строки.НомерСтроки; // ТЗ.Продукт=Строки.Продукт; // ТЗ.Количество=Строки.Количество; ТаблицаООО=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
Карась
06.08.12
✎
16:47
|
но он не работает
|
|||
36
Карась
06.08.12
✎
16:55
|
Или же как к моему варианту просто сделать, чтобы он не добавлял вместо уже существующих, а просто прибавлял новые?
|
|||
37
smaharbA
06.08.12
✎
17:08
|
(32) смотрите внимательно (27)
в случае у Вас типо так (восьмерку не знаю)
|
|||
38
Карась
06.08.12
✎
17:12
|
ТаблицаООО.initialize(ТЗ.Количество(),ТЗ.Колонки.Количество());
вот это строка не работает( |
|||
39
Карась
06.08.12
✎
17:14
|
Все ту сделала, а теперь вот эта не хочет
Ячейка=ТаблицаООО.getCellByPosition(Кол-1,Сч); |
|||
40
smaharbA
06.08.12
✎
17:19
|
Сч-1
|
|||
41
smaharbA
06.08.12
✎
17:23
|
+ в (37) забыл
Текст.insertTextContent(Курсор,ТаблицаООО,0); |
|||
42
Карась
06.08.12
✎
17:24
|
понятно, а он все равно жалуется
|
|||
43
Бертыш
06.08.12
✎
17:35
|
Дуа блин
|
|||
44
Карась
06.08.12
✎
17:36
|
(43)ну просвятите
|
|||
45
Карась
06.08.12
✎
17:40
|
ТаблицаООО=Document.createInstance("com.sun.star.text.TextTable");
ТаблицаООО.initialize(ТЗ.Количество(),ТЗ.Колонки.Количество()); Текст.insertTextContent(Курсор10,ТаблицаООО,0); Для Сч=1 По ТЗ.Количество() Цикл Колонки=ТЗ.Колонки; Для Кол=1 По Колонки.Количество() Цикл Ячейка=ТаблицаООО.getCellByPosition((Кол-1),(Сч-1)); Ячейка.getText().setString(""+ТЗ.Получить(Сч-1).Получить(Кол-1)); КонецЦикла; КонецЦикл вот так заработало, осталось это все в нужную закладку передать в нужное место |
|||
46
Карась
06.08.12
✎
17:41
|
(43)извините, что Вас эти разозлила
|
|||
47
smaharbA
06.08.12
✎
17:44
|
нисколько, "разозлило" это (7)
(весело когда постят перепись кода при живом) |
|||
48
Карась
06.08.12
✎
17:46
|
(47)а как мне теперь передать это все в определенную закладку?
|
|||
49
smaharbA
06.08.12
✎
17:46
|
(45)
Перестраивайте под себя (тут много "лишнего", ибо некая совместимость с 77)
|
|||
50
smaharbA
06.08.12
✎
17:47
|
+ в восьмерке абсолютный профан
|
|||
51
Карась
06.08.12
✎
17:57
|
Во так делает как надо, вставляет куда необходимо
Закладки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
smaharbA
06.08.12
✎
18:06
|
идеологически правильнее для восьмерки наверное делать Для Каждого Из...
(метаданные восьмерки абсолютно не знаю) |
|||
53
Vladal
06.08.12
✎
18:09
|
(52) Я вот с ИТС взял конфигурацию демо ОпенОффис
// Если у документ 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
smaharbA
06.08.12
✎
18:25
|
(53) это хорошо когда есть сейфмассив, но не всегда это так
|
|||
55
smaharbA
06.08.12
✎
18:26
|
и когда ИТС есть, то же хорошо
|
|||
56
Карась
06.08.12
✎
20:49
|
Я с ИТС только начинаю дружить, но понимаю-вещь полезная!
|
|||
57
smaharbA
06.08.12
✎
20:51
|
в случае ООо вещь никчемная - это невозможно понять, в это надо просто верить.
|
|||
58
smaharbA
06.08.12
✎
20:52
|
кто не верит, возвращается, а не редко еще и учит тех кто устриц не то что бы кушал, а прямо Жрал.
|
|||
59
Карась
06.08.12
✎
21:18
|
(58)Ну мне очень повезло, что Вы оказались на этом форуме
|
|||
60
smaharbA
06.08.12
✎
21:21
|
мне льстит и важности добавляет
|
|||
61
Карась
06.08.12
✎
21:25
|
ну а что Вы хотите, чтобы я еще что-нибудь спросила, я могу, вопросов много))
|
|||
62
smaharbA
06.08.12
✎
21:28
|
нехочу, у меня такая же доча учится асуп
по существу веток - убей руководителя практики. Совет искренен, пусть купят нормальный софт и не умничают. |
|||
63
smaharbA
06.08.12
✎
21:31
|
+ руководитель 27 - 28 летний пацан ?
|
|||
64
Карась
06.08.12
✎
21:32
|
Неа, ему 39
|
|||
65
Карась
06.08.12
✎
21:33
|
А с софтом я надеюсь в скором времени все решится, очень надеюсь)
|
|||
66
smaharbA
06.08.12
✎
21:33
|
конченый неадекват, не исправимо
|
|||
67
Карась
06.08.12
✎
21:35
|
Ну не знаю, я не берусь судить, маленькая еще
|
|||
68
smaharbA
06.08.12
✎
21:38
|
да ладно, эмоционален может где. Не нравятся "адепты" ооо кои в большинстве представления об оном не имеющие
а так - полезно и ооо позырить, начнете понимать что есть не есть. |
|||
69
smaharbA
06.08.12
✎
21:39
|
успехов
|
|||
70
Карась
06.08.12
✎
21:39
|
Спасибо)
|
|||
71
Oleg_Kag
07.08.12
✎
07:55
|
Внесите в книгу знаний, т.к. с начала и до конца разобран пример работы с кальком
|
|||
72
Карась
07.08.12
✎
11:34
|
(71)это не Calc это writer
|
|||
73
Карась
07.08.12
✎
11:34
|
Я в нем работала, но в принципе суть метода та же
|
|||
74
Карась
07.08.12
✎
12:34
|
Маленький нюанс, если надо, чтобы выводились все колонки табличной части, то можно использовать этот код, он будет выводить и колонку со значениями ссылок.
Но если колонка со ссылками не нужна то в строке ТаблицаООО.initialize(ТЗ.Количество(),ТЗ.Колонки.Количество()-1); указываем Количество()-1 и в строке Для Кол=1 По Колонки.Количество()-1 Цикл так же ставим минус1, тогда последняя колонка со ссылками включаться не будет |
|||
75
Карась
07.08.12
✎
12:35
|
возможно, совсем простые вещи объяснила, но для меня это оказалось важно
|
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |