При разработке расширений для облачного сервиса 1С:Fresh программисты часто сталкиваются с тем, что расширение, идеально работающее в локальной базе, перестает функционировать при включении флажка Безопасный режим. Это связано с тем, что аудит 1С:Fresh предъявляет жесткие требования к безопасности кода, ограничивая доступ к файловой системе, COM-объектам и некоторым методам исполнения кода. Разберем подробно, почему так происходит и как адаптировать ваше расширение для успешного прохождения проверки.
Безопасный режим в облаке — это не просто формальное ограничение. На серверах 1С:Fresh он работает в тесной связке с профилями безопасности кластера серверов. Когда мы устанавливаем для расширения признак безопасного режима, система автоматически накладывает следующие ограничения:
Выполнить() и Вычислить().Важно помнить, что в безопасном режиме расширение имеет доступ только к тем типам данных и объектам, которые разрешены в базовой конфигурации. Если ваше расширение пытается изменить данные в объектах, на которые не получено явное разрешение в профиле безопасности, код просто не сработает.
Проанализируем ситуацию: в файловой базе при включении безопасного режима 1С начинает эмулировать серверные ограничения. Если вы используете аннотацию &Вместо для замены серверной функции в общем модуле (например, в ОбменСКонтрагентамиВнутренний), система может игнорировать этот вызов, если нарушаются условия контекста. В безопасном режиме нельзя просто так переопределять функции, которые работают с критически важными данными, без соблюдения правил расширения типов.
Для того чтобы ваша локальная разработка была максимально приближена к условиям облака, недостаточно просто поставить галочку в свойствах расширения. Рассмотрим пошагово, как правильно имитировать среду 1С:Fresh:
/SimulateServerSafeMode. Это заставит платформу проверять код на соответствие правилам безопасного режима сервера даже в файловом варианте.Одной из главных причин отказа в аудите является злоупотребление аннотацией &Вместо. Полная замена типового кода делает систему нестабильной при обновлениях. Рассмотрим, как правильно модифицировать логику формирования XML для ЭДО:
Вместо полной подмены функции, попробуем использовать аннотации &Перед или &После. Если же без &Вместо не обойтись, обязательно используйте метод ПродолжитьВызов(). Это гарантирует, что основной код конфигурации будет выполнен, а вы лишь добавите или скорректируете нужные данные.
Пример правильной структуры переопределения функции в общем модуле:
&Вместо("СформироватьДанныеДляУПД")
Процедура Расш1_СформироватьДанныеДляУПД(Параметры, Результат)
// Выполняем типовую логику
ПродолжитьВызов(Параметры, Результат);
// Добавляем свои дозаполнения в структуру XML
Если Параметры.Свойство("ДополнительныеПоля") Тогда
Результат.Вставить("НовоеПоле", "Значение");
КонецЕсли;
КонецПроцедуры
При модификации XML-файлов (УПД, Акты) в конфигурации Бухгалтерия предприятия 3.0, мы должны учитывать архитектуру БЭД. Система часто использует так называемые «переопределяемые модули». Выясним, нет ли возможности внедрить свой код через штатные механизмы:
Переопределяемый.Если вы все же меняете функции в ОбменСКонтрагентамиВнутренний, убедитесь, что ваш код не нарушает XSD-схему документа. Аудит 1С:Fresh проводит автоматизированную проверку сформированных файлов. Любое отклонение от стандарта приведет к отклонению расширения.
Чтобы успешно пройти аудит с первого раза, придерживайтесь следующих правил:
Минимизируйте код в расширении. Чем меньше строк типового кода вы скопировали в расширение, тем выше шансы. Старайтесь выносить сложную логику в отдельные процедуры вашего расширения, вызывая их из обработчиков.
Документируйте изменения. При подаче расширения на аудит приложите пояснительную записку. Четко опишите: «Функция X заменена на Y, так как типовой механизм не позволяет добавить поле Z в XML-файл УПД». Это снимет лишние вопросы у аудитора.
Работа в разделении данных. Помните, что во Fresh база общая для многих клиентов. Ваш код не должен пытаться обращаться к данным других областей. Используйте стандартные механизмы запросов 1С, которые автоматически учитывают разделитель ОбластьДанныхОсновныеДанные.
Разберем альтернативный подход, предложенный опытными разработчиками. Если серверная функция общего модуля упорно не хочет работать в безопасном режиме, можно попробовать перенести часть логики на сторону клиента, изменив команду вызова. Рассмотрим этот вариант:
Этот путь более трудозатратный, но он позволяет обойти жесткие ограничения на модификацию «ядра» системы в безопасном режиме, сохраняя при этом работоспособность расширения в облаке.