Встроенный язык 1С: где он на шкале от ассемблера до Python
Содержание
Встроенный язык 1С относится к языкам высокого уровня. Он не привязан к процессору, не работает с адресами памяти и исполняется виртуальной машиной платформы. Среднего и низкого уровня в нём нет: ни указателей, ни ручного выделения памяти, ни доступа к регистрам.
Путаница возникает из-за слова «средний». В учебниках так иногда называют C, потому что он сочетает удобный синтаксис с прямой работой с памятью. 1С к этой группе не относится. Ближе всего он к скриптовым языкам вроде Visual Basic for Applications или Python, но с важной оговоркой: это язык предметной области, а не универсальный.
Что такое уровень языка и по каким признакам его определяют
Уровень языка показывает, насколько он далёк от машины. Чем дальше, тем меньше приходится думать про железо и тем больше можно сделать одной строкой.
Упрощённо шкала выглядит так:
| Уровень | Примеры | Что делает программист |
|---|---|---|
| Низкий | машинный код, ассемблер | пишет команды процессора, сам размещает данные |
| Средний (условно) | C | работает с указателями и памятью, но синтаксис уже человеческий |
| Высокий | Java, C#, Python, JavaScript | оперирует объектами и коллекциями, память освобождает среда |
| Предметно-ориентированный | язык запросов, встроенный язык 1С, VBA | решает задачи узкой области готовыми объектами |
Определяют уровень по четырём признакам:
- 🧠 Управление памятью. Нужно ли выделять и освобождать её вручную.
- 🔗 Привязка к платформе. Один и тот же код идёт на разное железо без правок или нет.
- 🧱 Абстракции. Есть ли встроенные коллекции, строки, даты, работа с базой без драйверов.
- ⚙️ Исполнение. Компилируется в машинный код или выполняется средой.
Чёткой границы между «средним» и «высоким» нет. Это ориентир для разговора, а не стандарт.
Почему 1С плохо ложится в классическую шкалу
Язык создавался не как универсальный. Он нужен, чтобы описывать учёт: документы, справочники, регистры, отчёты. Поэтому в нём нет того, ради чего придумывали C: нет драйверов, потоков операционной системы, прямой работы с сетевыми сокетами.
Зато есть то, чего нет в универсальных языках из коробки:
- типы
СправочникСсылка.Номенклатура,ДокументОбъект.РеализацияТоваровУслугпрямо в языке; - встроенный язык запросов, похожий на SQL, с виртуальными таблицами остатков и оборотов;
- проведение документа по регистрам как штатная операция;
- права доступа и ролевая модель на уровне платформы.
В итоге язык 1С нельзя честно поставить на одну ось с C и Python. Он решает другую задачу. Это как сравнивать SQL и Rust: оба языки, но уровень «высокий» у них означает разное.
Есть и смешной нюанс. Код 1С привязан не к процессору, а к платформе. Одна и та же конфигурация работает под Windows и Linux, в файловом и клиент-серверном режиме. Для программиста разница в железе невидима, а это признак высокого уровня.
Как 1С выглядит рядом с другими языками
Сравним по тем самым признакам.
| Признак | 1С | Python | Java | C |
|---|---|---|---|---|
| Память | автоматически | автоматически | сборщик мусора | вручную |
| Типизация | динамическая | динамическая | статическая | статическая |
| Исполнение | байт-код в среде платформы | интерпретатор | виртуальная машина JVM | машинный код |
| Указатели | нет | нет | ссылки без арифметики | есть |
| База данных | встроена в язык | через библиотеки | через JDBC и ORM | через драйверы |
| Универсальность | прикладной учёт | общая | общая | общая |
Вывод из таблицы простой. По памяти, типизации и исполнению 1С стоит рядом с Python и Java. По универсальности он сильно уже.
Один и тот же приём на разных языках
Допустим, нужно пройти по таблице и сложить сумму. В 1С это выглядит так:
Итог = 0;
Для Каждого Строка Из ТаблицаТоваров Цикл
Итог = Итог + Строка.Сумма;
КонецЦикла;
В C тот же результат потребует знать размер массива, тип элемента и следить за границами. В 1С достаточно обойти коллекцию, а тип поля платформа определит сама.
Ещё одна деталь: код 1С можно писать по-русски и по-английски. Если и If, Цикл и Do равноправны. Это тоже сигнал языка, ориентированного на людей, а не на машину.
Доводы за высокий уровень
Основных доводов пять, и все проверяемые:
- Память управляется автоматически. Объект, на который не осталось ссылок, платформа освобождает сама. Утечки через забытый
freeв 1С невозможны по определению. - Динамическая типизация. Переменная не объявляется с типом, а получает его в момент присваивания. Тип можно узнать функцией
ТипЗнч(). - Нет указателей. Все объекты передаются по ссылке неявно, но арифметики адресов нет.
- Готовые объекты.
Массив,Структура,Соответствие,ТаблицаЗначений,ТекстовыйДокументи десятки других доступны без подключения библиотек. - Переносимость. Код не зависит от архитектуры процессора и операционной системы сервера.
Если спросить разработчика, который писал на C, почему он считает 1С высоким уровнем, он обычно называет третий пункт: «здесь нечем выстрелить себе в ногу».
Аргументы в пользу «низкого» или «среднего»
Такие мнения встречаются, и у них есть основания. Разберём честно.
Что приводят сторонники
- 🔧 Жёсткая привязка к платформе. Без 1С:Предприятия код не запустить нигде.
- 🐌 Скорость. Для тяжёлых вычислений язык медленнее компилируемых, поэтому узкие места часто выносят в запросы.
- 📦 Ограниченные возможности. Нет классов в привычном смысле, нет наследования, нет многопоточности как в универсальных языках.
- 🧩 Мало «чистых» абстракций. Много кода уходит на служебные операции: открыть форму, передать параметры, обработать события.
Что в этих доводах не так
Скорость и узость возможностей не определяют уровень языка. Python тоже медленнее C, но от этого не становится низкоуровневым. Отсутствие наследования в 1С говорит не о «низком» уровне, а о выбранной модели: объекты платформы создаются конструкторами метаданных, а не руками разработчика.
Среди тех, кто называет 1С «средним», есть и разумная версия: это язык низкого порога входа, но с богатой прикладной частью. Правильнее сказать «высокий, но прикладной».
Не путайте уровень языка с уровнем сложности задач. Простой код на ассемблере может быть короче сложного на 1С. Уровень отвечает на вопрос «насколько далеко от машины», а не «насколько трудно».
Что это даёт разработчику на практике
Классификация не академическая, из неё следуют рабочие выводы.
Когда пригодится знание, что язык высокого уровня
- 🧮 Оценка скорости. Каждое обращение к базе в цикле стоит дорого, а сложение чисел почти ничего. Поэтому оптимизация в 1С — это в первую очередь запросы, а не микротонкости арифметики.
- 🚫 Нельзя рассчитывать на контроль над памятью. Если очередной массив разросся до миллионов элементов, поможет только изменение алгоритма, а не ручное освобождение.
- 📡 Интеграции. Для работы с оборудованием, сетью и нестандартными форматами приходится подключать внешние компоненты, обычно написанные на C++. Именно они закрывают то, что язык высокого уровня не умеет.
Как это влияет на переход на другие языки
Разработчик 1С, который идёт в Python или JavaScript, привыкает к новому быстро: динамическая типизация, коллекции и циклы знакомы. Труднее всего даётся то, что в 1С скрыто платформой: асинхронность, управление зависимостями, работа с файлами и сетью напрямую.
Обратный путь сложнее в другую сторону. Программисту на Java непривычно, что формы, права и хранение данных описываются конфигуратором, а не кодом.
Чек-лист для резюме и собеседования
Язык запросов и контексты исполнения: что ещё поднимает уровень
Помимо основного языка в платформе есть второй, декларативный: язык запросов. Он описывает, какие данные нужны, а не как их доставать. Выборка остатков по складу за пару строк ВЫБРАТЬ ... ИЗ РегистрНакопления.ТоварыНаСкладах.Остатки(...) заменяет сотни строк ручного обхода таблиц. Платформа сама превращает запрос в SQL для конкретной СУБД. Это ещё один шаг вверх по шкале: программист не знает, какая база стоит под конфигурацией.
Второй пример — разделение контекстов. Процедуры помечаются директивами &НаКлиенте и &НаСервере. Разработчик пишет код как единое целое, а платформа решает, где он исполнится и как передать данные между клиентом и сервером. В универсальных языках для этого пришлось бы вручную строить сетевой протокол.
Мини-кейс: одна задача на двух уровнях
Нужно получить сумму продаж по контрагенту за месяц.
- Ручной обход. Загрузить все документы в таблицу, пройти циклом, отфильтровать по дате и контрагенту, сложить. Работает, но на сотнях тысяч документов тормозит, потому что каждая строка проходит через клиента.
- Запрос. Одна выборка с условием и группировкой, расчёт на стороне СУБД. Время падает в десятки раз.
Урок для практики: чем выше уровень абстракции, тем важнее выбрать правильный инструмент платформы. Знание «высокий или низкий» здесь превращается в привычку не писать циклы там, где справится запрос.
Чего в языке нет и чем это компенсируется
Новички часто ищут в 1С то, что есть в универсальных языках, и удивляются. Вот короткий список отсутствующего и штатных обходных путей:
| Чего нет | Чем заменяют |
|---|---|
| Классов и наследования своими руками | общие модули, расширения конфигурации, объекты метаданных |
| Прямой многопоточности | фоновые задания, регламентные задания |
| Работы с памятью и указателями | коллекции значений, структуры, соответствия |
| Низкоуровневой работы с оборудованием | внешние компоненты на C++ |
| Подключаемых пакетов вроде pip | общие макеты, подсистемы, внешние обработки |
Каждый пункт говорит об одном: язык защищает программиста от опасных возможностей. Это и есть главная черта высокого уровня. Ограничения не мешают учёту, зато резко снижают число ошибок, которые на C дают падение всей программы.
Если нужна скорость вычислений, сначала проверьте план: можно ли переложить задачу на запрос. Внешняя компонента на C++ — крайняя мера, у неё свои требования к подключению и сопровождению.
Что говорят специалисты и сообщество
Единого официального ответа нет, фирма 1С не публикует классификацию «по уровням». Мнения делятся на три лагеря, и каждый легко узнаётся по аргументам.
| Лагерь | Позиция | Типичный довод |
|---|---|---|
| Классики | высокий уровень | автоматическая память, динамическая типизация |
| Скептики | средний или низкий | нет универсальности, привязка к платформе |
| Практики | «зависит от задачи» | важно не как назвать, а что на нём можно сделать |
Если нужен компромисс, его сформулировали так: 1С — язык высокого уровня в рамках своей предметной области. Он удобен для учёта, но не предназначен для системного программирования, игр и драйверов.
Для кадровых целей это означает следующее. Работодатель, нанимая 1С-разработчика, не проверяет знание указателей и памяти. Его интересует, как человек пишет запросы, строит проведение документов и расширяет типовые конфигурации.