Где хранить служебные данные внешней обработки в базовой 1С:Бухгалтерии 3.0?

Программист 1С v8.3 (Управляемые формы) 1C:Бухгалтерия IT и автоматизация бизнеса
← На главную

При разработке внешних обработок для обмена данными с внешними сайтами и сервисами часто возникает необходимость сохранять состояние выгрузки. Например, требуется хранить список уже отправленных контрагентов, даты изменений или соответствия идентификаторов. В базовых версиях конфигураций 1С:Бухгалтерия 3.0 доработка структуры метаданных (создание собственных регистров сведений, справочников или планов обмена) недоступна. При этом данные должны быть доступны любому пользователю и фоновым заданиям, сохраняться при переносе информационной базы на другой сервер и корректно восстанавливаться из резервных копий.

Разберем основные способы и механизмы платформы 1С:Предприятие 8.3, позволяющие решить эту задачу внутри информационной базы без изменения типовой конфигурации.

Вариант 1. Использование Хранилища общих настроек

Для сохранения произвольных структур данных (включая таблицы значений, структуры и массивы) в платформе предусмотрен менеджер ХранилищеОбщихНастроек. В отличие от ХранилищеДанныхФорм, которое привязано исключительно к контексту интерактивной формы конкретного пользователя и недоступно в фоновых заданиях, ХранилищеОбщихНастроек позволяет читать и записывать данные на сервере.

Проанализируем особенности использования этого механизма:

  1. Независимость от конкретного пользователя: в параметре ИмяПользователя можно передавать пустую строку или фиксированный служебный псевдоним ключа.
  2. Права доступа: чтение и запись настроек от имени служебного ключа требуют административных прав (АдминистрированиеДанных). При запуске обработки обычным пользователем возникнет ошибка прав доступа. Чтобы избежать этого, вызовы необходимо оборачивать в привилегированный режим.
  3. Безопасный режим: если обработка зарегистрирована в базе через подсистему «Дополнительные отчеты и обработки», безопасный режим должен быть отключен, иначе включение привилегированного режима будет заблокировано.

Посмотрим на пример программного сохранения и чтения таблицы значений:


// Сохранение данных
УстановитьПривилегированныйРежим(Истина);

КлючОбъекта = "ИнтеграцияСайт_СписокКонтрагентов";
КлючНастроек = "ТаблицаОтправленных";

ХранилищеОбщихНастроек.Сохранить(
    КлючОбъекта,
    КлючНастроек,
    ТаблицаОтправленных,
    , // ОписаниеНастроек
    "" // ИмяПользователя (общее для всех)
);

УстановитьПривилегированныйРежим(Ложь);

Для считывания сохраненных данных используем следующий фрагмент кода:


// Чтение данных
УстановитьПривилегированныйРежим(Истина);

КлючОбъекта = "ИнтеграцияСайт_СписокКонтрагентов";
КлючНастроек = "ТаблицаОтправленных";

ТаблицаОтправленных = ХранилищеОбщихНастроек.Загрузить(
    КлючОбъекта,
    КлючНастроек,
    , // НастройкиПоУмолчанию
    "" // ИмяПользователя
);

УстановитьПривилегированныйРежим(Ложь);

Если ТаблицаОтправленных = Неопределено Тогда
    ТаблицаОтправленных = Новый ТаблицаЗначений;
    ТаблицаОтправленных.Колонки.Добавить("Ссылка", Новый ОписаниеТипов("СправочникСсылка.Контрагенты"));
    ТаблицаОтправленных.Колонки.Добавить("ИдентификаторСайта", Новый ОписаниеТипов("Строка", Новый КвалификаторыСтроки(50)));
    ТаблицаОтправленных.Колонки.Добавить("ХешСумма", Новый ОписаниеТипов("Строка", Новый КвалификаторыСтроки(64)));
КонецЕсли;

Вариант 2. Использование типового регистра «Соответствия объектов информационных баз»

В конфигурации на базе Библиотеки стандартных подсистем (БСП) уже присутствует типовой регистр сведений РегистрСведений.СоответствияОбъектовИнформационныхБаз. Он предназначен именно для задач синхронизации объектов 1С с внешними системами.

Рассмотрим преимущества данного подхода:

  1. Реляционное хранение: данные хранятся построчно, а не единым бинарным объектом. Это позволяет выполнять быстрый отбор и поиск через Запрос без загрузки всего массива данных в оперативную память.
  2. Стабильность при больших объемах: нет риска повреждения монолитной таблицы при сбоях во время сериализации.
  3. Поддержка типов: измерение УникальныйИдентификаторИсточника содержит ссылку на объект 1С (например, СправочникСсылка.Контрагенты), а ИдентификаторПриемника — строковый ID на стороне сайта.

Вариант 3. Хранение в регистре «Дополнительные сведения»

Если для каждого контрагента необходимо хранить признак выгрузки или дату последней отправки, можно воспользоваться штатным механизмом дополнительных сведений БСП. В отличие от дополнительных реквизитов, сведения хранятся в независимом регистре РегистрСведений.ДополнительныеСведения.

Разберем по шагам, почему это удобно:

  1. Запись в регистр дополнительных сведений не перезаписывает сам элемент справочника Контрагенты и не меняет версию объекта.
  2. Пользователь может создать служебное свойство (например, «ID на сайте» или «Дата выгрузки») в пользовательском режиме без изменения метаданных.
  3. Данные легко читаются штатными запросами и процедурами БСП.

Рекомендации по оптимизации обмена

Выясним причину возможных проблем с производительностью и способы их предотвращения:

  1. Хранение хеш-сумм вместо полных реквизитов: вместо записи в базу всей структуры реквизитов контрагента эффективнее вычислять и сохранять контрольную строку (хеш) ключевых полей (ИНН, КПП, Наименование, Адрес). При очередном запуске достаточно рассчитать текущий хеш объекта и сравнить его с сохраненным значением.
  2. Ограничение размера данных в хранилище настроек: сериализация единой ТаблицыЗначений через ХранилищеОбщихНастроек отлично подходит для небольших объемов (до нескольких тысяч записей). Если справочник насчитывает десятки тысяч контрагентов, предпочтительно использовать регистры сведений БСП для построчной работы.
← На главную