На чём пишут в 1С: встроенный язык платформы и запросы

· 9 мин

Содержание

В 1С:Предприятии используется собственный встроенный язык программирования. Его называют «встроенный язык 1С», иногда BSL (Business Script Language). Он работает только внутри платформы 1С:Предприятие 8.3 и без неё не запускается. Рядом с ним живёт второй язык, язык запросов, похожий на SQL.

Бухгалтер впервые сталкивается с этим, когда просит программиста «добавить поле в отчёт» и слышит: «Это на встроенном языке, сделаю в конфигураторе». Ниже разобрано, из чего этот язык состоит, где исполняется и чем отличается от привычных языков.

Что такое встроенный язык платформы

Встроенный язык создан специально для учётных задач. Он умеет работать с документами, справочниками, регистрами, формами и печатными формами. Отдельно подключать библиотеки для этого не нужно: все объекты предметной области уже встроены в платформу.

Главные свойства:

  • 🔤 Русские и английские ключевые слова. Если и If, Для Каждого и For Each равнозначны. Можно смешивать, но в типовых конфигурациях принят русский вариант.
  • 🔠 Регистр не важен. Сообщить, сообщить и СООБЩИТЬ — одно и то же.
  • 🧩 Динамическая типизация. Тип переменной определяется значением, объявлять его заранее не нужно.
  • 🧱 Процедурный стиль с объектами платформы. Свои классы, как в C# или Java, в языке не описываются. Зато есть множество готовых объектов: Справочники, Документы, РегистрыСведений, Таблица значений, Структура, Массив.
  • 🔒 Работа только в среде платформы. Нельзя собрать из кода отдельный exe-файл.

Код хранится внутри информационной базы (или в файлах расширения). Его редактируют в конфигураторе или в 1C:Enterprise Development Tools (EDT), если команда работает на среде разработки EDT.

Платформа 1С:Предприятие 8 — это и среда выполнения, и среда разработки. Язык сам по себе без объектов платформы (документов, регистров) почти бесполезен, и в этом его главное отличие от универсальных языков.

Синтаксис и структура кода

Код делится на процедуры и функции. Функция возвращает значение, процедура — нет. Модуль — это файл с набором таких процедур. У каждого объекта конфигурации (документ, справочник, форма) свои модули.

Минимальный пример, который выводит сообщение пользователю:

Процедура ПриветствиеПользователя()
    Имя = "Анна";
    Если ПустаяСтрока(Имя) Тогда
        Сообщить("Имя не указано");
    Иначе
        Сообщить("Здравствуйте, " + Имя + "!");
    КонецЕсли;
КонецПроцедуры

Что видно из примера:

  1. Блоки закрываются парными словами: КонецЕсли, КонецПроцедуры, КонецЦикла.
  2. Оператор заканчивается точкой с запятой.
  3. Строки заключаются в двойные кавычки, склеиваются плюсом.
  4. Комментарий начинается с двух косых черт //.

Основные конструкции

ЗадачаКонструкция
УсловиеЕсли … Тогда … ИначеЕсли … Иначе … КонецЕсли;
Цикл по коллекцииДля Каждого Элемент Из Коллекция Цикл … КонецЦикла;
Цикл по счётчикуДля Индекс = 0 По 9 Цикл … КонецЦикла;
Цикл с условиемПока Условие Цикл … КонецЦикла;
Обработка ошибокПопытка … Исключение … КонецПопытки;

Типы данных делятся на примитивные (число, строка, дата, булево, Неопределено) и ссылочные (ссылка на элемент справочника, документ и т. д.). Для хранения наборов данных используют Массив, Структура, Соответствие, ТаблицаЗначений.

Нумерация в коллекциях начинается с нуля: у Массива первый элемент — Массив[0]. А номера строк в табличных частях и ТаблицеЗначений в интерфейсе пользователь видит с единицы. Эта разница путает новичков чаще всего.

Запросы и работа с базой данных

Прямого SQL-доступа к таблицам в 1С нет, и это сделано намеренно. Платформа хранит данные в СУБД (файловой, PostgreSQL, MS SQL Server и других), но программист общается с ней через объекты и язык запросов.

Язык запросов — второй язык платформы. Он описывает выборку данных и выглядит знакомо тому, кто видел SQL:

Запрос = Новый Запрос;
Запрос.Текст =
    "ВЫБРАТЬ
    |    Контрагенты.Наименование КАК Наименование,
    |    Контрагенты.ИНН КАК ИНН
    |ИЗ
    |    Справочник.Контрагенты КАК Контрагенты
    |ГДЕ
    |    Контрагенты.ИНН = &ИНН";
Запрос.УстановитьПараметр("ИНН", "7700000000");
Выборка = Запрос.Выполнить().Выбрать();
Пока Выборка.Следующий() Цикл
    Сообщить(Выборка.Наименование);
КонецЦикла;

Запрос возвращается как результат, который обходят через Выборка.Следующий(). Параметры задают через & и подставляют методом УстановитьПараметр, это защищает от ошибок при формировании текста.

Чем язык запросов 1С отличается от SQL

  • 🏷 Источники — объекты конфигурации, а не физические таблицы: Справочник.Контрагенты, Документ.РеализацияТоваровУслуг.
  • 🔗 Обращение через точку. Можно написать Реализация.Контрагент.ИНН, и платформа сама сделает соединение.
  • 📊 Виртуальные таблицы регистров. РегистрНакопления.ТоварыНаСкладах.Остатки(&Дата) возвращает остатки на дату без ручного суммирования движений.
  • 🗂 Временные таблицы создаются через ПОМЕСТИТЬ и хранятся в менеджере временных таблиц на время работы запроса.
  • 🌐 Русские и английские ключевые слова и здесь взаимозаменяемы.

Запрос только читает данные. Записывать данные в базу нужно объектами: создали Документы.Реализация.СоздатьДокумент(), заполнили, вызвали Записать() или Провести.

Где выполняется код: клиент и сервер

Платформа 8.3 клиент-серверная, поэтому каждая процедура в модуле формы выполняется либо на клиенте (на компьютере пользователя), либо на сервере. Место исполнения задаётся директивой компиляции перед процедурой.

ДирективаГде исполняетсяЧто с контекстом формы
&НаКлиентеклиентдоступен, видны элементы формы
&НаСервересервердоступен, форма передаётся на сервер и обратно
&НаСервереБезКонтекстасервернедоступен, работает быстрее, передаются только параметры
&НаКлиентеНаСервереБезКонтекстаоба местанедоступен

Типичная схема: кнопка вызывает клиентскую процедуру, та обращается к серверной за данными, получает результат и показывает его. Вызов клиент-сервер — дорогая операция по времени, поэтому за один раз стараются передать всё нужное, а не вызывать сервер в цикле.

Правила простые:

  1. Всё, что связано с интерфейсом (диалоги, сообщения, открытие форм), — на клиенте.
  2. Запросы к базе, проведение документов, расчёты — на сервере.
  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СPythonC#SQL
Назначениеучёт, бизнес-приложения на платформеуниверсальноеуниверсальноезапросы к БД
Типизациядинамическаядинамическаястатическая—
Работа с БДчерез объекты и язык запросовчерез библиотекичерез ORM или ADOнапрямую
Интерфейсформы платформыотдельные библиотекиWinForms, WPF и др.нет
Запуск вне платформынетдадав СУБД
Порог входанизкий для бухгалтеранизкийсреднийнизкий

Что это значит на практике:

  • Написать справочник, документ и отчёт на 1С быстрее, чем на универсальном языке. Формы, права, журналы и печать уже есть.
  • Перенести код 1С в другую среду нельзя. Навыки языка полезны только внутри экосистемы 1С.
  • От SQL язык запросов отличается синтаксисом, но суть, то есть ВЫБРАТЬ … ИЗ … ГДЕ, переносится легко.

Как учить язык и куда он развивается

Хорошо, если у вас уже есть учётный опыт: понятия «документ», «проводка», «регистр» знакомы заранее. Язык сам по себе осваивается быстро, сложнее освоить архитектуру конфигурации.

Порядок, который работает:

  1. Запустите учебную версию платформы или демо-базу и откройте конфигуратор через пункт запуска «Конфигуратор».
  2. Прочитайте типовой модуль какого-нибудь документа. Начните с ОбработкаПроведения и найдите, как формируются движения.
  3. Напишите несколько простых обработок: вывод списка, фильтр, печатная форма.
  4. Освойте язык запросов и конструктор запросов, который встроен в конфигуратор.
  5. Изучите отладчик: точки останова, просмотр переменных, пошаговое выполнение.

Для дальнейшего развития платформа предлагает среду 1C:Enterprise Development Tools (EDT). Она построена на основе Eclipse и работает с проектами в виде набора файлов, что удобно для командной разработки и систем контроля версий. Конфигуратор при этом остаётся основным инструментом для администрирования и многих рабочих задач.

Разработчика 1С нанимают и на «чистую» разработку, и на смежные позиции: программист-аналитик, консультант по внедрению. Для бухгалтера знание языка даёт возможность самому править отчёты, макеты печатных форм и простые обработки.

Правки типовой конфигурации «напрямую» усложняют обновление: при каждом релизе придётся сравнивать и объединять изменения. Для небольших доработок удобнее расширение.

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

Как называется язык программирования в 1С?
Его называют встроенным языком 1С. В английской документации встречается название BSL (Business Script Language). Отдельный язык запросов работает рядом и описывает выборку данных.
Можно ли программировать в 1С на Python или C#?
Прямо в модулях конфигурации нельзя: код пишется на встроенном языке. Python и C# подключают снаружи, например через HTTP-сервисы или COM-объекты.
Нужно ли знать SQL, чтобы писать в 1С?
Не обязательно, но знание помогает. Язык запросов 1С похож на SQL по смыслу, а прямые запросы к таблицам СУБД вручную не пишут.
Язык 1С регистрозависимый?
Нет. Имена переменных и ключевые слова можно писать в любом регистре, платформа их различает без учёта регистра.
Где писать код 1С?
В конфигураторе платформы или в среде разработки EDT. Для небольших экспериментов достаточно демо-базы и режима «Конфигуратор».
Сложно ли бухгалтеру выучить язык 1С?
Простые вещи вроде условий, циклов и запросов осваиваются за несколько недель практики. Сложнее разобраться в архитектуре типовой конфигурации, на это уходят месяцы.