Встроенный язык, запросы и всё вокруг: чем на деле пишет код разработчик 1С
Содержание
Программист 1С пишет на встроенном языке 1С:Предприятия — собственном языке платформы с русскими ключевыми словами (Если, Процедура, Цикл). Данные из базы он получает на втором языке — языке запросов 1С, который похож на SQL, но работает с объектами конфигурации, а не с таблицами СУБД. Это два основных инструмента, и без обоих работы нет.
Остальное — вспомогательное: JSON и XML для обменов, HTTP для интеграций, иногда C++ для внешних компонент и HTML на формах. Писать «на Java» или «на C#» внутри типовой конфигурации не получится: платформа исполняет только свой язык.
Встроенный язык платформы 1С:Предприятие 8.3
У языка нет отдельного громкого имени. В документации его называют «встроенный язык», в вакансиях — «язык 1С» или BSL (от 1C:Enterprise Script / Built-in Script Language — так его обозначают в сторонних инструментах и на GitHub).
Как он выглядит
Синтаксис ближе всего к Visual Basic и Паскалю: блоки закрываются словами, а не фигурными скобками.
Процедура ПроверитьОстаток(Количество, Резерв)
Если Количество - Резерв < 0 Тогда
Сообщить("Остатка не хватает");
ИначеЕсли Количество - Резерв = 0 Тогда
Сообщить("Остаток выбран полностью");
Иначе
Сообщить(СтрШаблон("Свободно: %1", Количество - Резерв));
КонецЕсли;
КонецПроцедуры
У каждого слова есть английский двойник. Тот же код можно написать так:
Procedure Hello()
Message("Hello");
EndProcedure
На практике почти весь код типовых конфигураций — на русском. Английский вариант встречается в разработках для зарубежных внедрений и в примерах на форумах.
Главные свойства языка
- 🔤 Регистр не важен.
Сообщить,СООБЩИТЬисообщить— одно и то же. - 🧩 Динамическая типизация. Тип переменной не объявляется, одна переменная может хранить сначала число, потом строку.
- 🏗️ Предметно-ориентированный. В языке есть готовые типы под учёт:
СправочникСсылка,ДокументОбъект,РегистрСведенийНаборЗаписей,ТаблицаЗначений,Структура,Соответствие. - 🚫 Нет своих классов. Создать класс с наследованием нельзя. Роль классов играют объекты метаданных — справочники, документы, регистры, — которые создаются в дереве конфигурации, а код к ним пишется в модулях.
- 📦 Модули вместо файлов. Код живёт в модуле объекта, модуле менеджера, модуле формы, общих модулях. Отдельного «проекта из .bsl-файлов» в Конфигураторе нет.
Новичку больше времени уйдёт не на синтаксис, а на модель данных: чем документ отличается от регистра, зачем нужны проведение и движения. Синтаксис осваивается за пару недель, понимание учётной модели — месяцами.
Запросы к базе: язык запросов 1С вместо чистого SQL
Чтобы выбрать данные, программист не пишет SQL напрямую. Он пишет текст на языке запросов 1С, а платформа переводит его в SQL нужной СУБД: Microsoft SQL Server, PostgreSQL, IBM Db2, Oracle Database — или выполняет сама, если база файловая.
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| Остатки.Номенклатура КАК Номенклатура,
| Остатки.КоличествоОстаток КАК Количество
|ИЗ
| РегистрНакопления.ТоварыНаСкладах.Остатки(&НаДату, ) КАК Остатки
|ГДЕ
| Остатки.КоличествоОстаток > 0";
Запрос.УстановитьПараметр("НаДату", ТекущаяДатаСеанса());
Выборка = Запрос.Выполнить().Выбрать();
Пока Выборка.Следующий() Цикл
Сообщить(СтрШаблон("%1: %2", Выборка.Номенклатура, Выборка.Количество));
КонецЦикла;
Имя регистра здесь условное — в каждой конфигурации свои регистры. Сам приём типовой: запрос к виртуальной таблице остатков и обход результата.
Чем язык запросов отличается от SQL
| SQL | Язык запросов 1С | |
|---|---|---|
| Ключевые слова | SELECT, FROM, WHERE | ВЫБРАТЬ, ИЗ, ГДЕ (английские тоже допустимы) |
| Изменение данных | INSERT, UPDATE, DELETE | Нет — только чтение. Запись идёт через объекты встроенного языка |
| Источник | Таблицы СУБД | Справочники, документы, регистры конфигурации |
| Обращение к связанным данным | JOIN вручную | Можно через точку: Документ.Контрагент.ИНН |
| Остатки и обороты | Считаются вручную | Готовые виртуальные таблицы Остатки, Обороты, ОстаткиИОбороты, СрезПоследних |
| Временные таблицы | CREATE TABLE #tmp | ПОМЕСТИТЬ в пакетном запросе |
Писать в таблицы базы 1С прямыми SQL-запросами нельзя — платформа ничего не знает о таких изменениях, и данные теряют целостность. Прямой SQL допустим только для чтения в аналитических задачах и только по согласованию с ответственным за базу.
Зачем программисту 1С всё же знать SQL
- 🔍 Разбирать долгие запросы в технологическом журнале и профайлере СУБД — там виден уже переведённый SQL.
- 📊 Понимать индексы и планы запросов. Разыменование через точку в условиях — частая причина тормозов.
- 🔄 Подключаться к внешним базам через внешние источники данных.
На собеседованиях на позицию выше младшей обычно спрашивают и язык запросов 1С, и основы SQL.
Клиент, сервер и директивы компиляции
Одна из главных особенностей языка — код выполняется в разных местах. Часть процедур работает на компьютере пользователя, часть — на сервере 1С. Где именно, программист указывает директивой над процедурой в модуле формы.
| Директива | Где выполняется | Что доступно |
|---|---|---|
&НаКлиенте | На компьютере пользователя | Данные формы, интерфейс. Запросов к базе нет |
&НаСервере | На сервере, с передачей формы | Запросы, объекты базы, данные формы |
&НаСервереБезКонтекста | На сервере, без формы | Запросы и объекты. Форма не передаётся — вызов дешевле |
&НаКлиентеНаСервереБезКонтекста | И там, и там | Только то, что есть в обоих контекстах |
Типичный приём — нажали кнопку на клиенте, посчитали на сервере, вернули результат:
&НаКлиенте
Процедура ПоказатьСумму(Команда)
Сумма = СуммаДокументаНаСервере(Объект.Ссылка);
ПоказатьПредупреждение(, СтрШаблон("Сумма документа: %1", Сумма));
КонецПроцедуры
&НаСервереБезКонтекста
Функция СуммаДокументаНаСервере(Ссылка)
Возврат Ссылка.СуммаДокумента;
КонецФункции
Каждый вызов сервера с клиента — это сетевой обмен. Вызов в цикле на 500 строк превращается в 500 обращений, и форма «подвисает». Данные собирают на сервере одним вызовом.
В общих модулях то же самое задаётся флажками в свойствах модуля: «Клиент», «Сервер», «Вызов сервера», «Внешнее соединение». А внутри модулей встречаются инструкции препроцессора вроде #Если Сервер Тогда … #КонецЕсли.
Отдельно стоит привилегированный режим и безопасный режим: первый выполняет код без проверки прав пользователя, второй ограничивает внешние обработки. Оба задаются в свойствах общих модулей или программно.
Обмены и интеграции: JSON, XML, HTTP
Почти каждый проект 1С связан с внешним миром: сайт, маркетплейс, банк, другая база. Для этого во встроенном языке есть готовые объекты.
| Задача | Чем решается в 1С |
|---|---|
| Отправить запрос во внешний API | HTTPСоединение и HTTPЗапрос |
| Принять запрос от сайта | HTTP-сервис в конфигурации (REST-подход) |
| SOAP-интеграция | Веб-сервисы и WS-ссылки |
| Отдать данные без программирования | Стандартный интерфейс OData |
| Разобрать или собрать JSON | ЧтениеJSON, ЗаписьJSON, функции ПрочитатьJSON и ЗаписатьJSON |
| Работа с XML | ЧтениеXML, ЗаписьXML, механизм XDTO |
| Подключиться к базе из другой программы | COM-соединение, внешнее соединение |
| Обмен между базами 1С | Планы обмена, формат EnterpriseData, «Конвертация данных» |
Пример разбора ответа сервиса в JSON:
Чтение = Новый ЧтениеJSON;
Чтение.УстановитьСтроку(ТекстОтвета);
Данные = ПрочитатьJSON(Чтение);
Чтение.Закрыть();
Сообщить(СтрШаблон("Статус заказа: %1", Данные.status));
ПрочитатьJSON без второго параметра возвращает Структуру, поэтому к полям обращаются через точку. Если ключи содержат дефис или начинаются с цифры, передают Истина вторым параметром и получают Соответствие.
Когда нужны другие языки
- ⚙️ C++ — для внешних компонент по технологии Native API: когда нужен драйвер оборудования или быстрая обработка, которой нет в платформе.
- 🌐 HTML, CSS и JavaScript — для поля HTML-документа на форме: карты, графики, нестандартные редакторы.
- 🐍 Python, Go, C# — снаружи 1С: скрипты, которые обращаются к базе через HTTP-сервисы или OData. Это уже не код конфигурации.
- 🧮 Выражения СКД — в системе компоновки данных отчёты собираются в конструкторе, но вычисляемые поля и ресурсы пишутся выражениями, близкими к языку запросов.
Где пишут и отлаживают код
Конфигуратор
Классическая среда: дерево метаданных, редактор модулей, конструкторы форм и запросов, синтакс-помощник со справкой по каждому методу. Запускается из окна выбора баз кнопкой «Конфигуратор». Подходит для доработок типовых и работы через хранилище конфигурации.
1С:Enterprise Development Tools (EDT)
Современная среда на базе Eclipse. Конфигурация хранится как набор файлов, поэтому с ней работают через Git: ветки, слияния, код-ревью. EDT проверяет код на лету и показывает ошибки до запуска. Ресурсов требует заметно больше Конфигуратора — на машине с 8 ГБ памяти работать тяжело.
Чем ловят ошибки и тормоза
- 🐞 Отладчик — точки останова, пошаговое выполнение, просмотр переменных. Работает и для клиентского, и для серверного кода.
- ⏱️ Замер производительности — показывает, какие строки кода съели время.
- 📜 Технологический журнал — настраивается файлом
logcfg.xmlна сервере, пишет долгие запросы, ошибки и блокировки. - 📘 Журнал регистрации — в режиме Предприятия, видно ошибки пользователей и кто что менял.
- ✅ Автотесты и анализ кода — сообщество использует Vanessa Automation для сценарного тестирования, BSL Language Server и SonarQube для проверки качества кода.
Конструктор запросов в Конфигураторе и EDT собирает текст запроса мышкой. Начинающим он экономит много времени, а опытные используют его для сложных соединений и проверки синтаксиса.
Что ещё учить, кроме синтаксиса
Знание языка — это треть работы. Без остального программист 1С пишет код, который «работает у меня», но ломается в реальной базе.
- Метаданные и учётная модель. Справочники, документы, регистры накопления и сведений, регистры бухгалтерии, планы счетов, планы видов характеристик.
- Библиотека стандартных подсистем (БСП). На ней построены все типовые конфигурации. Вместо своих велосипедов используют её функции, например
ОбщегоНазначения.ЗначениеРеквизитаОбъекта. - Расширения конфигурации . Доработка типовой без снятия с поддержки — сейчас это основной способ правок, он упрощает обновления.
- Блокировки и транзакции. Управляемые блокировки, взаимоблокировки, порядок записи.
- Администрирование. Клиент-серверный вариант, консоль кластера, резервное копирование , публикация на веб-сервере.
- Предметная область. Хотя бы основы бухучёта, НДС и зарплаты — иначе разговор с бухгалтером не сложится.
Проверенный путь входа: учебная версия платформы, книги и курсы фирмы, затем экзамен «1С:Профессионал» по платформе и выбранной конфигурации. Следующая ступень — «1С:Специалист».
Куда развивается язык и смежные технологии
Язык меняется вместе с платформой. В новых релизах 8.3 появились асинхронные методы с Ждать и Асинх вместо громоздких оповещений, расширились возможности работы с JSON и HTTP.
Смежные направления, куда уходят программисты 1С:
- 📱 Мобильная платформа — тот же встроенный язык, приложения для Android и iOS.
- 🧱 1С:Элемент — новая облачная платформа фирмы со своим языком, близким по духу, но не совместимым напрямую с кодом 8.3.
- 🔗 Интеграционные шины и сервисы обмена — больше HTTP, очередей сообщений и форматов данных.
- 📈 Аналитика — выгрузка данных 1С в BI-системы, где нужен SQL и понимание хранилищ.
Код 1С пишут только для своей экосистемы. Плюс — большой рынок вакансий в России. Минус — переход в «общую» разработку потребует выучить ещё один язык с нуля. Обратный путь проще: программисту на Python или C# встроенный язык 1С покажется знакомым, сложности будут в учётной логике.
Частые вопросы
Можно ли программировать в 1С на английском?
Procedure, If, Message. Конфигуратор умеет показывать код на обоих языках, но типовые конфигурации написаны на русском.