К статье
Практический материал

Разработка и Конфигурация · 14 мин

Как работает язык программирования 1С

Как устроен встроенный язык 1С: платформа, конфигурация, контексты выполнения, запросы, клиент-серверное взаимодействие и практические советы разработчику.

Язык программирования 1С — это встроенный язык платформы «1С:Предприятие», который не существует отдельно от платформы. В отличие от универсальных языков вроде Python или C#, код на 1С исполняется только внутри среды исполнения «1С:Предприятие» и оперирует прикладными объектами: документами, справочниками, регистрами, отчётами. Его главная задача — описывать бизнес-логику учёта: что происходит при проведении документа, как пересчитываются остатки, какие проверки выполняются перед записью данных.

Ключевая особенность языка — он предметно-ориентированный. Разработчик не описывает структуры таблиц базы данных вручную: платформа сама создаёт физические таблицы на основе метаданных конфигурации, а программист работает с объектами высокого уровня. Запись вида Документы.РеализацияТоваров.НайтиПоНомеру(...) превращается платформой в SQL-запрос к СУБД автоматически.

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

Из чего состоит среда исполнения: платформа, конфигурация, СУБД

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

Второй слой — конфигурация. Это набор метаданных (описания справочников, документов, регистров) и модулей с кодом на встроенном языке. Конфигурация разрабатывается в Конфигураторе и хранится в информационной базе. Типовые конфигурации вроде «1С:Бухгалтерия» или «1С:Управление торговлей» — это готовые конфигурации от вендора, которые можно дорабатывать.

Третий слой — СУБД. В файловом варианте платформа использует собственный файловый формат базы, в клиент-серверном — внешнюю СУБД: Microsoft SQL Server, PostgreSQL, IBM Db2 или Oracle. Разработчик не пишет SQL напрямую (кроме редких случаев прямых запросов): платформа транслирует обращения к объектам и запросы на языке запросов 1С в команды конкретной СУБД.

Где хранится и как исполняется код: модули и контексты

Код на 1С не лежит в свободных файлах — он размещается в модулях, привязанных к объектам конфигурации. Основные виды модулей: общие модули (переиспользуемые процедуры и функции), модули объектов (логика конкретного справочника или документа), модули форм (обработчики событий интерфейса), модули менеджеров (логика уровня коллекции объектов) и модуль приложения (глобальные обработчики запуска).

Каждый модуль исполняется в определённом контексте — наборе доступных объектов, переменных и методов. Например, в модуле формы доступны реквизиты формы и её элементы, но недоступен прямой вызов серверных общих модулей без специальных указаний. В модуле объекта доступны реквизиты объекта через контекст «ЭтотОбъект».

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

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

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

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

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

Как организовать клиент-серверное взаимодействие
  1. 1
    В модуле формы создайте клиентскую процедуру-обработчик события с директивой &НаКлиенте
  2. 2
    Соберите нужные данные формы в структуру или массив простых типов
  3. 3
    Вызовите серверную процедуру из общего модуля с флагом «Вызов сервера», передав структуру параметром
  4. 4
    На сервере выполните запрос и обработку, верните результат простым типом данных
  5. 5
    На клиенте обновите элементы формы по полученному результату и проверьте работу в тонком клиенте

Как 1С работает с данными: объекты и язык запросов

Существует два способа доступа к данным. Объектный способ: загрузить объект целиком методом ПолучитьОбъект(), изменить реквизиты, вызвать Записать(). Он удобен для изменения одного объекта, потому что выполняет все проверки и обработчики событий, но неприемлем для массовой обработки — каждый объект читается и пишется целиком.

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

Пример простого запроса:

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

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

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

Код на 1С в основном событийный: разработчик не пишет главный цикл программы, а описывает реакции на события платформы. События делятся на события формы (ПриСозданииНаСервере, ПередЗаписью), события объекта (ПередЗаписью, ПриЗаписи, ОбработкаПроведения) и события приложения (ПриНачалеРаботыСистемы).

Центральный сценарий учётных систем — проведение документа. В обработчике ОбработкаПроведения разработчик формирует движения по регистрам: заполняет коллекции Движения.ТоварыНаСкладах, Движения.Продажи и так далее. Платформа выполняет проведение в транзакции: если в обработчике возникает исключение или вызывается Отказ = Истина, все изменения откатываются, и база остаётся в согласованном состоянии.

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

Расширения и внешние компоненты: как изменить поведение без доработки конфигурации

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

В расширении можно перехватывать типовые процедуры аннотациями «Вместо», «Перед», «После». Вариант «Вместо» полностью заменяет типовой код и опасен при обновлениях: если вендор изменит типовую процедуру, ваш заменяющий код продолжит работать по старой логике. Безопаснее использовать «Перед» и «После» с вызовом типовой процедуры через ПродолжитьВызов().

Для задач, которые встроенный язык не решает — работа с оборудованием, криптография, специфические протоколы, — используются внешние компоненты по технологии Native API или COM, а также HTTP-вызовы внешних сервисов напрямую из кода через объект HTTPСоединение.

Способы доработки типовой конфигурации

Прямая доработка модулей

Полный доступ к коду, но конфигурация частично снимается с поддержки; обновления требуют ручного сравнения и переноса изменений

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

Типовая конфигурация остаётся на поддержке, обновления простые; ограничения — не все объекты можно заимствовать и изменить

Внешние обработки и отчёты

Подключаются без изменения конфигурации вообще; подходят только для автономных сценариев, не меняющих типовую логику

Типичные ошибки и ограничения языка

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

Третья группа ошибок связана с блокировками. При записи объектов платформа накладывает управляемые блокировки, и конкурентные сеансы могут получать ошибки «Конфликт блокировок». Массовые перепроведения документов в часы работы пользователей — типичная причина взаимных блокировок и таймаутов.

Типичные ошибки разработчика на 1С
01
Запрос или ПолучитьОбъект() в цикле — время обработки растёт линейно по числу строк, сервер СУБД перегружается мелкими запросами
02
Вызов сервера с клиента на каждую строку табличной части — интерфейс зависает из-за сотен сетевых обращений
03
Использование НайтиПоНаименованию без уточняющих условий — при дублях наименований подставляется не тот элемент
04
Игнорирование параметра Отказ в обработчиках — документ записывается, хотя проверка не пройдена
05
Доработка типового кода «Вместо» без необходимости — после обновления конфигурации логика расходится с типовой
Прежде чем писать собственный механизм, проверьте, нет ли готового в библиотеке стандартных подсистем (БСП), на которой построены типовые конфигурации: работа с файлами, отправка почты, версионирование, дополнительные отчёты уже реализованы и протестированы. Повторное использование БСП экономит недели разработки и упрощает поддержку.
ПЗ
Практическое замечание

Как проверить, что код работает правильно

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

Для проверки запросов удобна консоль запросов: она выполняет текст запроса с реальными параметрами и показывает результат без написания обработки. Для поиска узких мест используется замер производительности — встроенный механизм, показывающий, сколько времени заняла каждая строка модуля и сколько вызовов СУБД она породила.

Контрольные точки

Как проверить результат доработки

Проведение документа
Норма

Документ проводится, движения по всем регистрам соответствуют ожидаемым суммам и количествам

Тревожный признак

Движения дублируются, отсутствуют по части регистров или остатки уходят в минус без контроля

Скорость операции
Норма

Типовая операция выполняется за время, сопоставимое с типовым аналогом

Тревожный признак

Операция в разы медленнее типовой, в замере видны запросы внутри цикла

Поведение при ошибке
Норма

При отказе в проведении база не меняется, пользователь видит понятное сообщение

Тревожный признак

Часть данных записалась, часть нет, сообщение об ошибке техническое и непонятное

Работа под нагрузкой
Норма

Параллельные сеансы не конфликтуют, ошибок блокировок нет

Тревожный признак

У пользователей возникают ошибки «Конфликт блокировок при выполнении транзакции»

Итог

Что важно запомнить

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

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

Нужно ли знать SQL, чтобы программировать на 1С?

Для большинства задач достаточно встроенного языка запросов 1С, который платформа сама переводит в SQL. Однако понимание принципов работы СУБД — индексов, планов запросов, блокировок — заметно помогает при оптимизации медленных отчётов и разборе конфликтов блокировок в клиент-серверном режиме.

Можно ли писать на 1С на английском языке?

Да, синтаксис полностью дублирован: вместо «Если» можно писать «If», вместо «Процедура» — «Procedure». Допускается смешение языков в одном модуле. В российских конфигурациях принят русский синтаксис, в международных продуктах фирмы «1С» — английский.

Чем файловый режим работы отличается от клиент-серверного для разработчика?

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

Что такое управляемые формы и почему код в них разделён?

Управляемая форма — декларативно описанный интерфейс, который платформа отрисовывает на тонком, толстом или веб-клиенте. Логика формы разделена директивами &НаКлиенте и &НаСервере, потому что форма физически существует на клиенте, а данные — на сервере; платформа синхронизирует их автоматически.

Можно ли вызвать код 1С из внешней программы?

Да, основные способы — HTTP-сервисы и веб-сервисы, публикуемые из конфигурации, а также COM-соединение для Windows-приложений. Рекомендуемый современный вариант — HTTP-сервисы: они не требуют установки клиента 1С на вызывающей стороне и работают через стандартные веб-протоколы.

Почему запрос к виртуальной таблице остатков иногда работает медленно?

Чаще всего потому, что не заданы параметры виртуальной таблицы — период и условия отбора. Без параметров платформа строит остатки по всем данным регистра, а отбор применяется уже после соединения. Перенос условий в параметры виртуальной таблицы обычно ускоряет запрос в разы.