Встроенный язык 1С глазами программиста: Pascal, BASIC, SQL, JavaScript и ещё три родственника
Содержание
Язык 1С больше всего похож на Pascal и Visual Basic по синтаксису, на JavaScript по типизации, а язык запросов 1С — на SQL. Частое заблуждение: «1С — это Паскаль на русском». Внешне да, блоки Если … Тогда … КонецЕсли читаются как if … then … end. Но типизация в 1С динамическая, как в JavaScript, а не строгая, как в Pascal.
Точного «прототипа» у встроенного языка нет. Это предметный язык, собранный под учётные задачи: процедурный каркас из Pascal и BASIC, запросы из SQL, гибкие типы из скриптовых языков и объектная модель, которую генерирует сама платформа 1С:Предприятие 8.3. Ниже сравнение по каждому родственнику с примерами кода.
Коротко: язык 1С в сравнении с семью языками программирования
| Язык | Что 1С взял от него | Чем 1С отличается |
|---|---|---|
| Pascal | Блоки с явным концом, процедуры и функции, ; между операторами | Нет объявления типов, нет begin, параметры по умолчанию передаются по ссылке |
| BASIC / Visual Basic | = и для присваивания, и для сравнения, <>, функции строк Лев, Прав, Сред | Нет нумерации строк, есть модули и директивы |
| SQL | Язык запросов: ВЫБРАТЬ, ИЗ, ГДЕ, СГРУППИРОВАТЬ ПО | Только чтение, обращение к полям через точку, виртуальные таблицы |
| JavaScript | Динамические типы, Неопределено, объект-словарь Структура, Асинх/Ждать | Нет функций как значений, нет замыканий и лямбд |
| Python | Простота, коллекции «из коробки», интерпретируемость | Блоки задаются словами, а не отступами |
| C# | Попытка/Исключение как try/catch, #Область как #region | Нет своих классов, наследования, интерфейсов |
| Java | Серверная логика, транзакции, работа с объектами БД через «сущности» | Нет пакетов, дженериков, строгой типизации |
Если вы пришли из любого процедурного языка, синтаксис 1С вы прочитаете за вечер. Время уходит не на язык, а на объекты платформы: регистры, проведение документов, формы.
Наследие Pascal и BASIC: процедуры, блоки и операторы
От Pascal: структура программы
Код 1С делится на процедуры и функции. Функция возвращает значение через Возврат, процедура ничего не возвращает — ровно как procedure и function в Pascal. Каждый блок закрывается своим словом: КонецПроцедуры, КонецЕсли, КонецЦикла.
Сравните одну и ту же функцию — сумму положительных чисел массива.
Функция СуммаПоложительных(Значения) Экспорт
Итог = 0;
Для Каждого Элемент Из Значения Цикл
Если Элемент > 0 Тогда
Итог = Итог + Элемент;
КонецЕсли;
КонецЦикла;
Возврат Итог;
КонецФункции
function SumPositive(const a: array of Integer): Integer;
var i: Integer;
begin
Result := 0;
for i := Low(a) to High(a) do
if a[i] > 0 then
Result := Result + a[i];
end;
Что совпадает с Pascal:
- 🔹 точка с запятой разделяет операторы;
- 🔹 регистр букв в именах не важен:
итогиИтог— одна переменная; - 🔹 цикл со счётчиком
Для Сч = 1 По 10 Цикл— прямой аналогfor i := 1 to 10 do; - 🔹 цикл с условием
Пока … Циклповторяетwhile … do; - 🔹 переменные модуля объявляются через
Перем, как черезvar.
А вот главное отличие. В Pascal параметр по умолчанию передаётся по значению, а для передачи по ссылке пишут var. В 1С наоборот: параметры по умолчанию передаются по ссылке, и изменение внутри процедуры видно снаружи. Чтобы передать копию, перед параметром ставят Знач.
Новички из Pascal часто меняют параметр внутри процедуры «как локальную переменную» и потом ищут, почему у вызывающего кода поменялось значение. Если параметр не должен меняться — пишите Знач.
От BASIC: простота и «человеческие» операторы
У BASIC язык 1С взял подход «понятно без подготовки». Знак = служит и присваиванием, и сравнением — смысл определяется местом в строке. Неравенство пишется как <>, логика словами: И, ИЛИ, НЕ.
Строковые функции почти дословно повторяют Visual Basic:
| Visual Basic | 1С | Что делает |
|---|---|---|
Left(s, 3) | Лев(Стр, 3) | первые 3 символа |
Right(s, 3) | Прав(Стр, 3) | последние 3 символа |
Mid(s, 2, 4) | Сред(Стр, 2, 4) | 4 символа со второго |
Len(s) | СтрДлина(Стр) | длина строки |
IIf(a, b, c) | ?(А, Б, В) | условное выражение |
Как и в BASIC, позиции в строке считаются с единицы. Зато индексы массива начинаются с нуля — на этой разнице спотыкаются почти все.
В 1С даже есть оператор безусловного перехода Перейти ~Метка; — привет из BASIC. Пользоваться им в рабочем коде не принято, но читать старые обработки с ним иногда приходится.
Язык запросов 1С и SQL: родство и разница
Язык запросов — самая «знакомая» часть для тех, кто писал на SQL. Ключевые слова переведены, логика та же.
ВЫБРАТЬ
Реализация.Контрагент.ИНН КАК ИНН,
СУММА(Реализация.СуммаДокумента) КАК Выручка
ИЗ
Документ.РеализацияТоваровУслуг КАК Реализация
ГДЕ
Реализация.Проведен
И Реализация.Дата МЕЖДУ &Начало И &Конец
СГРУППИРОВАТЬ ПО
Реализация.Контрагент.ИНН
Соответствие слов почти один к одному: SELECT — ВЫБРАТЬ, FROM — ИЗ, WHERE — ГДЕ, GROUP BY — СГРУППИРОВАТЬ ПО, ORDER BY — УПОРЯДОЧИТЬ ПО, CASE WHEN — ВЫБОР КОГДА. Соединения тоже есть: ЛЕВОЕ СОЕДИНЕНИЕ, ВНУТРЕННЕЕ СОЕДИНЕНИЕ, ПОЛНОЕ СОЕДИНЕНИЕ. Параметры задаются через &Имя.
Чем запрос 1С не похож на SQL
- 🔸 Только чтение.
INSERT,UPDATE,DELETEнет. Данные записываются через объекты встроенного языка. Исключение — временные таблицы:ПОМЕСТИТЬиУНИЧТОЖИТЬ. - 🔸 Точка вместо JOIN. Запись
Реализация.Контрагент.ИННсама добавит соединение со справочником. Удобно, но каждая лишняя точка — лишнее соединение и медленный запрос. - 🔸 Виртуальные таблицы. У регистров есть готовые таблицы
Остатки,Обороты,СрезПоследнихс параметрами периода. В чистом SQL такое пишется отдельными подзапросами. - 🔸
ИТОГИ ПО. Промежуточные итоги по группировкам считаются прямо в запросе. - 🔸 Независимость от СУБД. Платформа переводит текст запроса в диалект той базы, где лежат данные: MS SQL Server, PostgreSQL или файловый формат.
Знание SQL — лучшая «предподготовка» к 1С. Тот, кто понимает соединения и группировки, пишет быстрые отчёты с первой недели.
Сходство с JavaScript и Python: динамические типы и гибкие объекты
Типизация «как в JavaScript»
Переменная в 1С не имеет объявленного типа. Сначала в ней число, потом строка — платформа не возразит:
Значение = 100;
Значение = "сто";
Если ТипЗнч(Значение) = Тип("Строка") Тогда
Сообщить("Теперь это строка");
КонецЕсли;
Проверка типа через ТипЗнч — аналог typeof в JavaScript. Значение Неопределено ведёт себя как undefined: так выглядит пустая переменная или параметр, который не передали. Отдельно есть Null — он приходит из запросов, когда соединение не нашло пары.
Структура в 1С — почти объект JavaScript:
Клиент = Новый Структура("Имя, ИНН", "ООО Ромашка", "7701000000");
Клиент.Вставить("Город", "Москва");
Если Клиент.Свойство("Город") Тогда
Сообщить(Клиент.Город);
КонецЕсли;
В JavaScript то же самое: client.city = "Москва" и проверка "city" in client. Для словарей с произвольными ключами в 1С есть Соответствие — аналог Map.
Асинхронность: Асинх и Ждать
С платформы 8.3.18 в языке появились ключевые слова Асинх и Ждать и тип Обещание. Модель почти зеркальна async/await в JavaScript:
&НаКлиенте
Асинх Процедура ОчиститьТовары(Команда)
Ответ = Ждать ВопросАсинх("Очистить табличную часть?", РежимДиалогаВопрос.ДаНет);
Если Ответ = КодВозвратаДиалога.Да Тогда
Объект.Товары.Очистить();
КонецЕсли;
КонецПроцедуры
Чего из JavaScript нет: функции нельзя присвоить переменной, нет стрелочных функций, замыканий и +=. Вызвать процедуру по имени можно через ОписаниеОповещения или Выполнить, но это уже обходные пути.
Что общего с Python
С Python роднит дух «скриптового» языка: нет компиляции в привычном смысле, коллекции готовы сразу (Массив — как list, Соответствие — как dict), цикл Для Каждого … Из читается как for item in items. Отличие — блоки: Python держит структуру отступами, 1С — словами КонецЕсли и КонецЦикла. Отступы в 1С нужны только для читаемости.
Есть приятная разница с обоими скриптовыми языками: тип Число в 1С десятичный. Выражение 0.1 + 0.2 даёт ровно 0.3, а не 0.30000000000000004. Для учёта денег это принципиально.
C# и Java: какие черты объектного подхода есть в 1С
Язык 1С часто называют объектным, но это верно лишь отчасти. Объекты есть, а своих классов писать нельзя. Нет наследования, интерфейсов, конструкторов и дженериков.
Что всё-таки похоже
| Конструкция C# / Java | Аналог в 1С |
|---|---|
try { } catch { } | Попытка … Исключение … КонецПопытки |
throw | ВызватьИсключение |
#region (C#) | #Область … #КонецОбласти |
| атрибуты и аннотации | директивы &НаСервере, &НаКлиенте |
new ArrayList() | Новый Массив |
| статический класс с методами | общий модуль с экспортными процедурами |
| ORM-сущность (Entity Framework, Hibernate) | объект справочника или документа |
Последняя строка — ключ к пониманию 1С для программиста на C# или Java. Разработчик описывает в конфигураторе справочник Контрагенты с реквизитами, а платформа сама создаёт таблицу в базе и типы СправочникСсылка.Контрагенты, СправочникОбъект.Контрагенты. У объекта есть методы Записать(), Удалить(), а в модуле объекта — обработчики событий ПередЗаписью, ОбработкаПроведения. По сути это ORM с хуками, встроенный в язык.
Чего не хватает разработчику из C# и Java
- ❌ нет собственных типов данных, кроме объектов метаданных;
- ❌ нет перегрузки методов: у процедуры одно имя — одна сигнатура, зато можно задать значения по умолчанию
Процедура Расчёт(Сумма, Ставка = 20); - ❌ нет оператора
switch— только цепочкаЕсли … ИначеЕсли; - ❌ нет статической проверки типов при компиляции: ошибка «поле объекта не обнаружено» всплывает только при выполнении.
Транзакции, напротив, знакомы: НачатьТранзакцию(), ЗафиксироватьТранзакцию(), ОтменитьТранзакцию(). Для блокировок данных есть объект БлокировкаДанных — по смыслу близко к управлению блокировками в Java-приложениях с базой.
Что есть только в 1С и не встречается в других языках
Два набора ключевых слов
Один и тот же код можно писать по-русски и по-английски: Если … Тогда или If … Then, Процедура или Procedure, Для Каждого … Из … Цикл или For Each … In … Do. Платформа понимает оба варианта, даже вперемешку. Типовые конфигурации написаны на русском.
Код делится между клиентом и сервером
Над каждой процедурой модуля формы стоит директива: где её выполнять.
| Директива | Где выполняется |
|---|---|
&НаКлиенте | на компьютере пользователя |
&НаСервере | на сервере, с данными формы |
&НаСервереБезКонтекста | на сервере, без передачи формы — быстрее |
&НаКлиентеНаСервереБезКонтекста | и там, и там |
Аналогов в массовых языках нет: в веб-разработке клиент и сервер обычно пишут в разных файлах и даже на разных языках. В 1С это одна процедура рядом с другой, а платформа сама передаёт вызов по сети.
Другие особенности
- 📅 литерал даты в одинарных кавычках:
НачалоГода = '20250101'; - 📝 многострочная строка с вертикальной чертой в начале каждой строки — так оформляют тексты запросов;
- 🧾 типы метаданных:
Справочник,Документ,РегистрНакопления,ПланСчетов— это не библиотеки, а часть самого языка; - 🔢 форматирование чисел и дат одной функцией
Формат(Сумма, "ЧДЦ=2")со строкой параметров.
С какого языка легче всего перейти на 1С
Короткий ответ: с SQL и любого процедурного языка. Но «лёгкий вход» у каждого свой.
| Ваш опыт | Что дастся легко | Где будет трудно |
|---|---|---|
| SQL | Запросы, отчёты, СКД | Формы и клиент-серверные вызовы |
| Pascal, Delphi | Синтаксис, процедуры, модули | Динамические типы, передача по ссылке |
| Visual Basic, VBA | Строки, условия, работа с офисными файлами | Запросы и регистры |
| JavaScript, Python | Коллекции, Структура, асинхронность | Отсутствие функций как значений |
| C#, Java | Архитектура, транзакции, ORM-мышление | Нет классов и наследования, нет IDE-подсказок по типам |
Если вы с нуля и выбираете, что учить «под 1С», берите основы SQL. Синтаксис встроенного языка проще любого из перечисленных, а мышление запросами пригодится в каждой задаче: от отчёта до обработки данных.
Второй совет: не пытайтесь переносить привычки один в один. Программист на C# первым делом ищет, как создать класс. В 1С правильный путь другой — добавить объект метаданных или общий модуль.
Мифы о том, на что похож язык 1С
Миф 1. «В 1С строгая типизация, как в Pascal». Нет. Объявлять тип переменной нельзя, тип определяется значением. Строго типизированы только реквизиты объектов метаданных: в поле Сумма с типом «Число» строку не запишешь.
Миф 2. «1С — полноценный ООП-язык». Объекты есть, классов нет. Наследования и полиморфизма в классическом смысле тоже нет.
Миф 3. «Запросы 1С — это обычный SQL». Синтаксис похож, но написать UPDATE нельзя, а точечная запись скрывает соединения. Запрос, который в SQL выглядел бы безобидно, в 1С может превратиться в пять неявных соединений.
Миф 4. «Язык 1С есть только на русском». Английский синтаксис поддерживается полностью. Есть даже открытая реализация языка вне платформы — OneScript, на которой пишут скрипты автоматизации.
Миф 5. «1С — это не программирование, а настройка». Типовые конфигурации — это сотни тысяч строк кода на встроенном языке. Задачи там вполне инженерные: производительность запросов, блокировки, обмены данными.
Частые вопросы
Язык 1С компилируемый или интерпретируемый?
Можно ли писать на 1С в Visual Studio Code?
Зачем в 1С нужны «Знач» и почему без него меняются данные?
Знач параметр передаётся по ссылке. Если процедура меняет его, меняется и переменная в вызывающем коде. Знач заставляет работать с копией.Как в 1С сделать аналог switch?
Если … ИначеЕсли … Иначе … КонецЕсли. Для выбора по ключу часто удобнее Соответствие: ключ — вариант, значение — результат.