От дерева метаданных до рабочей базы: как устроена разработка на 1С:Предприятии 8.3
Содержание
Программирование в 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). Переменные не объявляют с типом: значение в переменной может быть числом, строкой, ссылкой на справочник.
Процедура ПередЗаписью(Отказ)
Если Не ЗначениеЗаполнено(Контрагент) Тогда
Сообщить("Не указан контрагент");
Отказ = Истина;
КонецЕсли;
КонецПроцедуры
Где живёт код
Код пишут не «в файлах», а в модулях, привязанных к объектам:
- Модуль объекта — обработчики записи, проведения, заполнения конкретного документа или элемента справочника.
- Модуль менеджера — функции для всего типа сразу (например, печать или заполнение по шаблону).
- Модуль формы — реакция на нажатия кнопок и изменение полей.
- Общие модули — библиотека процедур, которыми пользуются все. В свойствах общего модуля отмечают, где он доступен:
Клиент,Сервер,Вызов сервера,Привилегированный,Глобальный. - Модуль сеанса и модуль управляемого приложения — код при старте сеанса и запуске клиента.
Как код исполняется
Модуль при первом обращении компилируется во внутренний байт-код, который выполняет виртуальная машина платформы. Скомпилированный модуль кешируется, поэтому повторные вызовы быстрее первого. Ошибки синтаксиса ловит проверка модуля (Ctrl+F7), а ошибки типов вылезают только во время исполнения — это плата за динамическую типизацию.
Для выборки данных есть отдельный язык запросов, похожий на SQL, но оперирующий метаданными: ВЫБРАТЬ Ссылка, Наименование ИЗ Справочник.Номенклатура. Платформа переводит такой запрос в SQL конкретной СУБД. Виртуальные таблицы вроде РегистрНакопления.ОстаткиТоваров.Остатки(&Дата) читают итоги, а не перебирают движения.
Клиент и сервер: кто что выполняет
В управляемом приложении (тонкий клиент, веб-клиент, мобильный клиент) код явно делится между компьютером пользователя и сервером 1С. Делят его директивами компиляции перед процедурой.
| Директива | Где выполняется | Что доступно |
|---|---|---|
&НаКлиенте | На компьютере пользователя | Форма, интерфейс, файлы клиента. Запросов к базе нет |
&НаСервере | На сервере, с передачей данных формы | База данных и данные формы |
&НаСервереБезКонтекста | На сервере, без данных формы | Только база и переданные параметры |
&НаКлиентеНаСервереБезКонтекста | Там, откуда вызвали | Общий для обеих сторон код |
&НаКлиенте
Процедура ЗаполнитьЦены(Команда)
ЗаполнитьЦеныНаСервере();
КонецПроцедуры
&НаСервере
Процедура ЗаполнитьЦеныНаСервере()
Запрос = Новый Запрос;
Запрос.Текст = "ВЫБРАТЬ Цены.Номенклатура, Цены.Цена
|ИЗ РегистрСведений.ЦеныНоменклатуры.СрезПоследних(&Дата) КАК Цены";
Запрос.УстановитьПараметр("Дата", Объект.Дата);
// дальше результат раскладывается по строкам табличной части
КонецПроцедуры
Каждый переход с клиента на сервер — это сетевой вызов. Вызов &НаСервере тащит туда и обратно все данные формы, включая табличные части на тысячи строк. &НаСервереБезКонтекста дешевле: передаёт только параметры.
В клиент-серверном варианте клиент сначала обращается к агенту сервера (порт 1540), затем к менеджеру кластера (1541) и к рабочим процессам rphost из диапазона портов, заданного в свойствах рабочего сервера (по умолчанию 1560–1591). Код &НаСервере выполняется именно в rphost.
Производительность кода 1С: запросы, блокировки, вызовы сервера
Медленная 1С почти всегда медленная из-за кода, а не из-за «слабого сервера». Приёмы, которые знает каждый опытный разработчик:
- 🔄 Никаких запросов в цикле. Вместо запроса на каждую строку — один запрос с параметром-списком (
В (&Список)) или временной таблицей. - 🔗 Осторожно с «точкой через точку». Выражение
Документ.Контрагент.ГоловнойКонтрагент.ИННв коде читает из базы объекты целиком. Нужные реквизиты лучше получить одним запросом. - 📡 Меньше серверных вызовов. Собирайте работу в одну серверную процедуру, а не дёргайте сервер на каждое изменение поля.
- 🔒 Управляемые блокировки. В режиме управляемых блокировок данные под контроль остатков блокируют явно:
Блокировка = Новый БлокировкаДанных;
ЭлементБлокировки = Блокировка.Добавить("РегистрНакопления.ОстаткиТоваров");
ЭлементБлокировки.Режим = РежимБлокировкиДанных.Исключительный;
ЭлементБлокировки.УстановитьЗначение("Склад", Склад);
Блокировка.Заблокировать();
Блокировку ставят внутри транзакции и как можно уже: по конкретному складу, а не по всему регистру. Иначе пользователи будут ждать друг друга при проведении.
Для поиска узких мест в Конфигураторе есть Отладка → Замер производительности: он показывает, сколько времени и сколько раз выполнялась каждая строка. На сервере то же самое ищут технологическим журналом (файл logcfg.xml) — он пишет медленные запросы, ожидания на блокировках, взаимоблокировки.
Регистрация изменений и обмен данными между базами
Обмен в 1С строится на планах обмена. План обмена — это справочник узлов (баз-участников) плюс механизм, который запоминает, какие объекты изменились и ещё не отправлены в каждый узел.
Как это работает по шагам:
- В составе плана обмена отмечают объекты, которые участвуют в обмене, и для каждого — флаг Авторегистрация.
- При записи такого объекта платформа сама добавляет запись в таблицу регистрации для всех узлов, кроме текущего (
ЭтотУзел). - При выгрузке код выбирает изменения для узла и пишет их в сообщение (обычно XML):
Выборка = ПланыОбмена.ВыбратьИзменения(Узел, НомерСообщения);
Пока Выборка.Следующий() Цикл
Данные = Выборка.Получить();
ЗаписатьXML(ЗаписьXML, Данные);
КонецЦикла;
- Принимающая база загружает объекты и в ответном сообщении подтверждает номер полученного.
- По подтверждению отправитель снимает регистрацию:
ПланыОбмена.УдалитьРегистрациюИзменений(Узел, НомерСообщения). Не дошедшее сообщение уйдёт повторно — данные не теряются.
При загрузке объект записывают с Объект.ОбменДанными.Загрузка = Истина. Это отключает проверки и обработчики бизнес-логики, чтобы чужие данные легли «как есть», и не даёт сразу зарегистрировать их обратно к отправителю.
Варианты обмена на этом механизме:
- 🌐 Распределённая информационная база (РИБ) — флаг в свойствах плана обмена. Узлы получают не только данные, но и изменения конфигурации от главного узла.
- 🔀 Обмен между разными конфигурациями (Бухгалтерия ↔ УТ, ЗУП ↔ Бухгалтерия) — через правила конвертации и универсальный формат 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С?
Чем Конфигуратор отличается от EDT?
Можно ли писать на 1С на английском?
Почему код на клиенте не может сделать запрос?
Запрос на клиенте недоступен: база находится на сервере. Нужные данные получают серверным вызовом и возвращают на клиент простыми типами или в данных формы.