При работе в облачных решениях или при использовании механизма разделения данных (Data Separation / Multitenancy) в платформе 1С:Предприятие, часто возникает задача организовать обмен данными через Web-сервисы так, чтобы внешняя система подключалась не ко всей базе целиком, а к конкретной области данных (зоне). По умолчанию при обращении к Web-сервису платформа пытается создать сеанс без учета разделителей, что приводит к ошибкам авторизации или отсутствию доступа к данным конкретного клиента (области).
В данной статье мы подробно разберем, как правильно сформировать URL-ссылку, настроить файл публикации и программно обращаться к нужной области через Web-сервисы.
Рассмотрим самый простой и гибкий способ обращения к конкретной области. Платформа 1С поддерживает специальный параметр Z (от англ. Zone), который можно передавать непосредственно в строке адреса. Это позволяет использовать одну и ту же публикацию Web-сервиса для доступа к разным областям данных.
Проанализируем структуру формирования ссылки:
&Z=НомерОбласти.
http://myserver/mybase/ws/ExchangeService.1cws?wsdl&Z=123http://myserver/mybase/ws/ExchangeService.1cws?Z=123Здесь 123 — это числовое значение разделителя (индекс области данных), которое задано в вашей системе. При таком обращении платформа автоматически инициализирует сеанс именно в контексте указанной области, и все запросы к базе данных будут ограничены этой зоной.
Если вам необходимо создать фиксированную точку подключения для конкретного филиала или клиента, чтобы вызывающая сторона не знала о параметрах URL, мы можем воспользоваться редактированием файла конфигурации публикации default.vrd. В этом файле за определение области отвечает элемент <zone>.
Разберем по шагам структуру этого элемента внутри блока <zones>:
<point xmlns="http://v8.1c.ru/8.2/virtual-resource-system"
base="/mybase"
ib="Srvr="Server1";Ref="mybase";">
<zones>
<zone value="123" />
</zones>
<ws>
<point name="WebServiceName" alias="ws1.1cws" />
</ws>
</point>
Важные нюансы настройки:
<zone> должен строго соответствовать порядку следования разделителей в дереве метаданных конфигуратора.<zone> превысит количество разделителей в конфигурации, платформа выдаст исключение при попытке подключения.В некоторых сценариях, например, при разработке мобильных приложений или интеграции через сложные прокси-серверы, «загрязнение» URL дополнительными параметрами нежелательно. В этом случае мы можем передать номер области через заголовок HTTP-запроса.
Используйте заголовок: X-1C-Data-Area. Значением заголовка должно быть целое число — идентификатор области. Этот метод является приоритетным для механизмов самой платформы и обеспечивает корректную маршрутизацию запроса внутри кластера серверов 1С.
Выясним причину возможных проблем при авторизации. Даже если вы правильно указали область через Z=123, подключение может не состояться. Почему это происходит?
Рассмотрим правила авторизации:
Объекты, Запросы, Выборки) будут автоматически работать только с данными этой области. Платформа 1С на уровне СУБД добавит необходимые условия фильтрации.Если вы подключаете Web-сервис разделенной базы в другой конфигурации 1С через объект WSПрокси, проанализируем пример кода для корректного создания определения:
// Определяем адрес WSDL с указанием области
АдресWSDL = "http://server/base/ws/Exchange.1cws?wsdl&Z=50";
// Создаем определения Web-сервиса
// Важно: параметры Z передаются именно здесь
Попытка
Определения = Новый WSОпределения(АдресWSDL, Логин, Пароль);
Исключение
Сообщить("Ошибка получения определений: " + ОписаниеОшибки());
Возврат;
КонецПопытки;
// Создаем прокси и вызываем метод
Прокси = Новый WSПрокси(Определения, "http://www.uri.ru/exchange", "Exchange", "ExchangeSoap");
Прокси.Пользователь = Логин;
Прокси.Пароль = Пароль;
Результат = Прокси.ВыполнитьВыгрузку();
При таком подходе платформа сама позаботится о том, чтобы все последующие вызовы методов через объект Прокси содержали информацию о нужном разделителе.
Разберем ситуацию, когда вы установили точку останова в методе Web-сервиса, но отладчик не срабатывает. Это часто происходит в разделенных базах. Чтобы отладка работала, необходимо:
default.vrd для отладочной публикации также должен быть прописан элемент <zone>, либо вы должны подключаться отладчиком к уже существующему сеансу, зная, что он запущен в контексте конкретной области.Использование вышеописанных методов позволит вам гибко настраивать интеграцию между различными экземплярами информационных баз 1С, работающих в режиме разделения данных, обеспечивая изоляцию и безопасность данных каждого клиента.