Навеяно постом.
Нехватка материала по работе с 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();