Разработка и Конфигурация · 12 мин
Как понять синтаксис 1С и начать читать код конфигураций
Как понять синтаксис 1С: структура встроенного языка, операторы, запросы, типы данных, примеры кода и типичные ошибки новичков при чтении конфигураций.
Синтаксис 1С — это правила встроенного языка платформы «1С:Предприятие», на котором описывается вся бизнес-логика: проведение документов, расчёт налогов, формирование отчётов. Главная особенность языка — он полностью русскоязычный: ключевые слова, имена процедур и методы объектов пишутся на русском, хотя платформа понимает и английские аналоги. Это снижает порог входа, но не отменяет необходимости понимать структуру языка.
Чтобы читать код 1С уверенно, нужно освоить четыре вещи: как устроены модули и процедуры, как работают операторы и типы данных, как обращаться к объектам конфигурации (справочникам, документам, регистрам) и как строятся запросы к базе данных. Каждая из этих тем разбирается ниже с конкретными примерами.
Важный нюанс: синтаксис встроенного языка и синтаксис языка запросов — это два разных языка внутри одной платформы. Новички часто путают их, потому что оба выглядят как русский текст, но правила у них разные. В статье они рассмотрены отдельно.
Из чего состоит код 1С: модули, процедуры и функции
Весь код в 1С хранится в модулях. Модуль — это контейнер с текстом программы, привязанный к определённому контексту: модуль объекта (например, документа «РеализацияТоваров»), модуль формы, общий модуль, модуль приложения. Понимание того, в каком модуле находится код — первый шаг к его пониманию, потому что от контекста зависит, какие переменные и методы доступны.
Внутри модуля код организован в процедуры и функции. Процедура выполняет действия и ничего не возвращает, функция обязательно возвращает значение через оператор Возврат. Объявление выглядит так:
Процедура РассчитатьСкидку(СуммаДокумента) Экспорт
// тело процедуры
КонецПроцедуры
Функция ПолучитьСтавкуНДС(Товар)
Возврат Товар.СтавкаНДС;
КонецФункции
Ключевое слово Экспорт делает процедуру доступной из других модулей. Без него процедура видна только внутри своего модуля. Это частый источник ошибки «Процедура или функция с указанным именем не определена» — метод существует, но не экспортирован.
Базовые операторы: условия, циклы и присваивание
Условный оператор записывается через Если ... Тогда ... ИначеЕсли ... Иначе ... КонецЕсли;. Обратите внимание: каждый блок завершается точкой с запятой, а слово КонецЕсли пишется слитно. Пропуск Тогда или лишняя точка с запятой перед Иначе — классические синтаксические ошибки новичка.
Циклов три вида: Для ... Цикл ... КонецЦикла; (счётный), Для Каждого Элемент Из Коллекции Цикл (перебор) и Пока Условие Цикл (условный). На практике чаще всего встречается перебор коллекций — строк табличной части документа, выборки запроса, массива.
Для Каждого СтрокаТовара Из Документ.Товары Цикл
Если СтрокаТовара.Количество > 0 Тогда
ОбщаяСумма = ОбщаяСумма + СтрокаТовара.Сумма;
КонецЕсли;
КонецЦикла;
Присваивание выполняется знаком =, сравнение — тоже знаком = внутри условий, а неравенство обозначается <>. Логические операции — И, ИЛИ, НЕ. Комментарии начинаются с двойного слеша // и действуют до конца строки.
Типы данных и работа со значениями
1С — язык со слабой типизацией: переменная не объявляется с типом заранее, а тип определяется присвоенным значением. Одна и та же переменная может сначала хранить число, а затем строку. Это удобно, но опасно: операция Число + Строка вызовет ошибку преобразования типов в момент выполнения.
Основные примитивные типы: Число, Строка, Дата, Булево, Неопределено и NULL. Различие последних двух важно: Неопределено — значение по умолчанию для незаполненных переменных, а NULL приходит из запросов, когда в базе нет данных (например, при левом соединении без совпадений). Сравнивать их между собой напрямую бессмысленно — это разные значения.
Для проверки типа используется функция ТипЗнч(Значение) в паре с Тип("ИмяТипа"). Для безопасного преобразования строк в числа и даты есть конструкции форматирования и функции вроде Число(), но они не ловят ошибки — надёжнее оборачивать преобразование в Попытка ... Исключение ... КонецПопытки;.
Обращение к объектам конфигурации
Большая часть прикладного кода — это обращения к объектам метаданных: справочникам, документам, регистрам, перечислениям. Синтаксис унифицирован: имя коллекции, точка, имя объекта. Например, Справочники.Номенклатура, Документы.РеализацияТоваровУслуг, Перечисления.СтавкиНДС.НДС20.
Типовые операции с объектами выглядят так: найти элемент справочника по коду или наименованию — Справочники.Номенклатура.НайтиПоНаименованию("Кирпич"); создать документ — Документы.ПоступлениеТоваров.СоздатьДокумент(); получить объект по ссылке — СсылкаНаДокумент.ПолучитьОбъект(). Различие между ссылкой и объектом — ключевое: ссылка — это лёгкий идентификатор записи, объект — полная загруженная в память копия, которую можно изменять и записывать.
Доступ к реквизитам выполняется через точку: ДокументОбъект.Контрагент, СтрокаТаблицы.Цена. Если реквизит — ссылка на другой объект, можно «разыменовать» его дальше: Документ.Контрагент.ИНН. Но каждое такое разыменование через ссылку — это обращение к базе данных, и в цикле по тысяче строк это заметно замедляет код. Правильный подход — получить нужные поля одним запросом.
Синтаксис языка запросов
Язык запросов 1С внешне похож на SQL с русскими ключевыми словами: ВЫБРАТЬ ... ИЗ ... ГДЕ ... СГРУППИРОВАТЬ ПО ... УПОРЯДОЧИТЬ ПО. Запрос — это отдельный текст внутри кода, который передаётся в объект Запрос и выполняется на сервере базы данных.
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| Товары.Номенклатура КАК Номенклатура,
| СУММА(Товары.Количество) КАК Количество
|ИЗ
| Документ.РеализацияТоваровУслуг.Товары КАК Товары
|ГДЕ
| Товары.Ссылка.Дата >= &НачалоПериода
|СГРУППИРОВАТЬ ПО
| Товары.Номенклатура";
Запрос.УстановитьПараметр("НачалоПериода", НачалоМесяца(ТекущаяДата()));
Выборка = Запрос.Выполнить().Выбрать();
Три правила, которые уберегут от большинства ошибок. Первое: параметры передаются только через &ИмяПараметра и УстановитьПараметр(), а не конкатенацией строк — это и безопаснее, и быстрее. Второе: символ | в начале строк — это продолжение многострочного литерала, а не часть запроса. Третье: результат запроса обходится через Выборка в цикле Пока Выборка.Следующий() Цикл.
Виртуальные таблицы регистров (РегистрНакопления.Продажи.Обороты, РегистрСведений.ЦеныНоменклатуры.СрезПоследних) требуют отдельного внимания: у них есть параметры, которые задаются в скобках после имени таблицы, и неправильно заданные параметры резко ухудшают производительность.
Запрос = Новый Запрос("ВЫБРАТЬ Ссылка ИЗ Справочник.Номенклатура ГДЕ Наименование = &Наименование");
Запрос.УстановитьПараметр("Наименование", "Кирпич");Инструменты, которые помогают понять код
Главный помощник — синтакс-помощник, встроенный в конфигуратор. Поставьте курсор на любое ключевое слово или метод и нажмите Ctrl+F1: откроется описание синтаксиса, параметров и примеров. Там же есть список всех глобальных методов платформы — полезно листать его, чтобы узнавать новые возможности языка.
Второй инструмент — контекстная подсказка (Ctrl+Пробел): конфигуратор показывает доступные свойства и методы объекта после точки. Третий — отладчик: точка останова (F9), пошаговое выполнение (F10/F11) и окно «Вычислить выражение» (Shift+F9) позволяют посмотреть реальные значения переменных в момент выполнения. Умение читать код в отладчике — самый быстрый способ понять, что делает чужой модуль.
- 1Определите, в каком модуле находится код и в каком контексте он выполняется (клиент, сервер, форма)
- 2Найдите точку входа — процедуру или обработчик события, с которой начинается выполнение
- 3Прочитайте код сверху вниз, подсматривая незнакомые методы в синтакс-помощнике (Ctrl+F1)
- 4Поставьте точку останова и пройдите код отладчиком, наблюдая значения переменных
- 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С — это русскоязычные операторы внутри модулей с процедурами и функциями, обращения к объектам конфигурации через точку и отдельный язык запросов для работы с данными. Быстрее всего чтение кода осваивается через связку «синтакс-помощник + отладчик + поиск по конфигурации», а эксперименты безопасно проводить только на копии базы.