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

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

На чём основан язык 1С и как устроен встроенный язык платформы

Разбираем, на чём основан язык 1С: синтаксис, модель исполнения, связь с платформой, отличия от C++, Java и 1C:Enterprise script. Практические пояснения для разработчиков.

Встроенный язык 1С — это не адаптация какого-либо существующего языка программирования, а самостоятельная разработка фирмы «1С», созданная специально для описания бизнес-логики внутри платформы «1С:Предприятие». У него нет «родительского» языка вроде C или Pascal, хотя по стилю синтаксиса он ближе всего к семейству BASIC и Pascal: ключевые слова вроде «Если…Тогда…КонецЕсли», «Процедура…КонецПроцедуры», отсутствие фигурных скобок и обязательной точки с запятой после каждой конструкции (она ставится, но как завершитель оператора).

При этом сама платформа, которая исполняет этот язык, написана преимущественно на C++. Это частый источник путаницы: разработчик конфигурации никогда не работает с C++ напрямую, но именно C++-ядро платформы интерпретирует и компилирует байт-код, в который превращаются модули конфигурации. Понимание этой двухуровневой структуры помогает правильно оценивать производительность кода и ограничения языка.

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

Собственный язык, а не надстройка над чужим

Главный факт, который нужно зафиксировать: встроенный язык 1С не «основан» на каком-либо популярном языке программирования. Он проектировался с нуля под конкретную задачу — описание прикладной логики учёта: проведение документов, расчёт итогов, формирование отчётов, работа с регистрами и справочниками. Поэтому в нём изначально заложены понятия предметной области, которых нет в универсальных языках: запросы к данным как часть синтаксиса, встроенные типы «ДокументОбъект», «СправочникСсылка», механизм проведения.

По стилистике язык ближе всего к BASIC и Pascal: блочная структура через служебные слова, а не скобки; нечувствительность к регистру идентификаторов; ключевые слова на русском языке с английскими синонимами («Если» / «If», «Цикл» / «Do»). Разработчик может смешивать русские и английские варианты, хотя на практике в типовых конфигурациях используется русский синтаксис.

Важно не путать встроенный язык с внешними средствами расширения: COM-объекты, внешние компоненты по технологии Native API и Web-сервисы позволяют подключать код на C++, C# или других языках, но это дополнение, а не основа. Ядро прикладной логики любой конфигурации — всегда встроенный язык.

Двухуровневая архитектура: C++-ядро и байт-код

Платформа «1С:Предприятие» — это исполняемая среда, написанная на C++. Когда разработчик сохраняет конфигурацию, тексты модулей компилируются не в машинный код процессора, а во внутренний байт-код платформы. При выполнении этот байт-код интерпретируется виртуальной машиной, встроенной в платформу. Такая схема похожа на модель Java (JVM) или .NET (CLR), но байт-код 1С закрыт и не документирован для внешнего использования.

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

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

Модель исполнения: клиент, сервер и контексты

Одна из ключевых особенностей языка 1С — привязка кода к месту исполнения. Один и тот же модуль может компилироваться в нескольких контекстах: на тонком клиенте, толстом клиенте, веб-клиенте и на сервере. Директивы компиляции &НаКлиенте, &НаСервере, &НаСервереБезКонтекста определяют, где будет выполняться процедура и какие объекты ей доступны.

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

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

Типичные ошибки
01
Вызов серверной процедуры внутри цикла на клиенте — каждый вызов это сетевой обмен, форма «зависает» на секунды при сотнях итераций
02
Попытка обратиться к реквизиту формы из процедуры &НаСервереБезКонтекста — такой контекст не имеет доступа к данным формы, код не скомпилируется
03
Игнорирование директив компиляции при переносе кода между модулями — процедура, работавшая в общем модуле, ломается в модуле формы

Типизация и работа с данными

Язык 1С — язык с динамической типизацией: переменные объявляются без указания типа (точнее, без явного объявления вообще), и тип значения определяется в момент присваивания. Одна и та же переменная может последовательно хранить число, строку и ссылку на документ. Это ускоряет написание кода, но переносит обнаружение многих ошибок с этапа компиляции на этап исполнения.

Набор встроенных типов отражает прикладную направленность: примитивы (Число, Строка, Дата, Булево, Неопределено, NULL), универсальные коллекции (Массив, Структура, Соответствие, СписокЗначений, ТаблицаЗначений) и типы, жёстко связанные с метаданными, — ссылки и объекты справочников, документов, регистров. Тип «Дата» в 1С всегда содержит и дату, и время с точностью до секунды, что часто становится источником ошибок при сравнениях: две «одинаковые» даты могут различаться временем.

Отдельная опора языка — встроенный язык запросов, синтаксически похожий на SQL, но работающий с объектами метаданных, а не с физическими таблицами СУБД. Платформа транслирует запрос в диалект конкретной базы данных (MS SQL, PostgreSQL, Oracle, IBM Db2 или файловый вариант). Разработчик конфигурации, как правило, не пишет SQL напрямую — это одно из принципиальных отличий от разработки на универсальных языках.

Связь языка с метаданными

Главное, что отличает язык 1С от любого универсального, — он не существует отдельно от конфигурации. Состав объектов языка (имена типов, реквизитов, методов) формируется метаданными: как только в конфигураторе создан документ «РеализацияТоваров», в языке появляются типы ДокументОбъект.РеализацияТоваров и ДокументСсылка.РеализацияТоваров, а в языке запросов — таблица «Документ.РеализацияТоваров».

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

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

Сравнение с универсальными языками

Встроенный язык 1С

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

C# / Java

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

Внешние компоненты (Native API, COM)

Применяются для узких задач: работа с оборудованием, криптография, специфические протоколы. Требуют навыков C++ и усложняют развёртывание

Что это значит на практике для разработчика

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

Второе следствие: перенос навыков. Программисту с опытом C# или Python синтаксис 1С осваивается за дни, но продуктивная работа требует понимания метаданных, событийной модели и механизмов платформы — именно они, а не язык, составляют основную сложность. Обратный перенос сложнее: опыт только на встроенном языке 1С даёт слабое представление о ручном управлении памятью, многопоточности и SQL на уровне СУБД.

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

Маршрут решения

Как выбрать инструмент под задачу

Нужно изменить логику проведения, печатную форму или отчётИспользуйте встроенный язык — это его прямое назначение, внешние средства только усложнят сопровождение
Нужны тяжёлые вычисления или работа со специфическим оборудованиемРассмотрите внешнюю компоненту по Native API или отдельный сервис с обменом через HTTP
Нужна интеграция с внешней системойИспользуйте HTTP-сервисы и HTTPСоединение встроенного языка — платформа имеет достаточные средства без внешних библиотек
Код должен работать в файловой и клиент-серверной базе одинаковоПишите только на встроенном языке и избегайте прямых обращений к СУБД и файловой системе сервера

Проверка понимания и частые заблуждения

Распространённое заблуждение — «1С написана на 1С». Платформа и конфигурация — разные слои: платформа написана на C++ и поставляется в скомпилированном виде, конфигурация — на встроенном языке и поставляется с исходными текстами (если поставщик их не закрыл). Дорабатывать можно только конфигурацию; поведение самой платформы изменить нельзя, можно лишь использовать её механизмы.

Второе заблуждение — «язык 1С это русский SQL». Язык запросов действительно напоминает SQL, но встроенный язык — это полноценный императивный язык с процедурами, функциями, коллекциями, обработкой исключений (Попытка…Исключение…КонецПопытки) и работой со строками, файлами и сериализацией. Запросы — лишь одна из его подсистем.

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

Итог

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

Встроенный язык 1С — самостоятельный предметно-ориентированный язык, а не производная от C++ или SQL. Платформа, исполняющая его, написана на C++, а код конфигураций компилируется во внутренний байт-код. Сила языка — в тесной связи с метаданными и учётной моделью; его ограничения — зависимость от платформы и непригодность для системных задач.

Частые вопросы

Язык 1С написан на русском — значит, это отдельный язык программирования?

Да. Русские ключевые слова — это лишь лексическое оформление, но сам язык действительно самостоятельный: у него собственная грамматика, компилятор в байт-код и виртуальная машина в составе платформы. Английский синтаксис существует как равноправная альтернатива, но не делает язык «диалектом» чего-либо.

На каком языке написана сама платформа 1С:Предприятие?

Ядро платформы разработано преимущественно на C++. Это касается исполняемых файлов сервера, клиентских приложений и конфигуратора. Прикладной разработчик с этим кодом не соприкасается: он работает только со встроенным языком и объектной моделью, которую платформа предоставляет.

Можно ли выполнить код на встроенном языке 1С вне платформы?

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

Чем язык запросов 1С отличается от обычного SQL?

Язык запросов 1С оперирует объектами метаданных (документы, справочники, регистры), а не физическими таблицами, и платформа сама транслирует его в диалект используемой СУБД. Он поддерживает специфические конструкции — виртуальные таблицы, итоги, иерархию, различие периодов, — которых нет в стандартном SQL, но при этом не даёт прямого доступа к возможностям конкретной базы данных.

Сложно ли освоить язык 1С программисту с опытом в других языках?

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

Правда ли, что 1С медленная из-за интерпретируемого языка?

Байт-код действительно исполняется медленнее нативного кода, но в типовых задачах основное время тратится на работу с базой данных, а не на вычисления в коде. Практика показывает, что «тормоза» почти всегда вызваны неоптимальными запросами, лишними серверными вызовами или обращениями к данным в цикле, а не скоростью самого языка.