Показаны сообщения с ярлыком ole. Показать все сообщения
Показаны сообщения с ярлыком ole. Показать все сообщения

среда, 26 октября 2016 г.

Вывод из 1С 7.7 в Word (OLE, с разбиением страницы на колонки)


Задача: Снова встала задача вывести из 1С в Word немного текста. В этот раз отличительной особенностью стала необходимость вывода шапки на всю ширину страницы, а таблицу - разместить ниже в 2 колонки.

Для небольших таблиц в пару сотен строк кода работает прекрасно. Для больших - лучше формировать не через OLE, иначе можно смело оставлять на пару часов.

Решение: Задача старая, много полезных ссылок:
https://helpf.pro/faq8/view/635.html
http://superadm.net/index.php?name=pages&op=view&id=98
http://infostart.ru/public/67727/ - с готовым примером, много комментариев
http://www.delphimaster.ru/articles/dbtoword/index.html - отличные примеры на Дельфи
Самый лучший и полный  - http://scriptcoding.ru !


Под катом моя версия и копия с инфостарта.


среда, 5 октября 2016 г.

1С 7.7 + OLE часть 3/3

Копия статьи с http://www.softpoint.ru/article_id90.htm под катом

1С 7.7 + OLE часть 2/3

Копия статьи с мисты под катом:

1С 7.7 + OLE часть 1/3


Подробно описано:

Простой пример:
БазаОле = СоздатьОбъект("V77.Application");
КаталогБазыОЛе  = "D:\base";
ПользовательОле = "";
ПарольОле       = "";
МонопольныйРежимOLE = " /m"; // для немонопольного запуска указать пустую строку!
ЗапускБезЗаставки = 0;    // без заставки 1, с заставкой 0
РезультатПодключения = БазаОле.Initialize(БазаОле.RMTrade , "/d" + СокрЛП(КаталогБазыОле) + " /n" + СокрЛП(ПользовательОле) +
 " /p" + СокрЛП(ПарольОле) + МонопольныйРежимOLE,
 ?(ЗапускБезЗаставки = 1, "NO_SPLASH_SHOW", ""));
Если РезультатПодключения = 0 Тогда
    Предупреждение("Не удалось подключится к указанной базе - проверьте вводные!");
КонецЕсли;
 
//
КонтрагентыOLE = БазаОле.CreateObject("Справочник.Контрагенты");
КонтрагентыOLE.ВыбратьЭлементы();
Пока КонтрагентыOLE.ПолучитьЭлемент()=1 Цикл
   Сообщить(КонтрагентыOLE.Наименование);
КонецЦикла;



Возможные проблемы:
http://www.forum.mista.ru/topic.php?id=395287
При использовании работы ИБ через OLE выдается сообщение: "Действие не может быть завершено, так как другая программа занята. (сервер занят)
Для перехода к этой программе воспользуйтесь кнопкой "Переключиться"."

Время до появления диалога "зашито" в 1С:Предприятие и не может быть изменено из встроенного языка или внешними средствами. Однако согласно документации Микрософт данное сообщение появляется только в случае, если пользователь использовал кливиатуру или мышь во время работы OLE-сервера - поэтому можно посоветовать после запуска обработки дождаться ее завершения, и лишь затем продолжить работу.

Вариант решения: Программа для автоматического закрытия окна "Server busy"
Данная утилита выполняет одну единственную функцию - каждые 5 секунд проверяет наличие окна с заголовком "Server busy" и жмет на кнопку "Retry" до тех пор, пока оно не закроется.
При запуске программы необходимо нажать кнопку "Старт" и свернуть в трей. При наведении курсора мыши на значок в трее программа показывает количество "кликов", если они были, т.е. сколько раз программа "нажимала" на "Retry".

вторник, 28 мая 2013 г.

Пример вывода данных в MS Word из 1С 7.7

Еще один пример работы с Word из 1С 7.7, увидел тут .

Word = CreateObject("Word.Application");
Word.Documents.Add();
Word.Documents(1).Content.InsertAfter(“Уважаемый “ + СокрЛП(Директор)+"!");
MyRange = Word.Documents(1).paragraphs.last.range;
MyRange.Bold = 1;
Word.Documents(1).paragraphs.last.Alignment = 1; //center
Word.Documents(1).Content.InsertParagraphAfter();
Word.Documents(1).Content.InsertAfter("Вы нам должны "+Сумма);
Word.Documents(1).Content.InsertAfter(" "+СокрЛП(Валюта));
Word.Documents(1).paragraphs.last.range.Bold = 0;
Word.Documents(1).paragraphs.last.Alignment = 0; //left
Цифирь = Word.Documents(1).range (Word.ActiveDocument.paragraphs.last.range.End – 1 -СтрДлина(Строка(СокрЛП(Сумма)))-1-СтрДлина(Строка(СокрЛП(Валюта))),
Word.ActiveDocument.paragraphs.last.range.End – 1 -СтрДлина(Строка(СокрЛП(Валюта))));
Цифирь.Font.ColorIndex = 6; //wdRed
// показываем полученный текст
Word.Visible = 1;


Есть несколько тонкостей, на которые следует обратить внимание:
• вызывается объект “Word.Application”;
• нельзя передавать константы Word в качестве параметров функций – только их численные значения. А чтобы быстро узнать их значения, достаточно создать макрос в Word, а в нем воспользоваться процедурой MsgBox(). Например, если передать ей wdRed в качестве параметра, то получим 6 – значение константы;
• вместо True и False надо использовать 1 и 0;
• “Documents(1)” указывает на первый из открытых документов. Надежнее использовать “ActiveDocument” (ведь если Word уже был запущен, то ваш документ может оказаться не первым) – пример просто показывает, что работают оба варианта;
• обратите внимание, что объектом “Range” может быть как весь объект другого вида (слово, абзац, документ), так и конкретная область (ср. “MyRange” и “Цифирь”).
Основным источником информации на эту тему является файл справки по VBA для MS Word.