Встроенный язык 1С: родословная, синтаксис и устройство

· 10 мин

Содержание

Встроенный язык 1С не построен на основе какого-то одного языка программирования. Это собственный предметно-ориентированный язык фирмы 1С: синтаксис у него ближе всего к Паскалю и Бейсику, язык запросов взят из SQL, а сама платформа 1С:Предприятие 8.3 написана на C++.

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

Откуда взялся язык 1С и на какие языки он похож

Язык появился вместе с платформой 1С:Предприятие ещё в версиях 7.x. Задача была практичной: дать внедренцу, часто вчерашнему бухгалтеру или инженеру, инструмент, на котором можно писать без изучения системного программирования.

Отсюда три решения, которые сохранились до 8.3:

  • 🇷🇺 Русские ключевые слова. Если, Тогда, Процедура, Возврат. Читаются как текст, а не как набор символов.
  • 🧩 Блоки «начало — конец». Если … КонецЕсли, Цикл … КонецЦикла. Это наследие Паскаля и Модулы, а не фигурных скобок C.
  • 🎯 Узкая предметная область. Язык не предназначен для системных утилит, драйверов или игр. Он управляет объектами учёта, которые платформа уже умеет хранить в базе.

У каждого ключевого слова есть английский аналог: If … Then … EndIf, Procedure … EndProcedure. Платформа понимает оба варианта, даже вперемешку в одном модуле. На практике типовые конфигурации пишут по-русски.

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

Где 1С ближе к классическим языкам, а где своя дорога

ЧертаОткуда похожеКак в 1С
Блоки Если … КонецЕслиПаскаль, Модула, Visual BasicОбязательное закрывающее слово
Без учёта регистраПаскаль, БейсикСумма и СУММА — одна переменная
Динамическая типизацияБейсик, JavaScript, PythonТип у значения, а не у переменной
Язык запросовSQLПодмножество ВЫБРАТЬ … ИЗ … ГДЕ с надстройками
Своих классов нет—Объекты задаются метаданными конфигурации

Синтаксис 1С рядом с Паскалем и Бейсиком

Лучше всего сходство видно на коде. Вот одна и та же функция — сумма чисел от 1 до N — на встроенном языке 1С:

Функция СуммаДо(N) Экспорт
    Итог = 0;
    Для Сч = 1 По N Цикл
        Итог = Итог + Сч;
    КонецЦикла;
    Возврат Итог;
КонецФункции

И на Паскале:

function SumTo(N: Integer): Integer;
var i, total: Integer;
begin
  total := 0;
  for i := 1 to N do
    total := total + i;
  SumTo := total;
end;

Что совпадает: цикл со счётчиком «от … до», явная граница блока, точка с запятой как разделитель операторов. Что отличается:

  • 📌 В 1С нет раздела объявления переменных. Переменная появляется при первом присваивании. Можно объявить её явно через Перем, но это не обязательно.
  • 📌 Присваивание пишется через =, как в Бейсике, а не через :=, как в Паскале. Сравнение — тоже =, смысл определяет контекст.
  • 📌 Типы не указываются. Переменной Итог можно присвоить число, а потом строку — ошибки компиляции не будет.
  • 📌 Слово Экспорт делает функцию доступной из других модулей. Аналог public, но на уровне модуля, а не класса.

Типы данных

Примитивных типов немного: Число, Строка, Дата, Булево, Неопределено, Null. Число в 1С десятичное, а не двоичное с плавающей точкой. Поэтому 0.1 + 0.2 здесь даёт ровно 0.3, чего не добьёшься от double в C или JavaScript. Для учёта денег это важное свойство.

Универсальные коллекции встроены в язык: Массив, Структура, Соответствие, ТаблицаЗначений, СписокЗначений. Структура ближе всего к словарю Python со строковыми ключами, таблица значений — к таблице в памяти с колонками и индексами.

Обработка ошибок

Исключения устроены по схеме «попробовать — перехватить»:

Попытка
    Документ.Записать(РежимЗаписиДокумента.Проведение);
Исключение
    Сообщить(ОписаниеОшибки());
КонецПопытки;

Это прямой аналог try … except или try … catch. Своё исключение вызывают через ВызватьИсключение. Классов исключений с иерархией, как в Java, нет: ошибку описывает текст и информация об ошибке.

Язык запросов 1С: что взято из SQL

Второй язык внутри 1С — язык запросов. Его основа — SQL, точнее, конструкция SELECT. Но пишутся запросы к объектам конфигурации, а не к физическим таблицам СУБД.

Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
|    Остатки.Номенклатура КАК Товар,
|    Остатки.КоличествоОстаток КАК Количество
|ИЗ
|    РегистрНакопления.ТоварыНаСкладах.Остатки(&Дата) КАК Остатки
|ГДЕ
|    Остатки.КоличествоОстаток > 0";
Запрос.УстановитьПараметр("Дата", ТекущаяДатаСеанса());
Результат = Запрос.Выполнить().Выгрузить();

Регистр накопления в примере условный: в вашей конфигурации у него будет своё имя. Сама конструкция стандартная.

Что совпадает с SQL: ВЫБРАТЬ (SELECT), ИЗ, ГДЕ, СГРУППИРОВАТЬ ПО, УПОРЯДОЧИТЬ ПО, соединения ЛЕВОЕ СОЕДИНЕНИЕ, ОБЪЕДИНИТЬ ВСЕ, агрегатные функции СУММА, КОЛИЧЕСТВО, МАКСИМУМ.

Чего в обычном SQL нет:

  • 🔗 Разыменование через точку. Документ.Контрагент.ИНН — платформа сама построит соединение с таблицей контрагентов.
  • 📊 Виртуальные таблицы. Остатки, Обороты, ОстаткиИОбороты, СрезПоследних. Это готовые запросы к итогам регистров с параметрами периода.
  • 🗂️ Временные таблицы через менеджер. ПОМЕСТИТЬ ВТ_Товары и пакеты запросов, разделённые точкой с запятой.
  • 📈 Итоги. Секция ИТОГИ ПО строит иерархические промежуточные суммы, которые в SQL пришлось бы собирать через ROLLUP или несколько запросов.

Запрос 1С не уходит в базу как есть. Платформа переводит его в SQL нужной СУБД: Microsoft SQL Server, PostgreSQL или IBM Db2, а для файловой базы — в обращения к собственному формату хранения. Поэтому одна конфигурация работает на разных СУБД без переписывания запросов.

Разыменование через точку удобно, но каждое обращение — это соединение. Цепочка Документ.Договор.Организация.ОсновнойБанковскийСчет.Банк на большой таблице заметно замедляет запрос. Если поле нужно часто, выберите его один раз и сохраните во временную таблицу.

Писать запросы на чистом SQL к таблицам СУБД из конфигурации нельзя штатными средствами. Прямое чтение таблиц базы в обход платформы к тому же нарушает условия лицензии 1С и ломает кэш и блокировки.

Есть ли в 1С объекты и классы

Короткий ответ: объекты есть, классов в привычном смысле нет. Встроенный язык 1С не поддерживает объявление собственных классов, наследование и полиморфизм.

Объектная модель живёт на уровне метаданных. Разработчик в конфигураторе создаёт справочник «Номенклатура» или документ «Реализация товаров». Платформа сама порождает для них типы: СправочникОбъект.Номенклатура, СправочникСсылка.Номенклатура, ДокументОбъект.РеализацияТоваровУслуг.

НовыйТовар = Справочники.Номенклатура.СоздатьЭлемент();
НовыйТовар.Наименование = "Бумага А4";
НовыйТовар.Записать();

Как это соотносится с ООП:

Понятие ООПАналог в 1С
КлассОбъект метаданных: справочник, документ, регистр
Методы экземпляраЭкспортные процедуры модуля объекта
Статические методыМодуль менеджера
Обработчики событийПередЗаписью, ОбработкаПроведения, ПриЗаписи
НаследованиеНет; общую логику выносят в общие модули
Расширение чужого кодаРасширения конфигурации, перехват методов

Отдельный приём практиков — расширения конфигурации (появились в 8.3.6). Через аннотации &Перед, &После, &Вместо можно встроить свой код в процедуру типовой конфигурации, не снимая её с поддержки. Это ближе к аспектно-ориентированному программированию, чем к наследованию.

Ссылки и объекты в 1С — разные вещи. Ссылка (СправочникСсылка) — лёгкий указатель на запись, из неё можно читать реквизиты. Объект (СправочникОбъект) загружает запись целиком и позволяет её менять и записывать.

Как исполняется код 1С и что влияет на скорость

Код на встроенном языке не компилируется в машинные инструкции. Платформа переводит модули во внутренний байт-код и исполняет его своей виртуальной машиной. По модели это ближе к Python или ранней Java, чем к C++.

Сама платформа — клиентские приложения, сервер 1С, менеджер кластера — написана на C++. Работа с СУБД, блокировки, кэш, формирование отчётов идут в этом «нативном» слое. Встроенный язык им управляет.

Клиент и сервер в одном модуле

Главная особенность исполнения — директивы компиляции в управляемых формах:

  • 🖥️ &НаКлиенте — код выполняется на компьютере пользователя, в тонком или веб-клиенте.
  • 🗄️ &НаСервере — код выполняется на сервере 1С, с передачей данных формы.
  • ⚡ &НаСервереБезКонтекста — на сервере, но без передачи формы. Самый лёгкий вызов.
&НаКлиенте
Процедура Рассчитать(Команда)
    Итог = ПолучитьСуммуНаСервере(Объект.Ссылка);
КонецПроцедуры

&НаСервереБезКонтекста
Функция ПолучитьСуммуНаСервере(Ссылка)
    Возврат Ссылка.СуммаДокумента;
КонецФункции

Каждый переход с клиента на сервер — это сетевой вызов. Пять вызовов подряд в цикле на медленном канале превращаются в секунды ожидания. Поэтому первое правило оптимизации в 1С: собрать всё нужное за один серверный вызов.

Память и производительность

Память освобождается по счётчику ссылок. Когда на значение больше никто не ссылается, оно удаляется. Если две структуры ссылаются друг на друга, счётчик не обнуляется, и память не освобождается до конца сеанса. Циклических ссылок в долгоживущем коде лучше избегать.

Что реально тормозит код 1С:

  • 🐢 Запросы в цикле вместо одного запроса с соединением.
  • 🐢 Получение объекта (ПолучитьОбъект()) там, где хватило бы ссылки или запроса.
  • 🐢 Частые серверные вызовы из клиентского кода.
  • 🐢 Длинные цепочки разыменования через точку.

Скорость самого языка — сложение, циклы, работа со строками — на учётных задачах почти никогда не узкое место. Узкое место — база данных и сеть. Инструмент для поиска медленных мест — замер производительности в режиме отладки: он показывает время по каждой строке модуля.

Куда развивается язык 1С и что вокруг него

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

  • ⏳ Асинхронность. В платформе 8.3.18 появились ключевые слова Асинх и Ждать и тип Обещание. Код с диалогами стал выглядеть линейно, без цепочек обработчиков оповещения. Это прямой аналог async/await из C# и JavaScript.
  • 🛠️ 1С:EDT. Среда разработки на базе Eclipse, работает с исходниками в виде файлов, дружит с Git. Конфигуратор остаётся, но командная разработка всё чаще идёт в EDT.
  • 🔍 Статический анализ. Сообщество развивает BSL Language Server — анализатор и подсветку для VS Code и других редакторов. Расширение файлов .bsl в репозиториях — это и есть модули 1С.
  • 📜 OneScript. Открытый проект, который исполняет код на языке 1С без платформы, на .NET. Подходит для скриптов сборки, деплоя и автоматизации администратора.

Знание языка 1С переносится в другие языки легче, чем кажется. Логика, коллекции, исключения, запросы — общие понятия. Сложнее перейти на статическую типизацию и настоящее ООП: этого в 1С нет, и привычки придётся перестраивать.

Проверьте себя
Какой язык ближе всего к языку запросов 1С?
Есть ли во встроенном языке 1С наследование классов?
Где выполняется функция с директивой &НаСервереБезКонтекста?

Частые заблуждения о языке 1С

❌ «1С написана на языке 1С». Нет. На встроенном языке написаны конфигурации — Бухгалтерия, ЗУП, УТ. Сама платформа написана на C++.

❌ «Язык 1С — это Паскаль с русскими словами». Похож только синтаксис блоков. Динамическая типизация, отсутствие объявлений, объектная модель метаданных и язык запросов — это уже не Паскаль.

❌ «Если писать по-английски, код будет быстрее». Скорость не зависит от языка ключевых слов: модуль всё равно переводится в один и тот же байт-код.

❌ «Запросы 1С — это тот же SQL, можно копировать из SQL Server Management Studio». Синтаксис похож, но имена таблиц другие, есть виртуальные таблицы и разыменование. Запрос из SSMS в 1С не заработает без переписывания.

❌ «1С — не настоящее программирование». Встроенный язык полноценный: циклы, функции, рекурсия, исключения, работа с файлами, HTTP, XML и JSON. Ограничение в другом — он работает только внутри платформы.

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

На каком языке написана сама платформа 1С:Предприятие?
На C++. Это касается клиента, сервера 1С и менеджера кластера. Встроенный язык 1С работает поверх платформы и управляет её объектами.
Можно ли писать код 1С на английском?
Да. У каждой конструкции есть английское написание: If, Then, EndIf, Procedure. Платформа понимает оба варианта, в том числе в одном модуле.
Компилируется ли код 1С?
Модули переводятся во внутренний байт-код и исполняются виртуальной машиной платформы. В машинный код, как программы на C++, код 1С не компилируется.
Как называется язык 1С официально?
Встроенный язык 1С:Предприятия. В сообществе часто говорят BSL — по расширению файлов модулей .bsl.
Можно ли запустить код 1С без платформы?
Штатно — нет. Для скриптов и автоматизации существует открытый проект OneScript, который исполняет код на языке 1С на .NET, но без объектов конфигурации.