Обмен данными через 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

См. также

SALE! 20%

Перенос данных 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. Не требуется синхронного обновления правил после обновления другой конфигурации, участвующей в обмене. Типовой обмен через планы обмена кнопкой Синхронизация вручную или автоматически по расписанию, или вручную обработкой.

27180 руб.

12.06.2017    156788    936    306    

474

Перенос данных 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    180282    346    282    

406

SALE! 10%

Перенос данных 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 34200 руб.

15.12.2021    31844    230    61    

173

SALE! 10%

Перенос данных 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 34200 руб.

23.07.2020    64536    303    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, почту.

13550 руб.

18.02.2016    198134    654    543    

557

Перенос данных 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    36819    32    56    

34

Перенос данных 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    60771    73    125    

71

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

Перенос данных из КА 1.1 в КА 2 | из КА 1.1 в УТ 11 | Воспользовались более 367 компаний! | Переносятся все возможные виды документов, начальных остатков и вся справочная информация из "1С:КА 1.1" в "1С:КА 2.х" / "1С:УТ 11" | Разработан в формате КД 2 (правила конвертации данных) | Фильтр по организациям при выгрузке | Выбор разных алгоритмов выгрузки начальных остатков | Можно проверить перенос до покупки!

58000 руб.

04.12.2015    197847    260    354    

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