Встроенный язык, запросы и всё вокруг: чем на деле пишет код разработчик 1С

· 9 мин

Содержание

Программист 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С
Отправить запрос во внешний APIHTTPСоединение и 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. Метаданные и учётная модель. Справочники, документы, регистры накопления и сведений, регистры бухгалтерии, планы счетов, планы видов характеристик.
  2. Библиотека стандартных подсистем (БСП). На ней построены все типовые конфигурации. Вместо своих велосипедов используют её функции, например ОбщегоНазначения.ЗначениеРеквизитаОбъекта.
  3. Расширения конфигурации . Доработка типовой без снятия с поддержки — сейчас это основной способ правок, он упрощает обновления.
  4. Блокировки и транзакции. Управляемые блокировки, взаимоблокировки, порядок записи.
  5. Администрирование. Клиент-серверный вариант, консоль кластера, резервное копирование , публикация на веб-сервере.
  6. Предметная область. Хотя бы основы бухучёта, НДС и зарплаты — иначе разговор с бухгалтером не сложится.

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

Куда развивается язык и смежные технологии

Язык меняется вместе с платформой. В новых релизах 8.3 появились асинхронные методы с Ждать и Асинх вместо громоздких оповещений, расширились возможности работы с JSON и HTTP.

Смежные направления, куда уходят программисты 1С:

  • 📱 Мобильная платформа — тот же встроенный язык, приложения для Android и iOS.
  • 🧱 1С:Элемент — новая облачная платформа фирмы со своим языком, близким по духу, но не совместимым напрямую с кодом 8.3.
  • 🔗 Интеграционные шины и сервисы обмена — больше HTTP, очередей сообщений и форматов данных.
  • 📈 Аналитика — выгрузка данных 1С в BI-системы, где нужен SQL и понимание хранилищ.

Код 1С пишут только для своей экосистемы. Плюс — большой рынок вакансий в России. Минус — переход в «общую» разработку потребует выучить ещё один язык с нуля. Обратный путь проще: программисту на Python или C# встроенный язык 1С покажется знакомым, сложности будут в учётной логике.

Проверьте себя
На каком языке выбирают данные из регистра остатков?
Какая директива подходит для серверной функции, которой не нужны данные формы?
Чем изменяют данные в базе 1С?

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

Можно ли программировать в 1С на английском?
Да. У каждого ключевого слова и метода есть английский вариант: Procedure, If, Message. Конфигуратор умеет показывать код на обоих языках, но типовые конфигурации написаны на русском.
Объектно-ориентированный ли язык 1С?
Частично. Объекты и методы есть, но своих классов с наследованием создать нельзя. Их место занимают объекты метаданных: справочники, документы, регистры.
Язык 1С компилируемый или интерпретируемый?
Платформа переводит модули во внутренний байт-код и исполняет его в своей виртуальной машине. Получить отдельный исполняемый файл из кода 1С нельзя.
Сколько времени нужно, чтобы выучить язык 1С с нуля?
Синтаксис и запросы — за 1–2 месяца регулярных занятий. До уровня, на котором дорабатывают типовые конфигурации, обычно уходит от полугода до года практики.
Нужно ли программисту 1С знать бухгалтерию?
Глубоко — нет, но основы нужны: проводки, счета, НДС, закрытие месяца. Без них трудно понять, что просит заказчик и почему отчёт не сходится.