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

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

Что означают выражения и конструкции в коде 1С

Разбираем, что означают основные конструкции в коде 1С: переменные, запросы, методы, символы и типовые выражения. Практические примеры и частые ошибки новичков.

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

Хорошая новость в том, что язык 1С относительно прост: он русскоязычный, большинство ключевых слов читаются как обычные слова, а логика конструкций повторяется от модуля к модулю. Разобравшись с десятком типовых выражений, вы сможете понимать большую часть кода типовых конфигураций — «Бухгалтерии», «Управления торговлей», «Зарплаты и управления персоналом».

В этом материале разобраны конструкции, которые чаще всего вызывают вопросы: объявление переменных, условия, циклы, обращение к реквизитам объектов, тексты запросов, служебные символы и типовые методы. Для каждой конструкции приведён пример и объяснение, что именно она делает.

Как устроен код 1С и где он хранится

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

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

Язык 1С регистронезависим: «ЕСЛИ», «Если» и «если» — одно и то же слово. Точка с запятой завершает оператор, а комментарии начинаются с двух косых черт //. Эти мелочи помогают ориентироваться в тексте модуля.

Переменные, процедуры и функции: базовые слова языка

Слово Перем объявляет переменную — именованную область для хранения значения. Строка Перем СуммаДокумента; означает, что дальше в коде будет использоваться переменная с таким именем. Тип переменной не указывается заранее: 1С определяет его в момент присваивания значения.

Конструкции Процедура и Функция объявляют именованные блоки кода. Разница между ними одна: функция возвращает значение через оператор Возврат, а процедура просто выполняет действия. Например, функция ПолучитьКурсВалюты() вернёт число, которое можно присвоить переменной, а процедура ЗаписатьДокумент() просто выполнит запись.

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

Перем ИтоговаяСумма; // объявление переменной

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

Если Сумма > 100000 Тогда

Возврат Сумма * 0.05;

Иначе

Возврат 0;

КонецЕсли;

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

Что означают «ЭтотОбъект», «ЭтаФорма» и обращения через точку

Конструкция ЭтотОбъект встречается в модулях объектов и означает текущий экземпляр: тот самый документ или элемент справочника, с которым идёт работа. Выражение ЭтотОбъект.Номер читается как «номер текущего документа». В модулях форм аналогичную роль играет ЭтаФорма и Объект — последний даёт доступ к данным редактируемого объекта.

Точка в коде 1С — оператор доступа к свойству или методу. Цепочка Документ.Товары.Итог("Сумма") означает: взять табличную часть «Товары» документа и посчитать итог по колонке «Сумма». Чем длиннее цепочка, тем глубже обращение в структуру данных.

Отдельно стоит понимать разницу между ссылкой и объектом. Документы.РеализацияТоваровУслуг.НайтиПоНомеру(Номер) вернёт ссылку — лёгкий указатель на запись в базе. Чтобы изменить данные, нужен объект: ДокОбъект = Ссылка.ПолучитьОбъект(). Попытка изменить реквизит через ссылку — одна из самых частых ошибок новичков.

Условия, циклы и логические выражения

Условие строится по шаблону Если … Тогда … Иначе … КонецЕсли;. Внутри могут быть сравнения (=, <>, >), логические операции И, ИЛИ, НЕ и проверки через функции вроде ЗначениеЗаполнено(Переменная). Последняя означает «переменная не пустая»: не содержит пустую ссылку, пустую строку или ноль.

Цикл Для Каждого СтрокаТовара Из Товары Цикл … КонецЦикла; перебирает коллекцию — например, строки табличной части. Цикл Пока Условие Цикл выполняется, пока условие истинно. Ключевые слова Прервать и Продолжить означают «выйти из цикла» и «перейти к следующей итерации» соответственно.

Тернарный оператор в 1С выглядит как функция: ?(Условие, ЗначениеЕслиИстина, ЗначениеЕслиЛожь). Выражение Ставка = ?(Сумма > 100000, 20, 10); означает: если сумма больше ста тысяч, ставка равна 20, иначе 10. Новички часто принимают знак вопроса за опечатку — это полноценная конструкция языка.

Символы в тексте запросов: |, &, @ и другие

Тексты запросов в 1С пишутся внутри строковых литералов, и здесь начинается больше всего вопросов. Вертикальная черта | в начале строки означает продолжение многострочного текста запроса — она просто склеивает строки в одну, чтобы запрос было удобно читать в коде.

Амперсанд & обозначает параметр запроса: ГДЕ Контрагент = &Контрагент значит, что вместо &Контрагент подставится значение, переданное через Запрос.УстановитьПараметр("Контрагент", Значение). Забыть установить параметр — типичная ошибка, приводящая к ошибке выполнения запроса.

Слово ВЫБРАТЬ начинает запрос, ИЗ указывает источник данных (таблицу), ГДЕ задаёт отбор, СГРУППИРОВАТЬ ПО группирует строки, а УПОРЯДОЧИТЬ ПО сортирует результат. Конструкция РАЗЛИЧНЫЕ убирает дубли строк, а ПЕРВЫЕ 10 ограничивает выборку десятью записями.

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

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

"ВЫБРАТЬ

| Продажи.Контрагент КАК Контрагент,

| СУММА(Продажи.Сумма) КАК Сумма

|ИЗ

| РегистрНакопления.Продажи КАК Продажи

|ГДЕ

| Продажи.Период МЕЖДУ &НачалоПериода И &КонецПериода

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

| Продажи.Контрагент";

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

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

Результат = Запрос.Выполнить().Выгрузить();

Директивы компиляции и обработчики событий

Строки вида &НаСервере, &НаКлиенте, &НаСервереБезКонтекста — это директивы, которые указывают, где будет выполняться процедура: на сервере или на клиенте (в интерфейсе пользователя). Они ставятся перед объявлением процедуры в модуле формы. Путаница с контекстом — частая причина ошибок «Процедура или функция с указанным именем не определена».

Обработчики событий — процедуры с зарезервированными именами, которые платформа вызывает автоматически: ПриЗаписи, ПередЗаписью, ОбработкаПроведения, ПриОткрытии. Увидев такую процедуру, знайте: её никто не вызывает напрямую, её запускает сама платформа при наступлении события.

Параметр Отказ в обработчиках означает флаг отмены действия. Строка Отказ = Истина; внутри ПередЗаписью прервёт запись объекта. Если документ «не проводится» без видимой причины — почти всегда стоит искать, где в коде устанавливается Отказ = Истина.

Типичные ошибки при чтении и изменении кода
01
Правка типового модуля напрямую — изменения слетят при обновлении конфигурации; используйте расширения
02
Изменение данных через ссылку вместо объекта — платформа выдаст ошибку, данные не сохранятся
03
Пропуск УстановитьПараметр для параметра запроса — запрос падает с ошибкой при выполнении
04
Установка Отказ = Истина без сообщения пользователю — документ молча не записывается, причину найти трудно
05
Использование ПолучитьОбъект() в массовом цикле — резкое замедление и блокировки

Как самостоятельно разобрать незнакомый фрагмент кода

Главный инструмент — синтакс-помощник в конфигураторе: меню «Справка» → «Синтакс-помощник» или клавиша F1 на выделенном слове. Там описано назначение каждого метода, параметры и примеры. Это официальная документация, встроенная прямо в платформу.

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

Третий приём — контекстный поиск по конфигурации: правый кнопка на имени процедуры → «Найти использование». Так вы увидите, откуда вызывается процедура и какие значения ей передают. Для типовых конфигураций это зачастую быстрее, чем чтение всего модуля целиком.

Как разобрать непонятный фрагмент кода
  1. 1
    Выделите незнакомое слово и нажмите F1 — откроется синтакс-помощник с описанием
  2. 2
    Найдите все места вызова через «Найти использование»
  3. 3
    Поставьте точку останова и запустите отладку
  4. 4
    Посмотрите значения переменных через «Вычислить выражение»
  5. 5
    Пройдите фрагмент по шагам и зафиксируйте, что меняется в данных

FAQ: частые вопросы о конструкциях кода 1С

Что означает «Новый» перед именем, например Новый Запрос?

Ключевое слово «Новый» создаёт экземпляр объекта встроенного типа. «Новый Запрос» создаёт объект запроса, «Новый Массив» — пустой массив, «Новый Структура» — структуру для хранения пар «ключ-значение». Без этого слова объект не существует, и обращение к нему вызовет ошибку.

Что означает «Возврат» в середине функции?

Оператор «Возврат» немедленно завершает выполнение процедуры или функции. В функции после него указывается возвращаемое значение: «Возврат Результат;». В процедуре «Возврат;» без значения просто досрочно выходит из неё — так часто обрывают выполнение при невыполненном условии.

Что означает «Неопределено» и чем оно отличается от NULL?

«Неопределено» — значение переменной, которой ничего не присвоено, или признак отсутствия результата (например, метод поиска ничего не нашёл). NULL встречается в запросах и означает отсутствие значения в поле базы данных. Это разные сущности: «Неопределено» живёт в коде, NULL — в данных, и сравнивать их между собой нельзя.

Что означают квадратные скобки в коде, например СтрокаТовары["Сумма"]?

Квадратные скобки обращаются к элементу коллекции по имени или индексу. Для строки таблицы значений «СтрокаТовары["Сумма"]» равнозначно «СтрокаТовары.Сумма». Скобки незаменимы, когда имя колонки хранится в переменной: «СтрокаТовары[ИмяКолонки]».

Что означает «Попытка … Исключение … КонецПопытки»?

Это обработка ошибок: код внутри «Попытка» выполняется, а если возникает ошибка, управление переходит в блок «Исключение», где доступно описание ошибки через «ОписаниеОшибки()». Конструкция не даёт программе аварийно завершиться, но злоупотреблять ею не стоит — «проглоченная» ошибка скрывает реальную проблему.

Что означает «ЗначениеЗаполнено» и когда её проверять?

Это функция платформы, которая возвращает Истина, если значение не пустое: не пустая строка, не пустая ссылка, не ноль, не Неопределено. Ей проверяют реквизиты перед использованием, чтобы не работать с пустыми данными. Обратная проверка — «НЕ ЗначениеЗаполнено(Поле)» — означает «поле не заполнено».

Итог

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

Код 1С читается почти как обычный текст: «Перем» объявляет переменную, «Если…Тогда» задаёт условие, «ЭтотОбъект» ссылается на текущий объект, «|» склеивает строки запроса, а «&» обозначает параметр. Для разбора незнакомых конструкций используйте синтакс-помощник (F1) и отладчик, а правки делайте только на копии базы или через расширение.