// С помощью СОМ-соединения запускает MS Visio, где воссоздаёт переданную графическую схему 1С и либо открывает приложение, либо сохраняет схему в файл.
//
// Параметры:
// ГрафСхема - собственно исходная графическая схема 1С, обязательна;
// ДопПараметры - структура, где все ключи необязательны, сама тоже необязательна:
// КоэффициентМасштаба - число; определяет увеличение (умножением) размеров и позиций 1С для позиций Визио; по умолчанию 100;
// СдвигВверх - число; сдвиг в координатах Визио вверх относительно вычисленных позиций 1С; по умолчанию 2;
// СдвигВправо - число; сдвиг в координатах Визио вверх относительно вычисленных позиций 1С; по умолчанию 2;
// Автосоединение - булево; если Истина, то применяется механизм автосоединения Визио (не всегда красиво и правильно отрабатывает); если Ложь, то нет; по умолчанию Ложь;
// ВизиоВФайл - булево; если Истина, то будет выполнено сохранение в файл без показа; если Ложь, то будет открыто приложение и в нём показана схема; по умолчанию Ложь;
//
&НаКлиенте
Процедура ВыгрузитьГрафСхемуВВизио(ГрафСхема, ДопПараметры=Неопределено)
Попытка
Если ТипЗнч(ГрафСхема)<>Тип("ГрафическаяСхема") Тогда
ОбщегоНазначенияКлиентСервер.СообщитьПользователю("Передана не графическая схема!");
Возврат;
КонецЕсли;
// общие настройки
Если ТипЗнч(ДопПараметры)<>Тип("Структура") Тогда
ДопПараметры=Новый Структура;
КонецЕсли;
КоэфМасштаба=?(ДопПараметры.Свойство("КоэффициентМасштаба"), ДопПараметры.КоэффициентМасштаба, 0);
Если не ЗначениеЗаполнено(КоэфМасштаба) Тогда КоэфМасштаба=100 КонецЕсли;
//
СдвигВверх=?(ДопПараметры.Свойство("СдвигВверх"), ДопПараметры.СдвигВверх, 0);
Если не ЗначениеЗаполнено(СдвигВверх) Тогда СдвигВверх=2 КонецЕсли;
//
СдвигВправо=?(ДопПараметры.Свойство("СдвигВправо"), ДопПараметры.СдвигВправо, 0);
Если не ЗначениеЗаполнено(СдвигВправо) Тогда СдвигВправо=2 КонецЕсли;
//
Автосоединение=?(ДопПараметры.Свойство("Автосоединение"), ДопПараметры.Автосоединение, Ложь);
ВизиоВФайл=?(ДопПараметры.Свойство("ВизиоВФайл"), ДопПараметры.ВизиоВФайл, Ложь);
Если ВизиоВФайл Тогда
Если не ДопПараметры.Свойство("ИмяФайла") Тогда
ОбщегоНазначенияКлиентСервер.СообщитьПользователю("Не указано имя файла!");
Возврат;
КонецЕсли;
ИмяФайла=СокрЛП(ДопПараметры.ИмяФайла);
КонецЕсли;
// анализ схемы
мФигур=Новый Массив;
мЛиний=Новый Массив;
МаксВерх=0;
Для каждого ЭлементГС Из ГрафСхема.ЭлементыГрафическойСхемы Цикл
ТипЭлемента=ТипЗнч(ЭлементГС);
Если ТипЭлемента=Тип("ЭлементГрафическойСхемыДействие") или ТипЭлемента=Тип("ЭлементГрафическойСхемыОбработка") Тогда
мФигур.Добавить(ЭлементГС);
МаксВерх=Макс(МаксВерх, ЭлементГС.Верх);
ИначеЕсли ТипЭлемента=Тип("ЭлементГрафическойСхемыСоединительнаяЛиния") Тогда
мЛиний.Добавить(ЭлементГС);
КонецЕсли;
КонецЦикла;
Если мФигур.Количество()=0 и мЛиний.Количество()=0 Тогда
Возврат; // схема пуста
КонецЕсли;
// подключение
комВизио=Новый COMОбъект("Visio.Application");
комВизио.Visible=Не ВизиоВФайл;
комДокумент=комВизио.Documents.Add("");
комСтраница=комДокумент.Pages.Item(1);
// добавление фигур
соотИдФигур=Новый Соответствие;
//
Для каждого ФигураГС Из мФигур Цикл
ЛевоФигуры=ФигураГС.Лево/100+СдвигВправо;
ПравоФигуры=(ФигураГС.Лево+ФигураГС.Ширина)/100+СдвигВправо;
НизФигуры=(МаксВерх-ФигураГС.Верх)/КоэфМасштаба+СдвигВверх;
ВерхФигуры=(МаксВерх-ФигураГС.Верх+ФигураГС.Высота)/КоэфМасштаба+СдвигВверх;
//
комФигура=комСтраница.DrawRectangle(ЛевоФигуры, ВерхФигуры, ПравоФигуры, НизФигуры);
комФигура.Text=ФигураГС.Наименование;
комФигура.CellsSRC(3, 0, 7).FormulaU = "9 pt"; // размер
//
соотИдФигур.Вставить(ФигураГС.Имя, комФигура.Id);
КонецЦикла;
Если Автосоединение Тогда
соотТиповСторон=Новый Соответствие;
соотТиповСторон.Вставить(ТипСтороныЭлементаГрафическойСхемы.Верх, 1);
соотТиповСторон.Вставить(ТипСтороныЭлементаГрафическойСхемы.Низ, 2);
соотТиповСторон.Вставить(ТипСтороныЭлементаГрафическойСхемы.Лево, 3);
соотТиповСторон.Вставить(ТипСтороныЭлементаГрафическойСхемы.Право, 4);
соотТиповСторон.Вставить(ТипСтороныЭлементаГрафическойСхемы.Центр, 0);
//
комВизио.Settings.EnableAutoConnect=Истина;
КонецЕсли;
// добавление линий
Для каждого ЛинияГС Из мЛиний Цикл
комФигураНачало=комСтраница.Shapes.ItemFromID(соотИдФигур.Получить(ЛинияГС.НачалоЭлемент.Имя));
комФигураКонец=комСтраница.Shapes.ItemFromID(соотИдФигур.Получить(ЛинияГС.КонецЭлемент.Имя));
//
Если Автосоединение Тогда
комФигураНачало.AutoConnect(комФигураКонец, соотТиповСторон.Получить(ЛинияГС.КонецСторона));
Иначе
// пока так
начХ=ЛинияГС.НачалоЭлемент.Лево+10; // всё равно отцентрирует
начУ=ЛинияГС.НачалоЭлемент.Верх;
конХ=ЛинияГС.КонецЭлемент.Лево+10; // всё равно отцентрирует
конУ=ЛинияГС.КонецЭлемент.Верх;
//
комЛиния=комСтраница.Drop(комВизио.ConnectorToolDataObject, начХ, начУ);
комЛиния.CellsSRC(1, 4, 0).ResultIU=начХ;
комЛиния.CellsSRC(1, 4, 1).ResultIU=начУ;
комЛиния.CellsSRC(1, 4, 2).ResultIU=конХ;
комЛиния.CellsSRC(1, 4, 3).ResultIU=конУ;
//
яч1=комЛиния.CellsU("BeginX");
яч2=комФигураНачало.CellsSRC(1, 1, 0);
яч1.GlueTo(яч2);
яч1=комЛиния.CellsU("EndX");
яч2=комФигураКонец.CellsSRC(1, 1, 0);
яч1.GlueTo(яч2);
КонецЕсли;
КонецЦикла;
// масштаб по странице
комСтраница.AutoSize=Истина;
комСтраница.AutoSizeDrawing();
// завершение
Если ВизиоВФайл Тогда
комДокумент.SaveAs(ИмяФайла);
комДокумент.Close();
комВизио="";
//
ПоказатьОповещениеПользователя("Готово!", , "Схема сохранена в файл "+ИмяФайла);
Иначе
комВизио.Activate();
// СОМ-переменная не возвращается из функции!
КонецЕсли;
Исключение
ОбщегоНазначенияКлиентСервер.СообщитьПользователю("Ошибка при выгрузке в файл формата MS Visio: "+ОписаниеОшибки());
КонецПопытки;
КонецПроцедуры