Встроенный язык 1С глазами программиста: Pascal, BASIC, SQL, JavaScript и ещё три родственника

· 11 мин

Содержание

Язык 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 Basic1СЧто делает
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С
Выполнено: 0 / 5

Мифы о том, на что похож язык 1С

Миф 1. «В 1С строгая типизация, как в Pascal». Нет. Объявлять тип переменной нельзя, тип определяется значением. Строго типизированы только реквизиты объектов метаданных: в поле Сумма с типом «Число» строку не запишешь.

Миф 2. «1С — полноценный ООП-язык». Объекты есть, классов нет. Наследования и полиморфизма в классическом смысле тоже нет.

Миф 3. «Запросы 1С — это обычный SQL». Синтаксис похож, но написать UPDATE нельзя, а точечная запись скрывает соединения. Запрос, который в SQL выглядел бы безобидно, в 1С может превратиться в пять неявных соединений.

Миф 4. «Язык 1С есть только на русском». Английский синтаксис поддерживается полностью. Есть даже открытая реализация языка вне платформы — OneScript, на которой пишут скрипты автоматизации.

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

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

Язык 1С компилируемый или интерпретируемый?
Платформа переводит модули в промежуточный байт-код и выполняет его своей виртуальной машиной. Отдельного исполняемого файла, как у C#, не получается: код работает только внутри 1С:Предприятия или OneScript.
Можно ли писать на 1С в Visual Studio Code?
Да. Для VS Code есть расширения с подсветкой синтаксиса 1С, а для полноценной разработки фирма предлагает среду 1С:EDT на базе Eclipse. Классический путь — конфигуратор.
Зачем в 1С нужны «Знач» и почему без него меняются данные?
Без Знач параметр передаётся по ссылке. Если процедура меняет его, меняется и переменная в вызывающем коде. Знач заставляет работать с копией.
Как в 1С сделать аналог switch?
Через цепочку Если … ИначеЕсли … Иначе … КонецЕсли. Для выбора по ключу часто удобнее Соответствие: ключ — вариант, значение — результат.
Есть ли в 1С сборщик мусора, как в Java?
Память освобождается по счётчику ссылок. Поэтому объекты, ссылающиеся друг на друга по кругу, могут не освободиться — такие циклические ссылки лучше разрывать вручную.