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

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

Как понять синтаксис 1С и начать читать код конфигураций

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

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

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

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

Из чего состоит код 1С: модули, процедуры и функции

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

Внутри модуля код организован в процедуры и функции. Процедура выполняет действия и ничего не возвращает, функция обязательно возвращает значение через оператор Возврат. Объявление выглядит так:

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

// тело процедуры

КонецПроцедуры

Функция ПолучитьСтавкуНДС(Товар)

Возврат Товар.СтавкаНДС;

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

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

Базовые операторы: условия, циклы и присваивание

Условный оператор записывается через Если ... Тогда ... ИначеЕсли ... Иначе ... КонецЕсли;. Обратите внимание: каждый блок завершается точкой с запятой, а слово КонецЕсли пишется слитно. Пропуск Тогда или лишняя точка с запятой перед Иначе — классические синтаксические ошибки новичка.

Циклов три вида: Для ... Цикл ... КонецЦикла; (счётный), Для Каждого Элемент Из Коллекции Цикл (перебор) и Пока Условие Цикл (условный). На практике чаще всего встречается перебор коллекций — строк табличной части документа, выборки запроса, массива.

Для Каждого СтрокаТовара Из Документ.Товары Цикл

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

ОбщаяСумма = ОбщаяСумма + СтрокаТовара.Сумма;

КонецЕсли;

КонецЦикла;

Присваивание выполняется знаком =, сравнение — тоже знаком = внутри условий, а неравенство обозначается <>. Логические операции — И, ИЛИ, НЕ. Комментарии начинаются с двойного слеша // и действуют до конца строки.

Типичные ошибки
01
Точка с запятой перед Иначе — компилятор выдаёт синтаксическую ошибку, потому что оператор Если считается завершённым
02
Путаница между присваиванием и сравнением в других языках: в 1С оба действия используют знак =, контекст определяет смысл
03
Обращение к несуществующему реквизиту объекта — ошибка возникает только в момент выполнения, а не при проверке модуля
04
Использование английских и русских ключевых слов вперемешку в одном модуле — код работает, но становится трудночитаемым

Типы данных и работа со значениями

1С — язык со слабой типизацией: переменная не объявляется с типом заранее, а тип определяется присвоенным значением. Одна и та же переменная может сначала хранить число, а затем строку. Это удобно, но опасно: операция Число + Строка вызовет ошибку преобразования типов в момент выполнения.

Основные примитивные типы: Число, Строка, Дата, Булево, Неопределено и NULL. Различие последних двух важно: Неопределено — значение по умолчанию для незаполненных переменных, а NULL приходит из запросов, когда в базе нет данных (например, при левом соединении без совпадений). Сравнивать их между собой напрямую бессмысленно — это разные значения.

Для проверки типа используется функция ТипЗнч(Значение) в паре с Тип("ИмяТипа"). Для безопасного преобразования строк в числа и даты есть конструкции форматирования и функции вроде Число(), но они не ловят ошибки — надёжнее оборачивать преобразование в Попытка ... Исключение ... КонецПопытки;.

Обращение к объектам конфигурации

Большая часть прикладного кода — это обращения к объектам метаданных: справочникам, документам, регистрам, перечислениям. Синтаксис унифицирован: имя коллекции, точка, имя объекта. Например, Справочники.Номенклатура, Документы.РеализацияТоваровУслуг, Перечисления.СтавкиНДС.НДС20.

Типовые операции с объектами выглядят так: найти элемент справочника по коду или наименованию — Справочники.Номенклатура.НайтиПоНаименованию("Кирпич"); создать документ — Документы.ПоступлениеТоваров.СоздатьДокумент(); получить объект по ссылке — СсылкаНаДокумент.ПолучитьОбъект(). Различие между ссылкой и объектом — ключевое: ссылка — это лёгкий идентификатор записи, объект — полная загруженная в память копия, которую можно изменять и записывать.

Доступ к реквизитам выполняется через точку: ДокументОбъект.Контрагент, СтрокаТаблицы.Цена. Если реквизит — ссылка на другой объект, можно «разыменовать» его дальше: Документ.Контрагент.ИНН. Но каждое такое разыменование через ссылку — это обращение к базе данных, и в цикле по тысяче строк это заметно замедляет код. Правильный подход — получить нужные поля одним запросом.

Синтаксис языка запросов

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

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

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

"ВЫБРАТЬ

| Товары.Номенклатура КАК Номенклатура,

| СУММА(Товары.Количество) КАК Количество

|ИЗ

| Документ.РеализацияТоваровУслуг.Товары КАК Товары

|ГДЕ

| Товары.Ссылка.Дата >= &НачалоПериода

|СГРУППИРОВАТЬ ПО

| Товары.Номенклатура";

Запрос.УстановитьПараметр("НачалоПериода", НачалоМесяца(ТекущаяДата()));

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

Три правила, которые уберегут от большинства ошибок. Первое: параметры передаются только через &ИмяПараметра и УстановитьПараметр(), а не конкатенацией строк — это и безопаснее, и быстрее. Второе: символ | в начале строк — это продолжение многострочного литерала, а не часть запроса. Третье: результат запроса обходится через Выборка в цикле Пока Выборка.Следующий() Цикл.

Виртуальные таблицы регистров (РегистрНакопления.Продажи.Обороты, РегистрСведений.ЦеныНоменклатуры.СрезПоследних) требуют отдельного внимания: у них есть параметры, которые задаются в скобках после имени таблицы, и неправильно заданные параметры резко ухудшают производительность.

bsl
Запрос = Новый Запрос("ВЫБРАТЬ Ссылка ИЗ Справочник.Номенклатура ГДЕ Наименование = &Наименование");
Запрос.УстановитьПараметр("Наименование", "Кирпич");

Инструменты, которые помогают понять код

Главный помощник — синтакс-помощник, встроенный в конфигуратор. Поставьте курсор на любое ключевое слово или метод и нажмите Ctrl+F1: откроется описание синтаксиса, параметров и примеров. Там же есть список всех глобальных методов платформы — полезно листать его, чтобы узнавать новые возможности языка.

Второй инструмент — контекстная подсказка (Ctrl+Пробел): конфигуратор показывает доступные свойства и методы объекта после точки. Третий — отладчик: точка останова (F9), пошаговое выполнение (F10/F11) и окно «Вычислить выражение» (Shift+F9) позволяют посмотреть реальные значения переменных в момент выполнения. Умение читать код в отладчике — самый быстрый способ понять, что делает чужой модуль.

Как разобрать незнакомый фрагмент кода
  1. 1
    Определите, в каком модуле находится код и в каком контексте он выполняется (клиент, сервер, форма)
  2. 2
    Найдите точку входа — процедуру или обработчик события, с которой начинается выполнение
  3. 3
    Прочитайте код сверху вниз, подсматривая незнакомые методы в синтакс-помощнике (Ctrl+F1)
  4. 4
    Поставьте точку останова и пройдите код отладчиком, наблюдая значения переменных
  5. 5
    Составьте краткое описание: что получает на вход процедура, что изменяет и что возвращает

Частые трудности и как их преодолеть

Первая трудность — обилие «магических» имен. Код в типовых конфигурациях опирается на общие модули библиотеки стандартных подсистем (БСП): ОбщегоНазначения.ЗначениеРеквизитаОбъекта(), СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(). Не нужно зазубривать их все — достаточно научиться находить описание процедуры через поиск по конфигурации (Ctrl+Shift+F) и читать комментарий в заголовке модуля.

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

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

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

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

Можете ли вы пересказать назначение процедуры одним предложением
Норма

Формулируете: берёт X, делает Y, возвращает Z

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

Описание сводится к перечислению строк кода

Понимаете ли, откуда приходят входные данные
Норма

Нашли все места вызова через поиск по конфигурации

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

Параметры появляются «ниоткуда», источник неясен

Предсказываете ли результат выполнения
Норма

В отладчике значения совпадают с ожиданием

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

Результат неожиданный — значит, код прочитан неверно

FAQ

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

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

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

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

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

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

Почему код работает в тестовой базе, но выдаёт ошибку в рабочей?

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

Нужно ли знать SQL для понимания запросов 1С?

Строго необязательно, но знакомство с SQL-логикой (соединения, группировки, вложенные запросы) сильно ускоряет освоение, потому что язык запросов 1С построен на тех же принципах. Если SQL незнаком, начинайте с простых выборок из одной таблицы и постепенно добавляйте соединения.

Где искать описание метода, которого нет в синтакс-помощнике?

Если метод не находится через Ctrl+F1, скорее всего, это процедура прикладного модуля конфигурации, а не метод платформы. Найдите её глобальным поиском (Ctrl+Shift+F) по имени — откроется исходный код с комментариями разработчиков конфигурации.

Итог

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

Синтаксис 1С — это русскоязычные операторы внутри модулей с процедурами и функциями, обращения к объектам конфигурации через точку и отдельный язык запросов для работы с данными. Быстрее всего чтение кода осваивается через связку «синтакс-помощник + отладчик + поиск по конфигурации», а эксперименты безопасно проводить только на копии базы.