Навеяно постом.
Нехватка материала по работе с 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();
А как связи проставить?
(1) У объекта Task есть два метода LinkPredecessors() и LinkSuccessors(). Первый добавляет предшественника, второй наследника.
Спасибо. Очень помогло. В процессе бурной автоматизации отдела, появилась необходимость работы с Project, так что Ваша статья пришлась очень даже кстати. 🙂
Вдруг кому пригодится. У метода LinkPredecessors() можно использовать 3 параметра, собственно ссылка на предшественника, тип привязки, и запаздывание.
по 1-му все понятно
второй параметр — число от 1 до 4 (на текущий момент, 2010-й Project).
3-й параметр чуть хитрее, тип значение Variant — не заморачиваясь с английским выяснилось текстовое представление числа в данном конкретном методе.
где-то так
ЗЫ: И еще Project считает по рабочим дням, это следует учитывать.
Очень полезная статья, помогла в настройке выгрузки проектов в project
+1
Очень понятно и информативно расписано, автор молодец.
у кого нить есть полный пример выгрузки?
Доступно, лаконично.
Довольно подробно расписано, спасибо за публикацию.