Каталог решений - Выгрузка данных в MS Project через COM-соединение

Выгрузка данных в MS Project через COM-соединение

Выгрузка данных в MS Project через COM-соединение

В наличии

Работа с Microsoft Project через COM-соединение

Категория:

Описание

Навеяно постом.

Нехватка материала по работе с Project’ом через COM подтолкнула меня написать эту статью. Материал не претендует на полноту, но, надеюсь, поможет программистам в некоторых базовых моментах. Использовалась русская версия продукта, поэтому названия полей и таблиц приведены такими, как они были прописаны в VBA при записи макросов. Для другого языка, думаю, перевести проблем не составит.

Итак, создание COMОбъекта:

MSProject = Новый COMОбъект(«MSProject.Application»);

создание нового файла:

MSProject.FileNew();

получаем коллекцию задач:

Tasks = MSProject.ActiveProject.Tasks;

отключение сообщений об ошибках и диалоговых окон (вида «Такой файл уже существует»):

MSProject.DisplayAlerts = False;

указываем сколько часов в рабочем дне:

MSProject.ActiveProject.HoursPerDay = 8;

для добавления колонок на рабочую область, использую метод TableEditEx у Application:

ИмяТаблицы = «&Ввод»;
ПозицияКолонки = 2;
ТипПоля = «Текст1»;
MSProject.Application.TableEditEx(ИмяТаблицы,True,,,,, ТипПоля ,«Представление колонки»,,,,,,,  ПозицияКолонки ,,,,,);

Фактически в таблице хранится фиксированное количество столбцов и мы лишь можем управлять видимостью их и изменением свойств. Поэтому мы можем в любой столбец прописать свои значения, даже если его не видно на листе. Чтобы отобразить данные, нужно добавить колонку с тем типом данных, который мы указали. Второй параметр должен быть True. Список имен таблиц можно увидеть выполнив макрос с одним единственным словом Tables (может есть и «нормальный» вызов этого списка, но я этими поисками не занимался). После этого на форме появится список всех доступных таблиц проекта.

После добавления колонок нужно обновить таблицу:

MSProject.Application.TableApply(ИмяТаблицы);

Добавим задачу в проект:

NewTask = Tasks.Add();
мСоответствиеЗадач.Вставить(Задача1С, NewTask);

Переменная  мСоответствиеЗадач  это соответствие, для последующего добавления предшественников, если они будут.

Изменение уровня задачи в иерархии задач (действия аналогичны нажатию стрелок «Понизить уровень задачи» и «Повысить уровень задачи» на панели проекта:

Task.OutlineIndent(); // понижение уровня
Task.OutlineOutdent(); // повышение уровня

Редактирование полей, которые не ReadOnly можно напрямую:

NewTask.Name = «Название»;
NewTask.Milestone = True;  // Веха

Обратите внимание, что поля Start (Начало задачи) и Finish (Окончание задачи) не должны быть заполнены пустой датой:

Если ЗначениеЗаполнено(ДатаНачалаПлан) Тогда
   
NewTask.Start = ДатаНачалаПлан + Hour * 9;
КонецЕсли;
Если
ЗначениеЗаполнено(ДатаОкончанияПлан) Тогда
   
NewTask.Finish = ДатаОкончанияПлан + Hour * 18;
КонецЕсли;

Остальные поля можно редактировать через метод SetField, который умеет работать через константы имен полей и их ID (можно посмотреть в справке все ID всех доступных полей). Пример через ID:

NewTask.SetField(188743731, КодСДР); // Текст1

Добавим ресурсы через константу по имени поля. В квадратных скобках указывается Загрузка ресурса:

FieldRes = Tasks.Application.FieldNameToFieldConstant(«Названия ресурсов»);
NewTask.SetField(FieldRes, Исполнитель.Наименование + «[80%]»);

Если ресурсов больше, чем один, то они указываются в одну строку через точку с запятой.

Добавим предшественников с помощью метода  LinkPredecessors. Здесь-то нам и понадобится соответствие задач 1С и задач Project’а:

LinkTask = мСоответствиеЗадач[ЗадачаПредшественник];
Task.LinkPredecessors(LinkTask);

Можно изменить шрифт:

MSProject.Application.SelectSheet();
MSProject.Application.Font32Ex(«Arial», 8 , True);

Сохраним и выйдем:

MSProject.FileSaveAs(ПутьКФайлу);
MSProject.Application.Quit();

has been added to your cart:
Оформление заказа