Разработка и Конфигурация · 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-объектами и внешними компонентами, что защищает сервер от вредоносного кода.
Типизация и работа с данными
Язык 1С — язык с динамической типизацией: переменные объявляются без указания типа (точнее, без явного объявления вообще), и тип значения определяется в момент присваивания. Одна и та же переменная может последовательно хранить число, строку и ссылку на документ. Это ускоряет написание кода, но переносит обнаружение многих ошибок с этапа компиляции на этап исполнения.
Набор встроенных типов отражает прикладную направленность: примитивы (Число, Строка, Дата, Булево, Неопределено, NULL), универсальные коллекции (Массив, Структура, Соответствие, СписокЗначений, ТаблицаЗначений) и типы, жёстко связанные с метаданными, — ссылки и объекты справочников, документов, регистров. Тип «Дата» в 1С всегда содержит и дату, и время с точностью до секунды, что часто становится источником ошибок при сравнениях: две «одинаковые» даты могут различаться временем.
Отдельная опора языка — встроенный язык запросов, синтаксически похожий на SQL, но работающий с объектами метаданных, а не с физическими таблицами СУБД. Платформа транслирует запрос в диалект конкретной базы данных (MS SQL, PostgreSQL, Oracle, IBM Db2 или файловый вариант). Разработчик конфигурации, как правило, не пишет SQL напрямую — это одно из принципиальных отличий от разработки на универсальных языках.
Связь языка с метаданными
Главное, что отличает язык 1С от любого универсального, — он не существует отдельно от конфигурации. Состав объектов языка (имена типов, реквизитов, методов) формируется метаданными: как только в конфигураторе создан документ «РеализацияТоваров», в языке появляются типы ДокументОбъект.РеализацияТоваров и ДокументСсылка.РеализацияТоваров, а в языке запросов — таблица «Документ.РеализацияТоваров».
Код распределяется по модулям, привязанным к объектам: модуль объекта, модуль формы, модуль менеджера, общие модули, модуль приложения. Платформа сама вызывает нужные обработчики событий — ПередЗаписью, ПриПроведении, ОбработкаПроведения — в определённые моменты жизненного цикла объекта. Разработчик не управляет главным циклом программы: он вставляет свою логику в предопределённые точки, а инфраструктурой (транзакции, блокировки, кэширование) управляет платформа.
Такая модель резко снижает порог входа — не нужно писать слой доступа к данным, сериализацию, управление соединениями. Плата за это — зависимость от платформы: код на встроенном языке нельзя выполнить вне «1С:Предприятия» и нельзя перенести в другую среду без полного переписывания.
Сравнение с универсальными языками
Оптимален для учётной логики внутри платформы: запросы, проведение, отчёты. Ограничение — не исполняется вне платформы, слабые средства для системного программирования
Подходят для внешних сервисов, интеграций и высоконагруженных вычислений рядом с 1С. Потребуют самостоятельной реализации доступа к данным и бизнес-объектов
Применяются для узких задач: работа с оборудованием, криптография, специфические протоколы. Требуют навыков C++ и усложняют развёртывание
Что это значит на практике для разработчика
Знание устройства языка помогает принимать правильные решения при доработке конфигураций. Первое следствие: узкие места производительности почти всегда находятся не в «медленном языке», а в неоптимальных запросах и лишних серверных вызовах. Прежде чем выносить вычисления во внешнюю компоненту, стоит проверить запросы в консоли и замерить исполнение.
Второе следствие: перенос навыков. Программисту с опытом C# или Python синтаксис 1С осваивается за дни, но продуктивная работа требует понимания метаданных, событийной модели и механизмов платформы — именно они, а не язык, составляют основную сложность. Обратный перенос сложнее: опыт только на встроенном языке 1С даёт слабое представление о ручном управлении памятью, многопоточности и SQL на уровне СУБД.
Третье следствие: границы применимости. Встроенный язык не предназначен для многопоточных вычислений внутри сеанса, прямой работы с сокетами, сложной математики или разработки интерфейсов за пределами возможностей управляемых форм. Для таких задач рядом с 1С разворачивают внешние сервисы и связывают их через HTTP или очереди сообщений.
Как выбрать инструмент под задачу
Проверка понимания и частые заблуждения
Распространённое заблуждение — «1С написана на 1С». Платформа и конфигурация — разные слои: платформа написана на C++ и поставляется в скомпилированном виде, конфигурация — на встроенном языке и поставляется с исходными текстами (если поставщик их не закрыл). Дорабатывать можно только конфигурацию; поведение самой платформы изменить нельзя, можно лишь использовать её механизмы.
Второе заблуждение — «язык 1С это русский SQL». Язык запросов действительно напоминает SQL, но встроенный язык — это полноценный императивный язык с процедурами, функциями, коллекциями, обработкой исключений (Попытка…Исключение…КонецПопытки) и работой со строками, файлами и сериализацией. Запросы — лишь одна из его подсистем.
Третье заблуждение — «раз есть английский синтаксис, код можно писать как на любом языке». Английские ключевые слова меняют только лексику, но не семантику: модель исполнения, контексты и связь с метаданными остаются специфическими для 1С, и переносить приёмы из других экосистем напрямую нельзя.
Что важно запомнить
Встроенный язык 1С — самостоятельный предметно-ориентированный язык, а не производная от C++ или SQL. Платформа, исполняющая его, написана на C++, а код конфигураций компилируется во внутренний байт-код. Сила языка — в тесной связи с метаданными и учётной моделью; его ограничения — зависимость от платформы и непригодность для системных задач.
Частые вопросы
Язык 1С написан на русском — значит, это отдельный язык программирования?
Да. Русские ключевые слова — это лишь лексическое оформление, но сам язык действительно самостоятельный: у него собственная грамматика, компилятор в байт-код и виртуальная машина в составе платформы. Английский синтаксис существует как равноправная альтернатива, но не делает язык «диалектом» чего-либо.
На каком языке написана сама платформа 1С:Предприятие?
Ядро платформы разработано преимущественно на C++. Это касается исполняемых файлов сервера, клиентских приложений и конфигуратора. Прикладной разработчик с этим кодом не соприкасается: он работает только со встроенным языком и объектной моделью, которую платформа предоставляет.
Можно ли выполнить код на встроенном языке 1С вне платформы?
Нет. Код компилируется в закрытый байт-код и исполняется только виртуальной машиной «1С:Предприятия», к тому же большинство типов и методов существуют лишь в контексте метаданных конкретной конфигурации. Перенос логики в другую среду означает фактически переписывание на другом языке.
Чем язык запросов 1С отличается от обычного SQL?
Язык запросов 1С оперирует объектами метаданных (документы, справочники, регистры), а не физическими таблицами, и платформа сама транслирует его в диалект используемой СУБД. Он поддерживает специфические конструкции — виртуальные таблицы, итоги, иерархию, различие периодов, — которых нет в стандартном SQL, но при этом не даёт прямого доступа к возможностям конкретной базы данных.
Сложно ли освоить язык 1С программисту с опытом в других языках?
Синтаксис осваивается быстро — язык небольшой и без сложных концепций вроде указателей или ручного управления памятью. Основное время уходит на изучение метаданных, событийной модели, механизмов проведения и контекстов исполнения, потому что реальная сложность разработки в 1С заключена в платформе, а не в самом языке.
Правда ли, что 1С медленная из-за интерпретируемого языка?
Байт-код действительно исполняется медленнее нативного кода, но в типовых задачах основное время тратится на работу с базой данных, а не на вычисления в коде. Практика показывает, что «тормоза» почти всегда вызваны неоптимальными запросами, лишними серверными вызовами или обращениями к данным в цикле, а не скоростью самого языка.