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

· 9 мин

Содержание

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

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

Где найти код: конфигуратор и модули

Весь код хранится внутри конфигурации, а не в отдельных файлах на диске. Чтобы до него добраться:

  1. Запустите базу в режиме Конфигуратор (выбор режима — в стартовом окне 1С).
  2. Откройте дерево конфигурации: меню Конфигурация → Открыть конфигурацию.
  3. Найдите нужный объект (справочник, документ, обработку) и раскройте его ветку.
  4. Двойной клик по строке Модуль объекта или Модуль формы откроет редактор с кодом.

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

Логика разнесена по разным модулям, и место модуля подсказывает, когда код срабатывает:

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

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

Что означают символы и ключевые слова

Половина «нечитаемости» чужого кода уходит, как только опознаёшь служебные символы. Вот основные:

СимволЧто значит
//комментарий до конца строки, на выполнение не влияет
;конец оператора (команды)
.обращение к свойству или методу: Объект.Контрагент
()вызов процедуры или функции, внутри — параметры
[]обращение к элементу коллекции по индексу или ключу
=и присваивание, и сравнение (одиночный знак, не ==)
<>«не равно»
&директива компиляции: &НаКлиенте, &НаСервере
#инструкция препроцессора: #Область, #Если
``

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

  • Процедура / КонецПроцедуры — границы блока-процедуры.
  • Функция / Возврат / КонецФункции — функция и возвращаемое значение.
  • Если / Тогда / ИначеЕсли / Иначе / КонецЕсли — ветвление.
  • Для ... По ... Цикл, Для Каждого ... Из ... Цикл, Пока ... Цикл — циклы.
  • Попытка / Исключение / КонецПопытки — обработка ошибок.
  • Новый — создание объекта: Новый Массив, Новый Запрос.
  • Перем — объявление переменной.

Знак = в 1С отвечает и за присваивание, и за сравнение. Сумма = 0 в начале строки — это присваивание нуля, а то же Сумма = 0 внутри Если — проверка равенства. Контекст определяет смысл.

Процедуры и функции: как различать

Код собран в блоки. Процедура выполняет действие и ничего не возвращает, функция — вычисляет значение и отдаёт его через Возврат.

Процедура:

Процедура ЗаполнитьПоУмолчанию()
    Объект.Дата = ТекущаяДата();
    Объект.Валюта = Константы.ВалютаРегламентированногоУчета.Получить();
КонецПроцедуры

Функция — обратите внимание на Возврат:

Функция СуммаДокумента()
    Итог = 0;
    Для Каждого Строка Из Объект.Товары Цикл
        Итог = Итог + Строка.Сумма;
    КонецЦикла;
    Возврат Итог;
КонецФункции

Слово Экспорт после имени означает, что блок виден из других модулей:

Функция ПолучитьКурс(Валюта, Дата) Экспорт
    Возврат РегистрыСведений.КурсыВалют.ПолучитьПоследнее(
        Дата, Новый Структура("Валюта", Валюта)).Курс;
КонецФункции

Перед именем часто стоит директива компиляции — она говорит, где код исполняется:

  • &НаКлиенте — на компьютере пользователя, работает с формой и диалогами.
  • &НаСервере — на сервере, имеет доступ к базе данных.
  • &НаСервереБезКонтекста — на сервере, но без данных конкретной формы (быстрее).
  • &НаКлиентеНаСервереБезКонтекста — общий код без привязки к месту.

Директива важна при чтении: если видите обращение к базе в блоке &НаКлиенте, это ошибка — с клиента база напрямую недоступна.

Как читать обращения к данным

Большая часть кода 1С — это чтение и запись данных. Обращения узнаваемы по шаблону Вид.Имя:

  • Справочники.Контрагенты — менеджер справочника «Контрагенты».
  • Документы.РеализацияТоваровУслуг — менеджер документа реализации.
  • РегистрыНакопления.Товары — регистр остатков.
  • Константы.ОсновнаяВалюта — константа.

Через точку идут методы и реквизиты: Справочники.Контрагенты.НайтиПоНаименованию("Ромашка") вернёт ссылку, а дальше Ссылка.ИНН даст значение реквизита.

Самый насыщенный способ работы с данными — язык запросов. Его легко узнать по тексту в кавычках с символом | в начале строк:

Запрос = Новый Запрос;
Запрос.Текст =
    "ВЫБРАТЬ
    |   Номенклатура.Наименование,
    |   Номенклатура.Артикул
    |ИЗ
    |   Справочник.Номенклатура КАК Номенклатура
    |ГДЕ
    |   Номенклатура.ПометкаУдаления = ЛОЖЬ";
Результат = Запрос.Выполнить().Выбрать();
Пока Результат.Следующий() Цикл
    Сообщить(Результат.Наименование);
КонецЦикла;

Читается так: выбрали два поля из справочника «Номенклатура», отбросили помеченные на удаление, затем в цикле прошли по строкам результата и вывели наименование. Вертикальная черта | — это просто склейка одной длинной строки, на запрос она не влияет.

Запрос всегда выполняется на сервере. Если видите Новый Запрос в клиентской процедуре — значит, где-то рядом есть вызов серверного метода, в котором запрос и живёт.

Кроме запросов, данные читают и напрямую через объектную модель. Шаблоны, которые встречаются постоянно:

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

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

Приёмы быстрого разбора кода

Читать код глазами по строкам — долго. Конфигуратор умеет водить по коду сам:

  • F12 — перейти к определению процедуры или функции под курсором. Главный способ «провалиться» внутрь вызова и понять, что он делает.
  • Ctrl+F — поиск по тексту внутри открытого модуля.
  • Меню Правка → Глобальный поиск — поиск по текстам всех модулей сразу: удобно найти, откуда вообще вызывается метод.
  • Правый клик по объекту в дереве → Поиск ссылок на объект — покажет все места, где объект используется.
  • Ctrl+Space — контекстная подсказка: после точки покажет список доступных свойств и методов объекта. По нему видно, с чем вы вообще работаете.
  • Ctrl+F7 — синтаксический контроль открытого модуля. Если чужой код не запускается, проверка подсветит строку с ошибкой.
  • Меню Справка → Синтакс-помощник — встроенный справочник по всем методам платформы. Поставьте курсор на незнакомое слово и загляните туда.

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

Когда статикой не разобраться, помогает отладчик — он показывает код в движении:

  1. Поставьте точку останова на строке клавишей F9 (слева появится красный кружок).
  2. Запустите 1С:Предприятие из конфигуратора в режиме отладки (F5).
  3. Повторите действие пользователя — выполнение встанет на вашей строке.
  4. Шагайте: F10 — выполнить строку не заходя внутрь вызовов, F11 — зайти внутрь процедуры.
  5. Наводите курсор на переменные — всплывёт их текущее значение.

Отладку запускают в тестовой копии базы, а не в рабочей. Выполнение останавливается на точке останова, и пока вы изучаете код, сеанс «висит» — в рабочей базе это заметят другие пользователи.

Проверьте, как вы читаете структуру кода:

Проверьте себя
Что возвращает блок, начинающийся со слова «Функция»?
Что означает `//` в начале строки?
Директива `&НаСервере` говорит, что код выполняется…

Шаблоны кода, которые встречаются чаще всего

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

Обработчик события формы. Имя совпадает с событием: ПриОткрытии, ПриСозданииНаСервере, ПередЗаписью. Срабатывает автоматически в нужный момент.

&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
    Если Не ЗначениеЗаполнено(Объект.Организация) Тогда
        Объект.Организация = Константы.ОсновнаяОрганизация.Получить();
    КонецЕсли;
КонецПроцедуры

Обработка проведения документа. Лежит в модуле объекта, формирует движения по регистрам:

Процедура ОбработкаПроведения(Отказ, РежимПроведения)
    Движения.ТоварыНаСкладах.Записывать = Истина;
    Для Каждого СтрокаТовары Из Товары Цикл
        Движение = Движения.ТоварыНаСкладах.Добавить();
        Движение.Период = Дата;
        Движение.Номенклатура = СтрокаТовары.Номенклатура;
        Движение.Количество = СтрокаТовары.Количество;
    КонецЦикла;
КонецПроцедуры

Защита от ошибки. Опасную операцию оборачивают в Попытка, чтобы падение не остановило всё:

Попытка
    Соединение = ПолучитьВнешнееСоединение();
Исключение
    Сообщить("Не удалось подключиться: " + ОписаниеОшибки());
КонецПопытки;

Группировка кода. Инструкции #Область ИмяОбласти и #КонецОбласти сворачивают блоки в редакторе — на выполнение не влияют, но помогают ориентироваться. В типовых так разделены клиентские и серверные процедуры.

Частые ошибки новичка при чтении

Эти заблуждения сбивают с толку чаще всего:

  • 🔸 Путают = в условии и в присваивании. В начале строки — присваивание, внутри Если — сравнение. Разные смыслы у одного знака.
  • 🔸 Ищут код формы в модуле объекта. Поведение кнопок и полей лежит в модуле формы, а логика записи и проведения — в модуле объекта. Это разные места.
  • 🔸 Принимают комментарий за рабочий код. Всё после // до конца строки не выполняется. Иногда там лежит старый, отключённый вариант.
  • 🔸 Читают клиентский код как серверный. Если в блоке стоит &НаКлиенте, обращения к базе данных в нём быть не должно — ищите вызов серверного метода.
  • 🔸 Думают, что | — часть запроса. Вертикальная черта только склеивает длинную строку текста, в сам SQL-подобный запрос она не попадает.

Если застряли на незнакомом методе платформы (например, ПолучитьПоследнее или НайтиСтроки), не угадывайте — поставьте на него курсор и откройте Синтакс-помощник. Там описаны параметры и возвращаемое значение каждого метода.

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

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