К статье
Практический материал

Разработка и Конфигурация · 11 мин

Компиляция 1С: что это и как она работает

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

Компиляция в 1С — это процесс преобразования исходного кода, написанного на встроенном языке платформы, во внутреннее представление (байт-код), которое исполняется движком платформы. В отличие от классических компилируемых языков вроде C++, где компиляция — отдельный явный этап сборки программы, в 1С она происходит автоматически и часто остаётся незаметной для разработчика, пока не возникает ошибка.

Понимание того, как и когда платформа компилирует код, помогает быстрее находить ошибки в модулях, объясняет, почему обновлённый код иногда «не подхватывается» сразу, и почему один и тот же модуль может работать на сервере, но не компилироваться на клиенте. Эти знания особенно важны при доработке типовых конфигураций и при диагностике ошибок вида «Процедура или функция не обнаружена».

Что происходит при компиляции кода 1С

Встроенный язык 1С — интерпретируемый: платформа не создаёт исполняемый файл, а переводит текст модулей в промежуточный байт-код, который затем выполняется виртуальной машиной платформы. Этот перевод и называется компиляцией. Она выполняется для каждого модуля отдельно: модуля объекта, модуля формы, общего модуля, модуля приложения и так далее.

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

Когда платформа выполняет компиляцию

Компиляция не запускается вручную как отдельная команда в большинстве случаев — она происходит в определённые моменты жизненного цикла конфигурации. Первый случай — обновление конфигурации базы данных: при сохранении изменений платформа компилирует затронутые модули. Второй — первый вызов процедуры или функции из модуля в ходе сеанса: модуль компилируется «на лету» и результат кэшируется.

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

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

Контексты компиляции: клиент, сервер, внешнее соединение

Особенность 1С в том, что один и тот же модуль может компилироваться в разных контекстах исполнения, и результат может отличаться. Общий модуль с флажками «Сервер» и «Клиент (обычное приложение)» компилируется отдельно для каждого контекста. Код, допустимый на сервере, может быть недопустим на тонком клиенте — например, прямое обращение к базе данных или использование объектов, недоступных в клиентском контексте.

Директивы препроцессора #Если Сервер Тогда, #Если ТонкийКлиент Тогда и подобные позволяют разграничивать код по контекстам. При компиляции платформа учитывает только ветки, соответствующие текущему контексту. Ошибки часто возникают, когда разработчик проверяет код только в толстом клиенте, а пользователи работают в тонком или веб-клиенте, где контекст урезан.

Контексты компиляции

Сервер

Полный доступ к объектам базы данных, запросам, прикладным механизмам. Недоступны интерактивные действия с пользователем (предупреждения, вопросы) в асинхронной модели.

Тонкий/веб-клиент

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

Толстый клиент (обычное приложение)

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

Типичные ошибки компиляции и их причины

Самая распространённая группа ошибок — синтаксические: пропущенные ключевые слова, незакрытые конструкции Если...КонецЕсли, лишние или недостающие скобки, неправильное использование операторов. Такие ошибки конфигуратор подсвечивает ещё при редактировании, если включён контроль синтаксиса, но в больших модулях они легко пропускаются.

Вторая группа — ошибки разрешения имён: «Процедура или функция с указанным именем не определена». Причины: вызов неэкспортной процедуры из другого модуля, опечатка в имени, обращение к общему модулю, у которого снят нужный флажок контекста, или вызов функции, которая существует только в клиентском контексте, из серверного кода.

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

Типичные ошибки разработчиков
01
Проверка кода только в толстом клиенте — в тонком клиенте модуль не компилируется, пользователи получают ошибку при запуске
02
Вызов неэкспортной процедуры общего модуля — ошибка «Процедура не обнаружена» при первом обращении
03
Обращение к переменной вне области видимости — ошибка компиляции модуля формы после неудачного рефакторинга
04
Пропуск проверки конфигурации перед выгрузкой в рабочую базу — синтаксические ошибки обнаруживаются уже у пользователей

Как исправить ошибку компиляции: порядок действий

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

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

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

Компиляция внешних обработок и расширений

Внешние обработки и отчёты (файлы .epf и .erf) компилируются при открытии: платформа загружает модуль объекта и модули форм и выполняет их компиляцию в контексте текущего клиента. Поэтому обработка, написанная и проверенная в толстом клиенте, может не открыться в тонком — типичная ситуация для старых разработок, переносимых в управляемое приложение.

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

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

Включите в конфигураторе автоматическую проверку синтаксиса при редактировании модулей — платформа подчёркивает ошибки до сохранения. Для больших доработок используйте расширенную проверку конфигурации с указанием всех контекстов исполнения, которые реально используются в вашем режиме работы: тонкий клиент, веб-клиент, сервер.

В командной разработке полезно включить проверку конфигурации в процесс выгрузки в хранилище или в CI-конвейер: платформа поддерживает пакетный режим конфигуратора, где проверка запускается из командной строки. Это позволяет перехватывать ошибки компиляции до попадания кода в рабочую базу. Также держите под рукой тестовую базу с тем же режимом запуска, что и рабочая, — многие контекстные ошибки видны только там.

text
"C:\Program Files\1cv8\<версия>\bin\1cv8.exe" DESIGNER /F"C:\Bases\Test" /N"Администратор" /CheckConfig -ClientServer /ThinClient

Частые вопросы о компиляции в 1С

Чем компиляция в 1С отличается от компиляции в C++ или C#?

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

Почему после обновления конфигурации появилась ошибка «Процедура не обнаружена»?

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

Код работает у меня, но не работает у пользователя. Это ошибка компиляции?

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

Нужно ли компилировать конфигурацию после изменения одного модуля?

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

Что делать, если ошибка компиляции указывает на строку, где всё написано правильно?

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

Влияет ли компиляция на скорость работы 1С?

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

Итог

Что важно запомнить

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