Чтение и понимание кода на встроенном языке 1С 8.3
Содержание
Код на встроенном языке 1С читают не слева направо, а от точки входа. Находите, где процедура начинается (событие формы, команда, вызов из другого модуля), и идёте по ветке, которая вас интересует. Остальное пока не трогаете. Синтаксис здесь русскоязычный и простой, сложность не в словах, а в том, чтобы понять, какой объект что делает и в какой момент.
Ниже — как устроены модули, какими инструментами Конфигуратора и EDT быстро находить нужное, как разбирать процедуры и функции, ловить ошибки отладчиком и подступаться к большому алгоритму. Без предварительного опыта программирования: достаточно знать, где в 1С документы и справочники.
Из чего состоит код: модули и базовый синтаксис
Весь код в 1С живёт в модулях. Открыть модуль можно в Конфигураторе двойным кликом по объекту в дереве конфигурации. Основные виды:
- 📄 Модуль формы — обработчики событий:
ПриОткрытии,ПередЗаписью, нажатия кнопок. - 📦 Модуль объекта (справочника, документа) — логика самого объекта:
ОбработкаПроведения,ПриЗаписи. - 🧩 Общие модули (ветка
Общие → Общие модули) — переиспользуемые процедуры и функции. - ⚙️ Модуль менеджера, модуль приложения, модуль сеанса — служебные точки.
Внутри модуля код собран в процедуры и функции. Их легко различить:
Процедура ПересчитатьИтог(Таблица)
// процедура что-то делает, но ничего не возвращает
КонецПроцедуры
Функция СуммаСНДС(Сумма, Ставка) Экспорт
Возврат Сумма * (1 + Ставка / 100); // функция возвращает значение
КонецФункции
Ключевое слово Экспорт означает, что метод можно вызвать из других модулей — по нему удобно искать «входные двери» в чужой код.
Базовые конструкции, которые встретятся в любом модуле:
| Конструкция | Как выглядит | Что делает |
|---|---|---|
| Условие | Если … Тогда … Иначе … КонецЕсли | ветвление |
| Цикл по коллекции | Для Каждого Стр Из Таблица Цикл … КонецЦикла | перебор элементов |
| Счётный цикл | Для Сч = 1 По 10 Цикл … КонецЦикла | повтор N раз |
| Обработка ошибки | Попытка … Исключение … КонецПопытки | перехват сбоя |
| Комментарий | // текст | пояснение, код не исполняется |
Над процедурой часто стоит строка с директивой компиляции: &НаКлиенте, &НаСервере, &НаСервереБезКонтекста. Она говорит, где выполнится код. На клиенте нет прямого доступа к базе данных — если видите запрос или чтение реквизита объекта, код почти наверняка серверный. Это первое, на что смотрят, разбирая модуль формы.
Инструменты Конфигуратора и EDT для анализа кода
Читать код «глазами по экрану» медленно. Среда разработки умеет показывать связи между методами — этим и пользуются.
В Конфигураторе пригодятся:
- 🔎 Переход к определению — поставьте курсор на имя процедуры и нажмите
F12. Редактор откроет то место, где метод объявлен, даже если он в другом модуле. - 🌐 Глобальный поиск (
Правка → Глобальный поиск) — ищет текст по всей конфигурации. Так находят, откуда вызывается метод или где используется реквизит. - 🔗 Поиск ссылок на объект — правый клик по объекту в дереве конфигурации. Покажет все места, где объект задействован.
- 📑 Список процедур модуля — выпадающий список над текстом редактора. Быстрый переход к нужной процедуре в длинном модуле.
- 📝 Контекстная подсказка — наберите имя метода и открывающую скобку: всплывёт список параметров.
Ctrl+Пробелвызывает список доступных свойств и методов для объекта под курсором.
Синтакс-помощник (меню Справка → Синтакс-помощник) — встроенный справочник по всем методам платформы. Когда встретили незнакомую функцию вроде НайтиПоКоду или ЗначениеЗаполнено, ищите её там: будет описание, параметры и пример.
Если проект ведётся в 1C:Enterprise Development Tools (EDT) — среде на базе Eclipse — те же задачи решаются навигацией Ctrl+клик по имени метода, деревом вызовов (Call Hierarchy) и подсветкой ошибок прямо при наборе. Для чтения чужого кода EDT удобнее Конфигуратора за счёт быстрой навигации по ссылкам.
Как разбирать процедуру или функцию по шагам
Незнакомую процедуру не читают построчно сверху вниз. Сначала собирают общую картину, потом углубляются. Удобный порядок:
&НаКлиенте/&НаСервере). Имя обычно говорит о назначении. Параметры — это вход, с ними процедура и работает.Возврат. Они показывают, что метод отдаёт наружу и при каких условиях. Часто по одному Возврат в начале («ранний выход») понятен главный сценарий.Если и Цикл. Это скелет логики. Свёрнутые блоки (треугольники слева от кода) помогают увидеть структуру, не вчитываясь в детали.Найти…, чтение реквизитов, запись объектов — это то, ради чего процедура написана. Остальное обычно обвязка: проверки, подготовка, вывод сообщений.F12 в вызываемые методы, если нужно глубже.Пример. Видите в модуле формы:
&НаСервере
Процедура ЗаполнитьТаблицуНаСервере()
Запрос = Новый Запрос;
Запрос.Текст = "ВЫБРАТЬ Номенклатура, Количество ИЗ ...";
Выборка = Запрос.Выполнить().Выбрать();
Пока Выборка.Следующий() Цикл
НоваяСтрока = Товары.Добавить();
ЗаполнитьЗначенияСвойств(НоваяСтрока, Выборка);
КонецЦикла;
КонецПроцедуры
Расшифровка: на сервере выполняется запрос, его результат перебирается в цикле Пока … Следующий(), и каждая строка выборки переносится в табличную часть Товары. ЗаполнитьЗначенияСвойств копирует одноимённые поля. Пяти строк хватает, чтобы понять намерение, не зная наизусть синтаксис запросов.
Отладчик: что код делает на самом деле
Чтение глазами показывает, что код должен делать. Отладчик показывает, что он делает на самом деле — с реальными данными. Это самый быстрый способ понять незнакомый алгоритм.
Порядок работы:
- Поставьте точку останова — клик на поле слева от строки или клавиша
F9. Строка отметится кружком. - Запустите 1С в режиме отладки (
F5из Конфигуратора) и выполните действие, которое вызывает эту процедуру. - Выполнение остановится на вашей строке. Теперь шагайте:
F11— зайти внутрь вызванного метода,F10— выполнить строку не заходя внутрь,Shift+F11— выйти из текущей процедуры. - Наведите курсор на переменную — всплывёт её текущее значение. Сложные значения (таблицы, выборки) открываются двойным кликом в окне Табло.
Shift+F9— Вычислить выражение: можно проверить любое выражение прямо в точке останова.
Окно Стек вызовов показывает цепочку: кто вызвал текущую процедуру, кто вызвал того, и так до входа. По нему понятно, как управление пришло в эту точку.
Отладка серверного кода в клиент-серверной базе требует, чтобы отладка была разрешена на сервере, а в Конфигураторе — включено подключение к предмету отладки (Отладка → Подключение). Для файловой базы ничего настраивать не нужно.
Точка останова в рабочей базе останавливает сеанс реального пользователя. Отлаживайте на копии базы, а не на «боевой».
Как найти причину ошибки в коде
Когда 1С показывает ошибку, в тексте почти всегда есть имя модуля и номер строки. Это и есть отправная точка — открывайте указанное место, а не весь код подряд.
Типичные формулировки и что они значат:
Неопределено вместо ссылки. Смотрите отладчиком, откуда пришло значение.Чтобы перехватывать сбои и видеть их текст, в коде используют Попытка:
Попытка
Документ.Записать();
Исключение
Сообщить("Не удалось записать: " + ОписаниеОшибки());
КонецПопытки;
Если в чужом коде стоит пустой блок Исключение без вывода ошибки — это проблемное место: ошибки там молча проглатываются. Такой фрагмент стоит отметить как подозрительный.
Как подступиться к сложному алгоритму и запросу
Большая процедура на 300 строк или запрос на сто строк пугают только целиком. Их разбирают по частям.
Сложную процедуру делите на смысловые блоки. Часто автор уже разделил их комментариями или пустыми строками: подготовка данных → основной расчёт → запись результата. Разберите по одному блоку за раз, остальные временно сверните.
Длинный запрос читайте снизу вверх по структуре:
- 🎯 сначала итоговый
ВЫБРАТЬ— какие поля на выходе; - 🔗 потом
ИЗиСОЕДИНЕНИЕ— откуда берутся данные; - 🧮 временные таблицы (
ПОМЕСТИТЬ) — как заготовки: каждая решает одну подзадачу; - 📊
СГРУППИРОВАТЬ ПОи агрегатные функции (СУММА,КОЛИЧЕСТВО) — где сворачиваются строки.
Запросы удобно разбирать в консоли запросов (внешней обработке): туда копируют текст и выполняют по кусочкам, глядя на промежуточный результат каждой временной таблицы.
Для оптимизации собственного чтения помогают простые приёмы:
- переименуйте мысленно непонятную переменную в понятную — и дальше читайте так;
- рисуйте схему вызовов на бумаге для цепочки из 4–5 процедур, память разгружается;
- не держите в голове весь модуль — держите только текущую ветку;
- используйте закладки редактора, чтобы прыгать между связанными местами.
Антипаттерны, по которым видно слабый код
Читая чужой код, полезно замечать типичные огрехи — они подсказывают, где искать ошибки и чего коду не хватает.
- 🐌 Запрос внутри цикла. Классическая причина тормозов: на каждой строке — новый поход в базу. Признак —
Новый ЗапросилиНайти…внутриДля … Цикл. - 🔇 Пустой блок
Исключение. Ошибки подавляются без следа. Код «работает», но тихо теряет данные. - 🔢 Магические числа и строки.
Если Статус = 3 Тогда— что за 3? Хороший код использует перечисления и понятные имена. - 📜 Процедуры по 200+ строк. Делают сразу всё: такую логику трудно читать и ещё труднее менять.
- 🌀 Копипаста. Один и тот же фрагмент в пяти местах — исправлять придётся во всех пяти.
- 💬 Нет ни одного комментария в нетривиальном расчёте — приходится реконструировать замысел автора с нуля.
Эти признаки не всегда означают ошибку, но указывают, где она вероятнее. Начинайте проверку именно с таких мест.
Частые вопросы о чтении кода в 1С
Нужно ли знать английский, чтобы читать код 1С?
Если, Цикл, Функция. Английские аналоги (If, For) тоже поддерживаются, но в типовых конфигурациях код пишут по-русски.Чем модуль формы отличается от модуля объекта?
Как понять, где выполняется код — на клиенте или на сервере?
&НаКлиенте или &НаСервере. Если директивы нет, смотрите контекст модуля. Обращения к базе данных и запросы всегда серверные.