На чём пишут в 1С: встроенный язык платформы 8.3 без мифов
Содержание
В 1С:Предприятии 8.3 программируют на собственном встроенном языке платформы — его часто называют просто «язык 1С». Это не Python, не Java и не диалект Visual Basic: язык создан фирмой «1С» специально для учётных задач, а работает он только внутри платформы.
Новички обычно спотыкаются о три вещи: русские ключевые слова, разделение кода на клиент и сервер и отдельный язык запросов к данным. Разберём каждую по порядку, с примерами кода, которые можно вставить в обработку и запустить.
Какой язык используется в 1С и как он устроен
Встроенный язык — это скриптовый язык с динамической типизацией. Тип переменной не объявляется: одна и та же переменная может хранить сначала число, потом строку. Код живёт не в отдельных файлах проекта, а в модулях, привязанных к объектам конфигурации.
Основные виды модулей:
- 📦 Общие модули — библиотеки процедур и функций, доступные из любого места конфигурации.
- 📄 Модуль объекта — код конкретного справочника или документа: обработчики
ПередЗаписью,ОбработкаПроведения. - 🗂 Модуль менеджера — код, который работает с объектом «в целом», без экземпляра: печатные формы, служебные функции.
- 🪟 Модуль формы — реакция на кнопки, поля и открытие формы.
- ⚙️ Модуль управляемого приложения, модуль сеанса, модуль внешнего соединения — обработчики запуска системы и сеанса.
Главное отличие от «обычного» программирования: огромную часть работы делает не код, а метаданные. Вы создаёте в Конфигураторе справочник «Склады» — и платформа сама строит таблицу в базе, форму списка, форму элемента, права доступа . Код пишут только там, где нужна логика, которой нет в типовом поведении.
Поэтому разработчика 1С правильнее сравнивать не с бэкенд-программистом на Java, а с человеком, который собирает приложение из готовых блоков и дописывает к ним правила.
Синтаксис встроенного языка 1С: с чем столкнётесь в первый день
Ключевые слова — русские. Есть полный английский эквивалент (If … Then … EndIf, Procedure, Function), но в типовых конфигурациях почти весь код написан по-русски. Регистр букв не важен: Сообщить и СООБЩИТЬ — одно и то же.
Пример процедуры с условием и циклом:
Процедура ПроверитьОстатки(МинимальныйОстаток)
Итого = 0;
Для Сч = 1 По 10 Цикл
Итого = Итого + Сч;
КонецЦикла;
Если Итого > МинимальныйОстаток Тогда
Сообщить(СтрШаблон("Сумма %1 больше порога %2", Итого, МинимальныйОстаток));
ИначеЕсли Итого = МинимальныйОстаток Тогда
Сообщить("Ровно на пороге");
Иначе
Сообщить("Ниже порога");
КонецЕсли;
КонецПроцедуры
Что здесь видно:
- Блоки закрываются словами
КонецЦикла,КонецЕсли,КонецПроцедуры— фигурных скобок нет. - Каждый оператор заканчивается точкой с запятой.
Процедураничего не возвращает,Функциявозвращает значение черезВозврат.- Строки — в двойных кавычках, комментарии начинаются с
//. - Для подстановки значений в текст удобно
СтрШаблон— не нужно склеивать строки вручную.
Основные типы и коллекции:
| Тип | Для чего | Пример |
|---|---|---|
Число, Строка, Дата, Булево | примитивные значения | Дата(2026, 1, 1) |
Массив | упорядоченный список | Новый Массив |
Структура | набор «ключ — значение» с ключами-строками | Новый Структура("Код, Имя") |
Соответствие | словарь с ключом любого типа | Новый Соответствие |
ТаблицаЗначений | таблица в памяти, с сортировкой и группировкой | результат Выгрузить() |
Ссылки (СправочникСсылка.…) | указатель на запись в базе | Справочники.Склады.НайтиПоКоду("001") |
Ошибки ловят конструкцией Попытка … Исключение … КонецПопытки. Текст ошибки внутри блока Исключение берут через ОписаниеОшибки() или ИнформацияОбОшибке().
Классов в привычном смысле в языке нет: нельзя написать свой класс с наследованием. Роль классов играют объекты метаданных — справочник, документ, регистр — у которых уже есть свойства и методы.
Чем язык 1С отличается от Python, Java и SQL
Вопрос «на что похож язык 1С» задают все, кто приходит из другой разработки. Короткое сравнение:
| Признак | Встроенный язык 1С | Python | Java / C# | SQL |
|---|---|---|---|---|
| Типизация | динамическая | динамическая | статическая | — |
| ООП с наследованием | нет, вместо него объекты метаданных | да | да | нет |
| Где выполняется | только в платформе 1С | везде | JVM / .NET | в СУБД |
| Работа с базой | через объекты и язык запросов | через библиотеки и ORM | через ORM, JDBC | напрямую |
| Интерфейс | платформа строит формы сама | отдельные фреймворки | отдельные фреймворки | нет |
| Ключевые слова | русские или английские | английские | английские | английские |
По ощущениям синтаксис ближе всего к Pascal и Visual Basic: слова вместо скобок, явные КонецЕсли, процедуры и функции.
С Python язык 1С роднит динамическая типизация и простота старта. Но в Python огромная экосистема пакетов, а в 1С сторонних библиотек почти нет — всё нужное уже есть в платформе: работа с файлами, HTTP, XML, JSON, почтой, табличными документами.
С SQL путают язык запросов 1С. Он действительно похож (ВЫБРАТЬ … ИЗ … ГДЕ), но это надстройка: запрос пишется к объектам конфигурации, а платформа переводит его в SQL конкретной СУБД. Об этом — ниже отдельным разделом.
Знание Java или Python не делает человека 1С-программистом за неделю. Сам язык осваивается быстро, а вот устройство регистров, проведения документов и типовых конфигураций — месяцы практики.
Где выполняется код 1С: клиент, сервер и директивы компиляции
В 8.3 с управляемыми формами приложение разделено на клиент и сервер, даже в файловом варианте базы. Разработчик сам указывает, где выполнять каждую процедуру модуля формы. Для этого перед процедурой ставят директиву компиляции:
| Директива | Где выполняется | Доступ к данным формы | Обращение к базе |
|---|---|---|---|
&НаКлиенте | на компьютере пользователя | да | нет |
&НаСервере | на сервере | да, форма передаётся на сервер | да |
&НаСервереБезКонтекста | на сервере | нет | да |
&НаКлиентеНаСервереБезКонтекста | там, откуда вызвали | нет | только если вызвана на сервере |
Типичный шаблон — команда на клиенте вызывает серверную процедуру:
&НаКлиенте
Процедура Заполнить(Команда)
КоличествоСтрок = ЗаполнитьНаСервере();
Сообщить(СтрШаблон("Загружено строк: %1", КоличествоСтрок));
КонецПроцедуры
&НаСервереБезКонтекста
Функция ЗаполнитьНаСервере()
Запрос = Новый Запрос("ВЫБРАТЬ КОЛИЧЕСТВО(*) КАК Количество ИЗ Справочник.Номенклатура");
Выборка = Запрос.Выполнить().Выбрать();
Выборка.Следующий();
Возврат Выборка.Количество;
КонецФункции
Почему это важно на практике:
- 🐢 Каждый вызов сервера — это обмен по сети. Вызов в цикле на 1000 строк превращает форму в «тормоз».
- 📦
&НаСерверетащит на сервер всю форму со всеми таблицами;&НаСервереБезКонтекстапередаёт только параметры и работает быстрее. - 🚫 На клиенте нельзя прочитать данные из базы запросом — объект
Запростам недоступен.
Кроме директив есть инструкции препроцессора: #Если Сервер Тогда … #КонецЕсли. Ими ограничивают код в общих модулях и модулях объектов, чтобы он не компилировался там, где не нужен.
Для общих модулей место выполнения задают флажками в свойствах модуля: «Клиент (управляемое приложение)», «Сервер», «Вызов сервера». Флажок «Вызов сервера» разрешает клиенту вызывать процедуры модуля напрямую.
Язык запросов 1С и работа с данными
Читают данные в 1С в основном запросами. Синтаксис похож на SQL, но обращения идут к объектам конфигурации, а не к таблицам СУБД:
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| Номенклатура.Ссылка КАК Ссылка,
| Номенклатура.Наименование КАК Наименование
|ИЗ
| Справочник.Номенклатура КАК Номенклатура
|ГДЕ
| НЕ Номенклатура.ПометкаУдаления
| И Номенклатура.Наименование ПОДОБНО &Шаблон";
Запрос.УстановитьПараметр("Шаблон", "%бумага%");
Выборка = Запрос.Выполнить().Выбрать();
Пока Выборка.Следующий() Цикл
Сообщить(Выборка.Наименование);
КонецЦикла;
Чем язык запросов 1С отличается от обычного SQL:
- Только чтение. Конструкций
UPDATE,INSERT,DELETEнет. Изменяют данные через объекты (ПолучитьОбъект(),Записать()) и наборы записей регистров. - Разыменование через точку. Можно написать
Документ.Контрагент.ИНН— платформа сама добавит соединения таблиц. Удобно, но при глубоких цепочках запрос становится тяжёлым. - Виртуальные таблицы. У регистров есть готовые таблицы
Остатки,Обороты,ОстаткиИОбороты, у периодических регистров сведений —СрезПоследних. Параметры (период, отбор) передают прямо в скобках таблицы — так отбор срабатывает раньше и быстрее. - Временные таблицы. Конструкция
ПОМЕСТИТЬи объектМенеджерВременныхТаблицзаменяют вложенные подзапросы и ускоряют сложные выборки. - Независимость от СУБД. Один и тот же текст запроса работает в файловой базе и на клиент-серверной базе с MS SQL Server или PostgreSQL.
Не пишите запрос внутри цикла по строкам. 500 строк документа — 500 обращений к базе. Соберите нужные ссылки в массив и выполните один запрос с условием В (&Список).
Текст запроса не обязательно набирать вручную. В Конфигураторе есть конструктор запроса: открывается из контекстного меню модуля, позволяет мышкой выбрать таблицы, поля, условия и связи. Для отладки сложных запросов пользуются консолью запросов — внешней обработкой, которая выполняет текст запроса в базе и показывает результат.
Расширения, внешние обработки и инструменты разработчика
Писать код прямо в типовой конфигурации — плохая практика: при обновлении релиза доработки придётся переносить вручную. В 8.3 для этого есть способы мягче.
Расширения конфигурации
(появились в 8.3.6). Файл .cfe подключается к базе поверх типовой конфигурации. В расширении можно:
- ➕ добавить свои реквизиты, документы, отчёты, формы;
- 🔁 перехватить типовую процедуру аннотациями
&Перед,&После,&Вместо; - 🧩 с 8.3.16 и новее — точечно изменить код типовой процедуры аннотацией
&ИзменениеИКонтроль, с вставками#Вставка … #КонецВставкии#Удаление … #КонецУдаления.
После обновления типовой конфигурации расширение остаётся на месте. Платформа проверит, совпадают ли перехваченные процедуры, и сообщит, если что-то сломалось.
Внешние обработки и отчёты — файлы .epf и .erf. Их открывают через меню Файл → Открыть без изменения конфигурации или подключают в типовых через раздел «Дополнительные отчёты и обработки». Подходят для разовых загрузок, печатных форм, сервисных операций.
Внешняя обработка выполняет любой код с правами пользователя, который её открыл. Не запускайте файлы .epf из непроверенных источников в рабочей базе.
Инструменты:
| Инструмент | Для чего |
|---|---|
| Конфигуратор | классическая среда: метаданные, модули, отладчик, конструкторы |
| 1С:EDT (Enterprise Development Tools) | среда на базе Eclipse: работа с Git, рефакторинг, проверка кода |
| Хранилище конфигурации | групповая разработка с захватом объектов |
| Отладчик | точки останова, вычисление выражений, замер производительности |
Для командной работы и ревью кода всё чаще выбирают EDT с Git: конфигурация хранится в виде файлов, изменения видны построчно.
Как развивается язык 1С в платформе 8.3 и что дальше
Язык не стоит на месте: почти в каждой крупной версии платформы 8.3 добавляют возможности. Самые заметные для программиста:
- ⏳ Асинхронность. Модальные окна в веб-клиенте и мобильных приложениях не работают, поэтому сначала появились методы с
ОписаниеОповещения, а в 8.3.18 — ключевые словаАсинхиЖдать. Код с ними читается почти как синхронный. - 🌐 Интеграция. HTTP-сервисы, веб-сервисы, стандартный интерфейс OData, работа с JSON (
ЗаписьJSON,ЧтениеJSON) — 1С легко обменивается данными с сайтами и внешними системами. - 📱 Мобильная платформа — тот же язык для приложений под Android и iOS.
- 🧱 Расширения с каждой версией умеют больше, вплоть до точечной правки чужого кода.
Отдельно фирма развивает новую технологию 1С:Предприятие.Элемент. У неё свой язык с синтаксисом, близким к современным языкам, статической типизацией и английскими ключевыми словами по умолчанию. Это отдельная платформа, а не новая версия 8.3: типовые конфигурации — Бухгалтерия, ЗУП, УТ — по-прежнему работают на 8.3 и встроенном языке.
Для практики вывод простой: учить нужно встроенный язык 8.3, язык запросов и устройство управляемых форм. Именно на этом стеке работает почти весь рынок внедрений и сопровождения.
Частые вопросы
Можно ли писать код 1С на английском языке?
If, Procedure, Query). Русский и английский можно смешивать в одном модуле, но в типовых конфигурациях принят русский.Компилируется ли код 1С в исполняемый файл?
Сколько времени нужно, чтобы освоить язык 1С?
Можно ли подключить к 1С код на Python или C#?
Как называется расширение файлов с кодом 1С?
.bsl.