Встроенный язык 1С: родословная, синтаксис и устройство
Содержание
Встроенный язык 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С». Нет. На встроенном языке написаны конфигурации — Бухгалтерия, ЗУП, УТ. Сама платформа написана на C++.
❌ «Язык 1С — это Паскаль с русскими словами». Похож только синтаксис блоков. Динамическая типизация, отсутствие объявлений, объектная модель метаданных и язык запросов — это уже не Паскаль.
❌ «Если писать по-английски, код будет быстрее». Скорость не зависит от языка ключевых слов: модуль всё равно переводится в один и тот же байт-код.
❌ «Запросы 1С — это тот же SQL, можно копировать из SQL Server Management Studio». Синтаксис похож, но имена таблиц другие, есть виртуальные таблицы и разыменование. Запрос из SSMS в 1С не заработает без переписывания.
❌ «1С — не настоящее программирование». Встроенный язык полноценный: циклы, функции, рекурсия, исключения, работа с файлами, HTTP, XML и JSON. Ограничение в другом — он работает только внутри платформы.