Понимаем встроенный язык 1С: от символов до запросов
Содержание
Код в 1С читается слева направо и сверху вниз, как обычный текст: каждая строка — одна команда, в конце стоит точка с запятой ;. Открывается код в конфигураторе двойным кликом по нужному модулю в дереве конфигурации. Чтобы прочитать и понять код 1С, достаточно знать десяток ключевых слов, понимать структуру модулей и уметь ходить по ссылкам клавишей F12.
Разберём встроенный язык 1С по частям: что означают странные символы, где физически лежит логика, чем процедура отличается от функции, как выглядят обращения к базе данных и какими кнопками конфигуратора читать чужой код быстрее.
Где найти код: конфигуратор и модули
Весь код хранится внутри конфигурации, а не в отдельных файлах на диске. Чтобы до него добраться:
- Запустите базу в режиме
Конфигуратор(выбор режима — в стартовом окне 1С). - Откройте дерево конфигурации: меню
Конфигурация → Открыть конфигурацию. - Найдите нужный объект (справочник, документ, обработку) и раскройте его ветку.
- Двойной клик по строке
Модуль объектаилиМодуль формыоткроет редактор с кодом.
У типовых конфигураций на поддержке код открыт для чтения, но закрыт для правки — рядом с объектом виден замок. Читать можно всё, менять — только через расширение или снятие с поддержки.
Логика разнесена по разным модулям, и место модуля подсказывает, когда код срабатывает:
| Модуль | Где лежит | Когда выполняется |
|---|---|---|
| Модуль формы | внутри формы | при работе пользователя с этой формой |
| Модуль объекта | у справочника, документа | при записи, проведении, заполнении |
| Модуль менеджера | у объекта метаданных | общие методы для всех элементов вида |
| Общий модуль | ветка Общие → Общие модули | переиспользуемые функции со всех мест |
| Модуль сеанса | один на конфигурацию | при старте сеанса |
Если не знаете, откуда вызвана процедура, — начинайте с модуля формы: большая часть видимого поведения описана именно там.
Что означают символы и ключевые слова
Половина «нечитаемости» чужого кода уходит, как только опознаёшь служебные символы. Вот основные:
| Символ | Что значит |
|---|---|
// | комментарий до конца строки, на выполнение не влияет |
; | конец оператора (команды) |
. | обращение к свойству или методу: Объект.Контрагент |
() | вызов процедуры или функции, внутри — параметры |
[] | обращение к элементу коллекции по индексу или ключу |
= | и присваивание, и сравнение (одиночный знак, не ==) |
<> | «не равно» |
& | директива компиляции: &НаКлиенте, &НаСервере |
# | инструкция препроцессора: #Область, #Если |
| ` | ` |
Ключевых слов немного, и они двуязычные — писать можно по-русски и по-английски. В типовых конфигурациях встречается русский вариант:
Процедура/КонецПроцедуры— границы блока-процедуры.Функция/Возврат/КонецФункции— функция и возвращаемое значение.Если/Тогда/ИначеЕсли/Иначе/КонецЕсли— ветвление.Для ... По ... Цикл,Для Каждого ... Из ... Цикл,Пока ... Цикл— циклы.Попытка/Исключение/КонецПопытки— обработка ошибок.Новый— создание объекта:Новый Массив,Новый Запрос.Перем— объявление переменной.
Знак = в 1С отвечает и за присваивание, и за сравнение. Сумма = 0 в начале строки — это присваивание нуля, а то же Сумма = 0 внутри Если — проверка равенства. Контекст определяет смысл.
Процедуры и функции: как различать
Код собран в блоки. Процедура выполняет действие и ничего не возвращает, функция — вычисляет значение и отдаёт его через Возврат.
Процедура:
Процедура ЗаполнитьПоУмолчанию()
Объект.Дата = ТекущаяДата();
Объект.Валюта = Константы.ВалютаРегламентированногоУчета.Получить();
КонецПроцедуры
Функция — обратите внимание на Возврат:
Функция СуммаДокумента()
Итог = 0;
Для Каждого Строка Из Объект.Товары Цикл
Итог = Итог + Строка.Сумма;
КонецЦикла;
Возврат Итог;
КонецФункции
Слово Экспорт после имени означает, что блок виден из других модулей:
Функция ПолучитьКурс(Валюта, Дата) Экспорт
Возврат РегистрыСведений.КурсыВалют.ПолучитьПоследнее(
Дата, Новый Структура("Валюта", Валюта)).Курс;
КонецФункции
Перед именем часто стоит директива компиляции — она говорит, где код исполняется:
&НаКлиенте— на компьютере пользователя, работает с формой и диалогами.&НаСервере— на сервере, имеет доступ к базе данных.&НаСервереБезКонтекста— на сервере, но без данных конкретной формы (быстрее).&НаКлиентеНаСервереБезКонтекста— общий код без привязки к месту.
Директива важна при чтении: если видите обращение к базе в блоке &НаКлиенте, это ошибка — с клиента база напрямую недоступна.
Как читать обращения к данным
Большая часть кода 1С — это чтение и запись данных. Обращения узнаваемы по шаблону Вид.Имя:
Справочники.Контрагенты— менеджер справочника «Контрагенты».Документы.РеализацияТоваровУслуг— менеджер документа реализации.РегистрыНакопления.Товары— регистр остатков.Константы.ОсновнаяВалюта— константа.
Через точку идут методы и реквизиты: Справочники.Контрагенты.НайтиПоНаименованию("Ромашка") вернёт ссылку, а дальше Ссылка.ИНН даст значение реквизита.
Самый насыщенный способ работы с данными — язык запросов. Его легко узнать по тексту в кавычках с символом | в начале строк:
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| Номенклатура.Наименование,
| Номенклатура.Артикул
|ИЗ
| Справочник.Номенклатура КАК Номенклатура
|ГДЕ
| Номенклатура.ПометкаУдаления = ЛОЖЬ";
Результат = Запрос.Выполнить().Выбрать();
Пока Результат.Следующий() Цикл
Сообщить(Результат.Наименование);
КонецЦикла;
Читается так: выбрали два поля из справочника «Номенклатура», отбросили помеченные на удаление, затем в цикле прошли по строкам результата и вывели наименование. Вертикальная черта | — это просто склейка одной длинной строки, на запрос она не влияет.
Запрос всегда выполняется на сервере. Если видите Новый Запрос в клиентской процедуре — значит, где-то рядом есть вызов серверного метода, в котором запрос и живёт.
Кроме запросов, данные читают и напрямую через объектную модель. Шаблоны, которые встречаются постоянно:
Ссылка.Реквизит— значение реквизита по ссылке:Контрагент.ИНН,Документ.Сумма.Объект.ТабличнаяЧасть— табличная часть документа, по ней идут цикломДля Каждого.Менеджер.НайтиПоКоду("000001")иНайтиПоНаименованию— поиск элемента справочника.ЗначениеЗаполнено(Значение)— проверка, что поле не пустое (частая защита перед записью).
Если в коде встречается незнакомый тип значения, его подскажет функция ТипЗнч(Переменная). В типовых её часто ставят в отладке, чтобы понять, что пришло в параметр — ссылка, число или, например, Неопределено.
Приёмы быстрого разбора кода
Читать код глазами по строкам — долго. Конфигуратор умеет водить по коду сам:
F12— перейти к определению процедуры или функции под курсором. Главный способ «провалиться» внутрь вызова и понять, что он делает.Ctrl+F— поиск по тексту внутри открытого модуля.- Меню
Правка → Глобальный поиск— поиск по текстам всех модулей сразу: удобно найти, откуда вообще вызывается метод. - Правый клик по объекту в дереве →
Поиск ссылок на объект— покажет все места, где объект используется. Ctrl+Space— контекстная подсказка: после точки покажет список доступных свойств и методов объекта. По нему видно, с чем вы вообще работаете.Ctrl+F7— синтаксический контроль открытого модуля. Если чужой код не запускается, проверка подсветит строку с ошибкой.- Меню
Справка → Синтакс-помощник— встроенный справочник по всем методам платформы. Поставьте курсор на незнакомое слово и загляните туда.
Отдельный приём для крупных типовых — читать код не в конфигураторе, а в среде 1C:Enterprise Development Tools (EDT). Там модули открываются как обычные файлы, работает подсветка, переход по ссылкам и поиск по проекту целиком. Для разового чтения хватит и конфигуратора, но на большом объёме EDT удобнее.
Когда статикой не разобраться, помогает отладчик — он показывает код в движении:
- Поставьте точку останова на строке клавишей
F9(слева появится красный кружок). - Запустите
1С:Предприятиеиз конфигуратора в режиме отладки (F5). - Повторите действие пользователя — выполнение встанет на вашей строке.
- Шагайте:
F10— выполнить строку не заходя внутрь вызовов,F11— зайти внутрь процедуры. - Наводите курсор на переменные — всплывёт их текущее значение.
Отладку запускают в тестовой копии базы, а не в рабочей. Выполнение останавливается на точке останова, и пока вы изучаете код, сеанс «висит» — в рабочей базе это заметят другие пользователи.
Проверьте, как вы читаете структуру кода:
Шаблоны кода, которые встречаются чаще всего
Процентов на восемьдесят чужой код собран из повторяющихся заготовок. Опознаёшь шаблон — понимаешь блок целиком.
Обработчик события формы. Имя совпадает с событием: ПриОткрытии, ПриСозданииНаСервере, ПередЗаписью. Срабатывает автоматически в нужный момент.
&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
Если Не ЗначениеЗаполнено(Объект.Организация) Тогда
Объект.Организация = Константы.ОсновнаяОрганизация.Получить();
КонецЕсли;
КонецПроцедуры
Обработка проведения документа. Лежит в модуле объекта, формирует движения по регистрам:
Процедура ОбработкаПроведения(Отказ, РежимПроведения)
Движения.ТоварыНаСкладах.Записывать = Истина;
Для Каждого СтрокаТовары Из Товары Цикл
Движение = Движения.ТоварыНаСкладах.Добавить();
Движение.Период = Дата;
Движение.Номенклатура = СтрокаТовары.Номенклатура;
Движение.Количество = СтрокаТовары.Количество;
КонецЦикла;
КонецПроцедуры
Защита от ошибки. Опасную операцию оборачивают в Попытка, чтобы падение не остановило всё:
Попытка
Соединение = ПолучитьВнешнееСоединение();
Исключение
Сообщить("Не удалось подключиться: " + ОписаниеОшибки());
КонецПопытки;
Группировка кода. Инструкции #Область ИмяОбласти и #КонецОбласти сворачивают блоки в редакторе — на выполнение не влияют, но помогают ориентироваться. В типовых так разделены клиентские и серверные процедуры.
Частые ошибки новичка при чтении
Эти заблуждения сбивают с толку чаще всего:
- 🔸 Путают
=в условии и в присваивании. В начале строки — присваивание, внутриЕсли— сравнение. Разные смыслы у одного знака. - 🔸 Ищут код формы в модуле объекта. Поведение кнопок и полей лежит в модуле формы, а логика записи и проведения — в модуле объекта. Это разные места.
- 🔸 Принимают комментарий за рабочий код. Всё после
//до конца строки не выполняется. Иногда там лежит старый, отключённый вариант. - 🔸 Читают клиентский код как серверный. Если в блоке стоит
&НаКлиенте, обращения к базе данных в нём быть не должно — ищите вызов серверного метода. - 🔸 Думают, что
|— часть запроса. Вертикальная черта только склеивает длинную строку текста, в сам SQL-подобный запрос она не попадает.
Если застряли на незнакомом методе платформы (например, ПолучитьПоследнее или НайтиСтроки), не угадывайте — поставьте на него курсор и откройте Синтакс-помощник. Там описаны параметры и возвращаемое значение каждого метода.
Частые вопросы
Нужно ли знать программирование, чтобы читать код 1С?
F12. Чтобы писать и исправлять код — базовые знания алгоритмов уже понадобятся.Можно ли прочитать код типовой конфигурации?
На каком языке написан код 1С?
Чем модуль формы отличается от модуля объекта?
Как быстро понять, что делает незнакомая функция?
F12 — откроется определение. Если это метод платформы, а не процедура конфигурации, загляните в Синтакс-помощник через меню Справка.