Разработка и Конфигурация · 12 мин
Что такое компиляция модуля 1С и как её настроить
Компиляция модуля в 1С: что это, виды контекстов (клиент, сервер, внешнее соединение), как настроить в свойствах модуля, типичные ошибки и способы их исправить.
Компиляция модуля в 1С — это преобразование текстового кода на встроенном языке в исполняемый формат перед его выполнением. Когда вы запускаете механизм «Проверка конфигурации» или обновляете конфигурацию базы данных, платформа анализирует текст каждого модуля, проверяет синтаксис и формирует внутреннее представление кода, которое затем выполняется в нужном контексте: на клиенте, на сервере или во внешнем соединении.
Ключевая особенность платформы 1С:Предприятие в том, что один и тот же модуль может компилироваться в нескольких контекстах одновременно. Например, общий модуль с флагами «Клиент (обычное приложение)» и «Сервер» будет скомпилирован дважды — отдельно для клиентской и серверной стороны. Именно поэтому платформа требует явно указывать, где должен выполняться код, и выдаёт ошибки вида «Переменная не определена», если процедура недоступна в текущем контексте компиляции.
Понимание механизма компиляции критично для разработчика: от правильной настройки контекстов зависит, будет ли код работать в тонком клиенте, веб-клиенте, на сервере и при фоновых заданиях. Ошибки компиляции — одна из самых частых причин, почему доработанная конфигурация «не запускается» после обновления.
Что происходит при компиляции модуля
При компиляции платформа выполняет несколько действий: разбирает текст модуля, проверяет синтаксис встроенного языка, разрешает имена переменных, процедур и функций, а также проверяет типы там, где это возможно статически. Результат — скомпилированный образ модуля, привязанный к конкретному контексту исполнения.
Важно понимать, что 1С компилирует модули не в машинный код, а во внутреннее представление, которое исполняется интерпретатором платформы. Поэтому часть ошибок (например, обращение к несуществующему реквизиту объекта) может проявиться только в момент выполнения, а не при компиляции. Однако синтаксические ошибки, обращения к несуществующим процедурам и нарушения контекстной видимости отлавливаются именно на этапе компиляции.
Компиляция выполняется в нескольких ситуациях: при сохранении конфигурации с обновлением конфигурации базы данных, при запуске проверки конфигурации, при первом обращении к модулю в сеансе работы. Если модуль не компилируется, код в нём не выполнится ни при каких условиях.
Виды контекстов компиляции в общих модулях
Для общих модулей контексты компиляции задаются флагами в палитре свойств. Платформа предлагает следующие варианты: «Сервер», «Клиент (обычное приложение)», «Клиент (управляемое приложение)», «Внешнее соединение», а также дополнительные флаги «Вызов сервера» и «Привилегированный режим», влияющие на поведение, а не на сам контекст.
Флаг «Сервер» означает, что модуль компилируется и выполняется на сервере 1С:Предприятия. Такой код имеет доступ к запросам, транзакциям, объектам базы данных, но не может показывать пользователю диалоги и предупреждения. Флаги клиентских контекстов позволяют работать с интерфейсом, но ограничивают прямой доступ к данным — обращение к базе идёт только через серверные вызовы.
Контекст «Внешнее соединение» используется для COM-соединений и автоматизации: модуль доступен при подключении к информационной базе извне. Если модуль должен вызываться и с клиента, и с сервера, разработчики обычно создают пару модулей: клиентский и серверный, либо один модуль с несколькими флагами и директивами компиляции внутри.
| Флаг модуля | Где выполняется | Ключевые ограничения |
|---|---|---|
| Сервер | Сервер 1С | Нет интерфейса, нет модальных окон |
| Клиент (управляемое приложение) | Тонкий/веб-клиент | Нет прямых запросов к БД |
| Клиент (обычное приложение) | Толстый клиент | Не работает в веб-клиенте |
| Внешнее соединение | COM-подключение | Ограниченный набор объектов |
Директивы компиляции внутри кода
Когда один модуль компилируется в нескольких контекстах, внутри него можно разграничить код директивами препроцессора: #Если Сервер Тогда ... #КонецЕсли, #Если Клиент Тогда, #Если ТонкийКлиент Тогда, #Если ВебКлиент Тогда и другими. Директивы работают на этапе компиляции: платформа просто исключает неподходящие ветки из скомпилированного кода конкретного контекста.
В модулях форм, команд и объектов контекст задаётся не флагами, а аннотациями перед процедурами: &НаКлиенте, &НаСервере, &НаСервереБезКонтекста, &НаКлиентеНаСервереБезКонтекста. Эти аннотации фактически определяют, в каком контексте будет скомпилирована конкретная процедура формы. Ошибка в выборе аннотации — типичная причина сообщений «Метод объекта не обнаружен» или «Процедура или функция с указанным именем не определена».
Как выбрать аннотацию для процедуры формы
Если процедура работает с элементами формы, предупреждениями, файлами на компьютере пользователя — это &НаКлиенте. Если нужен запрос к базе или изменение данных — &НаСервере (когда требуется доступ к данным формы) или &НаСервереБезКонтекста (когда достаточно передать параметры, что быстрее и предпочтительнее). Аннотация &НаКлиентеНаСервереБезКонтекста подходит для общих вспомогательных функций без обращения к данным формы и базе.
Как выбрать контекст процедуры
Как проверить компиляцию модулей конфигурации
Полная проверка компиляции выполняется штатным механизмом конфигуратора: меню «Конфигурация → Проверка конфигурации». В окне настроек обязательно отметьте пункты проверки модулей для нужных режимов: «Тонкий клиент», «Веб-клиент», «Сервер», «Внешнее соединение», «Толстый клиент». Если снять галочки, ошибки компиляции в соответствующих контекстах просто не будут обнаружены.
Результат проверки выводится в окно служебных сообщений. Двойной щелчок по ошибке открывает модуль на проблемной строке. Обращайте внимание на контекст, указанный в тексте ошибки: одна и та же строка может быть корректной для сервера и ошибочной для тонкого клиента.
- 1Откройте конфигуратор и загрузите актуальную конфигурацию
- 2Выполните Конфигурация → Проверка конфигурации
- 3Отметьте проверку модулей для всех используемых контекстов: тонкий клиент, веб-клиент, сервер
- 4Запустите проверку и дождитесь завершения
- 5Разберите каждую ошибку, начиная с синтаксических, — они часто вызывают цепочку последующих
- 6Повторите проверку до полного отсутствия ошибок компиляции
Дополнительно полезно выполнить синтаксический контроль отдельного модуля через кнопку «Синтаксический контроль модуля» в редакторе кода. Это быстрая проверка без полного анализа конфигурации, удобная в процессе написания кода. Однако она не заменяет полную проверку: межмодульные вызовы и контекстная видимость проверяются только при компиляции всей конфигурации.
Типичные ошибки компиляции и их причины
Самая частая группа ошибок — «Переменная не определена» и «Процедура или функция с указанным именем не определена». Причины: обращение к процедуре общего модуля, недоступного в текущем контексте (например, вызов клиентского модуля с сервера), опечатка в имени, отсутствие ключевого слова «Экспорт» у вызываемой процедуры.
Вторая группа — ошибки директив компиляции: незакрытый блок #Если ... #КонецЕсли, неверное имя среды в директиве, вложенные директивы с противоречивыми условиями. Третья группа — синтаксические ошибки: пропущенные «КонецЕсли», «КонецЦикла», лишние или недостающие скобки, неправильное использование точки с запятой.
Отдельного внимания заслуживают ошибки вида «Операции сравнения... недопустимы» или обращения к несуществующим методам объектов. Они возникают, когда код писался под один контекст, а компилируется в другом: например, использование Сообщить с модальным выводом в серверном модуле или вызов методов работы с файлами в веб-клиенте без расширения работы с файлами.
Компиляция при обновлении конфигурации базы данных
При обновлении конфигурации базы данных платформа перекомпилирует изменённые модули. Если в коде есть ошибки, обновление может завершиться с предупреждениями, а проблемные механизмы перестанут работать в пользовательском режиме. Поэтому перед обновлением рабочей базы всегда выполняйте полную проверку конфигурации.
Особый случай — динамическое обновление. При нём часть изменений применяется без перезапуска сеансов, но изменения в структуре модулей могут привести к рассогласованию: у пользователя в памяти старый скомпилированный код, а в базе уже новый. Результат — непредсказуемые ошибки в сеансах. После динамического обновления с изменением модулей пользователей следует попросить перезапустить сеанс.
Если после обновления у пользователей появились ошибки «в пустом месте», первым делом проверьте, не остались ли у них старые сеансы, и очистите кэш метаданных на клиентских машинах. Кэшированные скомпилированные модули иногда конфликтуют с новой версией конфигурации.
Практические рекомендации по организации модулей
Правильная структура общих модулей снижает количество проблем с компиляцией. Принятая практика: разделять модули по контекстам и давать им говорящие имена с постфиксами — «Клиент», «Сервер», «ВызовСервера», «КлиентСервер». Например, модуль «РасчетыСервер» содержит только серверную логику, «РасчетыКлиент» — интерфейсную, а «РасчетыКлиентСервер» — функции, безопасные в обоих контекстах.
Минимизируйте количество контекстов у одного модуля: каждый дополнительный флаг — это отдельная компиляция и отдельный набор ограничений, которые нужно соблюдать во всём коде модуля. Модуль со всеми включёнными флагами фактически ограничен пересечением возможностей всех контекстов, что делает его мало полезным.
Что важно запомнить
Компиляция модуля — это подготовка кода к выполнению в конкретном контексте: клиент, сервер, внешнее соединение. Контексты задаются флагами общих модулей, директивами #Если и аннотациями &НаКлиенте/&НаСервере. Проверяйте конфигурацию для всех используемых контекстов перед обновлением рабочей базы — это главная защита от ошибок у пользователей.
Частые вопросы о компиляции модулей 1С
Чем компиляция отличается от синтаксической проверки модуля?
Синтаксический контроль проверяет только грамматику встроенного языка внутри одного модуля. Компиляция дополнительно разрешает ссылки на другие модули, проверяет доступность процедур в текущем контексте и корректность обращений к метаданным. Поэтому модуль может пройти синтаксический контроль, но дать ошибку при компиляции конфигурации.
Почему код работает в толстом клиенте, но не компилируется для тонкого?
Тонкий клиент не поддерживает часть объектов и методов, доступных в толстом: например, прямую работу с некоторыми COM-объектами и ряд устаревших механизмов. Вынесите такой код в серверный модуль или оберните директивой #Если с соответствующим условием, а для тонкого клиента реализуйте альтернативу.
Что означает флаг «Привилегированный режим» у общего модуля?
Он указывает, что весь код модуля выполняется без проверки прав доступа к объектам базы данных. Это удобно для служебных операций, но создаёт риск обхода ограничений прав: включайте флаг только там, где это действительно необходимо, и не выносите в такой модуль код, обрабатывающий пользовательский ввод без контроля.
Нужно ли перезапускать сервер 1С после изменения модулей?
Обычно нет: после обновления конфигурации базы данных новые сеансы получают актуальный скомпилированный код. Перезапуск сервера требуется в редких случаях, например при обновлении самой платформы или при подозрении на повреждение кэша сервера. Пользователям же достаточно перезапустить свои сеансы.
Как найти, какой модуль вызывает ошибку компиляции после доработки?
Запустите проверку конфигурации с отмеченными контекстами и отсортируйте сообщения по модулю. Если ошибок много, начинайте с первых в списке: одна синтаксическая ошибка в популярном общем модуле порождает десятки производных ошибок во всех вызывающих его местах. Исправление первопричины убирает всю цепочку.
Можно ли выполнять код без сохранения в конфигурации?
Да, для разовых задач используются внешние обработки и отчёты: их модули компилируются при открытии файла в режиме предприятия. Это безопасный способ проверить логику без изменения конфигурации. Однако правила контекстов и директив компиляции действуют и там в полном объёме.