При настройке бесшовной интеграции между 1С:ERP Управление предприятием и 1С:Документооборот (1С:ДО) часто возникает задача выйти за рамки типовых правил сопоставления полей. Одной из таких задач является программное извлечение значений дополнительных реквизитов объектов 1С:ДО для их последующей обработки на стороне 1С:ERP. Рассмотрим, почему стандартные примеры кода могут возвращать пустые значения и как правильно построить алгоритм получения данных.
Типовой подход, предлагаемый в документации, часто опирается на перебор коллекции additionalProperties (дополнительные свойства). Однако программисты сталкиваются с тем, что коллекция оказывается пустой или конкретное свойство не содержит значения. Проанализируем основные причины этой ситуации:
DMRetrieveRequest явно не указано, что нам нужны дополнительные реквизиты, сервер их просто не пришлет в ответе.propertySimpleValue для ссылочных данных (например, ссылка на другой документ или контрагента) всегда будет возвращать пустоту.Для того чтобы объект 1С:ДО «пришел» в 1С:ERP вместе со своими дополнительными реквизитами, нам необходимо использовать объект DMRetrieveRequest и настроить его параметры. Разберем по шагам, как это сделать программно.
Рассмотрим пример формирования запроса через прокси веб-сервиса, что позволяет выполнять произвольный запрос во внешнюю базу 1С:
// Создаем объект запроса
Запрос = ИнтеграцияС1СДокументооборотБазоваяФункциональность.СоздатьОбъект(Прокси, "DMRetrieveRequest");
// Указываем идентификатор объекта (например, внутреннего документа)
ОбъектИд = ИнтеграцияС1СДокументооборотБазоваяФункциональность.СоздатьObjectID(Прокси, ИдентификаторОбъектаДО, "DMInternalDocument");
Запрос.objectIds.Добавить(ОбъектИд);
// Важный момент: указываем, какие части объекта нам нужны
// Чтобы получить доп. реквизиты, нужно убедиться, что они включены в состав возвращаемых данных
// В некоторых версиях API это регулируется заполнением коллекции parts
КодЧасти = "Свойства"; // Уточните точное имя части в метаданных вашей версии WS-ссылки
Запрос.parts.Добавить(КодЧасти);
Результат = Прокси.execute(Запрос);
Выясним причину, по которой ЗначениеДопСвойства = ДопСвойство.propertySimpleValue; может не работать. В веб-сервисе 1С:ДО структура additionalProperties содержит несколько полей для хранения значений разных типов:
Если ваш реквизит — это ссылка на «Внутренний документ», то данные будут находиться в propertyReferenceValue. Посмотрим на правильный алгоритм обхода коллекции:
Для Каждого ДопСвойство Из Результат.objects[0].additionalProperties Цикл
// Рекомендуется проверять по внутреннему имени или GUID, а не по заголовку
Если ДопСвойство.name = "ИмяВашегоРеквизита" Тогда
// Проверяем, заполнено ли простое значение
Если ЗначениеЗаполнено(ДопСвойство.propertySimpleValue) Тогда
ЗначениеДопСвойства = ДопСвойство.propertySimpleValue;
// Если простое пустое, пробуем получить ссылку
ИначеЕсли ДопСвойство.propertyReferenceValue <> Неопределено Тогда
// Здесь мы получаем ObjectID (ID и TypeName)
ЗначениеДопСвойства = ДопСвойство.propertyReferenceValue.valueID;
КонецЕсли;
Прервать;
КонецЕсли;
КонецЦикла;
Проанализируем ситуацию, когда поиск по ДопСвойство.name не дает результата. Поле name в веб-сервисе может содержать не заголовок реквизита, а его внутренний программный идентификатор. Для максимально надежной работы мы рекомендуем сопоставлять свойства по их уникальным идентификаторам (GUID), которые заданы в настройках дополнительных реквизитов в 1С:Документооборот.
Вы можете заранее получить GUID нужного свойства в 1С:ДО и использовать его для сравнения с полем propertyID в цикле обхода свойств.
Переход на новую версию часто требует дополнительных манипуляций с данными.
Посмотрим на важные отличия версий. В 1С:Документооборот 3.0 архитектура хранения данных претерпела значительные изменения. Если вы используете интеграцию с версией 3.0, обратите внимание на следующие нюансы:
Подводя итог, для успешного получения значения дополнительного реквизита при интеграции 1С:ERP и 1С:ДО, выполните следующие действия:
DMRetrieveRequest обязательно проверяйте состав запрашиваемых данных (флаги получения свойств).propertyReferenceValue, для текста и чисел — propertySimpleValue.Прокси.execute(), чтобы в табло изучить реальную структуру объекта Результат. Это позволит увидеть, в каком именно поле приходят данные.Используя этот системный подход, вы сможете гибко управлять данными при интеграции и автоматизировать сложные бизнес-процессы обмена документами между системами.