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