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