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

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

Что такое встроенный язык в 1С:Предприятие

Что такое встроенный язык 1С:Предприятие, где он используется, как устроены модули и контексты исполнения. Примеры кода, типичные ошибки и ответы на вопросы.

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

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

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

Как устроен встроенный язык и чем он отличается от обычных языков

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

Характерная особенность — двуязычный синтаксис. Ключевые слова, встроенные функции и имена свойств объектов можно писать по-русски (Если ... Тогда ... КонецЕсли;) или по-английски (If ... Then ... EndIf;), причём смешивать варианты в одном модуле допустимо. На практике в типовых российских конфигурациях используется русский синтаксис, а в международных разработках — английский.

Ещё одно отличие от универсальных языков вроде C# или Python — отсутствие классов в привычном понимании и наследования. Вместо этого разработчик работает с объектами платформы: документами, справочниками, регистрами, менеджерами объектов. Расширение поведения достигается через модули объектов, обработчики событий и общие модули, а не через создание собственной иерархии классов.

Где размещается код: виды модулей

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

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

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

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

В трёхзвенной архитектуре 1С (клиент — сервер — СУБД) один и тот же код может выполняться либо на компьютере пользователя, либо на сервере приложений. Разделение критично: на клиенте недоступна прямая работа с базой данных и запросы, а на сервере нет пользовательского интерфейса — нельзя показать окно или спросить пользователя.

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

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

Как проверить, где исполняется код
  1. 1
    Откройте модуль и посмотрите директиву компиляции процедуры (&НаКлиенте, &НаСервере и т.д.)
  2. 2
    Для общих модулей проверьте флаги «Клиент», «Сервер», «Вызов сервера» в палитре свойств
  3. 3
    Убедитесь, что серверная процедура, вызываемая с клиента, помечена как экспортная и модуль допускает вызов сервера
  4. 4
    Прогоните сценарий в отладчике: точки останова подсветят, на какой стороне выполняется код

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

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

Функция РассчитатьСкидку(СуммаПокупки) Экспорт

Если СуммаПокупки >= 100000 Тогда

ПроцентСкидки = 10;

ИначеЕсли СуммаПокупки >= 50000 Тогда

ПроцентСкидки = 5;

Иначе

ПроцентСкидки = 0;

КонецЕсли;

Возврат СуммаПокупки * ПроцентСкидки / 100;

КонецФункции

Для коллекций используются массивы, структуры, соответствия и списки значений. Структура — удобный аналог словаря для передачи набора именованных параметров, соответствие — для быстрого поиска по ключу. Для табличных данных вне базы служит объект «ТаблицаЗначений», а для выборки данных из базы — язык запросов, который вызывается из встроенного языка через объект Запрос.

Обработка ошибок выполняется конструкцией Попытка ... Исключение ... КонецПопытки. В блоке Исключение доступно описание ошибки через ОписаниеОшибки(). Это стандартный способ защитить обмены данными и длительные операции от аварийного завершения.

1c
Запрос = Новый Запрос;
Запрос.Текст = "ВЫБРАТЬ Ссылка ИЗ Документ.РеализацияТоваров ГДЕ Дата >= &НачалоПериода";
Запрос.УстановитьПараметр("НачалоПериода", НачалоМесяца(ТекущаяДатаСеанса()));
Результат = Запрос.Выполнить().Выгрузить();

Как встроенный язык связан с объектами конфигурации

Главная сила встроенного языка — прямой доступ к метаданным конфигурации. Каждый описанный в конфигураторе объект получает программное представление: у документа есть менеджер (Документы.РеализацияТоваров), ссылки, объекты для изменения и наборы записей движений. Разработчик пишет Документы.РеализацияТоваров.НайтиПоНомеру(...) — и платформа выполняет обращение к базе.

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

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

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

Ограничения встроенного языка и когда нужны альтернативы

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

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

Фоновые и длительные операции оформляются через фоновые задания и механизм длительных операций, а не бесконечными циклами в обработчике. Иначе сеанс пользователя «зависает», а на сервере растёт риск тайм-аутов.

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

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

Дополнительно полезны замеры производительности (показывают, какие строки кода занимают время) и журнал регистрации, куда код может писать сообщения через ЗаписьЖурналаРегистрации. Для прикладных проверок — контрольные сценарии: провести документ, сверить движения по регистрам, сравнить итоги отчёта до и после изменения.

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

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

Компиляция модуля
Норма

Конфигуратор не сообщает об ошибках при проверке модуля

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

Сообщения о неизвестных идентификаторах или недопустимом контексте

Выполнение сценария
Норма

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

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

Ошибки времени выполнения или неверные суммы в регистрах

Производительность
Норма

Операция выполняется за приемлемое время без лавины серверных вызовов

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

В замере видны сотни одинаковых вызовов в цикле

Часто задаваемые вопросы

Нужно ли знать другой язык программирования, чтобы освоить встроенный язык 1С?

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

Можно ли писать код 1С на английском, если конфигурация русская?

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

Чем встроенный язык отличается от языка запросов 1С?

Это два разных языка внутри платформы. Язык запросов — декларативный, похож на SQL и служит для выборки данных из базы. Встроенный язык — императивный, описывает логику и алгоритмы. На практике они работают вместе: запрос выбирает данные, встроенный язык их обрабатывает.

Исполняется ли код встроенного языка вне платформы 1С?

Нет. Код модулей исполняется только платформой 1С:Предприятие в клиентском или серверном контексте. Отдельного компилятора в исполняемый файл не существует; перенос логики в другие системы требует переписывания на целевом языке.

Что такое «Экспорт» у процедуры и когда он нужен?

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

Как безопасно доработать типовую конфигурацию собственным кодом?

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

Итог

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

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