Какие глобальные процедуры 1С не компилируются на сервере и как настроить автоматическую проверку кода?

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

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

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

Как настроить конфигуратор для автоматического поиска ошибок компиляции?

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

Разберем по шагам, как активировать автоматическую синтаксическую проверку серверного контекста при сохранении модулей:

  1. Откроем Конфигуратор нашей информационной базы.
  2. В главном меню перейдем в раздел Сервис и выберем пункт Параметры.
  3. В открывшемся окне перейдем на вкладку Модули, а затем выберем подвкладку Проверка.
  4. В списке контекстов компиляции обязательно установим флаг напротив пункта Сервер. Также рекомендуется включить проверки для тонкого клиента и внешнего соединения, чтобы видеть полную картину кросс-контекстной совместимости.
  5. Нажмем кнопку Применить и закроем окно настроек.

Теперь при сохранении любого модуля или при принудительном запуске синтаксического контроля (сочетание клавиш Ctrl + F7) конфигуратор будет эмулировать компиляцию кода во всех выбранных контекстах. Если в общем модуле, у которого установлены свойства Клиент и Сервер, будет вызвана недоступная на сервере процедура, система сразу же подсветит ее как ошибку компиляции. Это избавляет от необходимости вести «бумажные списки» перед глазами.

Использование Синтакс-помощника для проверки доступности

Проанализируем классический инструмент разработчика — Синтакс-помощник (СП). Если мы сомневаемся, можно ли использовать конкретный метод на сервере, достаточно найти его в СП и посмотреть раздел Доступность.

Например, если мы найдем метод Предупреждение, в описании мы увидим:

Доступность: Тонкий клиент, веб-клиент, толстый клиент.

Отсутствие слова "Сервер" в этом списке однозначно указывает на то, что попытка компиляции данного метода на сервере приведет к ошибке.

Категории глобальных методов, которые НЕ компилируются на сервере

Выясним причину, по которой определенные методы заблокированы в серверном контексте, и подробно рассмотрим основные категории таких функций.

1. Интерактивные диалоги и ввод данных

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

2. Управление интерфейсом, окнами и формами

На сервере невозможно напрямую управлять открытыми окнами клиентского приложения, поскольку серверный код выполняется изолированно в процессах кластера серверов 1С (rphost). К этой категории относятся:

3. Оповещения и информирование пользователя

Методы, посылающие визуальные уведомления в интерфейс конкретного сеанса или управляющие звуковыми сигналами компьютера пользователя, также не компилируются на сервере:

4. Прерывание работы и управление сеансом

Методы контроля за действиями пользователя на его локальном ПК недоступны на стороне сервера:

5. Таймеры и периодические события

Методы для работы с фоновыми таймерами привязаны к графическому потоку операционной системы клиента и циклу событий интерфейса:

Как обходить ограничения: практические приемы и примеры кода

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

Прием 1. Использование директив препроцессора

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


#Если Клиент Тогда
    // Данный код выполнится только на стороне клиента
    ОбработкаПрерыванияПользователя();
#КонецЕсли

При компиляции этого модуля на сервере компилятор просто проигнорирует и отбросит весь блок между #Если Клиент и #КонецЕсли, благодаря чему ошибка компиляции не возникнет.

Прием 2. Реализация длительных операций через фоновые задания

Часто перед разработчиком стоит задача выполнить тяжелый расчет на сервере, но при этом дать пользователю возможность прервать операцию нажатием кнопки «Отмена» или показывать ему шкалу прогресса через Состояние. Напрямую сделать это на сервере нельзя.

Разберем по шагам правильную схему реализации длительной операции с использованием механизма фоновых заданий:

  1. На клиенте пользователь нажимает кнопку запуска процесса.
  2. Код запускает фоновое задание на сервере с помощью метода ФоновыеЗадания.Выполнить().
  3. На клиенте подключается периодический таймер через метод ПодключитьОбработчикОжидания().
  4. В обработчике ожидания клиент раз в секунду обращается к серверу для проверки состояния фонового задания и считывания его прогресса.
  5. Если пользователь решает отменить процесс, на клиенте срабатывает код отмены, который вызывает метод ФоновыеЗадания.Отменить() на сервере.

Посмотрим на пример кода запуска фонового задания на клиенте:


&НаКлиенте
Процедура ЗапуститьРасчетНаСервере()
    
    ПараметрыПроцедуры = Новый Массив;
    ПараметрыПроцедуры.Добавить(ПараметрыРасчета);
    
    // Запуск фонового процесса на сервере
    ИдентификаторЗадания = ЗапуститьФоновоеЗаданиеНаСервере(ПараметрыПроцедуры);
    
    // Подключаем обработчик ожидания для отслеживания прогресса
    ПодключитьОбработчикОжидания("Подключаемый_ПроверитьВыполнениеЗадания", 1, Ложь);
    
КонецПроцедуры

А теперь рассмотрим процедуру-обработчик ожидания на клиенте, которая опрашивает сервер:


&НаКлиенте
Процедура Подключаемый_ПроверитьВыполнениеЗадания()
    
    СостояниеЗадания = ПолучитьСостояниеЗаданияНаСервере(ИдентификаторЗадания);
    
    Если СостояниеЗадания = "Выполнено" Тогда
        ОтключитьОбработчикОжидания("Подключаемый_ПроверитьВыполнениеЗадания");
        ПоказатьОповещениеПользователя("Успех", , "Расчет успешно завершен!");
    ИначеЕсли СостояниеЗадания = "АварийноЗавершено" Или СостояниеЗадания = "Отменено" Тогда
        ОтключитьОбработчикОжидания("Подключаемый_ПроверитьВыполнениеЗадания");
        ПоказатьПредупреждение(, "Операция была прервана или завершилась с ошибкой.");
    Иначе
        // Продолжаем ожидать, выводим информацию в состояние интерфейса клиента
        Состояние("Выполняется расчет данных на сервере, пожалуйста, подождите...");
    КонецЕсли;
    
КонецПроцедуры

Прием 3. Строгое разделение общих модулей

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

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

← На главную