Встроенный язык 1С:Предприятия 8: как он устроен и чем отличается от других
Содержание
В 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С | Python | JavaScript |
|---|---|---|---|
| Условие | Если А > 0 Тогда ... КонецЕсли; | if a > 0: | if (a > 0) { } |
| Не равно | <> | != | !== |
| Логика | И, ИЛИ, НЕ | and, or, not | &&, ||, ! |
| Блок | ключевые слова Конец... | отступы | фигурные скобки |
| Тернарный оператор | ?(усл, а, б) | а if усл else б | усл ? а : б |
| Инкремент | Сч = Сч + 1; | сч += 1 | сч++ |
| Исключения | Попытка ... Исключение | try ... except | try ... 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С | SQL | Python | JavaScript |
|---|---|---|---|---|
| Назначение | учётные системы на платформе 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С с нуля
Порядок, который реально работает, — не «синтаксис, потом всё остальное», а сразу практика на объектах.
- Поставьте учебную версию платформы. Она бесплатна, в ней есть Конфигуратор. Ограничения касаются объёма данных и числа пользователей, для обучения их хватает.
- Создайте пустую конфигурацию и соберите мини-учёт: справочник «Товары», документы «Приход» и «Расход», регистр накопления «Остатки».
- Напишите обработку проведения документа — это первое место, где язык нужен по-настоящему.
- Освойте запросы: остатки на дату, обороты за период, соединение двух таблиц. Конструктор запроса помогает, но текст нужно уметь читать.
- Переходите к управляемым формам — директивы
&НаКлиентеи&НаСервере, передача данных между ними. - Откройте типовую конфигурацию (демобаза Бухгалтерии) и разберите чужой код: модуль документа, общие модули, подписки на события.
- Сделайте внешнюю обработку под реальную задачу — например, загрузку прайса из Excel.
Что использовать:
- 📘 Книга Радченко и Хрусталёвой «1С:Предприятие 8.3. Практическое пособие разработчика» — проходит путь от пустой базы до работающего учёта, учебная версия платформы часто идёт в комплекте с ней.
- 🔍 Синтакс-помощник в Конфигураторе — справочник по каждому методу и типу с описанием параметров. Вызывается из меню «Справка».
- 🧪 Отладчик: точки останова, вычисление выражений, просмотр значений переменных.
- 🛠️ 1С:EDT — среда разработки на базе Eclipse. Её стоит освоить после Конфигуратора, если работа идёт в команде с Git.
- 🎓 Сертификация «1С:Специалист» и «1С:Профессионал» по платформе — проверяют практику, работодатели на неё смотрят.
Стоит ли учить язык 1С сейчас
Короткий ответ: да, если вы хотите работать с учётом и бизнес-процессами в российских компаниях. 1С остаётся основной учётной платформой в России, а после ухода части зарубежных ERP-систем на неё переводят и крупный бизнес. Вакансий программистов 1С много, и большую их часть составляют не разработка с нуля, а сопровождение и доработка типовых конфигураций.
Кому подходит:
- 👩💼 Бухгалтерам и экономистам, которые хотят перейти в ИТ: знание учёта даёт фору, которой нет у выпускника курсов Python.
- 🧑💻 Разработчикам из других языков: синтаксис осваивается за пару недель, дальше всё решает знание платформы.
- 🎓 Студентам, которым нужна понятная точка входа в коммерческую разработку.
Кому стоит подумать дважды — тем, кто планирует работать на зарубежный рынок или хочет заниматься системным программированием, машинным обучением, играми. Язык 1С там не применяется.
Платформа развивается: в последних версиях 8.3 появились асинхронные методы Асинх/Ждать, развивается EDT, расширения стали стандартом доработок. Язык меняется медленно, и код, написанный пять лет назад, обычно продолжает работать — для учётных систем это плюс.
Частые ошибки новичков в языке 1С
- 🐢 Запрос в цикле. Обращение к базе на каждой итерации — главная причина медленного кода. Данные получают одним запросом до цикла.
- 🔗 Цепочки через точку в коде.
Документ.Контрагент.ОсновнойДоговор.Валютав модуле — это несколько обращений к базе. Нужные поля лучше забрать запросом. - 🖥️ Обращение к базе на клиенте. В процедуре
&НаКлиентенельзя прочитать реквизит ссылки — нужен вызов сервера, лучше один, а не десять подряд. - ✏️ Правка типовой конфигурации напрямую. Обновления потом превращаются в ручное сравнение-объединение. Доработки — в расширение.
- 🔄 Удаление элементов коллекции в прямом цикле. Индексы сдвигаются, часть элементов пропускается. Удаляют обходом с конца.
- 🤐 Пустой блок
Исключение. Ошибка исчезает без следа, и через месяц никто не понимает, почему документ не провёлся. Минимум — записать в журнал регистрации черезЗаписьЖурналаРегистрации().