Почему не вызывается серверная функция из клиентской в общем модуле 1С и как это исправить?

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

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

Причина ошибки: как платформа компилирует общий модуль

Разберем типичный пример некорректного кода в общем модуле, у которого установлены флаги Клиент (управляемое приложение), Сервер и Вызов сервера:


&НаКлиенте
Функция ПолучитьСуммуДляЗаполнения(ДоговорКонтрагента, Дата, ДокументОснование = Неопределено) Экспорт
    Возврат ПолучитьСуммуДляЗаполненияНаСервере(ДоговорКонтрагента, Дата, ДокументОснование); // Ошибка: Процедура или функция не обнаружена
КонецФункции

&НаСервере
Функция ПолучитьСуммуДляЗаполненияНаСервере(ДоговорКонтрагента, Дата, ДокументОснование = Неопределено) Экспорт
    // Серверный алгоритм
КонецФункции

Выясним причину такого поведения платформы. В отличие от модулей управляемых форм и команд, директивы компиляции &НаКлиенте, &НаСервере и &НаСервереБезКонтекста не работают в общих модулях. Они просто игнорируются или приводят к синтаксическим ошибкам.

Когда у общего модуля одновременно включены флаги Клиент и Сервер, платформа 1С компилирует два абсолютно независимых экземпляра этого модуля:

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

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

Архитектурное решение: разделение общих модулей по стандартам 1С

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

  1. Клиентский общий модуль (например, РаботаСДоговорамиКлиент):

    У модуля установлен только флаг Клиент (управляемое приложение). Модуль предназначен для интерфейсной логики, открытия форм, вывода предупреждений и вызова серверных фасадов.

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

    У модуля установлены флаги Сервер и Вызов сервера. Флаг Клиент должен быть обязательно снят. Этот модуль служит тонкой точкой входа для клиентских вызовов.

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

    У модуля установлен только флаг Сервер. Флаги Клиент и Вызов сервера сняты. Здесь сосредоточена вся бизнес-логика, выполнение запросов и работа с базой данных.

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

Важные правила клиент-серверного взаимодействия

Рассмотрим ключевые ограничения и рекомендации, которые необходимо соблюдать при передаче данных между клиентом и сервером через общие модули:

  1. Передача параметров по значению: при вызове экспортных функций через модуль с флагом Вызов сервера параметры сериализуются и передаются по значению. Любые изменения переданных переменных на сервере не вернутся обратно на клиент автоматически.
  2. Ограничение типов данных: через границу «клиент — сервер» нельзя передавать несериализуемые и мутабельные объекты, существующие только на сервере (такие как ДокументОбъект, СправочникОбъект, ТаблицаЗначений, ДеревоЗначений). Допустимо передавать примитивные типы, ссылки (СправочникСсылка, ДокументСсылка), а также коллекции Структура, Соответствие, Массив и ФиксированнаяСтруктура.
  3. Оптимизация сетевых вызовов: каждый вызов модуля с флагом Вызов сервера инициирует сетевой опрос. Старайтесь объединять вызовы: вместо нескольких отдельных серверных функций вызывайте одну процедуру или функцию, возвращающую структуру со всеми требуемыми для формы данными.
← На главную