Обмен данными через http-сервисы при помощи подсистемы «Домены данных»

08.09.25

Интеграция - WEB-интеграция

В статье рассматривается механизм обмена данными между мастер-базой и базами-приемниками через подсистему «Домены данных» с использованием HTTP-сервисов. Приведены примеры функций и регламентных заданий, которые автоматизируют процесс получения и обработки данных в приемниках.

Меня зовут Максим, я программист 1С в компании Programming Store.

В статье рассмотрим вариант обмена данными через http-сервисы с помощью подсистемы «Домены данных».

Подсистема «Домены данных» представляет собой блок общих модулей и справочника, с помощью которого происходит обмен данными в упрощенном режиме. Благодаря данной подсистеме, можно настраивать поля для выгрузки, их представление, тип и т.д. Также можно настраивать для каждой базы поля, которые необходимо получить, и у каждой базы могут свои нужные им поля.

В данном случае у нас есть мастер-база (далее МБ), которая отдает данные по запросу, и базы-приемники (далее «Приемники»), которые получают и обрабатывают данные.

В каждой базе есть справочник «Домены данных», но в МБ этот справочник отличается по структуре от аналогичного справочника в «Приемниках».

В МБ справочник «Домены данных» выглядит так:

В этом случае запросом выбираются данные из справочника «Физических лиц» и записываются в JSON. Справочник «Домены данных» хранит «Дата контракт полей», которая выгружается. При добавлении нового поля в выгрузку любого домена данных  необходимо добавить поле в структуру домена данных в нужную функцию модуля менеджера справочника.

// Дата контракт домена данных физические лица.
// 
// Возвращаемое значение:
//  Структура - Дата контракт домена данных физические лица:
// * uuid - Строка - глобальный идентификатор физического лица
// * name - Строка - полное наименование
// * deleted - Булево - пометка удаления
// * lastName - Строка - фамилия
// * firstName - Строка - имя
// * patronymic - Строка - отчество
// * birthDate - Строка - дата рождения
// * gender - Строка - пол
// * domainName - Строка - имя доменной учетки AD
// * phone - Строка - Телефон
// * email - Строка - Адрес электронной почты
// * dateOfEmployment - Дата - Дата первичного трудоустройства
Функция ДатаКонтрактДоменаДанныхФизическиеЛица() Экспорт
  
  Результат = Новый Структура;
  
  Результат.Вставить("uuid", "");
  Результат.Вставить("name", "");
  Результат.Вставить("deleted", Ложь);
  Результат.Вставить("lastName", "");
  Результат.Вставить("firstName", "");
  Результат.Вставить("patronymic", "");
  Результат.Вставить("birthDate", "");
  Результат.Вставить("gender", "");
  Результат.Вставить("domainName", "");
  Результат.Вставить("phone", "");
  Результат.Вставить("email", "");
  Результат.Вставить("dateOfEmployment",  "");
  
  Возврат Результат;
  
КонецФункции

 

В «Приемниках» есть регламентное задание, которое обращается к МБ и забирает данные. У всех доменов данных одно регламентное задание, в нем параметром является наименование домена данных, по которому необходимо получить данные. Так выглядит запрос изменений в «Приемниках»:

Функция ЗапросИзмененийДоменаДанных(ДоменДанных, ДатаЗапросаИзменений, Метод, Лимит = 0, Курсор = 0) Экспорт
  
  Результат = Новый Структура;
  Результат.Вставить("Успешно", Истина);
  Результат.Вставить("Ошибки", Новый Массив);
  Результат.Вставить("КодСостояния", 0);
  Результат.Вставить("МассивИзменений", Новый Массив);
  Результат.Вставить("Курсор", 0);
  
  ИмяДомена = НРег(Строка(ДоменДанных));
  ДатаВФорматеISO = ЗаписатьДатуJSON(ДатаЗапросаИзменений, ФорматДатыJSON.ISO, ВариантЗаписиДатыJSON.УниверсальнаяДата);
  СтрокаМетода = СтрШаблон("hs/nsi/%1?domen=%2&date=%3", Метод, ИмяДомена, ДатаВФорматеISO);
  Если ЗначениеЗаполнено(Лимит) Тогда
    СтрокаМетода = СтрокаМетода + "&limit=" + Лимит;
  КонецЕсли;
  
  // TODO переиспользовать соединение, открытое ранее
  Соединение = Новый HTTPСоединение(ДоменДанных.АдресСервера, , ДоменДанных.Логин, ДоменДанных.Пароль, , 60);
  
  HTTPЗапрос = Новый HTTPЗапрос;
  HTTPЗапрос.АдресРесурса = СтрокаМетода;
  
  Попытка
    
    HTTPОтвет = Соединение.ВызватьHTTPМетод("GET", HTTPЗапрос);
    Результат.КодСостояния = HTTPОтвет.КодСостояния;
    Если Результат.КодСостояния >= 200
      И Результат.КодСостояния < 300 Тогда
      
      Ответ = лпОбщегоНазначения.ПрочитатьТелоJSON(HTTPОтвет); // Структура
      Результат.МассивИзменений = Ответ.result; // Массив из Структура
      Результат.Курсор = Ответ.cursor; // Число
      
    Иначе
      
      Результат.Успешно = Ложь;
      ТекстОшибки = "Сервер вернул код состояния " + HTTPОтвет.КодСостояния;
      Результат.Ошибки.Добавить(ТекстОшибки);
      
    КонецЕсли;
    
  Исключение
    
    Результат.Успешно = Ложь;
    ТекстОшибки = "Не удалось отправить запрос на сервер: " + ОписаниеОшибки();
    Результат.Ошибки.Добавить(ТекстОшибки);
    
  КонецПопытки;
  
  Возврат Результат;
  
КонецФункции

В данном случае мы передаем в параметре имя домена данных, по которому есть нужные нам данные, также можно указать количество данных для выборки. В результате «Приемники» по http-сервису стучаться к МБ и передают параметры для выборки. В МБ данные параметры обрабатываются и формируется конечный запрос «Домена данных», где указанный запрос выполняется и записывается в массив структур. Далее массив структур записывается в JSON и передается в Приемники, где данные обрабатываются и записываются.

Текст метода http-сервиса в МБ:

Процедура ЗаполнитьОтветНаЗапросПолученияДоменаДанных(Запрос, Ответ, ДоменДанных)
  
  Попытка
    
    Лимит = 100;
    СсылкаКурсор = "";
    МассивФильтров = Новый Массив; // Массив из Структура
    
    КонвертироватьПараметрыЗапроса(Запрос.ПараметрыЗапроса, ДоменДанных, МассивФильтров, Лимит, СсылкаКурсор);
    
  Исключение
    
    Ответ.КодСостояния = 400;
    Ответ.Причина = "Ошибка в параметрах запроса: " + ОписаниеОшибки();
    
  КонецПопытки;
  
  Если Ответ.КодСостояния = 200 Тогда
    
    Попытка
      
      СтруктураВыборки = лпОтправкаДоменовДанных.ВыборкаОбъектовДоменаДанных(ДоменДанных, МассивФильтров, Лимит, СсылкаКурсор);
      
      ДатаКонтракт = Справочники.лпДоменыДанных.ДатаКонтрактДоменаДанных(ДоменДанных);
      МассивДанных = Справочники.лпДоменыДанных.ЗаполнитьДатаКонтрактИзСтрокДерева(ДатаКонтракт, СтруктураВыборки.ДеревоОбъектов.Строки);
      
      Результат = Новый Структура;
      Результат.Вставить("result", МассивДанных);
      Результат.Вставить("uuidcursor", СтруктураВыборки.НовыйСсылкаКурсор);
      Результат = лпОбщегоНазначения.ПреобразоватьНедопустимыеТипыJSON(Результат);
      
      лпОбщегоНазначения.ЗаписатьТелоJSON(Ответ, Результат);
      
    Исключение
      
      Ответ.КодСостояния = 500;
      Ответ.Причина = "Ошибка при получении данных на сервере: " + ОписаниеОшибки();
      
    КонецПопытки;
    
  КонецЕсли;
  
КонецПроцедуры

 

В этой функции происходит обращение к запросу домена данных, далее запрос форматируется и накладываются условия, переданные из «Приемников»:

Функция ВыборкаОбъектовДоменаДанных(ДоменДанных, МассивФильтров, Лимит, СсылкаКурсор = "") Экспорт
  
  Результат = Новый Структура;
  Результат.Вставить("ДеревоОбъектов", Новый ДеревоЗначений());
  Результат.Вставить("НовыйСсылкаКурсор", "");
  
  ОписаниеДомена = лпДоменыДанныхПовтИсп.ОписаниеДомена(ДоменДанных);
  Если НЕ ЗначениеЗаполнено(ОписаниеДомена.ТекстЗапросаТекущихДанных) Тогда
    ВызватьИсключение 
      "Не указан текст запроса текущих данных для этого домена данных";
  КонецЕсли;
  ТекстЗапроса = ОписаниеДомена.ТекстЗапросаТекущихДанных;
  ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "ВЫБРАТЬ ПЕРВЫЕ 100", "ВЫБРАТЬ ПЕРВЫЕ " + (Лимит + 1));
  
  Запрос = Новый Запрос;
  
  МассивУсловийОтбора = Новый Массив; // Массив из Строка
  Для Каждого Фильтр Из МассивФильтров Цикл
    ИмяПараметра = СтрЗаменить(Фильтр.ИмяФильтра, ".", "");
    Запрос.УстановитьПараметр(ИмяПараметра, Фильтр.ЗначениеФильтра);
    УсловиеОтбора = СтрШаблон("%1 = &%2", Фильтр.ИмяФильтра, ИмяПараметра);
    МассивУсловийОтбора.Добавить(УсловиеОтбора);
  КонецЦикла;
  ТекстОтбора = СтрСоединить(МассивУсловийОтбора, " И ");
  ТекстОтбора = ?(ЗначениеЗаполнено(ТекстОтбора), ТекстОтбора, "ИСТИНА");
  
  ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "&УсловиеОтбора", ТекстОтбора);
  Запрос.Текст = ТекстЗапроса;
  
  ДеревоОбъектов = Запрос.Выполнить().Выгрузить(ОбходРезультатаЗапроса.ПоГруппировкам);
  
  Если ДеревоОбъектов.Строки.Количество() > Лимит Тогда
    ПоследняяСтрока = ДеревоОбъектов.Строки[ДеревоОбъектов.Строки.Количество() - 1];
    НовыйСсылкаКурсор = ПоследняяСтрока.uuid; // Строка
    Результат.НовыйСсылкаКурсор = НовыйСсылкаКурсор;
    ДеревоОбъектов.Строки.Удалить(ПоследняяСтрока);
  КонецЕсли;
  
  Результат.ДеревоОбъектов = ДеревоОбъектов;
  
  Возврат Результат;
  
КонецФункции

 

Пример файла JSON, который передается в «Приемники»:

"result": [
    {
      "uuid": "51729b0e-4e37-11ef-8db9-000c29e62f1c",
      "name": "Лопатнев П  С    ",
      "deleted": false,
      "lastName": "Лопатнев",
      "firstName": "     ",
      "patronymic": "     ",
      "birthDate": "                :00:00",
      "gender": "Мужской",
      "domainName": "",
      "phone": "                ",
      "email": "                 ",
      "dateOfEmployment": "2024-07-30T00:00:00"
    },
    {
      "uuid": "29f59356-4f07-11ef-8db9-000c29e62f1c",
      "name": "Горохова К     А    ",
      "deleted": false,
      "lastName": "Горохова",
      "firstName": "     ",
      "patronymic": "      ",
      "birthDate": "1992-07-13T00:00:00",
      "gender": "Женский",
      "domainName": "",
      "phone": "             ",
      "email": "                  ",
      "dateOfEmployment": "2024-08-01T00:00:00"
    },

Итак, в статье был разобран эффективный механизм обмена данными между мастер-базой и базами-приемниками через подсистему «Домены данных», используя HTTP-сервисы. Гибкость настройки полей для выгрузки данных и их представления позволяет адаптировать систему под специфические требования каждой базы. Структура справочника «Домены данных» обеспечивает организованное хранение информации о физических лицах, что способствует упрощению процессов обработки и управления данными.  

Вступайте в нашу телеграмм-группу Инфостарт

Домены данных HTTP-сервис JSON

См. также

Перенос данных 1C Программист 1С:Предприятие 8 1С:Управление производственным предприятием 1С:ERP Управление предприятием 2 1С:Управление торговлей 11 1С:Комплексная автоматизация 2.х Россия Платные (руб)

Перенос документов, начальных остатков и справочной информации из УПП 1.3 в ERP 2 | из УПП 1.3 в УТ 11 | из УПП в КА 2 | Правила конвертации (КД 2) | Более 360 предприятий выполнили переход с использованием этого продукта! | Сэкономьте время - используйте готовое решение для перехода! | Позволяет перенести из УПП 1.3 в ERP / УТ 11 / КА 2 всю возможную информацию | В переносе есть фильтр по организации и множество других опциональных параметров выгрузки | Есть несколько алгоритмов выгрузки остатков на выбор

58000 руб.

04.08.2015    183782    425    298    

437

Перенос данных 1C Файловый обмен (TXT, XML, DBF), FTP Системный администратор Программист 1С:Предприятие 8 1С:Комплексная автоматизация 1.х 1С:Управление производственным предприятием 1С:Бухгалтерия 3.0 Россия Бухгалтерский учет Платные (руб)

Перенос данных из 1С:Управление производственным предприятием 1.3 в 1С:Бухгалтерия предприятия 3.0 с помощью правил обмена | Можно выполнить переход с УПП на БП 3 или запускать выгрузку данных за выбранный период времени | Переносятся документы, начальные остатки и вся справочная информация | Есть фильтр по организации и множество других параметров выгрузки | Поддерживается несколько сценариев работы: как первичный полный перенос, так и перенос только новых документов | Перенос данных возможен в "1С: Бухгалтерия 3.0" версии ПРОФ, КОРП или базовую | Переход с "1С: УПП1.3" / "1С:КА 1.1" на "1С:БП3.0" с помощью правил конвертации будет максимально комфортным! | Можно бесплатно проверить перенос на вашем сервере!

50050 руб.

25.02.2015    180629    348    283    

409

Перенос данных 1C Файловый обмен (TXT, XML, DBF), FTP Системный администратор Программист 1С:Предприятие 8 1С:Розница 2 1С:Управление нашей фирмой 1.6 1С:Бухгалтерия 3.0 1С:Управление торговлей 11 1С:Комплексная автоматизация 2.х 1С:Управление нашей фирмой 3.0 1С:Розница 3.0 Россия Платные (руб)

Правила в универсальном формате обмена для ERP 2.5, КА 2.5, УТ 11.5, БП 3.0, Розница, УНФ, для последних версий конфигураций. Ссылки на другие конфигурации в описании публикации. Правила совместимы со всеми другими версиями конфигураций новыми и старыми, поддерживающими обмен и синхронизацию в формате EnterpriseData. Не требуется синхронного обновления правил после обновления другой конфигурации, участвующей в обмене. Типовой обмен через планы обмена кнопкой Синхронизация вручную или автоматически по расписанию, или вручную обработкой.

22650 руб.

12.06.2017    157358    939    306    

475

Перенос данных 1C Файловый обмен (TXT, XML, DBF), FTP Системный администратор Программист 1С:Предприятие 8 1С:Управление производственным предприятием 1С:Бухгалтерия 3.0 Россия Бухгалтерский учет Управленческий учет Платные (руб)

Перенос данных из 1С:Управление производственным предприятием 1.3 в 1С:Бухгалтерия предприятия 3.0 с помощью правил обмена. Переносятся остатки, документы (обороты за период), справочная информация. Правила проверены на конфигурациях УПП 1.3 (1.3.262.x) и БП 3.0 (3.0.190.x). Правила подходят для версии ПРОФ и КОРП.

38000 руб.

15.12.2021    32232    237    61    

177

Перенос данных 1C Файловый обмен (TXT, XML, DBF), FTP Программист 1С:Предприятие 8 1С:Комплексная автоматизация 1.х 1С:Управление производственным предприятием 1С:Зарплата и Управление Персоналом 3.x Россия Бухгалтерский учет Платные (руб)

Правила переноса кадровых и расчетных данных и справочной информации из "1С:УПП1.3" или "1С:КА 1.1" в "1С:ЗУП 3.1 | Разработан в формате КД 2 (правила конвертации данных) | При выгрузке есть фильтр по организациям | Обновляется при выходе новых релизов 1С | Развитие алгоритмов | Расчетные документы переносятся в документ "Перенос данных" | Создаются документы "Начальная штатная расстановка" и "Начальная задолженность по зарплате", переносятся кадровые документы

58000 руб.

29.10.2018    60975    76    128    

74

Перенос данных 1C Файловый обмен (TXT, XML, DBF), FTP Системный администратор Программист 1С:Предприятие 8 1С:Управление торговлей 10 Россия Управленческий учет Платные (руб)

Перенос данных из 1С:Управление торговлей 10.3 в 1С:Управление торговлей 11.5 с помощью правил обмена. Переносятся остатки, документы (обороты за период), справочная информация. Правила проверены на конфигурациях УТ 10.3 (10.3.88.x) и УТ 11.5 (11.5.25.x).

38000 руб.

23.07.2020    65480    304    83    

243

Перенос данных 1C Файловый обмен (TXT, XML, DBF), FTP Системный администратор Программист 1С:Предприятие 8 1С:Комплексная автоматизация 1.х 1С:Управление торговлей 10 1С:Управление производственным предприятием Россия Платные (руб)

Регулярный обмен, выгрузка, перенос из КА 1.1, УПП 1.3, УТ 10.3 для обмена с любыми конфигурациями, поддерживающими обмен в формате EnterpriseData (КД3) - БП 3.0, ERP, КА 2, УТ 11, Розница 3, УНФ 3 и другими. Правила для старых и доработанных конфигураций не требуют синхронного обновления и совместимы с новыми и будущими конфигурациями. Обмен по расписанию, через папку, FTP, почту.

16531 руб.

18.02.2016    198579    661    543    

560

Перенос данных 1C Файловый обмен (TXT, XML, DBF), FTP Программист 1С:Предприятие 8 1С:ERP Управление предприятием 2 1С:Комплексная автоматизация 2.х 1С:Зарплата и Управление Персоналом 3.x Россия Платные (руб)

Перенос данных из ЗУП 3 в ЗУП 3 | из ЗУП 3 в КА 2 | из ЗУП 3 в ERP | Оперативно обновляется при выходе новых релизов 1С | Готовые правила конвертации (КД 2) для перехода с "ЗУП 3" на "УП ред. 3" / "КА, ред. 2" / "ERP, ред. 2" |Переносится нормативно-справочная информация и документы с движениями

55200 руб.

11.01.2021    37008    32    56    

34
Комментарии
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
1. avbolshakov 09.09.25 11:40 Сейчас в теме
а что это за подсистема Домены данных?
ccapt; andrey_sag; +2 Ответить
3. AlexeyPROSTO_1C 1988 12.09.25 10:48 Сейчас в теме
(1) подсистема Домена данных в данном случае - это самописная подсистема
2. V.Nikonov 124 09.09.25 14:42 Сейчас в теме
Не очень прозрачно описана фильтрация Запрашиваемых данных.
Кроме ограничений на количество Объектов к получению есть возможность установить другие дополнительные параметры запроса?
Возвращаются Измененные данные (т.е. зарегистрированные в неком плане обмена)?
4. AlexeyPROSTO_1C 1988 12.09.25 10:49 Сейчас в теме
(2) Можно усовершенствовать обмен данными любым способом, чтобы фильтровать данные, тут уже зависит от нужд,
возвращаются измененные данные, которые записываются в регистр сведений в зависимости от даты записи в регистр
5. V.Nikonov 124 12.09.25 15:11 Сейчас в теме
(4) Т.е. надо прописать в Базе регистрацию в СпецРегистре в момент Записи?
Фактическое изменение будет анализироваться в Процедуре регистрации к Обмену...
Для отправки сообщения требуется регистрация/авторизация