Имеется чертеж сборочное единицы (файл .cdw). При этом файл спецификации .spw для этой сборочной единицы отсутствует. Необходимо выдернуть из чертежа характеристику объектов спецификации и записать их в таблицу значений в 1с!
Вот с чего всё начинается:
Функция ПолучитьСпец()
КомпасПриложение = Новый COMОбъект("KOMPAS.Application.5");
СборочныйЧертеж = ПолучитьСборочныйЧертеж(item); / записываем в переменную путь к файлу с чертежом
Тспец=Новый ТаблицаЗначений; //Создание таблицы значений
Тспец.Колонки.Добавить("Раздел");
Тспец.Колонки.Добавить("Формат");
Тспец.Колонки.Добавить("Зона");
Тспец.Колонки.Добавить("Позиция");
Тспец.Колонки.Добавить("Обозначение");
Тспец.Колонки.Добавить("Наименование");
Тспец.Колонки.Добавить("Количество");
Тспец.Колонки.Добавить("Примечание");
Если КомпасОбъект= Неопределено Тогда
КомпасОбъект=КомпасПриложение.SpcDocument();
КомпасОбъект.ksOpenDocument(СборочныйЧертеж,Ложь);
КонецЕсли;
//!!!из файлов спецификации мы бы выдёргивали следующим образом:
//начало
Если КомпасОбъект= Неопределено Тогда
КомпасОбъект=КомпасПриложение.SpcDocument();
КомпасОбъект.ksOpenDocument(СборочныйЧертеж,Ложь);
КонецЕсли;
spc=КомпасОбъект.GetSpecification(); //Получаем объект спецификации.
spcColPar = КомпасПриложение.GetParamStruct(81);//81 - ko_SpcColumnParam
Итератор=КомпасПриложение.GetIterator(); //Инициализируем итератор
Итератор.ksCreateSpcIterator("graphic.lyt", 1, 0); //Прикручиваем итератор к спецификации
Строка=Итератор.ksMoveIterator( "F" ); //находим первый
Пока Строка<>0 И Строка <> Неопределено Цикл
//узнаем количество колонок у базового объекта спецификации
Стр=Тспец.Добавить();
Стр.Раздел=spc.ksGetSpcSectionName(Строка);
Если Стр.Раздел="Документация" Тогда
Стр.Раздел=Справочники.aps_ВидыЭлементов.Документ;
ИначеЕсли Стр.Раздел="Сборочные единицы" Тогда
Стр.Раздел=Справочники.aps_ВидыЭлементов.СбЕдиница;
ИначеЕсли Стр.Раздел="Детали" Тогда
Стр.Раздел=Справочники.aps_ВидыЭлементов.Деталь;
ИначеЕсли Стр.Раздел="Стандартные изделия" Тогда
Стр.Раздел=Справочники.aps_ВидыЭлементов.СтИзд;
ИначеЕсли Стр.Раздел="Материалы" Тогда
Стр.Раздел=Справочники.aps_ВидыЭлементов.Материал;
КонецЕсли;
Стр.Формат=ПолучитьЗначениеКолонкиСпецификации(spc,Строка,1,spcColPar);
Стр.Зона=ПолучитьЗначениеКолонкиСпецификации(spc,Строка,2,spcColPar);
Стр.Позиция=ПолучитьЗначениеКолонкиСпецификации(spc,Строка,3,spcColPar);
Стр.Обозначение=ПолучитьЗначениеКолонкиСпецификации(spc,Строка,4,spcColPar);
Стр.Наименование=ПолучитьЗначениеКолонкиСпецификации(spc,Строка,5,spcColPar);
Стр.Количество=ПолучитьЗначениеКолонкиСпецификации(spc,Строка,6,spcColPar);
Стр.Примечание=ПолучитьЗначениеКолонкиСпецификации(spc,Строка,7,spcColPar);
Строка = Итератор.ksMoveIterator( "N" ); //Находим следующий объект итерации
Конеццикла;
КомпасОбъект.ksCloseDocument();
Возврат ТСпец;
КонецФункции
Функция ПолучитьЗначениеКолонкиСпецификации(spc,Строка,Сч,spcColPar)
Значение="";
Если spc.ksGetSpcColumnType( Строка, //объект спецификации
Сч, // номер колонки, начиная с 1, нас интересует
spcColPar ) <> 0 Тогда
//Получили параметры колонки, "расчленим" их на составляющие
columnType = spcColPar.columnType;
ispoln = spcColPar.ispoln;
blok = spcColPar.block;
//Получаем в буфер содержимое ячейки таблицы (при заданном объекте, в заданной колонке)
Значение = spc.ksGetSpcObjectColumnText( Строка, columnType , ispoln, blok );
КонецЕсли;
Возврат Значение;
КонецФункции // ПолучитьЗначениеКолонкиСпецификации()
//конец
Как получить тоже самое из файла .cdw ?
Вообще мне достаточно только получить позицию объекта, его обозначение и наименование
Все точно так же, т. е. с использованием КомпасОбъект.GetSpecification(). Только в качестве КомпасОбъект "подсуньте" чертеж.
заменил КомпасОбъект=КомпасПриложение.SpcDocument(); на КомпасОбъект=КомпасПриложение.Document2D(); 1 раз срабатывает, 2 раз глючит при попытке получить спецификацию; А третий раз не удаётся даже получить COMОбъект("KOMPAS.Application.5"); При открытии и закрытии любого чертежа картина повторяется. Не могу понять в чём дело.
КомпасПриложение.Quit() почему-то не срабатывает.
проблема решилась только таким образом
Попытка
КомпасПриложение = Новый COMОбъект("KOMPAS.Application.5");
Исключение
КомпасПриложение = ПолучитьCOMОбъект("KOMPAS.Application.5");
КонецПопытки;
Блин не работает когда среди объектов спецификации есть документы :( Помогите. Итератор.ksMoveIterator( "F" ) в этих случаях возвращает сразу 0.
Если спецификация не секретная, сбросьте мне на почту (см. профиль), я посмотрю, как с ней работает моя программа.