Как работают расширения в 1С 8.3: безопасный режим, разделение данных и общие реквизиты

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

Механизм расширений в платформе «1С:Предприятие 8.3» — это мощный инструмент кастомизации прикладных решений без изменения типовой конфигурации. Однако при его активном использовании разработчики регулярно сталкиваются со специфическим поведением платформы. Особенно остро это проявляется при работе в безопасном режиме, в условиях разделения данных (SaaS/облачные решения) и при попытках связать новые объекты расширения с существующими механизмами разграничения доступа.

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

Решение 1: Безопасный режим и переопределение процедур в расширениях

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

Безопасный режим в 1С создан для того, чтобы минимизировать риски при выполнении стороннего кода (которым фактически и является расширение). Когда расширение запущено в безопасном режиме, платформа накладывает жесткие ограничения на выполнение потенциально опасных операций на сервере (например, работу с файловой системой, COM-объектами, внешними компонентами или выполнение произвольного кода).

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

  1. Ограничения аннотации &Вместо (Instead): В безопасном режиме использование аннотации &Вместо для переопределения экспортных процедур и функций в модулях менеджера или общих модулях жестко контролируется. Если замещающий код пытается выполнить операции, не разрешенные в текущем профиле безопасности, или если платформа определяет контекст вызова как небезопасный, выполнение кода блокируется.
  2. Использование аннотаций &Перед и &После: Вместо полного замещения метода с помощью &Вместо рекомендуется использовать аннотации &Перед или &После. Они работают более «мягко» и реже вызывают конфликты безопасности, так как оригинальный метод основной конфигурации гарантированно выполняется в своем штатном контексте.
  3. Профили безопасности: Если вам критически важно выполнить переопределение метода, который обращается к внешним ресурсам или файловой системе, безопасный режим расширения отключать крайне не рекомендуется. Вместо этого в кластере серверов 1С необходимо настроить специальный Профиль безопасности для этого расширения. В профиле можно точечно разрешить конкретные действия (например, доступ к определенному каталогу на диске или к конкретному интернет-адресу).

Проанализируем пример кода. Допустим, нам нужно перехватить обработку в модуле менеджера справочника. Вместо небезопасного замещения:


&Вместо("ОбработкаПолученияДанныхВыбора")
Процедура Расш_ОбработкаПолученияДанныхВыбора(ДанныеВыбора, Параметры, СтандартнаяОбработка)
    // Наш код, который может быть заблокирован в безопасном режиме
    СтандартнаяОбработка = Ложь;
КонецПроцедуры

Безопаснее и надежнее использовать аннотацию &Перед, если алгоритм позволяет не отменять полностью стандартную обработку:


&Перед("ОбработкаПолученияДанныхВыбора")
Процедура Расш_ПередОбработкиПолученияДанныхВыбора(ДанныеВыбора, Параметры, СтандартнаяОбработка)
    // Логика, выполняемая перед основным кодом
КонецПроцедуры

Решение 2: Массив РасширенияКонфигурации в режиме разделения данных

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

Это штатное и ожидаемое поведение платформы, обусловленное архитектурой безопасности многоабонентских систем (SaaS):

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

Решение 3: Разделение данных для новых объектов в расширении

Третий важный вопрос касается интеграции новых объектов расширения в существующую схему разделения данных. Рассмотрим ситуацию: в расширении создаются два новых объекта — регистр сведений и справочник. Разработчик добавляет общий реквизит-разделитель (например, ОбластьДанныхОсновныеДанные) из основной конфигурации в расширение. При этом у регистра сведений появляется кнопка «Общие реквизиты» для настройки разделения, а у справочника — нет.

Выясним причину этой проблемы и рассмотрим, как менялось поведение платформы в разных версиях совместимости:

Ситуация в режиме совместимости 8.3.14 и ниже:
В старых версиях платформы существовало жесткое техническое ограничение. Платформа не позволяла динамически модифицировать состав существующих общих реквизитов (разделителей) основной конфигурации для некоторых типов объектов (особенно для справочников) внутри расширения. Именно поэтому кнопка настройки общих реквизитов для нового справочника расширения отсутствовала — платформа просто не поддерживала такую операцию на уровне СУБД.

Решение в современных версиях платформы (8.3.15 и выше):
Начиная с версии платформы 8.3.15, разработчики «1С» устранили это ограничение. Теперь добавить новый справочник или регистр расширения в состав существующего общего реквизита основной конфигурации можно. Разберем по шагам, как это сделать:

  1. Добавьте общий реквизит (например, ОбластьДанныхОсновныеДанные) из основной конфигурации в ваше расширение (кликом правой кнопки мыши по реквизиту в основной конфигурации -> «Добавить в расширение»).
  2. В окне дерева метаданных расширения найдите этот общий реквизит, откройте его палитру свойств и перейдите в свойство «Состав».
  3. В открывшемся окне состава общего реквизита вы увидите не только объекты основной конфигурации, но и новые объекты, созданные непосредственно в расширении. Найдите ваш новый справочник или регистр сведений и установите для него флаг использования общего реквизита (значение «Использовать» или «Авто»).
  4. Обратите внимание на свойство справочника в расширении «Использование разделения данных». Оно должно строго соответствовать логике работы основного разделителя системы, иначе при попытке применить расширение платформа выдаст ошибку соответствия типов и метаданных.

Подведем итог. При проектировании расширений для современных систем крайне важно учитывать версию совместимости вашей конфигурации. Переход на режим совместимости 8.3.15 и выше снимает большинство старых ограничений на работу с общими реквизитами-разделителями и позволяет создавать полноценные облачные решения (SaaS) с использованием уникальных справочников и документов внутри расширений.

← На главную