Как выгрузить план проекта из 1С:Документооборот в MS Project (XML)?

Программист 1С v8.3 (Управляемые формы) 1С:Документооборот Управленческий учет IT и автоматизация бизнеса
← На главную

При работе с подсистемой управления проектами в конфигурации 1С:Документооборот (ДО) многие специалисты сталкиваются с неочевидной проблемой. Если загрузка плана из файла MS Project (формат .mpp или .xml) реализована штатно, то обратная операция — выгрузка созданного в 1С плана для передачи заказчику или открытия в MS Project — часто вызывает вопросы. Рассмотрим подробно, почему стандартные методы не работают и как решить эту задачу.

Почему не работает стандартная сериализация XML?

В платформе 1С:Предприятие существует мощный механизм XML-сериализации. Казалось бы, достаточно написать несколько строк кода, чтобы получить файл.

Посмотрим на пример стандартной выгрузки, который часто приходит в голову первым:


ЗаписьXML = Новый ЗаписьXML;
ЗаписьXML.ОткрытьФайл("C:\ProjectPlan.xml");
ЗаписатьXML(ЗаписьXML, ПланПроекта, НазначениеТипаXML.Явное);
ЗаписьXML.Закрыть();

Однако, если мы попробуем открыть полученный файл в Microsoft Project, программа выдаст ошибку или не распознает структуру данных. Причина кроется в стандартах. Команда ЗаписатьXML выгружает данные во внутреннем формате 1С (со своим пространством имен, структурой полей и GUID-ами). MS Project же ожидает файл, соответствующий схеме MSPDI (Microsoft Project Data Interchange).

Это принципиально разные структуры. Например, 1С хранит иерархию через ссылку на родителя, а XML схема MS Project требует вложенности тегов или указания уровня структуры (OutlineLevel).

Анализ структуры данных в 1С:Документооборот

Прежде чем приступать к решению, разберемся, что именно мы пытаемся выгрузить. Как верно замечено в обсуждении, план проекта в 1С — это не один объект.

В 1С:Документооборот план проекта строится на справочнике ПроектныеЗадачи. Это иерархический справочник, где элементы связаны с конкретным проектом (справочник Проекты).

Чтобы корректно передать данные, нам нужно собрать:

  1. Иерархию задач (WBS — Work Breakdown Structure).
  2. Сроки (Даты начала и окончания, длительность).
  3. Связи (Предшественники и последователи).
  4. Ресурсы (Исполнители).

Поскольку готовой кнопки "Сохранить как MS Project" в большинстве версий ДО нет, рассмотрим два основных пути решения: "Простой" (для пользователей) и "Программный" (для разработчиков).

Решение 1: Выгрузка через Excel (Без программирования)

Если вам нужно разово выгрузить план или вы не хотите писать сложную обработку, самый эффективный способ — использовать промежуточный формат Excel. MS Project отлично умеет импортировать данные из книг XLSX с помощью мастера настройки.

Разберем алгоритм действий:

  1. Откройте план проекта в 1С:Документооборот.
  2. Выведите список задач в табличный документ. Обычно это делается через меню "Все действия" -> "Вывести список".
  3. Убедитесь, что в список попали нужные колонки: Наименование, Дата начала, Дата окончания, Длительность.
  4. Сохраните полученную таблицу в формат Excel (xlsx).
  5. Запустите MS Project и откройте этот файл.
  6. Запустится "Мастер импорта". Выберите режим "Новая карта".
  7. Сопоставьте поля Excel с полями MS Project:
    • Колонка "Наименование" -> Поле "Name" (Название).
    • Колонка "Дата начала" -> Поле "Start" (Начало).
    • Колонка "Дата окончания" -> Поле "Finish" (Окончание).

Важный нюанс: При таком способе может потеряться иерархия, если она не была явно закодирована (например, цифрами 1.1, 1.2). Однако это самый быстрый способ перенести "кости" проекта в другую систему.

Решение 2: Программная генерация XML (MSPDI)

Если требуется регулярный обмен или полная автоматизация, необходимо написать обработку, которая сформирует XML-файл в строгом соответствии со схемой Microsoft.

Проанализируем ключевые блоки, которые должен содержать ваш XML-файл.

1. Заголовок проекта

Файл должен начинаться с описания проекта. Важно указать глобальные настройки, иначе сроки могут "поехать" из-за разницы в календарях.


ЗаписьXML.ЗаписатьНачалоЭлемента("Project");
ЗаписьXML.ЗаписатьАтрибут("xmlns", "http://schemas.microsoft.com/project");
// Основные свойства
ЗаписьXML.ЗаписатьНачалоЭлемента("Name");
ЗаписьXML.ЗаписатьТекст(ВыборкаПроекта.Наименование);
ЗаписьXML.ЗаписатьКонецЭлемента(); // Name
// ... другие свойства (Title, Subject, StartDate)

2. Задачи (Tasks)

Самый сложный момент — это идентификаторы. 1С использует УникальныйИдентификатор (GUID), а MS Project внутри XML оперирует целочисленными UID и ID.

Нам придется создать таблицу соответствия или добавлять временный числовой индекс при выгрузке.


ЗаписьXML.ЗаписатьНачалоЭлемента("Tasks");
Пока ВыборкаЗадач.Следующий() Цикл
    ЗаписьXML.ЗаписатьНачалоЭлемента("Task");
    
    // Уникальный ID задачи (Число!)
    ЗаписьXML.ЗаписатьНачалоЭлемента("UID");
    ЗаписьXML.ЗаписатьТекст(Формат(ВыборкаЗадач.НомерВПроекте, "ЧГ=0")); 
    ЗаписьXML.ЗаписатьКонецЭлемента();
    
    // Имя
    ЗаписьXML.ЗаписатьНачалоЭлемента("Name");
    ЗаписьXML.ЗаписатьТекст(ВыборкаЗадач.Наименование);
    ЗаписьXML.ЗаписатьКонецЭлемента();

    // Уровень вложенности (для иерархии)
    ЗаписьXML.ЗаписатьНачалоЭлемента("OutlineLevel");
    ЗаписьXML.ЗаписатьТекст(Строка(ВыборкаЗадач.Уровень));
    ЗаписьXML.ЗаписатьКонецЭлемента();

    // Даты обязательно в формате YYYY-MM-DDTHH:MM:SS
    ЗаписьXML.ЗаписатьНачалоЭлемента("Start");
    ЗаписьXML.ЗаписатьТекст(ФорматДатыXML(ВыборкаЗадач.ДатаНачалаПлановая));
    ЗаписьXML.ЗаписатьКонецЭлемента();

    ЗаписьXML.ЗаписатьКонецЭлемента(); // Task
КонецЦикла;
ЗаписьXML.ЗаписатьКонецЭлемента(); // Tasks

3. Связи задач (Predecessors)

В 1С связи обычно хранятся в табличной части или регистре сведений. При выгрузке задачи в XML необходимо внутри тега Task добавить блок PredecessorLink.

Обратите внимание: ссылаться нужно на UID задачи-предшественника, который вы сгенерировали на предыдущем шаге, а не на ссылку 1С.


// Внутри цикла выгрузки задачи (Task)
Для Каждого Связь Из ВыборкаЗадач.Предшественники Цикл
    ЗаписьXML.ЗаписатьНачалоЭлемента("PredecessorLink");
    
    ЗаписьXML.ЗаписатьНачалоЭлемента("PredecessorUID");
    // Здесь нужно найти Числовой ID задачи-предшественника
    ЗаписьXML.ЗаписатьТекст(НайтиUIDПоСсылке(Связь.Предшественник)); 
    ЗаписьXML.ЗаписатьКонецЭлемента();

    ЗаписьXML.ЗаписатьКонецЭлемента(); // PredecessorLink
КонецЦикла;

Особенности версий 1С:Документооборот

Рассмотрим различия в конфигурациях:

Резюме

Прямой экспорт ЗаписатьXML не подходит для обмена с MS Project. Для решения задачи рекомендуем:

  1. Для разовых задач: выгружать список в Excel и настраивать маппинг полей при импорте.
  2. Для постоянной работы: использовать готовые внешние обработки с профильных ресурсов (например, Инфостарт), которые реализуют схему MSPDI, или написать свою выгрузку, соблюдая структуру тегов Project -> Tasks -> Task.
← На главную