При интеграции 1С с инженерными системами, такими как WinCAD 4.0, разработчики часто сталкиваются с проблемой извлечения специфических данных. Формат .wds является проприетарным вектором, содержащим инструкции для построения схем оконных и дверных блоков. В этой статье мы разберем, как подступиться к этой задаче, проанализируем структуру хранения данных в MS SQL и рассмотрим эффективные методы преобразования этих данных для использования в печатных формах 1С.
Для начала проанализируем ситуацию: данные WinCAD хранятся в базе MS SQL Server в двоичном виде. Простая попытка прочитать этот поток как текст не приносит результата, так как файл представляет собой сложный набор координат и параметров профилей. Прежде чем приступать к конвертации, нам необходимо корректно извлечь эти данные из СУБД. Выясним причину, по которой стандартные методы чтения графических файлов здесь не работают: формат .wds требует наличия библиотек WinCAD (таких как Wdraw.dll) для интерпретации геометрии.
Рассмотрим пример кода на стороне 1С для получения двоичных данных из поля SQL:
// Создание соединения с MS SQL Server
Connection = Новый COMОбъект("ADODB.Connection");
ConnectionString = "Driver={SQL Server};Server=ИмяСервера;Database=ИмяБазы;Uid=Логин;Pwd=Пароль;";
Connection.Open(ConnectionString);
// Запрос к таблице с данными .wds
Command = Новый COMОбъект("ADODB.Command");
Command.ActiveConnection = Connection;
Command.CommandText = "SELECT WdsContent FROM OrderItems WHERE ItemID = '123'";
Recordset = Command.Execute();
Если Не Recordset.EOF Тогда
// Получение бинарного потока
ДвоичныеДанныеWDS = Recordset.Fields("WdsContent").Value;
// Сохранение во временный файл для дальнейшей обработки
ПутьКФайлу = ПолучитьИмяВременногоФайла("wds");
ДвоичныеДанныеWDS.Записать(ПутьКФайлу);
КонецЕсли;
Разберем по шагам наиболее стабильный способ получения визуальных данных, если прямая расшифровка формата невозможна. Этот метод заключается в программном вызове функции печати из WinCAD на виртуальный принтер, который сохраняет результат в универсальный формат (например, PDF или метафайл).
Проанализируем ситуацию: большинство версий WinCAD поддерживают командную строку или автоматизацию через интерфейс. Мы можем настроить виртуальный принтер (например, Bullzip PDF Printer или PDFCreator), который будет автоматически сохранять файл в заданную директорию без участия пользователя. Рассмотрим алгоритм реализации:
Посмотрим на пример выполнения команды через 1С:
Процедура НапечататьWDS(ПутьКПрограмме, ПутьКФайлу)
// Формируем строку запуска для печати
СтрокаЗапуска = """" + ПутьКПрограмме + """ /p """ + ПутьКФайлу + """";
ЗапуститьПриложение(СтрокаЗапуска, , Истина);
// После завершения забираем сформированный объект
// (Логика ожидания файла в папке принтера)
КонецПроцедуры
Проанализируем более продвинутый способ — использование COM-объектов. Если WinCAD зарегистрировал в системе свои библиотеки, мы можем управлять приложением напрямую. Это позволяет избежать открытия окон программы и выполнять экспорт в фоновом режиме. Выясним, какие объекты доступны, изучив реестр Windows или документацию к API WinCAD.
Рассмотрим примерную схему взаимодействия:
Попытка
WinCadApp = Новый COMОбъект("WinCad.Application"); // Имя объекта может отличаться
WinCadDoc = WinCadApp.Documents.Open(ПутьКФайлуWDS);
// Экспорт в векторный формат метафайла
ПутьЭкспорта = ПолучитьИмяВременногоФайла("emf");
WinCadDoc.Export(ПутьЭкспорта, "EMF");
WinCadDoc.Close();
Исключение
Сообщить("Ошибка инициализации WinCAD: " + ОписаниеОшибки());
КонецПопытки;
Рассмотрим подробнее техническую составляющую. Поскольку WinCAD базируется на технологиях Windows, его внутренние функции генерации визуализации часто опираются на стандартные графические контексты (GDI). Если данные в SQL представляют собой упакованный Windows Metafile, их можно извлечь, отбросив специфический заголовок WinCAD.
Проанализируем структуру байтов: если файл начинается не с сигнатуры WMF, попробуем найти библиотеку Wdraw.dll в каталоге программы. Иногда достаточно подключить эту DLL к своей внешней компоненте на C++ для 1С, чтобы вызвать функцию RenderWDS(data, hDC), которая отрисует данные напрямую в контекст формы или файла.
Важные моменты при работе с форматом EMF в 1С:
Картинка поддерживают метафайлы "из коробки".Выясним, как программно поместить полученный результат в печатную форму:
// Загрузка полученного векторного объекта в табличный документ
ОбластьМакета = Макет.ПолучитьОбласть("ОбластьЧертежа");
ДанныеГрафики = Новый Картинка(ПутьЭкспорта); // Путь к созданному EMF/WMF
РисунокНаФорме = ОбластьМакета.Рисунки.Добавить(ТипРисункаТабличногоДокумента.Картинка);
РисунокНаФорме.Картинка = ДанныеГрафики;
РисунокНаФорме.ГраницаСверху = Ложь;
РисунокНаФорме.ГраницаСнизу = Ложь;
Подводя итог, можно сказать, что прямая интерпретация бинарного кода .wds — задача крайне трудоемкая и нецелесообразная без спецификации от разработчиков WinSoft. Оптимальным путем является автоматизация штатных механизмов WinCAD. Выбирая между виртуальным принтером и COM-объектом, стоит отдать предпочтение COM, так как это обеспечивает более высокую скорость и надежность работы в многопользовательской среде. Проанализировав все способы, мы видим, что интеграция через промежуточные векторные форматы (EMF) является лучшим решением для сохранения качества проектных данных в коммерческих предложениях, формируемых в 1С.