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

· 9 мин

Содержание

Платформа 1С:Предприятие 8.3 написана в основном на C++. А сами прикладные решения — Бухгалтерия, ЗУП, Управление торговлей — написаны на собственном встроенном языке 1С с русским синтаксисом и языке запросов, похожем на SQL.

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

Два слоя: платформа и конфигурация

Любая база 1С — это связка двух частей. Их разрабатывают разные люди, на разных языках, и обновляются они отдельно.

СлойЧто этоНа чём написанКто меняет
ПлатформаИсполняемые файлы 1cv8.exe, 1cv8c.exe, сервер ragent, rmngr, rphostC++ (ядро), JavaScript (веб-клиент), Java (среда EDT)Только фирма 1С
КонфигурацияМетаданные, формы, макеты, модулиВстроенный язык 1С + язык запросовФирма 1С, франчайзи, программист компании
ДанныеСправочники, документы, регистрыХранятся в СУБДПользователи

🔹 Платформа — это «движок». Она умеет показывать формы, выполнять код, хранить данные, проверять права, работать по сети. Сама по себе она ничего не знает про НДС или отпускные.

🔹 Конфигурация — прикладная логика. Документ «Реализация товаров и услуг», его проводки, печатная форма, отчёт по продажам — всё это код и описания в конфигурации.

💡 Поэтому платформу и конфигурацию обновляют по отдельности. Новый релиз Бухгалтерии требует платформу с номером не ниже указанного в описании релиза, но сам платформу не ставит.

Как устроено ядро платформы

Ядро — набор нативных библиотек и исполняемых файлов под Windows, Linux и macOS. Внутри есть:

  • ⚙️ интерпретатор встроенного языка — код конфигурации не компилируется в машинный, а выполняется виртуальной машиной платформы;
  • 🗄️ транслятор языка запросов в SQL конкретной СУБД;
  • 🖼️ движок интерфейса, который сам строит формы по их описанию;
  • 🔐 подсистема прав, блокировок и транзакций;
  • 🌐 сетевой слой для клиент-серверного режима.

Модель «метаданные + интерпретатор» — главная особенность 1С. Разработчик не пишет таблицы и SQL-схему вручную. Он описывает объект «Справочник Контрагенты» с реквизитами, а платформа сама создаёт таблицы в базе и экранные формы.

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

Встроенный язык — предметно-ориентированный. Его создали под учётные задачи, и он намеренно простой. По синтаксису он ближе всего к Паскалю и Бейсику: блоки закрываются ключевыми словами, а не скобками.

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

  • 🇷🇺 двуязычный синтаксис — у каждого ключевого слова есть русский и английский вариант: Если / If, Процедура / Procedure, КонецЦикла / EndDo;
  • 📝 динамическая типизация — тип переменной определяется значением, объявлять тип не нужно;
  • 🔤 регистр не важен — Сумма и СУММА — одна переменная;
  • 🧩 нет собственных классов — объектная модель задаётся метаданными, а не кодом;
  • 📦 модули — код лежит в модулях объектов, менеджеров, форм, общих модулях и модуле приложения.

Пример процедуры, которая считает сумму по строкам табличной части:

Функция СуммаДокумента(Товары)
    Итого = 0;
    Для Каждого Строка Из Товары Цикл
        Итого = Итого + Строка.Сумма;
    КонецЦикла;
    Возврат Итого;
КонецФункции

То же на английском синтаксисе работает без изменений в платформе:

Function DocumentTotal(Goods)
    Total = 0;
    For Each Row In Goods Do
        Total = Total + Row.Sum;
    EndDo;
    Return Total;
EndFunction

В типовых конфигурациях фирмы 1С код пишут только по-русски. Английский вариант встречается в международных решениях и у разработчиков из других стран.

Язык запросов

Второй язык внутри 1С — язык запросов. Он похож на SQL, но работает с объектами конфигурации, а не с таблицами СУБД напрямую. Платформа сама переводит запрос в SQL нужной базы.

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

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

Отличия от «чистого» SQL:

  • 🔗 разыменование через точку: Документ.Контрагент.ИНН — платформа сама построит соединение таблиц;
  • 📊 виртуальные таблицы регистров: Остатки, Обороты, СрезПоследних;
  • ✍️ только чтение — ВСТАВИТЬ и УДАЛИТЬ в языке запросов нет, данные меняют через объекты встроенного языка;
  • 🧮 конструктор запросов в Конфигураторе собирает текст мышкой.

Поверх запросов работает система компоновки данных (СКД). На ней сделаны почти все отчёты типовых конфигураций: пользователь меняет группировки и отборы сам, без программиста.

Где хранятся данные: файловая база и СУБД

1С не привязана к одной СУБД. Платформа поддерживает два режима работы.

РежимГде данныеДля кого
ФайловыйОдин файл 1Cv8.1CD в каталоге базы1–5 пользователей, небольшие объёмы
Клиент-серверныйВнешняя СУБД: Microsoft SQL Server, PostgreSQL, IBM Db2 и другиеДесятки и сотни пользователей

Файловую СУБД фирма 1С написала сама, она встроена в платформу. Ставить отдельный сервер базы данных не нужно — поэтому небольшие фирмы и стартуют с файловой базы.

В клиент-серверном варианте между пользователем и СУБД стоит сервер 1С:Предприятия. Схема такая:

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

Структуру таблиц в СУБД вручную не меняют. Имена там служебные (_Reference25, _Document112), и правка в обход платформы ломает базу. Данные читают и пишут только через 1С.

Перенос между режимами — через выгрузку .dt в Конфигураторе. Загрузка .dt заменяет всю базу-приёмник, поэтому перед ней делают резервную копию приёмника и выгоняют пользователей.

Управляемые формы и клиент-серверный код

С версии 8.2 интерфейс строится на управляемых формах. В 8.3 обычные формы остались только для старых конфигураций, все типовые решения работают на управляемых. Интерфейс «Такси» — тоже поверх них.

Идея простая: разработчик описывает форму логически — какие поля, группы, команды. А как её нарисовать, решает клиент. Одна и та же форма открывается в тонком клиенте, в браузере и в мобильном приложении.

Виды клиентов:

  • 💻 тонкий клиент (1cv8c.exe) — основной вариант, почти вся логика на сервере;
  • 🌍 веб-клиент — работает в браузере, написан на JavaScript; базу публикуют на веб-сервере Apache или IIS;
  • 📱 мобильный клиент и мобильная платформа для Android и iOS;
  • 🖥️ толстый клиент (1cv8.exe) — исторический режим, нужен для обычных форм и Конфигуратора.

Директивы компиляции

Код в модуле формы явно делится на клиентский и серверный. Для этого перед процедурой ставят директиву:

ДирективаГде выполняетсяДоступ к данным формы
&НаКлиентеНа компьютере пользователяДа
&НаСервереНа сервере, с передачей формыДа
&НаСервереБезКонтекстаНа сервере, без формыНет — только параметры
&НаКлиентеНаСервереБезКонтекстаИ там, и тамНет
&НаКлиенте
Процедура ЗаполнитьЦены(Команда)
    ЗаполнитьЦеныНаСервере();
КонецПроцедуры

&НаСервере
Процедура ЗаполнитьЦеныНаСервере()
    // запросы к базе выполняются только здесь
КонецПроцедуры

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

Расширения и интеграция с другими системами

Расширения конфигурации

Раньше доработать типовую 1С можно было только одним способом — снять конфигурацию с поддержки и править её код. После этого каждое обновление превращалось в ручное сравнение.

С платформы 8.3.6 появились расширения — файлы .cfe. Это надстройка над конфигурацией: свои реквизиты, формы, отчёты и перехват процедур типового кода. Основная конфигурация остаётся на поддержке и обновляется как обычно.

Перехват делают аннотациями в модуле расширения:

  • &Перед — код выполнится до типовой процедуры;
  • &После — после неё;
  • &Вместо — вместо типовой (использовать осторожно: при обновлении типовой процедуры перехват не узнает о новой логике).

Загрузка .cfe и обновление конфигурации базы данных — это два отдельных шага. Если загрузить файл и не обновить базу , изменения не применятся.

Способы интеграции

1С умеет обмениваться данными с внешним миром несколькими способами:

МеханизмНаправлениеКогда подходит
HTTP-сервисы1С принимает запросыСвой REST API для сайта, мобильного приложения
Веб-сервисы (SOAP)Приём и отправкаОбмен с системами, которые работают через WSDL
Стандартный интерфейс OData1С отдаёт и принимает данныеБыстрый REST-доступ без программирования сервисов
COM-соединение (V83.COMConnector)Внешняя программа управляет базойСкрипты под Windows, обмен между базами
Внешние компоненты (Native API)Расширение возможностей платформыРабота с оборудованием, своя библиотека на C++
Файлы XML и JSONОбмен выгрузкамиКонвертация данных, загрузка из банков и маркетплейсов

Внешние компоненты — единственное место, где прикладной программист 1С пишет на C++. Так подключают кассы, весы, сканеры штрихкодов и специальные библиотеки.

Чем пользуется разработчик: Конфигуратор и EDT

Писать на 1С можно в двух средах.

Конфигуратор

Встроен в платформу, открывается из окна запуска кнопкой «Конфигуратор». В нём есть всё базовое:

  • 🌳 дерево метаданных и редакторы объектов;
  • ✏️ редактор модулей с подсказкой и синтакс-помощником;
  • 🧱 конструкторы запросов, форм, печатных форм;
  • 🐞 отладчик: точки останова, пошаговое выполнение, табло значений;
  • ⏱️ замер производительности — показывает, какие строки кода съедают время;
  • 🔀 сравнение и объединение конфигураций, хранилище для командной работы.

1C:Enterprise Development Tools (EDT)

Современная среда на базе Eclipse, написана на Java. Конфигурация хранится в виде файлов на диске, поэтому её можно вести в Git, делать ветки и код-ревью.

КонфигураторEDT
Хранение кодаВнутри базы или в хранилище 1СФайлы проекта, Git
Требования к компьютеруСкромныеНужно много памяти
Командная работаХранилище с захватом объектовВетки и слияние
Порог входаНижеВыше

Диагностика в рабочей базе

Когда ошибка проявляется только у пользователей, отладчика мало. Тогда смотрят:

  • 📒 журнал регистрации — кто, когда и что сделал, ошибки в событиях;
  • 🔬 технологический журнал — включается файлом logcfg.xml, пишет события платформы: долгие запросы, блокировки, исключения;
  • 🧪 отладку на сервере — сервер запускают с ключом -debug, после чего Конфигуратор подключается к рабочим процессам.

Перезапуск службы сервера 1С с ключом отладки обрывает сеансы всех пользователей. Делают это вне рабочего времени или на копии базы.

Проверьте себя
На каком языке написано ядро платформы 1С:Предприятие 8.3?
Где выполняется процедура с директивой &НаСервереБезКонтекста?
С какой версии платформы появились расширения конфигурации?

Частые вопросы о языке и устройстве 1С

Можно ли писать конфигурации 1С на Python или C#?
Нет. Прикладная логика пишется только на встроенном языке 1С. Внешние программы на любых языках подключаются к базе через HTTP-сервисы, OData или COM-соединение.
Код 1С компилируется в exe-файл?
Нет. Модули хранятся в конфигурации и выполняются платформой. Отдельного исполняемого файла у конфигурации нет, без установленной платформы она не запустится.
Можно ли изменить сам язык 1С или ядро платформы?
Нет, исходный код платформы закрыт. Расширить её возможности можно внешними компонентами на C++, а доработать конфигурацию — расширениями .cfe или правкой кода.
Чем встроенный язык 1С отличается от языка 1С 7.7?
Синтаксис близок, но объектная модель в 8.x другая: управляемые формы, директивы компиляции, новые виды регистров и SQL-подобный язык запросов вместо объекта «Запрос» 7.7 с собственным синтаксисом. Код из 7.7 напрямую в 8.3 не переносится.
Работает ли сервер 1С на Linux?
Да. Сервер 1С:Предприятия 8.3 и клиенты выпускаются для Linux, в паре с ним обычно используют PostgreSQL.