Из чего сделана 1С:Предприятие 8.3 — от ядра на C++ до встроенного языка

· 9 мин

Содержание

Платформа 1С:Предприятие 8.3 написана в основном на C++. На нём сделаны исполняемые файлы клиента и сервера: 1cv8.exe, 1cv8c.exe, ragent, rmngr, rphost. А конфигурации — Бухгалтерия, ЗУП, Управление торговлей — написаны уже на встроенном языке 1С, который исполняет эта платформа.

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

Два слоя: платформа и прикладное решение

Система 1С устроена как «движок + программа для движка». Это похоже на браузер и сайт: браузер написан на C++, а сайт — на HTML и JavaScript.

СлойЧто входитНа чём сделано
Технологическая платформаклиенты, сервер, работа с СУБД, интерпретатор языка, конструкторыC++
Веб-клиентинтерфейс в браузереJavaScript, который отдаёт веб-сервер с модулем расширения 1С
Конфигурация (прикладное решение)справочники, документы, регистры, формы, отчётыметаданные + встроенный язык 1С + язык запросов
Среда 1С:EDTредактор и инструменты разработчикаJava, на базе Eclipse

Убедиться в этом легко. Откройте каталог установленной платформы, обычно C:\Program Files\1cv8\<номер версии>\bin. Там лежат сотни библиотек .dll и исполняемые файлы — скомпилированный код ядра. Ни одного модуля на языке 1С в этой папке нет: прикладной код хранится в самой информационной базе.

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

  • 🔧 Исходники платформы закрыты. Изменить поведение ядра нельзя — только сообщить об ошибке в фирму 1С.
  • 📂 Исходники типовых конфигураций открыты. Любой модуль Бухгалтерии можно прочитать в Конфигураторе.
  • 🔄 Одна и та же конфигурация работает на Windows, Linux и macOS. Различия берёт на себя платформа.

Мобильная платформа

Для телефонов есть отдельная мобильная платформа под Android и iOS. Она тоже исполняет конфигурацию на встроенном языке, но с урезанным набором объектов. Мобильное приложение собирают из конфигурации сборщиком, а обмен с основной базой обычно идёт через HTTP-сервисы.

Платформа выходит отдельными версиями (8.3.2x) и обновляется независимо от конфигурации. Поэтому в требованиях к релизу Бухгалтерии пишут: «номер платформы не ниже 8.3.ХХ».

Встроенный язык 1С: синтаксис и исполнение

Встроенный язык — собственная разработка фирмы 1С. По синтаксису его чаще всего сравнивают с Visual Basic и Pascal: блоки закрываются словами, а не скобками, присваивание через =, точка с запятой разделяет операторы.

Главная особенность — двуязычие. Каждое ключевое слово имеет русское и английское написание, и их можно смешивать в одном модуле:

Процедура ПроверитьСумму(Сумма) Экспорт
    Если Сумма <= 0 Тогда
        ВызватьИсключение "Сумма должна быть больше нуля";
    КонецЕсли;
КонецПроцедуры

Procedure CheckSum(Sum) Export
    If Sum <= 0 Then
        Raise "Sum must be greater than zero";
    EndIf;
EndProcedure

Обе процедуры делают одно и то же. В типовых конфигурациях принят русский вариант.

Чем язык отличается от «обычных»

  • 🧩 Нет пользовательских классов. Объекты задаются метаданными: создали справочник «Номенклатура» — платформа сама даёт тип СправочникОбъект.Номенклатура с методами Записать(), Удалить() и свойствами по реквизитам.
  • 🔀 Динамическая типизация. Переменная не объявляет тип и может хранить что угодно. Тип проверяют функцией ТипЗнч().
  • 📦 Код живёт в модулях. Модуль объекта, модуль менеджера, модуль формы, общие модули, модуль сеанса, модуль приложения.
  • 🗃️ Отдельный язык запросов. Выборки из базы пишут не на SQL, а на языке запросов 1С с русским синтаксисом: ВЫБРАТЬ ... ИЗ ... ГДЕ.

Обработка ошибок

Исключения перехватывают конструкцией Попытка ... Исключение ... КонецПопытки. Текст ошибки получают через ИнформацияОбОшибке(), а для пользователя его упрощают функцией КраткоеПредставлениеОшибки(). Сообщение «Ошибка при вызове метода контекста» появляется, когда метод платформы выдал исключение, а прикладной код его не перехватил.

Как исполняется код

Модули не превращаются в машинный код процессора. Платформа компилирует текст модуля в промежуточный код и исполняет его своей виртуальной машиной. Компиляция происходит при первом обращении к модулю в сеансе, поэтому первый вызов тяжёлого общего модуля бывает заметно медленнее последующих.

💡 Из-за этого скорость прикладного кода редко упирается в сам язык. Тормозят обычно запросы в цикле, лишние вызовы сервера и блокировки — об этом ниже.

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

С управляемыми формами (интерфейс «Такси») код явно делится на клиентский и серверный. Разработчик указывает место исполнения директивой перед процедурой:

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

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

Файловый и клиент-серверный режим

В файловом варианте отдельного сервера нет. Серверная часть работает внутри процесса клиента, а данные лежат в одном файле 1Cv8.1CD.

В клиент-серверном варианте работает кластер серверов 1С из трёх типов процессов:

  1. ragent — агент сервера. Клиент сначала обращается к нему, по умолчанию на порт 1540. Через него же работает консоль администрирования.
  2. rmngr — менеджер кластера, порт 1541. Хранит реестр баз и распределяет сеансы.
  3. rphost — рабочие процессы. В них исполняется серверный код конфигурации и формируются запросы к СУБД. Диапазон их портов задаётся в свойствах рабочего сервера, по умолчанию 1560–1591.

Клиенты бывают трёх видов: тонкий 1cv8c, толстый 1cv8 и веб-клиент в браузере. Тонкий и веб-клиент не исполняют серверный код у себя — всё, что касается данных, уходит на сервер.

Как 1С хранит данные в СУБД

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

Платформа 8.3 работает с такими хранилищами:

  • 💾 файловая база — собственный формат 1С;
  • 🗄️ Microsoft SQL Server;
  • 🐘 PostgreSQL — в сборках, адаптированных для 1С;
  • 🏢 IBM Db2;
  • 🏛️ Oracle Database.

Как запрос 1С превращается в SQL

Код пишет запрос на языке 1С. Рабочий процесс переводит его в SQL-диалект конкретной СУБД и отправляет на выполнение. Конфигурация при этом не меняется: одна и та же Бухгалтерия переезжает с MS SQL на PostgreSQL выгрузкой и загрузкой .dt.

Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
|    Номенклатура.Ссылка КАК Ссылка,
|    Номенклатура.Наименование КАК Наименование
|ИЗ
|    Справочник.Номенклатура КАК Номенклатура
|ГДЕ
|    НЕ Номенклатура.ПометкаУдаления";

Выборка = Запрос.Выполнить().Выбрать();
Пока Выборка.Следующий() Цикл
    Сообщить(Выборка.Наименование);
КонецЦикла;

В самой СУБД таблицы называются не по-русски, а служебными именами вроде _Reference25, _Document112, _AccumRg340. Соответствие имён метаданных и таблиц возвращает функция ПолучитьСтруктуруХраненияБазыДанных().

Транзакции и блокировки

Запись документа выполняется в транзакции СУБД: либо записались все движения, либо ни одного. Если при проведении возникла ошибка, платформа откатывает всё целиком.

Блокировки бывают двух режимов, он задаётся в свойствах конфигурации:

  • 🔒 автоматический — блокировки ставит сама СУБД, часто крупными кусками таблиц;
  • 🎯 управляемый — блокировки ставит платформа по конкретным данным, а код запрашивает их объектом БлокировкаДанных.

Типовые конфигурации давно работают в управляемом режиме. Именно поэтому в них 20–30 пользователей могут проводить документы одновременно без постоянных ожиданий.

Менять данные напрямую SQL-запросами в обход платформы нельзя. Фирма 1С это не поддерживает, а платформа не узнает об изменениях: нарушатся итоги регистров, кэши и связи. Прямой SQL допустим только для чтения и диагностики, и то на копии базы.

Расширения, внешние обработки и компоненты

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

СпособЧто даётФормат
Расширение конфигурацииперехват процедур, новые реквизиты, формы, объекты.cfe
Внешняя обработкаотдельная утилита, подключается без изменения базы.epf
Внешний отчётотчёт вне конфигурации.erf
Внешняя компонентафункции, которых нет во встроенном языкебиблиотека .dll / .so, часто в ZIP-архиве

Расширения появились в платформе 8.3.6. Они пишутся на том же встроенном языке и позволяют подменить типовую процедуру своей через аннотации &Перед, &После или &Вместо.

Когда нужен «другой язык»

Внешние компоненты — единственный способ добавить в 1С код на C++. Используются две технологии:

  • 🔌 Native API — библиотека на C++ под Windows, Linux и macOS. Через неё работают драйверы торгового оборудования, сканеры, криптография.
  • 🪟 COM — только Windows, старая технология. Подходит для компонентов, написанных на любом языке с поддержкой COM.

Для связи с внешними системами компоненты нужны не всегда. В платформе есть HTTP-сервисы, веб-сервисы SOAP, стандартный интерфейс OData и COM-соединение V83.COMConnector. Через них 1С обменивается данными с сайтом, банком или программой на Python без строчки C++.

Среды разработки и отладка

У разработчика два основных инструмента.

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

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

Как устроена отладка

В 8.3 отладка идёт по протоколу HTTP через отдельный сервер отладки. Для файловой базы его запускает Конфигуратор. Для клиент-серверной — агент сервера, если его служба запущена с ключом -debug.

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

Что даёт отладчик:

  • 🔴 точки останова и пошаговое выполнение, в том числе серверного кода;
  • 👁️ просмотр значений переменных и выражений;
  • ⏱️ замер производительности — сколько времени заняла каждая строка модуля.

Для проблем, которые не ловятся отладчиком (взаимоблокировки, медленные запросы на рабочей базе), администраторы включают технологический журнал через файл logcfg.xml.

Инструменты сообщества

Вокруг языка 1С выросла экосистема открытых проектов:

  • 📝 BSL Language Server — проверка кода и подсветка для VS Code;
  • 🧪 Vanessa Automation — сценарное тестирование интерфейса;
  • 📜 OneScript — независимый интерпретатор языка 1С на .NET. Позволяет писать на привычном синтаксисе скрипты сборки и автоматизации без запуска платформы.

OneScript удобен для скриптов, но конфигурации в нём не запустишь: нет метаданных, форм и базы данных. Это только язык.

Что из этого нужно знать бухгалтеру и администратору

Программисту архитектура нужна для работы. Но и остальным она объясняет повседневные вещи.

  • 🐢 «Тормозит 1С». Чаще всего дело не в языке, а в сервере СУБД, сети между клиентом и сервером или конкретном отчёте с тяжёлым запросом.
  • 🔄 «Обновили платформу — сломалась обработка». Внешняя обработка написана под определённую версию языка и объектов конфигурации. После обновления её проверяют на копии.
  • 🌐 «Работаю из дома через браузер». Это веб-клиент: тот же код конфигурации, только интерфейс рисует JavaScript в браузере.
  • 💻 «Можно ли на Linux?» Можно: и сервер 1С, и клиенты есть под Linux. Конфигурацию переписывать не нужно.
Проверьте себя
Где исполняется процедура с директивой &НаСервереБезКонтекста?
На каком языке написана сама платформа 1С:Предприятие 8.3?
Какой формат у расширения конфигурации?

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

Можно ли писать конфигурации 1С на Python или C#?
Нет. Прикладная логика пишется только на встроенном языке 1С. Python или C# подключают снаружи — через HTTP-сервисы, OData или COM-соединение.
Язык 1С — объектно-ориентированный?
Не в классическом смысле. Объекты и их методы есть, но свои классы с наследованием создать нельзя: типы задаются метаданными конфигурации.
Почему в 1С код на русском языке?
Так задумано для удобства русскоязычных разработчиков и бухгалтеров. Каждый оператор имеет английский аналог, и платформа понимает оба варианта.
Чем 1С 8.3 отличается от 7.7 по языку?
Синтаксис похож, но в 8.x появились управляемые формы, разделение кода на клиент и сервер, язык запросов в нынешнем виде и работа с несколькими СУБД.
Нужно ли знать SQL программисту 1С?
Писать на SQL не нужно, но понимать его полезно. Это помогает читать планы запросов и находить медленные места в технологическом журнале.