Разработка и Конфигурация · 11 мин
Компиляция 1С: что это и как она работает
Компиляция в 1С: что это, как работает преобразование кода в байт-код, зачем нужна компиляция модулей, как исправить ошибки компиляции и проверить конфигурацию.
Компиляция в 1С — это процесс преобразования исходного кода, написанного на встроенном языке платформы, во внутреннее представление (байт-код), которое исполняется движком платформы. В отличие от классических компилируемых языков вроде C++, где компиляция — отдельный явный этап сборки программы, в 1С она происходит автоматически и часто остаётся незаметной для разработчика, пока не возникает ошибка.
Понимание того, как и когда платформа компилирует код, помогает быстрее находить ошибки в модулях, объясняет, почему обновлённый код иногда «не подхватывается» сразу, и почему один и тот же модуль может работать на сервере, но не компилироваться на клиенте. Эти знания особенно важны при доработке типовых конфигураций и при диагностике ошибок вида «Процедура или функция не обнаружена».
Что происходит при компиляции кода 1С
Встроенный язык 1С — интерпретируемый: платформа не создаёт исполняемый файл, а переводит текст модулей в промежуточный байт-код, который затем выполняется виртуальной машиной платформы. Этот перевод и называется компиляцией. Она выполняется для каждого модуля отдельно: модуля объекта, модуля формы, общего модуля, модуля приложения и так далее.
Компиляция включает несколько этапов: синтаксический анализ текста (проверка правильности конструкций языка), разрешение имён (проверка существования вызываемых процедур, функций и переменных в доступном контексте) и генерацию байт-кода. Если хотя бы один этап завершается с ошибкой, модуль считается нескомпилированным, а обращение к нему приводит к сообщению об ошибке.
Когда платформа выполняет компиляцию
Компиляция не запускается вручную как отдельная команда в большинстве случаев — она происходит в определённые моменты жизненного цикла конфигурации. Первый случай — обновление конфигурации базы данных: при сохранении изменений платформа компилирует затронутые модули. Второй — первый вызов процедуры или функции из модуля в ходе сеанса: модуль компилируется «на лету» и результат кэшируется.
Третий случай — явная проверка конфигурации в конфигураторе (меню «Конфигурация — Проверка конфигурации»), где можно включить режим проверки модулей. Именно этот инструмент используют разработчики, чтобы найти ошибки компиляции до того, как с ними столкнутся пользователи. Также компиляция выполняется при загрузке конфигурации из файла и при обмене через хранилище.
- 1Откройте конфигуратор и загрузите конфигурацию
- 2Выберите меню «Конфигурация — Проверка конфигурации»
- 3Отметьте флажок «Проверка логической целостности» и режимы проверки модулей для нужных контекстов (тонкий клиент, веб-клиент, сервер)
- 4Нажмите «Проверить» и дождитесь окончания анализа
- 5Разберите каждое сообщение об ошибке в окне служебных сообщений: двойной щелчок открывает место ошибки в модуле
Контексты компиляции: клиент, сервер, внешнее соединение
Особенность 1С в том, что один и тот же модуль может компилироваться в разных контекстах исполнения, и результат может отличаться. Общий модуль с флажками «Сервер» и «Клиент (обычное приложение)» компилируется отдельно для каждого контекста. Код, допустимый на сервере, может быть недопустим на тонком клиенте — например, прямое обращение к базе данных или использование объектов, недоступных в клиентском контексте.
Директивы препроцессора #Если Сервер Тогда, #Если ТонкийКлиент Тогда и подобные позволяют разграничивать код по контекстам. При компиляции платформа учитывает только ветки, соответствующие текущему контексту. Ошибки часто возникают, когда разработчик проверяет код только в толстом клиенте, а пользователи работают в тонком или веб-клиенте, где контекст урезан.
Контексты компиляции
Полный доступ к объектам базы данных, запросам, прикладным механизмам. Недоступны интерактивные действия с пользователем (предупреждения, вопросы) в асинхронной модели.
Ограниченный контекст: нет прямых запросов к базе, доступны только экспортные процедуры серверных модулей. Самый частый источник ошибок компиляции в управляемых приложениях.
Самый широкий контекст, код обычных форм компилируется здесь. Не подходит для проверки кода, предназначенного для тонкого клиента.
Типичные ошибки компиляции и их причины
Самая распространённая группа ошибок — синтаксические: пропущенные ключевые слова, незакрытые конструкции Если...КонецЕсли, лишние или недостающие скобки, неправильное использование операторов. Такие ошибки конфигуратор подсвечивает ещё при редактировании, если включён контроль синтаксиса, но в больших модулях они легко пропускаются.
Вторая группа — ошибки разрешения имён: «Процедура или функция с указанным именем не определена». Причины: вызов неэкспортной процедуры из другого модуля, опечатка в имени, обращение к общему модулю, у которого снят нужный флажок контекста, или вызов функции, которая существует только в клиентском контексте, из серверного кода.
Третья группа — ошибки после обновления типовой конфигурации: в новой версии поставщика переименовали или удалили процедуру, к которой обращается доработанный код. Такие ошибки проявляются именно как ошибки компиляции при первом вызове модуля, а не при обновлении, если проверка модулей не выполнялась.
Как исправить ошибку компиляции: порядок действий
Начните с точного текста сообщения об ошибке. Платформа указывает модуль, строку и характер проблемы. Двойной щелчок по сообщению в окне проверки конфигурации открывает модуль на нужной строке. Если ошибка синтаксическая — исправьте конструкцию и повторите проверку. Если ошибка связана с необнаруженной процедурой — проверьте экспортность вызываемого метода, правильность имени и доступность модуля в текущем контексте.
Если ошибка появляется только у пользователей, но не у вас в конфигураторе, почти наверняка проблема в контексте: вы работаете в толстом клиенте или с полными правами, а пользователь — в тонком клиенте. Воспроизведите ошибку в том же режиме запуска, что и у пользователя, затем включите проверку конфигурации для соответствующего контекста.
После исправления обязательно выполните полную проверку конфигурации для всех используемых контекстов и протестируйте сценарий, в котором ошибка возникала. В клиент-серверном варианте бывает полезно очистить кэш метаданных на клиенте, если платформа продолжает показывать старую ошибку после исправления — хотя обычно обновление конфигурации базы данных сбрасывает скомпилированный код автоматически.
Компиляция внешних обработок и расширений
Внешние обработки и отчёты (файлы .epf и .erf) компилируются при открытии: платформа загружает модуль объекта и модули форм и выполняет их компиляцию в контексте текущего клиента. Поэтому обработка, написанная и проверенная в толстом клиенте, может не открыться в тонком — типичная ситуация для старых разработок, переносимых в управляемое приложение.
Расширения конфигурации компилируются при подключении к сеансу. Если расширение содержит код, несовместимый с текущей версией основной конфигурации (например, обращается к переименованной процедуре), ошибка компиляции проявится при запуске сеанса. После каждого обновления основной конфигурации расширения следует проверять на совместимость и при необходимости дорабатывать.
Как ускорить поиск и предотвратить ошибки компиляции
Включите в конфигураторе автоматическую проверку синтаксиса при редактировании модулей — платформа подчёркивает ошибки до сохранения. Для больших доработок используйте расширенную проверку конфигурации с указанием всех контекстов исполнения, которые реально используются в вашем режиме работы: тонкий клиент, веб-клиент, сервер.
В командной разработке полезно включить проверку конфигурации в процесс выгрузки в хранилище или в CI-конвейер: платформа поддерживает пакетный режим конфигуратора, где проверка запускается из командной строки. Это позволяет перехватывать ошибки компиляции до попадания кода в рабочую базу. Также держите под рукой тестовую базу с тем же режимом запуска, что и рабочая, — многие контекстные ошибки видны только там.
"C:\Program Files\1cv8\<версия>\bin\1cv8.exe" DESIGNER /F"C:\Bases\Test" /N"Администратор" /CheckConfig -ClientServer /ThinClientЧастые вопросы о компиляции в 1С
Чем компиляция в 1С отличается от компиляции в C++ или C#?
В 1С не создаётся исполняемый файл или сборка: код переводится в байт-код и исполняется виртуальной машиной платформы. Процесс автоматический и скрытый, нет отдельного шага сборки проекта. Поэтому ошибки компиляции в 1С часто обнаруживаются только в момент выполнения, если не выполнять проверку конфигурации вручную.
Почему после обновления конфигурации появилась ошибка «Процедура не обнаружена»?
Чаще всего в новой версии поставщика процедура была переименована, удалена или лишилась ключевого слова «Экспорт», а ваш доработанный код продолжает к ней обращаться. Найдите вызов по тексту ошибки, сверьте имя с актуальным составом общего модуля и скорректируйте обращение.
Код работает у меня, но не работает у пользователя. Это ошибка компиляции?
Очень вероятно. Проверьте, в каком клиенте работает пользователь: если вы тестируете в толстом клиенте, а пользователь — в тонком или веб-клиенте, модуль может не компилироваться в его контексте. Выполните проверку конфигурации с флажками соответствующих контекстов.
Нужно ли компилировать конфигурацию после изменения одного модуля?
Отдельной команды для этого нет: при обновлении конфигурации базы данных платформа перекомпилирует изменённые модули автоматически. Однако перед обновлением рабочей базы рекомендуется выполнить проверку конфигурации, чтобы убедиться в отсутствии ошибок.
Что делать, если ошибка компиляции указывает на строку, где всё написано правильно?
Платформа иногда указывает не точное место, а точку, где анализатор «споткнулся». Проверьте несколько строк выше: незакрытая конструкция «Если», лишняя «КонецПроцедуры» или незакрытая скобка часто смещают указанную позицию ошибки.
Влияет ли компиляция на скорость работы 1С?
Сама компиляция выполняется один раз — при обновлении конфигурации или первом обращении к модулю, результат кэшируется. На постоянную скорость работы она влияет незначительно, но первый вызов «холодного» модуля может занять заметное время в больших конфигурациях.
Что важно запомнить
Компиляция в 1С — автоматическое преобразование кода модулей в байт-код, выполняемое платформой при обновлении конфигурации и первом обращении к модулю. Ошибки компиляции возникают из-за синтаксических проблем, недоступных в контексте вызовов и несовместимости доработок с обновлённой конфигурацией. Регулярная проверка конфигурации для всех используемых контекстов — основной способ находить такие ошибки до пользователей.