Механизм расширений в платформе «1С:Предприятие 8.3» — это мощный инструмент кастомизации прикладных решений без изменения типовой конфигурации. Однако при его активном использовании разработчики регулярно сталкиваются со специфическим поведением платформы. Особенно остро это проявляется при работе в безопасном режиме, в условиях разделения данных (SaaS/облачные решения) и при попытках связать новые объекты расширения с существующими механизмами разграничения доступа.
В этой статье мы подробно разберем по шагам три сложных вопроса, с которыми сталкиваются программисты при проектировании расширений, проанализируем причины такого поведения платформы и найдем корректные способы решения для каждого случая.
Рассмотрим первую ситуацию: у расширения в свойствах установлен флаг «Безопасный режим». Разработчик пытается переопределить экспортную процедуру из модуля менеджера основной конфигурации, но платформа блокирует это действие или код просто не выполняется, хотя свойства формы в том же расширении переопределяются без проблем. Выясним причину этой особенности.
Безопасный режим в 1С создан для того, чтобы минимизировать риски при выполнении стороннего кода (которым фактически и является расширение). Когда расширение запущено в безопасном режиме, платформа накладывает жесткие ограничения на выполнение потенциально опасных операций на сервере (например, работу с файловой системой, COM-объектами, внешними компонентами или выполнение произвольного кода).
Интерфейсные свойства форм не представляют угрозы для целостности данных сервера, поэтому платформа позволяет модифицировать формы практически без ограничений. С серверным кодом модулей менеджера и общих модулей ситуация принципиально иная:
&Вместо для переопределения экспортных процедур и функций в модулях менеджера или общих модулях жестко контролируется. Если замещающий код пытается выполнить операции, не разрешенные в текущем профиле безопасности, или если платформа определяет контекст вызова как небезопасный, выполнение кода блокируется.&Вместо рекомендуется использовать аннотации &Перед или &После. Они работают более «мягко» и реже вызывают конфликты безопасности, так как оригинальный метод основной конфигурации гарантированно выполняется в своем штатном контексте.Проанализируем пример кода. Допустим, нам нужно перехватить обработку в модуле менеджера справочника. Вместо небезопасного замещения:
&Вместо("ОбработкаПолученияДанныхВыбора")
Процедура Расш_ОбработкаПолученияДанныхВыбора(ДанныеВыбора, Параметры, СтандартнаяОбработка)
// Наш код, который может быть заблокирован в безопасном режиме
СтандартнаяОбработка = Ложь;
КонецПроцедуры
Безопаснее и надежнее использовать аннотацию &Перед, если алгоритм позволяет не отменять полностью стандартную обработку:
&Перед("ОбработкаПолученияДанныхВыбора")
Процедура Расш_ПередОбработкиПолученияДанныхВыбора(ДанныеВыбора, Параметры, СтандартнаяОбработка)
// Логика, выполняемая перед основным кодом
КонецПроцедуры
Перейдем ко второму вопросу. Разработчики часто замечают, что при вызове метода РасширенияКонфигурации.Получить() в обычном режиме система возвращает полный список установленных расширений, но в режиме разделения данных (например, при работе в модели сервиса 1С:Фреш) этот массив оказывается абсолютно пустым. Почему так происходит?
Это штатное и ожидаемое поведение платформы, обусловленное архитектурой безопасности многоабонентских систем (SaaS):
Получить(). Для них этого расширения «как бы не существует» на уровне системных списков, хотя его механизмы работают.РасширенияКонфигурации.Получить() внутри разделенного сеанса, оно само должно быть спроектировано как разделимое (то есть поддерживать работу с конкретной областью данных) и быть подключено непосредственно к этой области данных, а не ко всей базе в целом.Для проверки доступности расширений в коде, который должен одинаково работать как в локальном режиме, так и в облаке, рекомендуется использовать безопасный перебор или проверку наличия конкретных типов данных из расширения с помощью функции Тип(), вместо прямого анализа массива РасширенияКонфигурации.Получить().
Третий важный вопрос касается интеграции новых объектов расширения в существующую схему разделения данных. Рассмотрим ситуацию: в расширении создаются два новых объекта — регистр сведений и справочник. Разработчик добавляет общий реквизит-разделитель (например, ОбластьДанныхОсновныеДанные) из основной конфигурации в расширение. При этом у регистра сведений появляется кнопка «Общие реквизиты» для настройки разделения, а у справочника — нет.
Выясним причину этой проблемы и рассмотрим, как менялось поведение платформы в разных версиях совместимости:
Ситуация в режиме совместимости 8.3.14 и ниже:
В старых версиях платформы существовало жесткое техническое ограничение. Платформа не позволяла динамически модифицировать состав существующих общих реквизитов (разделителей) основной конфигурации для некоторых типов объектов (особенно для справочников) внутри расширения. Именно поэтому кнопка настройки общих реквизитов для нового справочника расширения отсутствовала — платформа просто не поддерживала такую операцию на уровне СУБД.
Решение в современных версиях платформы (8.3.15 и выше):
Начиная с версии платформы 8.3.15, разработчики «1С» устранили это ограничение. Теперь добавить новый справочник или регистр расширения в состав существующего общего реквизита основной конфигурации можно. Разберем по шагам, как это сделать:
ОбластьДанныхОсновныеДанные) из основной конфигурации в ваше расширение (кликом правой кнопки мыши по реквизиту в основной конфигурации -> «Добавить в расширение»).Подведем итог. При проектировании расширений для современных систем крайне важно учитывать версию совместимости вашей конфигурации. Переход на режим совместимости 8.3.15 и выше снимает большинство старых ограничений на работу с общими реквизитами-разделителями и позволяет создавать полноценные облачные решения (SaaS) с использованием уникальных справочников и документов внутри расширений.