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

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

Язык программирования 1С: как выглядит код

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

Встроенный язык 1С — это высокоуровневый язык, который разработчик пишет прямо в конфигураторе, внутри модулей объектов, форм, общих модулей и модулей приложения. Внешне он напоминает смесь Паскаля и Бейсика: есть процедуры и функции, условия «Если…Тогда…КонецЕсли», циклы «Для…Цикл…КонецЦикла» и строгое завершение каждого оператора точкой с запятой. Главная особенность — ключевые слова можно писать как на русском, так и на английском языке, причём оба варианта работают одинаково.

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

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

Из чего состоит модуль: общая структура кода

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

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

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

Как выглядят процедуры и функции

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

&НаСервере

Функция ПолучитьЦенуТовара(Номенклатура, ДатаЦены = Неопределено)

Если ДатаЦены = Неопределено Тогда

ДатаЦены = ТекущаяДатаСеанса();

КонецЕсли;

Запрос = Новый Запрос;

Запрос.Текст =

"ВЫБРАТЬ

| Цены.Цена КАК Цена

|ИЗ

| РегистрСведений.ЦеныНоменклатуры.СрезПоследних(&Дата, Номенклатура = &Номенклатура) КАК Цены";

Запрос.УстановитьПараметр("Дата", ДатаЦены);

Запрос.УстановитьПараметр("Номенклатура", Номенклатура);

Выборка = Запрос.Выполнить().Выбрать();

Если Выборка.Следующий() Тогда

Возврат Выборка.Цена;

Иначе

Возврат 0;

КонецЕсли;

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

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

Условия, циклы и работа с коллекциями

Условный оператор выглядит так: Если Условие Тогда … ИначеЕсли … Иначе … КонецЕсли;. Логические операции записываются словами И, ИЛИ, НЕ, сравнение — знаками =, <>, >, <. Оператора switch в классическом виде нет; множественные ветвления делаются через цепочку ИначеЕсли.

Циклов три вида. Счётный цикл: Для Сч = 1 По 10 Цикл … КонецЦикла;. Цикл обхода коллекции: Для Каждого Строка Из ТаблицаЗначений Цикл … КонецЦикла; — самый частый вариант при работе с табличными частями и выборками. Условный цикл: Пока Условие Цикл … КонецЦикла;. Для досрочного выхода используется Прервать, для перехода к следующей итерации — Продолжить.

Для Каждого СтрокаТовара Из Объект.Товары Цикл

Если СтрокаТовара.Количество <= 0 Тогда

Продолжить;

КонецЕсли;

СтрокаТовара.Сумма = СтрокаТовара.Количество * СтрокаТовара.Цена;

КонецЦикла;

Типичные коллекции, с которыми работает код: массив (Новый Массив), структура (Новый Структура — аналог словаря с доступом через точку), соответствие (пары ключ-значение с доступом по ключу) и таблица значений. Добавление элементов выглядит как Массив.Добавить(Значение) или Структура.Вставить("Ключ", Значение).

bsl
Структура = Новый Структура;
Структура.Вставить("Номенклатура", ТекущийТовар);
Структура.Вставить("Количество", 5);
Сообщить(Структура.Номенклатура); // доступ через точку

Язык запросов внутри кода

Отдельный визуальный пласт — язык запросов 1С, который встраивается в код как многострочная строка. Он похож на SQL, но ключевые слова тоже русские: ВЫБРАТЬ, ИЗ, ГДЕ, СОЕДИНЕНИЕ, СГРУППИРОВАТЬ ПО, УПОРЯДОЧИТЬ ПО. Вертикальная черта | в начале каждой строки — это признак продолжения многострочного строкового литерала.

Результат запроса обрабатывается через выборку: Выборка = Запрос.Выполнить().Выбрать(); Пока Выборка.Следующий() Цикл … КонецЦикла;. Параметры передаются через Запрос.УстановитьПараметр("Имя", Значение), а в тексте запроса обозначаются амперсандом — &Имя. Виртуальные таблицы вроде СрезПоследних и Остатки — характерная особенность 1С, которой нет в классическом SQL.

Русский или английский синтаксис: что выбрать

Платформа поддерживает оба варианта ключевых слов, и конфигуратор сам подсвечивает их одинаково. В типовых российских конфигурациях код написан на русском синтаксисе; английский вариант (If…Then…EndIf, Procedure…EndProcedure) встречается в международных разработках и у команды, пришедшей из других языков. Смешивать варианты в одном модуле технически можно, но делать этого не стоит — читаемость резко падает.

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

Сравнение вариантов

Русский синтаксис

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

Английский синтаксис

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

Смешанный стиль

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

Как читать чужой код и где искать нужный фрагмент

Чтобы понять, как выглядит код конкретного прикладного решения, откройте конфигуратор и используйте глобальный поиск (Ctrl+Shift+F) по имени процедуры, реквизита или фрагменту текста сообщения об ошибке. Поиск покажет все модули, где встречается строка, — это быстрее, чем вручную открывать объекты. Контекстная подсказка по F1 на любом методе открывает синтакс-помощник с описанием параметров.

Полезный приём — поставить точку останова (F9) в обработчике события и запустить отладку (F5). Когда выполнение остановится, вы увидите реальные значения переменных в табло (Shift+F9) и поймёте, какие данные реально приходят в код. Это самый надёжный способ разобраться в незнакомой логике, особенно в цепочках вызовов между общими модулями.

Как найти и понять нужный код
  1. 1
    Откройте конфигуратор и включите отладку (Сервис → Параметры → разрешить отладку)
  2. 2
    Через глобальный поиск (Ctrl+Shift+F) найдите текст сообщения или имя процедуры
  3. 3
    Откройте найденный модуль и поставьте точку останова (F9) на интересующей строке
  4. 4
    Запустите отладку (F5), выполните действие в режиме предприятия
  5. 5
    Проверьте значения переменных через табло (Shift+F9) и пройдите код по шагам (F10/F11)
Типичные ошибки новичков
01
Пропуск точки с запятой в конце оператора — модуль не компилируется, конфигуратор подсвечивает ошибку при проверке
02
Изменение реквизитов объекта без вызова Записать() — данные не сохраняются в базе, хотя в отладчике всё выглядит правильно
03
Обращение к серверным данным из клиентской процедуры &НаКлиенте — ошибка вызова, нужно выносить логику в серверный вызов
04
Использование транслита в именах переменных — код трудно читать и сопровождать, особенно в связке с типовыми модулями
05
Копирование фрагментов без проверки контекста — код из модуля объекта не работает в общем модуле без адаптации

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

Можно ли писать код 1С полностью на английском?

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

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

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

Где именно хранится написанный код?

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

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

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

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

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

Почему в коде встречаются обращения через точку к объектам, которых нет в модуле?

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

Итог

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

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