В современной практике разработки на платформе 1С часто возникает задача разделения зон ответственности между различными информационными базами. Традиционный подход с использованием синхронизации данных (через БСП или универсальные обмены) подразумевает полное копирование информации. Однако это ведет к избыточности: одни и те же данные (например, ФИО физических лиц) хранятся и редактируются в разных местах, что может привести к их рассинхронизации. Рассмотрим альтернативный подход — получение данных «по требованию» из мастер-системы.
Основная идея заключается в том, чтобы хранить в ведомой базе (где ведутся договоры) не сам справочник ФизическиеЛица со всеми его реквизитами, а лишь уникальный идентификатор (GUID) этого объекта из ведущей базы. Разберем по шагам, как это реализовать и с какими трудностями мы можем столкнуться.
Для того чтобы система понимала, к какому физлицу относится договор, нам необходимо хранить ссылку. Поскольку прямой ссылки между базами SQL не существует, мы добавим в документ Договор или в справочник-заглушку реквизит ИдентификаторИсточника с типом Строка (для хранения GUID).
Проанализируем сценарий: при создании договора пользователь выбирает физлицо. В этот момент мы можем либо обращаться к списку во внешней базе через HTTP-сервис, либо хранить в текущей базе минимальный набор данных для поиска.
Это наиболее гибкий способ. В базе-источнике создается HTTP-сервис, который по переданному GUID возвращает структуру данных (ФИО, паспортные данные и т.д.) в формате JSON. Рассмотрим пример кода на стороне базы-приемника для получения представления физического лица:
Функция ПолучитьДанныеФизЛица(Идентификатор)
Запрос = Новый HTTPЗапрос("/hs/PhysicalPersons/v1/getData?id=" + Идентификатор);
Соединение = Новый HTTPСоединение("server_address", , "user", "password");
Попытка
Ответ = Соединение.Получить(Запрос);
Если Ответ.КодСостояния = 200 Тогда
ЧтениеJSON = Новый ЧтениеJSON;
ЧтениеJSON.УстановитьСтроку(Ответ.ПолучитьТелоКакСтроку());
Данные = ПрочитатьJSON(ЧтениеJSON);
Возврат Данные.Представление;
КонецЕсли;
Исключение
Возврат "Ошибка получения данных";
КонецПопытки;
КонецФункции
Если мы не хотим писать собственные HTTP-сервисы, проанализируем возможности платформы по использованию OData (Rest API). В базе-источнике достаточно опубликовать информационную базу на веб-сервере и разрешить доступ к конкретным метаданным. Тогда получение ФИО будет сводиться к простому GET-запросу к стандартному интерфейсу 1С.
Выясним причину, по которой многие опасаются такого подхода. Если в мастер-базе физическое лицо будет удалено, база с договорами об этом «не узнает». Ссылка станет битой. Чтобы этого избежать, рассмотрим два варианта:
Важный момент: никогда не делайте вызовы внешних HTTP-сервисов внутри транзакции (например, в процедуре ПередЗаписью на сервере). Если внешняя база будет недоступна или ответит с задержкой, ваша транзакция «зависнет», заблокировав таблицу договоров для всех пользователей. Проанализируем правильный подход: данные должны подтягиваться либо на уровне интерфейса (в форме), либо через фоновые задания.
Чтобы пользователь не ждал ответа от сервера при каждом открытии формы, применим гибридную схему:
ФизическиеЛицаКэш.Разберем ситуацию с построением отчетов. Если данных о ФИО физически нет в SQL-таблицах текущей базы, вы не сможете выполнить запрос типа ВЫБРАТЬ Договоры.ФизЛицо.ФИО. Система компоновки данных (СКД) не умеет «ходить» по HTTP-ссылкам внутри запроса.
Для решения этой проблемы рассмотрим механизм Внешних источников данных. Если обе базы находятся в одном контуре, вы можете подключить таблицу физических лиц напрямую через ODBC. В этом случае 1С будет видеть внешнюю таблицу как родной справочник, и вы сможете использовать ее в любых отчетах без потери производительности.
Подход с получением данных без синхронизации — это шаг в сторону сервисно-ориентированной архитектуры (SOA). Рассмотрим краткий чек-лист для реализации:
GUID в качестве ключа связи.Таким образом, идея автора темы вполне жизнеспособна и является профессиональным подходом к проектированию распределенных систем, если учитывать ограничения платформы 1С в части построения запросов и работы транзакций.