Выгрузка данных в 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();

10 Comments

  1. German

    А как связи проставить?

    Reply
  2. Irwin

    (1) У объекта Task есть два метода LinkPredecessors() и LinkSuccessors(). Первый добавляет предшественника, второй наследника.

    Reply
  3. artmicro

    Спасибо. Очень помогло. В процессе бурной автоматизации отдела, появилась необходимость работы с Project, так что Ваша статья пришлась очень даже кстати. 🙂

    Reply
  4. Romanius

    Вдруг кому пригодится. У метода LinkPredecessors() можно использовать 3 параметра, собственно ссылка на предшественника, тип привязки, и запаздывание.

    по 1-му все понятно

    второй параметр — число от 1 до 4 (на текущий момент, 2010-й Project).

    3-й параметр чуть хитрее, тип значение Variant — не заморачиваясь с английским выяснилось текстовое представление числа в данном конкретном методе.

    где-то так

    ОсновнаяЗадача.LinkPredecessors(ЗадачаПредок,1,Строка(ПроцессСмещение));

    ЗЫ: И еще Project считает по рабочим дням, это следует учитывать.

    Reply
  5. RukORK

    Очень полезная статья, помогла в настройке выгрузки проектов в project

    Reply
  6. RukORK

    +1

    Reply
  7. Konsult

    Очень понятно и информативно расписано, автор молодец.

    Reply
  8. Daniayr

    у кого нить есть полный пример выгрузки?

    Reply
  9. hem1cuda

    Доступно, лаконично.

    Reply
  10. bimy22

    Довольно подробно расписано, спасибо за публикацию.

    Reply

Leave a Comment

Ваш адрес email не будет опубликован. Обязательные поля помечены *