Встроенный язык 1С:Предприятия 8: как он устроен и чем отличается от других

· 11 мин

Содержание

В 1С:Предприятии 8 используется собственный встроенный язык 1С — предметно-ориентированный язык платформы с русскими ключевыми словами (Если, Процедура, Цикл) и английскими синонимами (If, Procedure, Do). Вместе с ним работает второй язык — язык запросов 1С, похожий на SQL. Отдельно установить их нельзя: код пишут в Конфигураторе или в 1С:EDT, а выполняет его сама платформа.

Для новичка это значит одно: учить нужно не «язык вообще», а связку из трёх вещей — синтаксис, объекты платформы (справочники, документы, регистры) и запросы. Без второй и третьей части даже идеальное знание синтаксиса почти ничего не даёт.

Что представляет собой встроенный язык 1С

Встроенный язык — это не универсальный язык общего назначения вроде Python. Он создан под одну задачу: описывать поведение прикладных объектов учётной системы. Справочник «Номенклатура», документ «Реализация товаров», регистр остатков — всё это объекты метаданных, а язык описывает, что с ними происходит при записи, проведении, печати.

Основные характеристики:

  • 🔤 Двуязычные ключевые слова. Если ... Тогда ... КонецЕсли и If ... Then ... EndIf — одно и то же. В типовых конфигурациях фирмы 1С код пишут по-русски.
  • 🔡 Регистр букв не важен. ВЫБРАТЬ, Выбрать и выбрать система воспринимает одинаково.
  • 🧩 Динамическая типизация. Тип переменной не объявляют: в неё можно записать число, а потом строку. Объявить переменную можно словом Перем, но чаще её создают присваиванием.
  • ⚙️ Код живёт в модулях. Модуль объекта, модуль менеджера, модуль формы, общие модули, модуль приложения. Отдельных файлов-программ нет — модули хранятся внутри конфигурации.
  • 🖥️ Клиент и сервер в одном коде. Директивы компиляции указывают, где выполняется процедура.
  • 🏗️ Готовые объекты вместо классов. Свои классы и наследование создать нельзя: вместо этого используют объекты метаданных и встроенные типы платформы.

Код не интерпретируется построчно «как есть»: платформа компилирует модуль во внутренний байт-код и исполняет его на своей виртуальной машине. Поэтому синтаксическая ошибка в модуле обнаруживается сразу, при проверке модуля или запуске, а не только когда дело дойдёт до этой строки.

Где выполняется код: директивы компиляции

Самое непривычное для новичка — разделение на клиент и сервер. В модуле управляемой формы перед каждой процедурой ставят директиву:

ДирективаГде выполняетсяЧто доступно
&НаКлиентена компьютере пользователяданные формы, интерактивные действия
&НаСерверена сервере, с контекстом формыбаза данных и данные формы
&НаСервереБезКонтекстана сервере, без данных формытолько база и переданные параметры
&НаКлиентеНаСервереБезКонтекстаи там, и тамтолько общий код без обращения к базе

Вызов &НаСервереБезКонтекста легче обычного серверного: на сервер не передаются данные формы. Если процедуре нужна только ссылка и база, ставьте именно эту директиву.

Кроме директив есть инструкции препроцессора: #Если Сервер Тогда ... #КонецЕсли. Ими отсекают куски кода, которые не должны компилироваться на клиенте.

Синтаксис языка 1С на примерах

Каждая инструкция заканчивается точкой с запятой. Комментарий начинается с //. Строки берут в двойные кавычки, даты — в одинарные: '20250131'.

Процедуры, функции и условия

// Функция возвращает скидку в процентах по сумме заказа
Функция ПроцентСкидки(СуммаЗаказа) Экспорт

    Если СуммаЗаказа >= 100000 Тогда
        Возврат 10;
    ИначеЕсли СуммаЗаказа >= 50000 Тогда
        Возврат 5;
    Иначе
        Возврат 0;
    КонецЕсли;

КонецФункции

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

Есть краткая форма условия — аналог тернарного оператора:

Статус = ?(Остаток > 0, "В наличии", "Нет на складе");

Циклы и коллекции

Товары = Новый Массив;
Товары.Добавить("Бумага А4");
Товары.Добавить("Картридж");
Товары.Добавить("Скрепки");

// Обход всех элементов
Для Каждого Товар Из Товары Цикл
    Сообщить(Товар);
КонецЦикла;

// Цикл со счётчиком: индексы массива начинаются с нуля
Для Индекс = 0 По Товары.ВГраница() Цикл
    Сообщить(Строка(Индекс + 1) + ". " + Товары[Индекс]);
КонецЦикла;

Второй цикл выведет «1. Бумага А4», «2. Картридж», «3. Скрепки». Число склеивается со строкой через Строка() — без явного преобразования в больших числах появятся пробелы-разделители разрядов.

Основные коллекции, с которыми работают каждый день:

  • 📦 Массив — упорядоченный список значений.
  • 🗂️ Структура — пары «ключ — значение», ключи только строковые, обращение через точку: Параметры.Организация.
  • 🔑 Соответствие — пары, где ключом может быть любое значение, например ссылка на контрагента.
  • 📊 ТаблицаЗначений — таблица в памяти с колонками, сортировкой, группировкой Свернуть().
  • 📋 СписокЗначений — список с представлениями и пометками, удобен для выбора в форме.

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

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

Своё исключение вызывают через ВызватьИсключение "Текст ошибки";.

Язык запросов

Данные из базы почти всегда получают запросом, а не перебором объектов:

Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
|    Номенклатура.Ссылка КАК Ссылка,
|    Номенклатура.Наименование КАК Наименование
|ИЗ
|    Справочник.Номенклатура КАК Номенклатура
|ГДЕ
|    НЕ Номенклатура.ПометкаУдаления
|
|УПОРЯДОЧИТЬ ПО
|    Наименование";

Выборка = Запрос.Выполнить().Выбрать();
Пока Выборка.Следующий() Цикл
    Сообщить(Выборка.Наименование);
КонецЦикла;

Вертикальная черта | продолжает многострочную строку. Текст запроса обычно не пишут руками, а собирают в конструкторе запроса — он вызывается из контекстного меню в модуле.

Чем синтаксис 1С похож на другие языки и чем отличается

Конструкция1СPythonJavaScript
УсловиеЕсли А > 0 Тогда ... КонецЕсли;if a > 0:if (a > 0) { }
Не равно<>!=!==
ЛогикаИ, ИЛИ, НЕand, or, not&&, ||, !
Блокключевые слова Конец...отступыфигурные скобки
Тернарный оператор?(усл, а, б)а if усл else бусл ? а : б
ИнкрементСч = Сч + 1;сч += 1сч++
ИсключенияПопытка ... Исключениеtry ... excepttry ... catch

Ближе всего синтаксис 1С к Visual Basic и Pascal: блоки закрываются словами, а не скобками, операторов += и ++ нет.

Где применяют язык 1С

Встроенный язык работает только внутри платформы 1С:Предприятие. Зато внутри неё он покрывает почти всё:

  • 🧾 Доработка типовых конфигураций — Бухгалтерии, ЗУП, УТ, ERP: новые реквизиты, печатные формы, свои проверки при проведении.
  • 🔌 Расширения конфигурации — изменения без снятия типовой с поддержки. Механизм появился в платформе 8.3.6, сейчас это основной способ дорабатывать типовые решения.
  • 📄 Внешние обработки и отчёты — файлы .epf и .erf, которые подключают к базе без изменения конфигурации: загрузка из Excel , групповая обработка документов, нестандартные отчёты.
  • 🔄 Обмены и интеграции — HTTP-сервисы, веб-сервисы, обмен через XML и JSON, интерфейс OData, подключение к сайтам, банкам, маркетплейсам.
  • ⏱️ Регламентные и фоновые задания — ночная загрузка курсов, пересчёт итогов, рассылки.
  • 📱 Мобильные приложения на мобильной платформе 1С — тот же язык с урезанным набором объектов.
  • 🏢 Отраслевые решения с нуля: от учёта в автосервисе до складской логистики.

Есть и сторонний проект OneScript — открытый независимый интерпретатор языка 1С. На нём пишут скрипты автоматизации: сборка конфигураций, выгрузка баз, тесты. Это не продукт фирмы 1С, и объектов прикладной конфигурации в нём нет.

Язык 1С против SQL, Python и JavaScript

Сравнение «что лучше» тут не работает : 1С решает одну узкую задачу, остальные — универсальные. Полезнее понимать, где пересекаются.

КритерийЯзык 1СSQLPythonJavaScript
Назначениеучётные системы на платформе 1Сзапросы к реляционным СУБДуниверсальныйвеб, браузер, Node.js
Где работаеттолько в 1С:Предприятиив СУБДвездебраузер, сервер
Типизациядинамическаястатическая, по схеме таблицдинамическаядинамическая
Свои классынет—естьесть
Работа с базойвстроенная, объектная и через запросынапрямуючерез библиотекичерез библиотеки
Порог входанизкий для синтаксиса, высокий для платформынизкийнизкийсредний

Язык запросов 1С и SQL

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

Отличия, которые бросаются в глаза:

  • 🔗 Разыменование через точку. Реализация.Контрагент.ИНН — платформа сама построит соединения.
  • 📐 Виртуальные таблицы регистров: Остатки, Обороты, СрезПоследних с параметрами периода.
  • 🧮 Временные таблицы и пакеты — несколько запросов в одном тексте через ;.
  • 🚫 Только чтение. INSERT, UPDATE, DELETE нет: данные меняют объектами встроенного языка.

Прямые SQL-запросы к таблицам базы 1С в обход платформы ломают целостность данных и противоречат лицензионному соглашению. Читайте и пишите данные только средствами платформы.

Python и JavaScript рядом с 1С

На практике эти языки не конкурируют с 1С, а дополняют её. Python-скрипт забирает выгрузку через HTTP-сервис 1С и строит аналитику. JavaScript-сайт принимает заказы и отдаёт их в 1С через REST. Код на 1С при этом отвечает за учёт: проведение, остатки, проводки.

Ограничения языка 1С и обходные пути

ОграничениеЧем обходят
Нельзя создать свои классы и наследованиеобщие модули, объекты метаданных, обработки как «классы» с модулем объекта
Код работает только в платформе 1СHTTP-сервисы и веб-сервисы для связи с внешним миром
Нет многопоточности в привычном видефоновые задания ФоновыеЗадания.Выполнить() — параллельные потоки на сервере
Нет низкоуровневого доступа к железу и ОСвнешние компоненты (Native API, на C++), COM-объекты в Windows
Модальные окна в веб-клиенте под запретомасинхронные методы: оповещения, а с платформы 8.3.18 — Асинх и Ждать
Нет лямбд и функций как значенийОписаниеОповещения с именем процедуры, вызов по имени через Выполнить()
Изменения типовой мешают обновлениямрасширения конфигурации вместо правки основной

Выполнить() и Вычислить() выполняют код из строки. Не передавайте в них данные, которые ввёл пользователь: это прямой путь к выполнению произвольного кода в базе.

Ещё одно ограничение — привязка к экосистеме. Навыки 1С ценятся в России и странах СНГ, за их пределами спрос на них почти отсутствует. Зато внутри этой экосистемы конкуренция ниже, чем среди универсальных разработчиков.

Как изучить язык 1С с нуля

Порядок, который реально работает, — не «синтаксис, потом всё остальное», а сразу практика на объектах.

  1. Поставьте учебную версию платформы. Она бесплатна, в ней есть Конфигуратор. Ограничения касаются объёма данных и числа пользователей, для обучения их хватает.
  2. Создайте пустую конфигурацию и соберите мини-учёт: справочник «Товары», документы «Приход» и «Расход», регистр накопления «Остатки».
  3. Напишите обработку проведения документа — это первое место, где язык нужен по-настоящему.
  4. Освойте запросы: остатки на дату, обороты за период, соединение двух таблиц. Конструктор запроса помогает, но текст нужно уметь читать.
  5. Переходите к управляемым формам — директивы &НаКлиенте и &НаСервере, передача данных между ними.
  6. Откройте типовую конфигурацию (демобаза Бухгалтерии) и разберите чужой код: модуль документа, общие модули, подписки на события.
  7. Сделайте внешнюю обработку под реальную задачу — например, загрузку прайса из Excel.

Что использовать:

  • 📘 Книга Радченко и Хрусталёвой «1С:Предприятие 8.3. Практическое пособие разработчика» — проходит путь от пустой базы до работающего учёта, учебная версия платформы часто идёт в комплекте с ней.
  • 🔍 Синтакс-помощник в Конфигураторе — справочник по каждому методу и типу с описанием параметров. Вызывается из меню «Справка».
  • 🧪 Отладчик: точки останова, вычисление выражений, просмотр значений переменных.
  • 🛠️ 1С:EDT — среда разработки на базе Eclipse. Её стоит освоить после Конфигуратора, если работа идёт в команде с Git.
  • 🎓 Сертификация «1С:Специалист» и «1С:Профессионал» по платформе — проверяют практику, работодатели на неё смотрят.
Проверьте себя
Как в языке 1С записывается «не равно»?
С какого индекса начинается массив в 1С?
Какая директива подходит серверной функции, которой не нужны данные формы?
Можно ли в запросе 1С изменить данные командой UPDATE?

Стоит ли учить язык 1С сейчас

Короткий ответ: да, если вы хотите работать с учётом и бизнес-процессами в российских компаниях. 1С остаётся основной учётной платформой в России, а после ухода части зарубежных ERP-систем на неё переводят и крупный бизнес. Вакансий программистов 1С много, и большую их часть составляют не разработка с нуля, а сопровождение и доработка типовых конфигураций.

Кому подходит:

  • 👩‍💼 Бухгалтерам и экономистам, которые хотят перейти в ИТ: знание учёта даёт фору, которой нет у выпускника курсов Python.
  • 🧑‍💻 Разработчикам из других языков: синтаксис осваивается за пару недель, дальше всё решает знание платформы.
  • 🎓 Студентам, которым нужна понятная точка входа в коммерческую разработку.

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

Платформа развивается: в последних версиях 8.3 появились асинхронные методы Асинх/Ждать, развивается EDT, расширения стали стандартом доработок. Язык меняется медленно, и код, написанный пять лет назад, обычно продолжает работать — для учётных систем это плюс.

Частые ошибки новичков в языке 1С

  • 🐢 Запрос в цикле. Обращение к базе на каждой итерации — главная причина медленного кода. Данные получают одним запросом до цикла.
  • 🔗 Цепочки через точку в коде. Документ.Контрагент.ОсновнойДоговор.Валюта в модуле — это несколько обращений к базе. Нужные поля лучше забрать запросом.
  • 🖥️ Обращение к базе на клиенте. В процедуре &НаКлиенте нельзя прочитать реквизит ссылки — нужен вызов сервера, лучше один, а не десять подряд.
  • ✏️ Правка типовой конфигурации напрямую. Обновления потом превращаются в ручное сравнение-объединение. Доработки — в расширение.
  • 🔄 Удаление элементов коллекции в прямом цикле. Индексы сдвигаются, часть элементов пропускается. Удаляют обходом с конца.
  • 🤐 Пустой блок Исключение. Ошибка исчезает без следа, и через месяц никто не понимает, почему документ не провёлся. Минимум — записать в журнал регистрации через ЗаписьЖурналаРегистрации().

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

Можно ли писать код 1С на английском?
Да. У всех ключевых слов и большинства встроенных методов есть английские синонимы: If, Then, Procedure, Query. Конфигурацию можно создать с английским вариантом встроенного языка.
Язык 1С — объектно-ориентированный?
Частично. Вы работаете с объектами и их методами, но не можете объявить свой класс или наследовать один объект от другого. Поведение задают модули объектов метаданных.
В каком файле хранится код 1С?
В Конфигураторе — внутри конфигурации базы, отдельных файлов нет. При выгрузке в XML или работе в EDT каждый модуль сохраняется в текстовый файл с расширением .bsl.
Нужно ли знать SQL, чтобы программировать на 1С?
Не обязательно, но помогает. Язык запросов 1С построен на тех же принципах: выборка, соединения, группировка. Кто знает SQL, осваивает его за несколько дней.
Сколько времени нужно, чтобы начать работать программистом 1С?
При ежедневных занятиях основы синтаксиса, запросов и форм осваивают за 3–6 месяцев. Дальше рост идёт на реальных задачах по доработке типовых конфигураций.