При работе с подсистемой управления проектами в конфигурации 1С:Документооборот (ДО) многие специалисты сталкиваются с неочевидной проблемой. Если загрузка плана из файла MS Project (формат .mpp или .xml) реализована штатно, то обратная операция — выгрузка созданного в 1С плана для передачи заказчику или открытия в MS Project — часто вызывает вопросы. Рассмотрим подробно, почему стандартные методы не работают и как решить эту задачу.
В платформе 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С:Документооборот план проекта строится на справочнике ПроектныеЗадачи. Это иерархический справочник, где элементы связаны с конкретным проектом (справочник Проекты).
Чтобы корректно передать данные, нам нужно собрать:
Поскольку готовой кнопки "Сохранить как MS Project" в большинстве версий ДО нет, рассмотрим два основных пути решения: "Простой" (для пользователей) и "Программный" (для разработчиков).
Если вам нужно разово выгрузить план или вы не хотите писать сложную обработку, самый эффективный способ — использовать промежуточный формат Excel. MS Project отлично умеет импортировать данные из книг XLSX с помощью мастера настройки.
Разберем алгоритм действий:
Важный нюанс: При таком способе может потеряться иерархия, если она не была явно закодирована (например, цифрами 1.1, 1.2). Однако это самый быстрый способ перенести "кости" проекта в другую систему.
Если требуется регулярный обмен или полная автоматизация, необходимо написать обработку, которая сформирует XML-файл в строгом соответствии со схемой Microsoft.
Проанализируем ключевые блоки, которые должен содержать ваш XML-файл.
Файл должен начинаться с описания проекта. Важно указать глобальные настройки, иначе сроки могут "поехать" из-за разницы в календарях.
ЗаписьXML.ЗаписатьНачалоЭлемента("Project");
ЗаписьXML.ЗаписатьАтрибут("xmlns", "http://schemas.microsoft.com/project");
// Основные свойства
ЗаписьXML.ЗаписатьНачалоЭлемента("Name");
ЗаписьXML.ЗаписатьТекст(ВыборкаПроекта.Наименование);
ЗаписьXML.ЗаписатьКонецЭлемента(); // Name
// ... другие свойства (Title, Subject, StartDate)
Самый сложный момент — это идентификаторы. 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
В 1С связи обычно хранятся в табличной части или регистре сведений. При выгрузке задачи в XML необходимо внутри тега Task добавить блок PredecessorLink.
Обратите внимание: ссылаться нужно на UID задачи-предшественника, который вы сгенерировали на предыдущем шаге, а не на ссылку 1С.
// Внутри цикла выгрузки задачи (Task)
Для Каждого Связь Из ВыборкаЗадач.Предшественники Цикл
ЗаписьXML.ЗаписатьНачалоЭлемента("PredecessorLink");
ЗаписьXML.ЗаписатьНачалоЭлемента("PredecessorUID");
// Здесь нужно найти Числовой ID задачи-предшественника
ЗаписьXML.ЗаписатьТекст(НайтиUIDПоСсылке(Связь.Предшественник));
ЗаписьXML.ЗаписатьКонецЭлемента();
ЗаписьXML.ЗаписатьКонецЭлемента(); // PredecessorLink
КонецЦикла;
Рассмотрим различия в конфигурациях:
Прямой экспорт ЗаписатьXML не подходит для обмена с MS Project. Для решения задачи рекомендуем:
Project -> Tasks -> Task.