Разработка внешних обработок для платформы 1С:Предприятие, особенно тех, которые предназначены для работы в сервисе 1С:Фреш (или в других средах, где активно используется безопасный режим), сопряжена с определенными ограничениями. Основная сложность заключается в том, что по умолчанию безопасный режим запрещает прямой доступ к файловой системе, сетевым ресурсам и другим внешним по отношению к базе данных операциям. Однако, благодаря механизмам Библиотеки Стандартных Подсистем (БСП) и платформы 1С, мы можем запросить необходимые разрешения. В этой статье мы подробно рассмотрим, как реализовать функциональность, включающую HTTP-запросы, сохранение временных файлов и изменение документов, оставаясь при этом в рамках безопасного режима.
Когда мы говорим о безопасном режиме, особенно в контексте 1С:Фреш, мы сталкиваемся с жесткими ограничениями, направленными на обеспечение стабильности и безопасности всей системы. В такой среде мы не можем модифицировать конфигурацию, что исключает вариант "допилить конфу", и не можем отключить безопасный режим для внешних обработок или расширений. Все взаимодействия с внешним миром (интернет, файловая система) должны осуществляться через строго определенный API, предоставляемый платформой и БСП, с явным запросом разрешений. Это требует от разработчика понимания и строгого соблюдения правил работы с разрешениями.
Напрямую выполнять HTTP-запросы из кода внешней обработки в безопасном режиме запрещено. Для того чтобы получить возможность взаимодействовать с внешними веб-сервисами, нам необходимо запросить специальное разрешение. Это делается с помощью метода РаботаВБезопасномРежиме.РазрешениеНаИспользованиеИнтернетРесурса(). Давайте разберем его параметры и использование.
Метод РазрешениеНаИспользованиеИнтернетРесурса() принимает следующие аргументы:
forum.infostart.ru, а не общим символом *.Неопределено.После того как мы создали объект разрешения, его необходимо добавить в массив Разрешения структуры ПараметрыРегистрации нашей внешней обработки. Вот как это будет выглядеть в коде:
// ... в функции СведенияОВнешнейОбработке Экспорт
ПараметрыРегистрации.Разрешения.Добавить(РаботаВБезопасномРежиме.РазрешениеНаИспользованиеИнтернетРесурса("HTTPS", "forum.infostart.ru", Неопределено, НСтр("ru = 'Разрешение на доступ к форуму Инфостарт'")));
// ...
Помните, что каждое обращение к новому домену или с новым протоколом потребует отдельного разрешения. Если ваша обработка должна взаимодействовать с несколькими веб-сервисами, мы добавляем по одному разрешению для каждого из них.
После получения разрешения, для выполнения самих запросов мы будем использовать стандартные объекты 1С: HTTPСоединение и HTTPЗапрос. Эти объекты работают в безопасном режиме, если для целевого адреса получено соответствующее разрешение.
Сохранение и чтение файлов, особенно полученных из внешних сервисов (например, картинок), является частой задачей. В безопасном режиме прямой доступ к произвольным каталогам файловой системы запрещен. Однако, нам доступны специальные разрешения для работы с определенными, контролируемыми областями.
Для работы с временными файлами нам потребуется разрешение РаботаВБезопасномРежиме.РазрешениеНаИспользованиеКаталогаВременныхФайлов(). Этот метод принимает два булевых параметра: первый для разрешения чтения, второй для разрешения записи. Обычно мы разрешаем и то, и другое:
// ... в функции СведенияОВнешнейОбработке Экспорт
Разрешение = РаботаВБезопасномРежиме.РазрешениеНаИспользованиеКаталогаВременныхФайлов(Истина, Истина); // Разрешаем чтение и запись
ПараметрыРегистрации.Разрешения.Добавить(Разрешение);
// ...
Путь к временному каталогу для нашей обработки можно получить с помощью функции платформы КаталогВременныхФайлов(). Все операции по сохранению и чтению файлов должны выполняться строго внутри этого каталога. Например, для сохранения полученной картинки:
ИмяФайлаКартинки = "МояКартинка.jpg";
ПутьКВременномуКаталогу = КаталогВременныхФайлов();
ПолныйПутьКФайлу = ПутьКВременномуКаталогу + ИмяФайлаКартинки;
// Пример сохранения двоичных данных (например, полученных по HTTP)
ДвоичныеДанные.Записать(ПолныйПутьКФайлу);
Иногда может потребоваться доступ к каталогу программы или другим частям файловой системы (например, для чтения настроек). Для этого существуют дополнительные разрешения:
РаботаВБезопасномРежиме.РазрешениеНаИспользованиеКаталогаПрограммы(Истина, Истина): Разрешает чтение и запись в каталог, где расположена сама программа 1С:Предприятие.РаботаВБезопасномРежиме.РазрешениеНаИспользованиеКаталогаФайловойСистемы(Истина, Истина): Это более широкое разрешение, которое теоретически может дать доступ к другим каталогам. Однако его использование в 1С:Фреш может быть ограничено или требовать дополнительного аудита, и обычно оно не рекомендуется без крайней необходимости. В ряде случаев, как показано в одном из сообщений форума, именно добавление этого разрешения (в дополнение к каталогу временных файлов) помогло решить проблему с записью текстовых файлов, что может указывать на особенности реализации или специфические ошибки в версиях БСП. При возникновении проблем с записью файлов, даже во временный каталог, попробуйте добавить его:
// ... в функции СведенияОВнешнейОбработке Экспорт
Разрешение = РаботаВБезопасномРежиме.РазрешениеНаИспользованиеКаталогаВременныхФайлов(Истина, Истина);
ПараметрыРегистрации.Разрешения.Добавить(Разрешение);
Разрешение = РаботаВБезопасномРежиме.РазрешениеНаИспользованиеКаталогаПрограммы(Истина, Истина);
ПараметрыРегистрации.Разрешения.Добавить(Разрешение);
// В некоторых случаях может понадобиться:
Разрешение = РаботаВБезопасномРежиме.РазрешениеНаИспользованиеКаталогаФайловойСистемы(Истина, Истина);
ПараметрыРегистрации.Разрешения.Добавить(Разрешение);
// ...
Функциональность по изменению и записи документов (например, заполнение табличной части) в безопасном режиме отличается от работы с внешними ресурсами. Если наша внешняя обработка запущена и имеет соответствующие права доступа к объектам базы данных (например, к документу "Реализация товаров и услуг"), то платформа 1С по умолчанию разрешает ей выполнять такие операции, как чтение, изменение и запись этих объектов. Мы не запрашиваем специальных "разрешений на запись документов" так, как мы запрашиваем разрешения на доступ к интернету или файловой системе.
Важный момент: если обработка зарегистрирована в безопасном режиме, это означает, что ее код не может выполнять операции, которые могут нарушить целостность или безопасность системы (например, вызывать внешние компоненты, выполнять произвольный SQL). Однако, если код внешней обработки обращается к стандартным механизмам работы с объектами базы данных (таким как ДокументОбъект.Прочитать(), ДокументОбъект.Записать(), ДокументОбъект.ТабличнаяЧасть.Добавить()), и для пользователя, от имени которого запущена обработка, есть необходимые права, эти операции будут выполнены.
Проблемы могут возникнуть, если:
Для заполнения табличной части документа в безопасном режиме мы будем использовать стандартный код 1С:
// Предполагается, что Объект (например, документ) уже получен и является ДокументОбъект
// Например, из ОбработкаОбъект.ПолучитьОбъект() или найденный по ссылке
// Очистим текущую табличную часть, если нужно
Объект.Товары.Очистить();
// Добавим новые строки
НоваяСтрока = Объект.Товары.Добавить();
НоваяСтрока.Номенклатура = СсылкаНаНоменклатуру;
НоваяСтрока.Количество = 10;
НоваяСтрока.Цена = 100;
НоваяСтрока.Сумма = НоваяСтрока.Количество * НоваяСтрока.Цена;
// ... Добавляем другие строки
// Запишем документ
Попытка
Объект.Записать(РежимЗаписиДокумента.Проведение); // Или РежимЗаписиДокумента.Запись
Исключение
Сообщить("Ошибка при записи документа: " + ОписаниеОшибки());
Отказ = Истина;
КонецПопытки;
Важно убедиться, что все операции с данными выполняются с соблюдением транзакционности и корректной обработкой ошибок. Если обработка выполняется на сервере, она будет использовать права того контекста, в котором она запущена.
Одним из ключевых моментов для успешной работы внешней обработки в безопасном режиме, особенно в среде 1С:Фреш, является ее правильная регистрация. Это включает в себя не только указание флага БезопасныйРежим = Истина, но и критически важное указание версии Библиотеки Стандартных Подсистем (БСП).
Почему версия БСП так важна? Механизмы безопасного режима и разрешений в БСП развиваются и меняются. Если мы не укажем корректную версию БСП, система может либо не применить разрешения, либо вызвать ошибку, так как будет пытаться интерпретировать параметры обработки по устаревшим правилам.
Как показал опыт участников форума, распространенной проблемой является ошибка типа {ОбщийМодуль.ДополнительныеОтчетыИОбработкиВБезопасномРежимеСлужебный.Модуль(295)}: Значение не является значением объектного типа (Представление). Эта ошибка часто возникает именно из-за некорректно сформированной структуры разрешений или несовместимости с текущей версией БСП, особенно если мы вручную добавляем разрешения без использования вспомогательных методов БСП или указываем пустую версию БСП.
Мы должны использовать специальный метод из БСП для создания структуры параметров регистрации, передавая ему текущую версию БСП:
// Внешняя обработка. Модуль объекта.
Функция СведенияОВнешнейОбработке() Экспорт
// Получаем текущую версию БСП
// Это критически важно для корректной работы разрешений в безопасном режиме
Перем ВерсияБСП;
Если ОбщегоНазначения.ФункциональнаяОпцияДополнительныеОтчетыИОбработки() Тогда
ВерсияБСП = СтандартныеПодсистемыСервер.ВерсияБиблиотеки();
Иначе
// Если БСП не подключена или старая версия
ВерсияБСП = "2.2.2.1"; // Примерная минимальная версия, с которой могут работать разрешения
КонецЕсли;
// Создаем параметры регистрации, используя метод БСП
// Передаем актуальную версию БСП
ПараметрыРегистрации = ДополнительныеОтчетыИОбработки.СведенияОВнешнейОбработке(ВерсияБСП);
// Основные сведения об обработке
ПараметрыРегистрации.Вид = ДополнительныеОтчетыИОбработкиКлиентСервер.ВидОбработкиДополнительнаяОбработка;
ПараметрыРегистрации.Наименование = НСтр("ru = 'Обработка импорта данных'");
ПараметрыРегистрации.Версия = "1.2.3";
ПараметрыРегистрации.Информация = НСтр("ru = 'Импорт данных из внешнего сервиса'");
ПараметрыРегистрации.БезопасныйРежим = Истина; // Обязательно для Фреш
// Добавляем необходимые разрешения
// 1. Разрешение на использование интернет-ресурса
ПараметрыРегистрации.Разрешения.Добавить(
РаботаВБезопасномРежиме.РазрешениеНаИспользованиеИнтернетРесурса(
"HTTPS",
"api.externalservice.com", // Конкретный адрес вашего сервиса
Неопределено,
НСтр("ru = 'Доступ к API внешнего сервиса для получения данных'")
)
);
// 2. Разрешения для работы с временными файлами
ПараметрыРегистрации.Разрешения.Добавить(
РаботаВБезопасномРежиме.РазрешениеНаИспользованиеКаталогаВременныхФайлов(Истина, Истина) // Чтение и запись
);
// В некоторых случаях может понадобиться:
ПараметрыРегистрации.Разрешения.Добавить(
РаботаВБезопасномРежиме.РазрешениеНаИспользованиеКаталогаПрограммы(Истина, Истина) // Чтение и запись в каталог программы
);
// И даже это, если предыдущие не помогли при работе с файлами
ПараметрыРегистрации.Разрешения.Добавить(
РаботаВБезопасномРежиме.РазрешениеНаИспользованиеКаталогаФайловойСистемы(Истина, Истина)
);
// Описание команды, которая будет вызываться из формы или из списка ДПО
Команда = ПараметрыРегистрации.Команды.Добавить();
Команда.Представление = НСтр("ru = 'Выполнить импорт'");
Команда.Идентификатор = "ВыполнитьИмпортДанных";
Команда.Использование = ДополнительныеОтчетыИОбработкиКлиентСервер.ТипКомандыОткрытиеФормы;
Команда.ПоказыватьОповещение = Истина;
Возврат ПараметрыРегистрации;
КонецФункции
Мы видим, что в этом примере мы сначала пытаемся получить версию БСП через СтандартныеПодсистемыСервер.ВерсияБиблиотеки(). Если по каким-то причинам этот вызов не работает (например, очень старая БСП или ее отсутствие), мы можем указать версию вручную, но это менее надежно, так как требует ручного отслеживания. Версию БСП можно найти в регистре сведений "Версии подсистем" вашей конфигурации. Использование актуальной версии БСП позволяет системе корректно интерпретировать и применять запрошенные нами разрешения.
Работа с безопасным режимом требует особого подхода к разработке и отладке. Рассмотрим несколько важных рекомендаций:
Сообщить() или запись в журнал регистрации, если это разрешено) и детальную обработку ошибок, чтобы понимать, на каком этапе происходит сбой.В целом, успешно реализовать функциональность внешней обработки в безопасном режиме 1С:Фреш вполне реально, но требует внимательности к деталям, особенно в части настройки разрешений и версионирования БСП. Следуя изложенным рекомендациям и используя предоставленные примеры кода, мы можем создать надежные и функциональные решения, соответствующие требованиям безопасности платформы 1С.