На чём пишут в 1С: встроенный язык платформы и запросы
Содержание
В 1С:Предприятии используется собственный встроенный язык программирования. Его называют «встроенный язык 1С», иногда BSL (Business Script Language). Он работает только внутри платформы 1С:Предприятие 8.3 и без неё не запускается. Рядом с ним живёт второй язык, язык запросов, похожий на SQL.
Бухгалтер впервые сталкивается с этим, когда просит программиста «добавить поле в отчёт» и слышит: «Это на встроенном языке, сделаю в конфигураторе». Ниже разобрано, из чего этот язык состоит, где исполняется и чем отличается от привычных языков.
Что такое встроенный язык платформы
Встроенный язык создан специально для учётных задач. Он умеет работать с документами, справочниками, регистрами, формами и печатными формами. Отдельно подключать библиотеки для этого не нужно: все объекты предметной области уже встроены в платформу.
Главные свойства:
- 🔤 Русские и английские ключевые слова.
ЕслииIf,Для КаждогоиFor Eachравнозначны. Можно смешивать, но в типовых конфигурациях принят русский вариант. - 🔠 Регистр не важен.
Сообщить,сообщитьиСООБЩИТЬ— одно и то же. - 🧩 Динамическая типизация. Тип переменной определяется значением, объявлять его заранее не нужно.
- 🧱 Процедурный стиль с объектами платформы. Свои классы, как в C# или Java, в языке не описываются. Зато есть множество готовых объектов:
Справочники,Документы,РегистрыСведений,Таблица значений,Структура,Массив. - 🔒 Работа только в среде платформы. Нельзя собрать из кода отдельный exe-файл.
Код хранится внутри информационной базы (или в файлах расширения). Его редактируют в конфигураторе или в 1C:Enterprise Development Tools (EDT), если команда работает на среде разработки EDT.
Платформа 1С:Предприятие 8 — это и среда выполнения, и среда разработки. Язык сам по себе без объектов платформы (документов, регистров) почти бесполезен, и в этом его главное отличие от универсальных языков.
Синтаксис и структура кода
Код делится на процедуры и функции. Функция возвращает значение, процедура — нет. Модуль — это файл с набором таких процедур. У каждого объекта конфигурации (документ, справочник, форма) свои модули.
Минимальный пример, который выводит сообщение пользователю:
Процедура ПриветствиеПользователя()
Имя = "Анна";
Если ПустаяСтрока(Имя) Тогда
Сообщить("Имя не указано");
Иначе
Сообщить("Здравствуйте, " + Имя + "!");
КонецЕсли;
КонецПроцедуры
Что видно из примера:
- Блоки закрываются парными словами:
КонецЕсли,КонецПроцедуры,КонецЦикла. - Оператор заканчивается точкой с запятой.
- Строки заключаются в двойные кавычки, склеиваются плюсом.
- Комментарий начинается с двух косых черт
//.
Основные конструкции
| Задача | Конструкция |
|---|---|
| Условие | Если … Тогда … ИначеЕсли … Иначе … КонецЕсли; |
| Цикл по коллекции | Для Каждого Элемент Из Коллекция Цикл … КонецЦикла; |
| Цикл по счётчику | Для Индекс = 0 По 9 Цикл … КонецЦикла; |
| Цикл с условием | Пока Условие Цикл … КонецЦикла; |
| Обработка ошибок | Попытка … Исключение … КонецПопытки; |
Типы данных делятся на примитивные (число, строка, дата, булево, Неопределено) и ссылочные (ссылка на элемент справочника, документ и т. д.). Для хранения наборов данных используют Массив, Структура, Соответствие, ТаблицаЗначений.
Нумерация в коллекциях начинается с нуля: у Массива первый элемент — Массив[0]. А номера строк в табличных частях и ТаблицеЗначений в интерфейсе пользователь видит с единицы. Эта разница путает новичков чаще всего.
Запросы и работа с базой данных
Прямого SQL-доступа к таблицам в 1С нет, и это сделано намеренно. Платформа хранит данные в СУБД (файловой, PostgreSQL, MS SQL Server и других), но программист общается с ней через объекты и язык запросов.
Язык запросов — второй язык платформы. Он описывает выборку данных и выглядит знакомо тому, кто видел SQL:
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| Контрагенты.Наименование КАК Наименование,
| Контрагенты.ИНН КАК ИНН
|ИЗ
| Справочник.Контрагенты КАК Контрагенты
|ГДЕ
| Контрагенты.ИНН = &ИНН";
Запрос.УстановитьПараметр("ИНН", "7700000000");
Выборка = Запрос.Выполнить().Выбрать();
Пока Выборка.Следующий() Цикл
Сообщить(Выборка.Наименование);
КонецЦикла;
Запрос возвращается как результат, который обходят через Выборка.Следующий(). Параметры задают через & и подставляют методом УстановитьПараметр, это защищает от ошибок при формировании текста.
Чем язык запросов 1С отличается от SQL
- 🏷 Источники — объекты конфигурации, а не физические таблицы:
Справочник.Контрагенты,Документ.РеализацияТоваровУслуг. - 🔗 Обращение через точку. Можно написать
Реализация.Контрагент.ИНН, и платформа сама сделает соединение. - 📊 Виртуальные таблицы регистров.
РегистрНакопления.ТоварыНаСкладах.Остатки(&Дата)возвращает остатки на дату без ручного суммирования движений. - 🗂 Временные таблицы создаются через
ПОМЕСТИТЬи хранятся в менеджере временных таблиц на время работы запроса. - 🌐 Русские и английские ключевые слова и здесь взаимозаменяемы.
Запрос только читает данные. Записывать данные в базу нужно объектами: создали Документы.Реализация.СоздатьДокумент(), заполнили, вызвали Записать() или Провести.
Где выполняется код: клиент и сервер
Платформа 8.3 клиент-серверная, поэтому каждая процедура в модуле формы выполняется либо на клиенте (на компьютере пользователя), либо на сервере. Место исполнения задаётся директивой компиляции перед процедурой.
| Директива | Где исполняется | Что с контекстом формы |
|---|---|---|
&НаКлиенте | клиент | доступен, видны элементы формы |
&НаСервере | сервер | доступен, форма передаётся на сервер и обратно |
&НаСервереБезКонтекста | сервер | недоступен, работает быстрее, передаются только параметры |
&НаКлиентеНаСервереБезКонтекста | оба места | недоступен |
Типичная схема: кнопка вызывает клиентскую процедуру, та обращается к серверной за данными, получает результат и показывает его. Вызов клиент-сервер — дорогая операция по времени, поэтому за один раз стараются передать всё нужное, а не вызывать сервер в цикле.
Правила простые:
- Всё, что связано с интерфейсом (диалоги, сообщения, открытие форм), — на клиенте.
- Запросы к базе, проведение документов, расчёты — на сервере.
- Параметры между клиентом и сервером передаются копиями. Передать между ними ссылку на живой объект интерфейса нельзя.
Если вызвать на клиенте метод, который существует только на сервере, платформа не даст сохранить модуль и покажет ошибку компиляции. Это удобная защита: неправильное место исполнения ловится до запуска.
Есть и модули, которые целиком работают на сервере: модуль объекта, модуль менеджера, общие модули с нужными флагами. Общий модуль можно настроить так, чтобы он вызывался из клиента, сервера или из обоих мест.
Как организован код: модули и области видимости
Код лежит не в одном файле, а в модулях разного назначения. Выбор модуля определяет, что доступно в коде.
- 📄 Модуль формы. Обработчики событий формы, кнопок и полей. Здесь работают директивы клиент/сервер.
- 🗃 Модуль объекта. Логика самого документа или справочника: заполнение, проведение, проверка перед записью.
- 🧰 Общие модули. Набор процедур и функций, которые вызываются из любого места конфигурации. В них выносят всё, что нужно в нескольких формах.
- 🚀 Модули сеанса, приложения. Выполняются при старте работы пользователя.
Переменные, объявленные внутри процедуры, видны только в ней. Переменные верхнего уровня модуля доступны всем процедурам этого модуля, но не другим. Чтобы вызвать чужую процедуру, её помечают ключевым словом Экспорт:
Функция ТекущийПользователь() Экспорт
Возврат ИмяПользователя();
КонецФункции
Без Экспорт процедура остаётся внутренней. Экспортные процедуры общего модуля становятся доступны по имени модуля, например МойМодуль.ТекущийПользователь().
Расширение возможностей: внешние компоненты и интеграции
Встроенный язык не изолирован. Когда его возможностей мало, платформа предлагает несколько путей.
- 🔌 Внешние компоненты. Это библиотеки, написанные на C++ по технологии Native API (или по старой технологии COM). Через них подключают торговое оборудование, сканеры, фискальные регистраторы. В коде компонента подключают методом
ПодключитьВнешнююКомпоненту. - 🧾 COM-объекты. Из кода можно открыть Excel или Word:
Новый COMОбъект("Excel.Application"). Работает только там, где эти программы установлены. - 🌍 HTTP-сервисы и веб-сервисы. Платформа и принимает запросы (
HTTPСервис), и отправляет (HTTPСоединение,HTTPЗапрос). Формат обмена обычно JSON или XML. - 📦 Расширения конфигураций. Меняют поведение типовой конфигурации без правки самой конфигурации, поэтому типовой код остаётся обновляемым.
- 🔁 Обмен данными. Планы обмена и правила конвертации, XML и JSON.
Если нужна сложная математика или машинное обучение, на практике часто пишут отдельный сервис на Python или C#, а 1С обращается к нему через HTTP. Тяжёлые вычисления в 1С возможны, но платформа для них не создавалась.
Компоненты для работы с оборудованием обычно ставят с драйвером производителя. Подключение выполняют в тот момент, когда оборудование нужно, и обрабатывают ошибку подключения через Попытка … Исключение.
Сравнение со Python, C# и SQL
Язык 1С решает узкую задачу: быстро делать учётные приложения на готовой платформе. Универсальные языки решают всё подряд, но требуют больше работы вокруг.
| Сравнение | Язык 1С | Python | C# | SQL |
|---|---|---|---|---|
| Назначение | учёт, бизнес-приложения на платформе | универсальное | универсальное | запросы к БД |
| Типизация | динамическая | динамическая | статическая | — |
| Работа с БД | через объекты и язык запросов | через библиотеки | через ORM или ADO | напрямую |
| Интерфейс | формы платформы | отдельные библиотеки | WinForms, WPF и др. | нет |
| Запуск вне платформы | нет | да | да | в СУБД |
| Порог входа | низкий для бухгалтера | низкий | средний | низкий |
Что это значит на практике:
- Написать справочник, документ и отчёт на 1С быстрее, чем на универсальном языке. Формы, права, журналы и печать уже есть.
- Перенести код 1С в другую среду нельзя. Навыки языка полезны только внутри экосистемы 1С.
- От SQL язык запросов отличается синтаксисом, но суть, то есть
ВЫБРАТЬ … ИЗ … ГДЕ, переносится легко.
Как учить язык и куда он развивается
Хорошо, если у вас уже есть учётный опыт: понятия «документ», «проводка», «регистр» знакомы заранее. Язык сам по себе осваивается быстро, сложнее освоить архитектуру конфигурации.
Порядок, который работает:
- Запустите учебную версию платформы или демо-базу и откройте конфигуратор через пункт запуска «Конфигуратор».
- Прочитайте типовой модуль какого-нибудь документа. Начните с
ОбработкаПроведенияи найдите, как формируются движения. - Напишите несколько простых обработок: вывод списка, фильтр, печатная форма.
- Освойте язык запросов и конструктор запросов, который встроен в конфигуратор.
- Изучите отладчик: точки останова, просмотр переменных, пошаговое выполнение.
Для дальнейшего развития платформа предлагает среду 1C:Enterprise Development Tools (EDT). Она построена на основе Eclipse и работает с проектами в виде набора файлов, что удобно для командной разработки и систем контроля версий. Конфигуратор при этом остаётся основным инструментом для администрирования и многих рабочих задач.
Разработчика 1С нанимают и на «чистую» разработку, и на смежные позиции: программист-аналитик, консультант по внедрению. Для бухгалтера знание языка даёт возможность самому править отчёты, макеты печатных форм и простые обработки.
Правки типовой конфигурации «напрямую» усложняют обновление: при каждом релизе придётся сравнивать и объединять изменения. Для небольших доработок удобнее расширение.