При разработке интеграции между учетной системой и «1С:Документооборот» (1С:ДО) часто используется механизм веб-сервисов и XDTO-пакетов. Одной из самых коварных проблем, с которой мы можем столкнуться, является ситуация, когда один и тот же программный код работает корректно в интерактивном режиме (под пользователем), но падает с ошибкой «Поле объекта не обнаружено» при запуске в фоновом или регламентном задании. Давайте подробно разберем, почему свойства XDTO могут «исчезать» и как грамотно настроить систему, чтобы избежать подобных ошибок. При необходимости можно воспользоваться готовым примером вызова веб-сервисов 1С:ДО из фонового задания.
Рассмотрим типичный сценарий. Мы настраиваем бесшовную интеграцию и хотим получить список документов из 1С:ДО с определенными свойствами. Для этого мы используем прокси-объект и формируем запрос DMGetDocumentListRequest. В коде мы явно указываем, какие колонки (свойства) нас интересуют.
Взглянем на пример кода, который вызывает вопросы:
// Создаем запрос к веб-сервису 1С:ДО
Запрос = ИнтеграцияС1СДокументооборотБазоваяФункциональность.СоздатьОбъект(МоёПрокси, "DMGetDocumentListRequest");
// Указываем, какие свойства хотим получить
ЗапрашиваемыеСвойства = Запрос.columnSet;
ЗапрашиваемыеСвойства.Добавить("confirmed"); // Нас интересует статус утверждения
// Добавляем объект, по которому нужен запрос
СписокОбъектов = Запрос.externalObjects;
СписокОбъектов.Добавить(ИнтеграцияС1СДокументооборотБазоваяФункциональность.СоздатьExternalObject(МоёПрокси, СсылкаНаДокумент));
// Выполняем запрос
Результат = ИнтеграцияС1СДокументооборотБазоваяФункциональность.ВыполнитьЗапрос(МоёПрокси, Запрос);
Когда мы запускаем этот код под своей учетной записью (у которой обычно полные права или права администратора), в полученном объекте XDTO присутствует свойство confirmed. Однако стоит перенести этот код в регламентное задание, как при обращении к Результат.confirmed (или внутри коллекции объектов) мы получаем ошибку.
Чтобы понять причину, нам нужно углубиться в то, как платформа 1С и веб-сервис DMService (стандартный сервис интеграции ДО) обрабатывают запросы.
1. Динамическая генерация XML-ответа
Веб-сервис 1С не возвращает статическую структуру. При формировании ответа сервер 1С:ДО проверяет права доступа текущего пользователя к каждому запрошенному реквизиту. Это работа механизма RLS (Record Level Security — ограничение прав доступа на уровне записей).
2. Сериализация и RLS
Если у пользователя, под которым выполняется запрос, нет прав на чтение конкретного поля (например, поля «Утвержден» — confirmed), то сервер просто не включает соответствующий XML-тег в ответ. Платформа 1С работает по принципу: «чего не вижу, того не отдаю».
3. Десериализация в XDTO
На стороне принимающей базы (где работает наше регламентное задание) фабрика XDTO получает XML-ответ. В схеме данных свойство confirmed, скорее всего, помечено как необязательное (атрибут minOccurs="0"). Поскольку тега в XML нет, свойство в объекте XDTO не создается физически.
Именно поэтому проверка на Неопределено часто не срабатывает, а попытка обращения к свойству вызывает исключение: свойства просто нет в структуре объекта в памяти.
Ключевое различие кроется в том, кто авторизуется в веб-сервисе 1С:ДО.
Если в настройках бесшовной интеграции или в коде коннектора не прописан явно логин и пароль служебного пользователя с достаточными правами, подключение может происходить с ограниченными правами. В результате срабатывает RLS, и часть данных обрезается на уровне формирования XML.
Для исправления ситуации нам необходимо выполнить комплекс действий, касающихся как администрирования прав, так и доработки программного кода для повышения отказоустойчивости.
Это основное решение проблемы. Нам нужно обеспечить пользователя, под которым работает регламентное задание, необходимыми правами. При возникновении системных сбоев с применением настроенных прав можно использовать инструмент для восстановления записей в регистрах прав доступа 1С:ДО.
WS_Robot).Важно: Не рекомендуется давать техническому пользователю полные права (Администратор) из соображений безопасности, но его полномочия должны явно покрывать чтение всех запрашиваемых атрибутов (columnSet).
Даже если права настроены, хорошей практикой программирования считается проверка наличия свойства перед обращением к нему. Это защитит регламентное задание от падения в случае изменения прав в будущем.
Вместо прямого обращения ОбъектXDTO.confirmed, используйте проверку через коллекцию свойств.
Пример безопасного получения значения:
// Функция для безопасного получения свойства XDTO
Функция ПолучитьЗначениеСвойстваБезопасно(ОбъектXDTO, ИмяСвойства)
// Проверяем, есть ли такое свойство в определении типа
Свойство = ОбъектXDTO.Свойства().Получить(ИмяСвойства);
Если Свойство <> Неопределено Тогда
// Свойство существует в схеме, проверяем, установлено ли оно в конкретном экземпляре
Если ОбъектXDTO.Установлено(Свойство) Тогда
Возврат ОбъектXDTO[ИмяСвойства];
КонецЕсли;
КонецЕсли;
// Если свойства нет или оно не установлено
Возврат Неопределено;
КонецФункции
// Использование в основном коде
ЗначениеУтвержден = ПолучитьЗначениеСвойстваБезопасно(ПолученныйОбъектXDTO, "confirmed");
Если ЗначениеУтвержден = Истина Тогда
// Логика обработки
КонецЕсли;
В теме обсуждалась сложность отладки веб-сервисов. Если вы не можете включить отладку на сервере 1С:ДО, используйте альтернативные методы диагностики, чтобы понять, что именно возвращает сервис.
SCALL (вызов сервиса) на стороне сервера 1С:ДО. В логах можно увидеть полное тело ответа XML. Если тега <confirmed> там нет — проблема 100% в правах.Проблема «невидимости» свойств XDTO в регламентных заданиях практически всегда упирается в права доступа (RLS) на стороне системы-источника (в данном случае 1С:Документооборот). Веб-сервис фильтрует данные, к которым у технического пользователя нет доступа, исключая их из XML-пакета.
Для решения: