Разработка и Конфигурация · 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В модуле формы создайте клиентскую процедуру-обработчик события с директивой &НаКлиенте
- 2Соберите нужные данные формы в структуру или массив простых типов
- 3Вызовите серверную процедуру из общего модуля с флагом «Вызов сервера», передав структуру параметром
- 4На сервере выполните запрос и обработку, верните результат простым типом данных
- 5На клиенте обновите элементы формы по полученному результату и проверьте работу в тонком клиенте
Как 1С работает с данными: объекты и язык запросов
Существует два способа доступа к данным. Объектный способ: загрузить объект целиком методом ПолучитьОбъект(), изменить реквизиты, вызвать Записать(). Он удобен для изменения одного объекта, потому что выполняет все проверки и обработчики событий, но неприемлем для массовой обработки — каждый объект читается и пишется целиком.
Второй способ — язык запросов 1С, декларативный язык, похожий на SQL. Запрос выбирает данные из виртуальных и физических таблиц, соединяет их, группирует и фильтрует, не загружая объекты в память. Платформа транслирует текст запроса в SQL конкретной СУБД, оптимизирует его и возвращает выборку или таблицу значений.
Пример простого запроса:
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| Номенклатура.Ссылка КАК Товар,
| Остатки.КоличествоОстаток КАК Остаток
|ИЗ
| Справочник.Номенклатура КАК Номенклатура
| ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.ТоварыНаСкладах.Остатки КАК Остатки
| ПО Остатки.Номенклатура = Номенклатура.Ссылка";
Результат = Запрос.Выполнить().Выгрузить();Особый механизм — виртуальные таблицы регистров: остатки, обороты, срезы последних. Они не хранятся в базе как готовые данные, а вычисляются платформой из таблиц движений и итогов. Правильное использование виртуальных таблиц с параметрами (период, отбор) — основа производительности отчётов.
Событийная модель: обработчики и проведение документов
Код на 1С в основном событийный: разработчик не пишет главный цикл программы, а описывает реакции на события платформы. События делятся на события формы (ПриСозданииНаСервере, ПередЗаписью), события объекта (ПередЗаписью, ПриЗаписи, ОбработкаПроведения) и события приложения (ПриНачалеРаботыСистемы).
Центральный сценарий учётных систем — проведение документа. В обработчике ОбработкаПроведения разработчик формирует движения по регистрам: заполняет коллекции Движения.ТоварыНаСкладах, Движения.Продажи и так далее. Платформа выполняет проведение в транзакции: если в обработчике возникает исключение или вызывается Отказ = Истина, все изменения откатываются, и база остаётся в согласованном состоянии.
Порядок вызова обработчиков строго определён платформой, и его нужно учитывать. Например, при записи документа с проведением сначала вызывается ПередЗаписью, затем ПриЗаписи, затем ОбработкаПроведения, и только потом фиксируется транзакция. Попытка читать «свежие» остатки в ПередЗаписи до формирования движений даст старые данные — это источник трудноуловимых ошибок.
Расширения и внешние компоненты: как изменить поведение без доработки конфигурации
Если типовая конфигурация находится на поддержке, прямое изменение её модулей усложняет обновления. Механизм расширений позволяет добавить свои процедуры, формы и даже объекты метаданных поверх типовой конфигурации, не снимая её с поддержки. Расширение подключается к информационной базе и применяется поверх основной конфигурации при запуске.
В расширении можно перехватывать типовые процедуры аннотациями «Вместо», «Перед», «После». Вариант «Вместо» полностью заменяет типовой код и опасен при обновлениях: если вендор изменит типовую процедуру, ваш заменяющий код продолжит работать по старой логике. Безопаснее использовать «Перед» и «После» с вызовом типовой процедуры через ПродолжитьВызов().
Для задач, которые встроенный язык не решает — работа с оборудованием, криптография, специфические протоколы, — используются внешние компоненты по технологии Native API или COM, а также HTTP-вызовы внешних сервисов напрямую из кода через объект HTTPСоединение.
Способы доработки типовой конфигурации
Полный доступ к коду, но конфигурация частично снимается с поддержки; обновления требуют ручного сравнения и переноса изменений
Типовая конфигурация остаётся на поддержке, обновления простые; ограничения — не все объекты можно заимствовать и изменить
Подключаются без изменения конфигурации вообще; подходят только для автономных сценариев, не меняющих типовую логику
Типичные ошибки и ограничения языка
Язык 1С прост для входа, но имеет специфические ловушки. Первая — обращение к БД в цикле: запрос или получение объекта внутри перебора строк вместо одного запроса с соединением. Вторая — игнорирование транзакционности: длинные цепочки записей объектов без единой транзакции оставляют базу в рассогласованном состоянии при сбое посередине.
Третья группа ошибок связана с блокировками. При записи объектов платформа накладывает управляемые блокировки, и конкурентные сеансы могут получать ошибки «Конфликт блокировок». Массовые перепроведения документов в часы работы пользователей — типичная причина взаимных блокировок и таймаутов.
Прежде чем писать собственный механизм, проверьте, нет ли готового в библиотеке стандартных подсистем (БСП), на которой построены типовые конфигурации: работа с файлами, отправка почты, версионирование, дополнительные отчёты уже реализованы и протестированы. Повторное использование БСП экономит недели разработки и упрощает поддержку.
Как проверить, что код работает правильно
Базовый инструмент — отладчик Конфигуратора. Он подключается к клиентскому или серверному процессу, позволяет ставить точки останова, смотреть значения переменных и пошагово проходить код, включая серверные вызовы. Для отладки на сервере кластер должен быть запущен в отладочном режиме.
Для проверки запросов удобна консоль запросов: она выполняет текст запроса с реальными параметрами и показывает результат без написания обработки. Для поиска узких мест используется замер производительности — встроенный механизм, показывающий, сколько времени заняла каждая строка модуля и сколько вызовов СУБД она породила.
Как проверить результат доработки
Документ проводится, движения по всем регистрам соответствуют ожидаемым суммам и количествам
Движения дублируются, отсутствуют по части регистров или остатки уходят в минус без контроля
Типовая операция выполняется за время, сопоставимое с типовым аналогом
Операция в разы медленнее типовой, в замере видны запросы внутри цикла
При отказе в проведении база не меняется, пользователь видит понятное сообщение
Часть данных записалась, часть нет, сообщение об ошибке техническое и непонятное
Параллельные сеансы не конфликтуют, ошибок блокировок нет
У пользователей возникают ошибки «Конфликт блокировок при выполнении транзакции»
Что важно запомнить
Язык 1С исполняется только внутри платформы и оперирует объектами метаданных. Код делится на клиентский и серверный, данные обрабатываются объектно или через язык запросов, а учётная логика строится на событиях и проведении документов в транзакциях. Производительность определяется отсутствием запросов в циклах и разумным числом клиент-серверных вызовов, а безопасность доработок — расширениями и тестированием на копии базы.
Частые вопросы
Нужно ли знать SQL, чтобы программировать на 1С?
Для большинства задач достаточно встроенного языка запросов 1С, который платформа сама переводит в SQL. Однако понимание принципов работы СУБД — индексов, планов запросов, блокировок — заметно помогает при оптимизации медленных отчётов и разборе конфликтов блокировок в клиент-серверном режиме.
Можно ли писать на 1С на английском языке?
Да, синтаксис полностью дублирован: вместо «Если» можно писать «If», вместо «Процедура» — «Procedure». Допускается смешение языков в одном модуле. В российских конфигурациях принят русский синтаксис, в международных продуктах фирмы «1С» — английский.
Чем файловый режим работы отличается от клиент-серверного для разработчика?
Код в основном пишется одинаково, но в файловом режиме нет настоящего разделения клиента и сервера — всё выполняется в одном процессе, а конкурентный доступ ограничен. Клиент-серверный режим требует аккуратности с блокировками, транзакциями и объёмом передаваемых между клиентом и сервером данных.
Что такое управляемые формы и почему код в них разделён?
Управляемая форма — декларативно описанный интерфейс, который платформа отрисовывает на тонком, толстом или веб-клиенте. Логика формы разделена директивами &НаКлиенте и &НаСервере, потому что форма физически существует на клиенте, а данные — на сервере; платформа синхронизирует их автоматически.
Можно ли вызвать код 1С из внешней программы?
Да, основные способы — HTTP-сервисы и веб-сервисы, публикуемые из конфигурации, а также COM-соединение для Windows-приложений. Рекомендуемый современный вариант — HTTP-сервисы: они не требуют установки клиента 1С на вызывающей стороне и работают через стандартные веб-протоколы.
Почему запрос к виртуальной таблице остатков иногда работает медленно?
Чаще всего потому, что не заданы параметры виртуальной таблицы — период и условия отбора. Без параметров платформа строит остатки по всем данным регистра, а отбор применяется уже после соединения. Перенос условий в параметры виртуальной таблицы обычно ускоряет запрос в разы.