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