Из чего сделана 1С:Предприятие 8.3 — от ядра на C++ до встроенного языка
Содержание
Платформа 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С из трёх типов процессов:
ragent— агент сервера. Клиент сначала обращается к нему, по умолчанию на порт1540. Через него же работает консоль администрирования.rmngr— менеджер кластера, порт1541. Хранит реестр баз и распределяет сеансы.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. Конфигурацию переписывать не нужно.