Как хранить общие настройки внешней обработки в 1С:Бухгалтерии 3.0 в облаке

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

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

Стандартное решение через ХранилищеОбщихНастроек в данном случае не подходит, так как для записи общих настроек у обычных пользователей недостаточно прав («Администратор данных»). Попытка включить привилегированный режим вызовом УстановитьПривилегированныйРежим(Истина) в безопасном режиме облака также игнорируется платформой. Разберем подробнее варианты архитектурных решений, позволяющие обойти эти ограничения без нарушения требований безопасности.

Вариант 1. Использование подсистемы «Дополнительные сведения»

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

Рассмотрим по шагам алгоритм реализации данного подхода:

  1. В режиме «1С:Предприятие» или программно создаем новый вид дополнительного сведения через ПланВидовХарактеристик.ДополнительныеРеквизитыИСведения с типом значения «Строка» (неограниченной длины).
  2. Сериализуем таблицу значений или структуру настроек в строку формата XML или JSON с помощью объектов СериализаторXDTO или ЗаписьJSON.
  3. Записываем полученную строку в регистр сведений ДополнительныеСведения. В качестве объекта адресации можно использовать любой универсальный справочник (например, Справочники.Организации или текущего пользователя), либо связать запись с ключом обработки.

Посмотрим на пример кода для сериализации и чтения структуры настроек в строку XML:


// Сохранение таблицы значений в строку
ЗаписьXML = Новый ЗаписьXML;
ЗаписьXML.УстановитьСтроку();
СериализаторXDTO.ЗаписатьXML(ЗаписьXML, ТаблицаНастроек);
СтрокаНастроек = ЗаписьXML.Закрыть();

// Восстановление таблицы значений из строки
ЧтениеXML = Новый ЧтениеXML;
ЧтениеXML.УстановитьСтроку(СтрокаНастроек);
ТаблицаНастроек = СериализаторXDTO.ПрочитатьXML(ЧтениеXML);

Вариант 2. Использование элементов справочника «Варианты отчетов»

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

Справочник ВариантыОтчетов содержит реквизиты КлючВарианта и Настройки (тип ХранилищеЗначения). Выясним, как использовать его для внешних обработок:

  1. При первом запуске обработки создаем служебный элемент справочника ВариантыОтчетов.
  2. В реквизите КлючВарианта указываем уникальный идентификатор вашей внешней обработки.
  3. В реквизите Настройки сохраняем двоичные данные или структуру с произвольной таблицей настроек через ХранилищеЗначения.
  4. При открытии обработки выполняем чтение хранилища из найденного элемента справочника по ключу.

Вариант 3. Перенос функционала в расширение конфигурации (.cfe)

Если решение проектируется для постоянного использования в облаке, наиболее правильным архитектурным шагом будет оформление разработки в виде расширения конфигурации.

После прохождения аудита сервис-провайдера расширение позволяет:

  1. Добавить собственный объект метаданных (например, РегистрСведений.МоиНастройкиОбработки).
  2. Задать требуемые права доступа на чтение и запись для стандартных ролей пользователей.
  3. Хранить данные напрямую в структурированном виде без необходимости сериализации в текстовые строки.

Вариант 4. Внешний HTTP-сервис / REST API

Выясним причину применения сторонних сервисов: в случаях, когда настройки должны синхронизироваться не только между пользователями одной базы, но и между разными информационными базами. Настройки можно хранить на внешнем веб-сервере.

Для работы в безопасном режиме облака потребуется зарегистрировать разрешение на сетевой обмен. В функции СведенияОВнешнейОбработке описывается запрос к разрешению с указанием конкретного URL или IP-адреса. После одобрения аудиторами обработки платформа разрешит использование объекта HTTPСоединение для чтения и отправки данных внешней системе.

Обеспечение параллельной работы пользователей

При использовании любого общего хранилища (справочника или регистра сведений) обратите внимание на проблему одновременной записи. Если два пользователя одновременно изменят данные, изменения одного из них могут быть перезаписаны.

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


Блокировка = Новый БлокировкаДанных;
ЭлементБлокировки = Блокировка.Добавить("РегистрСведений.ДополнительныеСведения");
ЭлементБлокировки.УстановитьЗначение("Объект", СсылкаНаОбъект);
ЭлементБлокировки.УстановитьЗначение("Свойство", СвойствоНастроек);

НачатьТранзакцию();
Попытка
    Блокировка.Заблокировать();
    // Чтение, изменение и запись данных
    ЗафиксироватьТранзакцию();
Исключение
    ОтменитьТранзакцию();
    ВызватьИсключение;
КонецПопытки;

Таким образом, для безопасного режима в облаке оптимальным выбором для внешней обработки является хранение сериализованных данных в подсистеме дополнительных сведений БСП или переход на использование расширения конфигурации.

← На главную