От дерева метаданных до рабочей базы: как устроена разработка на 1С:Предприятии 8.3

· 10 мин

Содержание

Программирование в 1С работает так: разработчик описывает в Конфигураторе объекты метаданных (справочники, документы, регистры), платформа сама строит по ним таблицы в СУБД, формы и командный интерфейс, а программист пишет на встроенном языке только прикладную логику — что происходит при записи, проведении, заполнении формы. Код исполняет платформа 1С:Предприятие 8.3, разделяя его на клиентскую и серверную части.

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

Три слоя: платформа, конфигурация и информационная база

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

СлойЧто этоКто меняет
Платформа 1С:Предприятие 8.3Исполняемые файлы 1cv8.exe, 1cv8c.exe, сервер ragent, rmngr, rphostФирма 1С, вы только ставите нужную версию
КонфигурацияМетаданные, модули, формы, макеты, ролиПрограммист в Конфигураторе или EDT
Информационная базаДанные пользователей плюс сама конфигурацияПользователи в режиме «1С:Предприятие»
  • 🧩 Платформа — движок. Она умеет работать с СУБД, рисовать формы, исполнять код, проверять права. Прикладной логики в ней нет.
  • 📦 Конфигурация — прикладная программа: Бухгалтерия, ЗУП, УТ или ваша самописная. Это не exe-файл, а описание, которое платформа интерпретирует.
  • 🗄️ База — файловая (1Cv8.1CD) или клиент-серверная (MS SQL Server, PostgreSQL и другие поддерживаемые СУБД).

В базе хранятся две копии конфигурации. Основная конфигурация — то, что вы правите в Конфигураторе. Конфигурация базы данных — то, с чем реально работают пользователи. Пока вы не выполните Конфигурация → Обновить конфигурацию базы данных, изменения видны только вам.

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

Объекты метаданных и что из них получается в базе

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

  • 📒 Справочники — списки (номенклатура, контрагенты). В СУБД — таблица _Reference<N>, плюс по таблице на каждую табличную часть.
  • 📄 Документы — события с датой и номером. Таблица _Document<N>, у документа есть проведение.
  • 📊 Регистры сведений — данные с измерениями и периодом (курсы, цены).
  • 📈 Регистры накопления — остатки и обороты. Платформа сама ведёт таблицу движений и таблицу итогов, поэтому остаток на дату получается быстро, без пересчёта всей истории.
  • 🧾 Регистры бухгалтерии вместе с планом счетов — проводки с субконто.
  • 🔁 Планы обмена, бизнес-процессы, задачи, перечисления, константы, общие модули, роли — служебные и вспомогательные объекты.

Связка «документ → регистр» — сердце любой конфигурации. Документ хранит первичку. При проведении он пишет движения в регистры. Отчёты почти всегда строятся по регистрам, а не по документам.

Номер <N> в имени таблицы присваивается при создании объекта и ничего не говорит о его смысле. Поэтому прямые SQL-запросы к базе 1С — плохая идея: структуру знает только платформа, а запись данных мимо неё ломает итоги и лицензионное соглашение.

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

Встроенный язык — процедурный, с динамической типизацией и русскими ключевыми словами (у каждого есть английский синоним: Процедура/Procedure). Переменные не объявляют с типом: значение в переменной может быть числом, строкой, ссылкой на справочник.

Процедура ПередЗаписью(Отказ)
    Если Не ЗначениеЗаполнено(Контрагент) Тогда
        Сообщить("Не указан контрагент");
        Отказ = Истина;
    КонецЕсли;
КонецПроцедуры

Где живёт код

Код пишут не «в файлах», а в модулях, привязанных к объектам:

  1. Модуль объекта — обработчики записи, проведения, заполнения конкретного документа или элемента справочника.
  2. Модуль менеджера — функции для всего типа сразу (например, печать или заполнение по шаблону).
  3. Модуль формы — реакция на нажатия кнопок и изменение полей.
  4. Общие модули — библиотека процедур, которыми пользуются все. В свойствах общего модуля отмечают, где он доступен: Клиент, Сервер, Вызов сервера, Привилегированный, Глобальный.
  5. Модуль сеанса и модуль управляемого приложения — код при старте сеанса и запуске клиента.

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

Модуль при первом обращении компилируется во внутренний байт-код, который выполняет виртуальная машина платформы. Скомпилированный модуль кешируется, поэтому повторные вызовы быстрее первого. Ошибки синтаксиса ловит проверка модуля (Ctrl+F7), а ошибки типов вылезают только во время исполнения — это плата за динамическую типизацию.

Для выборки данных есть отдельный язык запросов, похожий на SQL, но оперирующий метаданными: ВЫБРАТЬ Ссылка, Наименование ИЗ Справочник.Номенклатура. Платформа переводит такой запрос в SQL конкретной СУБД. Виртуальные таблицы вроде РегистрНакопления.ОстаткиТоваров.Остатки(&Дата) читают итоги, а не перебирают движения.

Клиент и сервер: кто что выполняет

В управляемом приложении (тонкий клиент, веб-клиент, мобильный клиент) код явно делится между компьютером пользователя и сервером 1С. Делят его директивами компиляции перед процедурой.

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

&НаСервере
Процедура ЗаполнитьЦеныНаСервере()
    Запрос = Новый Запрос;
    Запрос.Текст = "ВЫБРАТЬ Цены.Номенклатура, Цены.Цена
    |ИЗ РегистрСведений.ЦеныНоменклатуры.СрезПоследних(&Дата) КАК Цены";
    Запрос.УстановитьПараметр("Дата", Объект.Дата);
    // дальше результат раскладывается по строкам табличной части
КонецПроцедуры

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

В клиент-серверном варианте клиент сначала обращается к агенту сервера (порт 1540), затем к менеджеру кластера (1541) и к рабочим процессам rphost из диапазона портов, заданного в свойствах рабочего сервера (по умолчанию 1560–1591). Код &НаСервере выполняется именно в rphost.

Производительность кода 1С: запросы, блокировки, вызовы сервера

Медленная 1С почти всегда медленная из-за кода, а не из-за «слабого сервера». Приёмы, которые знает каждый опытный разработчик:

  • 🔄 Никаких запросов в цикле. Вместо запроса на каждую строку — один запрос с параметром-списком (В (&Список)) или временной таблицей.
  • 🔗 Осторожно с «точкой через точку». Выражение Документ.Контрагент.ГоловнойКонтрагент.ИНН в коде читает из базы объекты целиком. Нужные реквизиты лучше получить одним запросом.
  • 📡 Меньше серверных вызовов. Собирайте работу в одну серверную процедуру, а не дёргайте сервер на каждое изменение поля.
  • 🔒 Управляемые блокировки. В режиме управляемых блокировок данные под контроль остатков блокируют явно:
Блокировка = Новый БлокировкаДанных;
ЭлементБлокировки = Блокировка.Добавить("РегистрНакопления.ОстаткиТоваров");
ЭлементБлокировки.Режим = РежимБлокировкиДанных.Исключительный;
ЭлементБлокировки.УстановитьЗначение("Склад", Склад);
Блокировка.Заблокировать();

Блокировку ставят внутри транзакции и как можно уже: по конкретному складу, а не по всему регистру. Иначе пользователи будут ждать друг друга при проведении.

Для поиска узких мест в Конфигураторе есть Отладка → Замер производительности: он показывает, сколько времени и сколько раз выполнялась каждая строка. На сервере то же самое ищут технологическим журналом (файл logcfg.xml) — он пишет медленные запросы, ожидания на блокировках, взаимоблокировки.

Регистрация изменений и обмен данными между базами

Обмен в 1С строится на планах обмена. План обмена — это справочник узлов (баз-участников) плюс механизм, который запоминает, какие объекты изменились и ещё не отправлены в каждый узел.

Как это работает по шагам:

  1. В составе плана обмена отмечают объекты, которые участвуют в обмене, и для каждого — флаг Авторегистрация.
  2. При записи такого объекта платформа сама добавляет запись в таблицу регистрации для всех узлов, кроме текущего (ЭтотУзел).
  3. При выгрузке код выбирает изменения для узла и пишет их в сообщение (обычно XML):
Выборка = ПланыОбмена.ВыбратьИзменения(Узел, НомерСообщения);
Пока Выборка.Следующий() Цикл
    Данные = Выборка.Получить();
    ЗаписатьXML(ЗаписьXML, Данные);
КонецЦикла;
  1. Принимающая база загружает объекты и в ответном сообщении подтверждает номер полученного.
  2. По подтверждению отправитель снимает регистрацию: ПланыОбмена.УдалитьРегистрациюИзменений(Узел, НомерСообщения). Не дошедшее сообщение уйдёт повторно — данные не теряются.

При загрузке объект записывают с Объект.ОбменДанными.Загрузка = Истина. Это отключает проверки и обработчики бизнес-логики, чтобы чужие данные легли «как есть», и не даёт сразу зарегистрировать их обратно к отправителю.

Варианты обмена на этом механизме:

  • 🌐 Распределённая информационная база (РИБ) — флаг в свойствах плана обмена. Узлы получают не только данные, но и изменения конфигурации от главного узла.
  • 🔀 Обмен между разными конфигурациями (Бухгалтерия ↔ УТ, ЗУП ↔ Бухгалтерия) — через правила конвертации и универсальный формат EnterpriseData. В типовых решениях это готовые настройки в разделе Администрирование → Синхронизация данных.
  • 🔧 Собственная регистрация — вместо авторегистрации подписка на событие и вызов ПланыОбмена.ЗарегистрироватьИзменения(), когда в обмен нужно отправлять только часть объектов по условию.

Отладка, тесты и версии конфигурации

Отладчик

Отладка запускается из Конфигуратора: Отладка → Начать отладку → Тонкий клиент (или F5). Точка останова — F9 на строке, шаг с заходом — F11, шаг без захода — F10. Значения переменных смотрят в табло и через Shift+F9 (вычислить выражение).

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

Тесты

Встроенного фреймворка модульных тестов в платформе нет, используют внешние инструменты:

  • ✅ Vanessa Automation — сценарные тесты на языке Gherkin («Дано… Когда… Тогда»), гоняют интерфейс как пользователь.
  • ✅ YAxUnit — модульные тесты в виде расширения конфигурации .
  • ✅ Типовые решения проверяют синтаксис и стандарты через Конфигурация → Проверка конфигурации и, при наличии, через «1С:Автоматизированная проверка конфигураций».

Управление версиями

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

Альтернатива — 1C:Enterprise Development Tools (EDT). Там конфигурация хранится как набор текстовых файлов, и с ней работают через Git: ветки, слияния, код-ревью. Для типовых конфигураций изменения выгоднее делать в расширениях (.cfe): они не снимают типовое решение с поддержки, и обновление релиза проходит без ручного сравнения.

Права доступа и безопасность кода

Права в 1С проверяет платформа, а не прикладной код. Это важное отличие от многих самописных систем.

  • 👤 Роли — объекты метаданных, где для каждого объекта отмечены права: чтение, добавление, изменение, проведение, интерактивное удаление. Пользователю назначают набор ролей.
  • 🧱 Ограничение доступа на уровне записей (RLS) — условие в роли, похожее на запрос. Например, менеджер видит документы только своей организации. Условие платформа подставляет в каждый запрос сама.
  • 🛡️ Привилегированный режим — УстановитьПривилегированныйРежим(Истина) или флаг Привилегированный у общего модуля. Код в нём обходит проверку прав. Применяют точечно: например, чтобы записать служебный регистр, к которому у пользователя нет доступа.
  • 🔐 Безопасный режим — УстановитьБезопасныйРежим(Истина) перед выполнением чужого кода (внешних обработок, произвольных выражений). В нём запрещены работа с файлами, COM, запуск программ. На сервере дополнительно настраивают профили безопасности кластера.

В типовых конфигурациях роли и RLS обёрнуты в подсистему «Управление доступом» из БСП: администратор настраивает группы доступа в Администрирование → Пользователи и права, а не правит роли в Конфигураторе.

Самая частая дыра — серверная процедура в общем модуле с флагами Вызов сервера и Привилегированный одновременно. Её может вызвать любой клиент с любыми параметрами, а права она не проверяет. Экспортные серверные методы проверяйте на входе.

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

Нужно ли знать SQL, чтобы программировать на 1С?
Нет. Данные читают языком запросов 1С, а таблицы СУБД создаёт платформа. Понимание SQL помогает при разборе медленных запросов в технологическом журнале.
Чем Конфигуратор отличается от EDT?
Конфигуратор встроен в платформу и работает с базой напрямую. EDT — отдельная среда на базе Eclipse, хранит конфигурацию в файлах и даёт Git, рефакторинг и проверку кода на лету.
Можно ли писать на 1С на английском?
Да. У всех ключевых слов и большинства методов есть английские синонимы, а интерфейс Конфигуратора переключается на английский язык.
Почему код на клиенте не может сделать запрос?
Тип Запрос на клиенте недоступен: база находится на сервере. Нужные данные получают серверным вызовом и возвращают на клиент простыми типами или в данных формы.
Что такое БСП?
Библиотека стандартных подсистем — набор общих механизмов (пользователи, права, обмены, печать, обновление), на котором построены почти все типовые конфигурации. Свои разработки на ней делать быстрее, чем с нуля.
Проверьте себя
Где нельзя выполнить запрос к базе?
Что снимает регистрацию изменений после обмена?
Что даёт привилегированный режим?