При разработке внешних обработок для 1С:Бухгалтерии 3.0, работающих в облачных сервисах (например, 1С:Фреш), разработчики регулярно сталкиваются со специфическими ограничениями платформы. Одной из частых задач является сохранение общей таблицы настроек, которая должна быть доступна и едишна для всех пользователей базы данных.
Стандартное решение через ХранилищеОбщихНастроек в данном случае не подходит, так как для записи общих настроек у обычных пользователей недостаточно прав («Администратор данных»). Попытка включить привилегированный режим вызовом УстановитьПривилегированныйРежим(Истина) в безопасном режиме облака также игнорируется платформой. Разберем подробнее варианты архитектурных решений, позволяющие обойти эти ограничения без нарушения требований безопасности.
Проанализируем базовый вариант, предложенный в сообществе. В конфигурациях на базе Библиотеки Стандартных Подсистем (БСП) существует регистр сведений ДополнительныеСведения, доступ на запись в который открыт большинству пользователей.
Рассмотрим по шагам алгоритм реализации данного подхода:
ПланВидовХарактеристик.ДополнительныеРеквизитыИСведения с типом значения «Строка» (неограниченной длины).СериализаторXDTO или ЗаписьJSON.ДополнительныеСведения. В качестве объекта адресации можно использовать любой универсальный справочник (например, Справочники.Организации или текущего пользователя), либо связать запись с ключом обработки.Посмотрим на пример кода для сериализации и чтения структуры настроек в строку XML:
// Сохранение таблицы значений в строку
ЗаписьXML = Новый ЗаписьXML;
ЗаписьXML.УстановитьСтроку();
СериализаторXDTO.ЗаписатьXML(ЗаписьXML, ТаблицаНастроек);
СтрокаНастроек = ЗаписьXML.Закрыть();
// Восстановление таблицы значений из строки
ЧтениеXML = Новый ЧтениеXML;
ЧтениеXML.УстановитьСтроку(СтрокаНастроек);
ТаблицаНастроек = СериализаторXDTO.ПрочитатьXML(ЧтениеXML);
Разберем еще один способ сохранения настроек средствами БСП без изменения состава метаданных. В типовой конфигурации обычные пользователи имеют права на сохранение вариантов отчетов.
Справочник ВариантыОтчетов содержит реквизиты КлючВарианта и Настройки (тип ХранилищеЗначения). Выясним, как использовать его для внешних обработок:
ВариантыОтчетов.КлючВарианта указываем уникальный идентификатор вашей внешней обработки.Настройки сохраняем двоичные данные или структуру с произвольной таблицей настроек через ХранилищеЗначения.Если решение проектируется для постоянного использования в облаке, наиболее правильным архитектурным шагом будет оформление разработки в виде расширения конфигурации.
После прохождения аудита сервис-провайдера расширение позволяет:
РегистрСведений.МоиНастройкиОбработки).Выясним причину применения сторонних сервисов: в случаях, когда настройки должны синхронизироваться не только между пользователями одной базы, но и между разными информационными базами. Настройки можно хранить на внешнем веб-сервере.
Для работы в безопасном режиме облака потребуется зарегистрировать разрешение на сетевой обмен. В функции СведенияОВнешнейОбработке описывается запрос к разрешению с указанием конкретного URL или IP-адреса. После одобрения аудиторами обработки платформа разрешит использование объекта HTTPСоединение для чтения и отправки данных внешней системе.
При использовании любого общего хранилища (справочника или регистра сведений) обратите внимание на проблему одновременной записи. Если два пользователя одновременно изменят данные, изменения одного из них могут быть перезаписаны.
Для предотвращения потерь данных запись и чтение общих настроек необходимо оборачивать в транзакцию с использованием управляемых блокировок:
Блокировка = Новый БлокировкаДанных;
ЭлементБлокировки = Блокировка.Добавить("РегистрСведений.ДополнительныеСведения");
ЭлементБлокировки.УстановитьЗначение("Объект", СсылкаНаОбъект);
ЭлементБлокировки.УстановитьЗначение("Свойство", СвойствоНастроек);
НачатьТранзакцию();
Попытка
Блокировка.Заблокировать();
// Чтение, изменение и запись данных
ЗафиксироватьТранзакцию();
Исключение
ОтменитьТранзакцию();
ВызватьИсключение;
КонецПопытки;
Таким образом, для безопасного режима в облаке оптимальным выбором для внешней обработки является хранение сериализованных данных в подсистеме дополнительных сведений БСП или переход на использование расширения конфигурации.