Как работают свойства общего модуля в 1С: разбираемся с флагами Клиент, Сервер, Вызов сервера и Глобальный

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

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

Разделение контекста: Клиент, Сервер и Внешнее соединение

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

  1. Сервер — если этот флаг установлен, процедуры и функции модуля могут быть выполнены на стороне сервера. Здесь доступен полный функционал платформы, включая работу с запросами, чтение и запись в базу данных.
  2. Клиент (управляемое приложение) — этот флаг позволяет коду выполняться на стороне тонкого клиента или веб-клиента. Здесь доступна работа с формами и интерфейсом, но накладываются серьезные ограничения на работу с данными (например, нельзя выполнять запросы напрямую).
  3. Внешнее соединение — флаг необходим для того, чтобы методы модуля были доступны при подключении к базе через COM-соединение или Automation. Если этот флаг не установлен, внешняя программа просто «не увидит» экспортируемые функции, даже если они помечены ключевым словом Экспорт.

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

Почему флаг «Сервер» не гарантирует вызов с клиента?

Многие начинающие разработчики сталкиваются с проблемой: флаг Сервер стоит, функция помечена как Экспорт, но при попытке вызвать ее из модуля формы (на клиенте) возникает ошибка. Проанализируем причину.

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

Рассмотрим пример кода в общем модуле ОбщийМодуль1:


// В свойствах модуля установлены флаги: Сервер, Вызов сервера
Функция ПолучитьОстатокТовара(ТоварСсылка) Экспорт
    Запрос = Новый Запрос;
    // ... текст запроса ...
    Возврат Результат;
КонецФункции

Теперь эту функцию можно вызвать из клиентской части модуля формы:


&НаКлиенте
Процедура ПроверитьОстаток()
    Остаток = ОбщийМодуль1.ПолучитьОстатокТовара(ВыбранныйТовар);
КонецПроцедуры

Ограничения передачи данных (Сериализация)

При использовании флага Вызов сервера мы должны помнить о процессе сериализации. Когда данные передаются с клиента на сервер, они упаковываются, передаются по сети и распаковываются. Выясним, какие данные нельзя передавать таким образом.

Нельзя передавать так называемые мутабельные значения. К ним относятся объекты базы данных (например, СправочникОбъект, ДокументОбъект) и наборы записей регистров. Если вы попытаетесь передать ссылку (СправочникСсылка), это сработает, так как ссылка — это простой ссылочный идентификатор. Но попытка передать сам объект приведет к ошибке выполнения.

Рекомендация: передавайте только простые типы (числа, строки, даты), ссылки или структуры/массивы, содержащие эти типы.

Загадочный флаг «Глобальный»

Флаг Глобальный делает функции модуля доступными в «глобальном контексте». Это означает, что вам не нужно писать имя модуля через точку. Вместо ОбщийМодуль1.МояФункция() можно написать просто МояФункция().

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

  1. Конфликт имен. Если в конфигурации уже есть функция с таким же именем (в другом глобальном модуле или встроенная в платформу), возникнет ошибка компиляции.
  2. Производительность. Все процедуры и функции глобальных модулей загружаются в память при старте системы. Большое количество таких модулей замедляет запуск программы и увеличивает потребление оперативной памяти.

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

Дополнительные свойства: Привилегированный и Повторное использование

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

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

Повторное использование возвращаемых значений — это механизм кэширования. Если функция вызывается несколько раз с одними и теми же параметрами, платформа не будет выполнять код функции снова, а сразу вернет результат из кэша. Рассмотрим варианты настройки:

Осторожно: кэш не знает об изменениях в базе данных. Если ваша функция делает запрос к БД, она может вернуть устаревшие данные, если они уже были закешированы ранее в этом сеансе.

Итоги и рекомендации

Подводя итог нашему анализу, сформулируем краткую инструкцию по настройке общего модуля:

  1. Если код должен работать с базой данных — ставьте флаг Сервер.
  2. Если этот код нужно вызвать из кнопок на форме или из модулей команд — обязательно добавляйте флаг Вызов сервера.
  3. Избегайте флага Глобальный, чтобы не создавать конфликтов имен и не нагружать систему.
  4. Используйте Привилегированный режим только тогда, когда это действительно необходимо для обхода ограничений прав доступа.
  5. Для ускорения работы системы применяйте Повторное использование для функций, которые делают сложные расчеты или запросы, результат которых редко меняется.

Правильная настройка свойств общих модулей — это залог стабильной и быстрой работы вашей конфигурации.

← На главную