Как программно получить значение дополнительного реквизита из 1С:Документооборот при интеграции с 1С:ERP?

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

При настройке бесшовной интеграции между 1С:ERP Управление предприятием и 1С:Документооборот (1С:ДО) часто возникает задача выйти за рамки типовых правил сопоставления полей. Одной из таких задач является программное извлечение значений дополнительных реквизитов объектов 1С:ДО для их последующей обработки на стороне 1С:ERP. Рассмотрим, почему стандартные примеры кода могут возвращать пустые значения и как правильно построить алгоритм получения данных.

Анализ проблемы: почему стандартный код не возвращает данные

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

  1. Неполный состав запроса: Веб-сервис 1С:ДО работает по принципу минимизации трафика. Если в запросе DMRetrieveRequest явно не указано, что нам нужны дополнительные реквизиты, сервер их просто не пришлет в ответе.
  2. Несоответствие типов данных: В структуре веб-сервиса значение свойства может храниться в разных полях в зависимости от его типа. Использование propertySimpleValue для ссылочных данных (например, ссылка на другой документ или контрагента) всегда будет возвращать пустоту.
  3. Ошибка идентификации: Поиск свойства по «Имени», которое видит пользователь в интерфейсе, часто ошибочен, так как веб-сервис оперирует внутренними идентификаторами.

Шаг 1: Правильное формирование запроса DMRetrieveRequest

Для того чтобы объект 1С:ДО «пришел» в 1С:ERP вместе со своими дополнительными реквизитами, нам необходимо использовать объект DMRetrieveRequest и настроить его параметры. Разберем по шагам, как это сделать программно.

Рассмотрим пример формирования запроса через прокси веб-сервиса, что позволяет выполнять произвольный запрос во внешнюю базу 1С:


// Создаем объект запроса
Запрос = ИнтеграцияС1СДокументооборотБазоваяФункциональность.СоздатьОбъект(Прокси, "DMRetrieveRequest");

// Указываем идентификатор объекта (например, внутреннего документа)
ОбъектИд = ИнтеграцияС1СДокументооборотБазоваяФункциональность.СоздатьObjectID(Прокси, ИдентификаторОбъектаДО, "DMInternalDocument");
Запрос.objectIds.Добавить(ОбъектИд);

// Важный момент: указываем, какие части объекта нам нужны
// Чтобы получить доп. реквизиты, нужно убедиться, что они включены в состав возвращаемых данных
// В некоторых версиях API это регулируется заполнением коллекции parts
КодЧасти = "Свойства"; // Уточните точное имя части в метаданных вашей версии WS-ссылки
Запрос.parts.Добавить(КодЧасти);

Результат = Прокси.execute(Запрос);

Шаг 2: Выбор правильного поля значения (Simple vs Reference)

Выясним причину, по которой ЗначениеДопСвойства = ДопСвойство.propertySimpleValue; может не работать. В веб-сервисе 1С:ДО структура additionalProperties содержит несколько полей для хранения значений разных типов:

Если ваш реквизит — это ссылка на «Внутренний документ», то данные будут находиться в propertyReferenceValue. Посмотрим на правильный алгоритм обхода коллекции:


Для Каждого ДопСвойство Из Результат.objects[0].additionalProperties Цикл
    // Рекомендуется проверять по внутреннему имени или GUID, а не по заголовку
    Если ДопСвойство.name = "ИмяВашегоРеквизита" Тогда
        
        // Проверяем, заполнено ли простое значение
        Если ЗначениеЗаполнено(ДопСвойство.propertySimpleValue) Тогда
            ЗначениеДопСвойства = ДопСвойство.propertySimpleValue;
            
        // Если простое пустое, пробуем получить ссылку
        ИначеЕсли ДопСвойство.propertyReferenceValue <> Неопределено Тогда
            // Здесь мы получаем ObjectID (ID и TypeName)
            ЗначениеДопСвойства = ДопСвойство.propertyReferenceValue.valueID;
        КонецЕсли;
        
        Прервать;
    КонецЕсли;
КонецЦикла;

Шаг 3: Особенности поиска по идентификатору свойства

Проанализируем ситуацию, когда поиск по ДопСвойство.name не дает результата. Поле name в веб-сервисе может содержать не заголовок реквизита, а его внутренний программный идентификатор. Для максимально надежной работы мы рекомендуем сопоставлять свойства по их уникальным идентификаторам (GUID), которые заданы в настройках дополнительных реквизитов в 1С:Документооборот.

Вы можете заранее получить GUID нужного свойства в 1С:ДО и использовать его для сравнения с полем propertyID в цикле обхода свойств.

Шаг 4: Учет версионности (1С:ДО 2.1 против 3.0)

Переход на новую версию часто требует дополнительных манипуляций с данными.

Посмотрим на важные отличия версий. В 1С:Документооборот 3.0 архитектура хранения данных претерпела значительные изменения. Если вы используете интеграцию с версией 3.0, обратите внимание на следующие нюансы:

Резюме по решению задачи

Подводя итог, для успешного получения значения дополнительного реквизита при интеграции 1С:ERP и 1С:ДО, выполните следующие действия:

  1. Убедитесь, что используете актуальную WS-ссылку в конфигураторе 1С:ERP. При добавлении новых реквизитов в ДО описание веб-сервиса может потребовать обновления.
  2. При формировании DMRetrieveRequest обязательно проверяйте состав запрашиваемых данных (флаги получения свойств).
  3. Всегда анализируйте тип данных реквизита: для ссылок используйте propertyReferenceValue, для текста и чисел — propertySimpleValue.
  4. Для отладки используйте замер производительности или остановку в точке вызова Прокси.execute(), чтобы в табло изучить реальную структуру объекта Результат. Это позволит увидеть, в каком именно поле приходят данные.

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

← На главную