Как правильно создать общую процедуру, доступную и с клиента, и с сервера?

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

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

Почему возникают проблемы с «глобальными» модулями

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

Пошаговое решение: создание общего модуля для клиент-серверного взаимодействия

Если вам нужно, чтобы код работал и на клиенте, и на сервере, самым верным решением будет создание обычного общего модуля (не глобального).

  1. Откройте дерево конфигурации и перейдите в ветку Общие — Общие модули.
  2. Создайте новый модуль, дайте ему понятное имя, например, УниверсальныеМетоды.
  3. В свойствах модуля установите флажки:
    • Клиент (управляемое приложение) — установите Истина.
    • Сервер — установите Истина.
    • Флажок Вызов сервера — в данном сценарии не нужен, если ваша задача просто сделать код доступным, а не выполнять серверную логику по требованию клиента.
  4. В модуле напишите процедуру или функцию, добавив ключевое слово Экспорт.

Важно помнить: никакие директивы компиляции (препроцессоры) внутри общего модуля не нужны. Платформа сама определит контекст выполнения. Если вы вызываете процедуру из клиентского модуля, она будет выполнена на клиенте. Если из серверного — на сервере.

Пример кода общего модуля:


// В модуле ОбщиеМодули.УниверсальныеМетоды
Функция ПолучитьПриветствие() Экспорт
    Возврат "Привет, мир!";
КонецФункции

Вызов этой функции из любой точки конфигурации будет выглядеть так:

Результат = УниверсальныеМетоды.ПолучитьПриветствие();

Когда действительно нужен «Вызов сервера»

Если ваша процедура содержит специфический серверный код (например, чтение данных из базы через Запрос или модификацию объектов через Записать()), то при вызове с клиента такая процедура вызовет ошибку, так как на клиенте нет доступа к данным БД.

В этом случае необходимо разделить логику на два модуля:

Разберем пример:


// Серверный модуль (с установленным флагом «Вызов сервера»)
// Имя: РаботаСДаннымиВызовСервера
Процедура ЗаписатьДанныеВБазу(Параметры) Экспорт
    // Здесь выполняем серверные действия
    Объект = Справочники.Номенклатура.СоздатьЭлемент();
    // ... логика записи
КонецПроцедуры

Теперь из клиентского модуля (например, из модуля формы) вы вызываете его напрямую:


&НаКлиенте
Процедура КомандаВыполнить(Команда)
    РаботаСДаннымиВызовСервера.ЗаписатьДанныеВБазу(Параметры);
КонецПроцедуры

Подведем итоги

Для создания универсальных процедур:

  1. Используйте обычные общие модули, а не глобальные.
  2. Не используйте директивы компиляции внутри модулей — они предназначены для модулей форм.
  3. Если логика «тяжелая» и требует доступа к БД, выносите ее в модуль с флагом Вызов сервера.
  4. Соблюдайте чистоту архитектуры: разделение логики на клиентскую и серверную позволяет избежать ошибок доступа и повышает производительность вашего решения.

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

← На главную