При разработке внешних обработок для обмена данными с внешними сайтами и сервисами часто возникает необходимость сохранять состояние выгрузки. Например, требуется хранить список уже отправленных контрагентов, даты изменений или соответствия идентификаторов. В базовых версиях конфигураций 1С:Бухгалтерия 3.0 доработка структуры метаданных (создание собственных регистров сведений, справочников или планов обмена) недоступна. При этом данные должны быть доступны любому пользователю и фоновым заданиям, сохраняться при переносе информационной базы на другой сервер и корректно восстанавливаться из резервных копий.
Разберем основные способы и механизмы платформы 1С:Предприятие 8.3, позволяющие решить эту задачу внутри информационной базы без изменения типовой конфигурации.
Для сохранения произвольных структур данных (включая таблицы значений, структуры и массивы) в платформе предусмотрен менеджер ХранилищеОбщихНастроек. В отличие от ХранилищеДанныхФорм, которое привязано исключительно к контексту интерактивной формы конкретного пользователя и недоступно в фоновых заданиях, ХранилищеОбщихНастроек позволяет читать и записывать данные на сервере.
Проанализируем особенности использования этого механизма:
ИмяПользователя можно передавать пустую строку или фиксированный служебный псевдоним ключа.АдминистрированиеДанных). При запуске обработки обычным пользователем возникнет ошибка прав доступа. Чтобы избежать этого, вызовы необходимо оборачивать в привилегированный режим.Посмотрим на пример программного сохранения и чтения таблицы значений:
// Сохранение данных
УстановитьПривилегированныйРежим(Истина);
КлючОбъекта = "ИнтеграцияСайт_СписокКонтрагентов";
КлючНастроек = "ТаблицаОтправленных";
ХранилищеОбщихНастроек.Сохранить(
КлючОбъекта,
КлючНастроек,
ТаблицаОтправленных,
, // ОписаниеНастроек
"" // ИмяПользователя (общее для всех)
);
УстановитьПривилегированныйРежим(Ложь);
Для считывания сохраненных данных используем следующий фрагмент кода:
// Чтение данных
УстановитьПривилегированныйРежим(Истина);
КлючОбъекта = "ИнтеграцияСайт_СписокКонтрагентов";
КлючНастроек = "ТаблицаОтправленных";
ТаблицаОтправленных = ХранилищеОбщихНастроек.Загрузить(
КлючОбъекта,
КлючНастроек,
, // НастройкиПоУмолчанию
"" // ИмяПользователя
);
УстановитьПривилегированныйРежим(Ложь);
Если ТаблицаОтправленных = Неопределено Тогда
ТаблицаОтправленных = Новый ТаблицаЗначений;
ТаблицаОтправленных.Колонки.Добавить("Ссылка", Новый ОписаниеТипов("СправочникСсылка.Контрагенты"));
ТаблицаОтправленных.Колонки.Добавить("ИдентификаторСайта", Новый ОписаниеТипов("Строка", Новый КвалификаторыСтроки(50)));
ТаблицаОтправленных.Колонки.Добавить("ХешСумма", Новый ОписаниеТипов("Строка", Новый КвалификаторыСтроки(64)));
КонецЕсли;
В конфигурации на базе Библиотеки стандартных подсистем (БСП) уже присутствует типовой регистр сведений РегистрСведений.СоответствияОбъектовИнформационныхБаз. Он предназначен именно для задач синхронизации объектов 1С с внешними системами.
Рассмотрим преимущества данного подхода:
Запрос без загрузки всего массива данных в оперативную память.УникальныйИдентификаторИсточника содержит ссылку на объект 1С (например, СправочникСсылка.Контрагенты), а ИдентификаторПриемника — строковый ID на стороне сайта.Если для каждого контрагента необходимо хранить признак выгрузки или дату последней отправки, можно воспользоваться штатным механизмом дополнительных сведений БСП. В отличие от дополнительных реквизитов, сведения хранятся в независимом регистре РегистрСведений.ДополнительныеСведения.
Разберем по шагам, почему это удобно:
Контрагенты и не меняет версию объекта.Выясним причину возможных проблем с производительностью и способы их предотвращения:
ТаблицыЗначений через ХранилищеОбщихНастроек отлично подходит для небольших объемов (до нескольких тысяч записей). Если справочник насчитывает десятки тысяч контрагентов, предпочтительно использовать регистры сведений БСП для построчной работы.