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

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

Как пишется код 1С: синтаксис, структура и практические примеры

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

Код в 1С пишется на встроенном языке платформы, который часто называют «языком 1С» или «1С-скриптом». Он похож на процедурные языки программирования, но имеет важную особенность: операторы можно писать как на русском, так и на английском языке — например, Если ... Тогда ... КонецЕсли; и If ... Then ... EndIf; полностью эквивалентны. На практике в российских проектах чаще используют русский синтаксис.

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

Язык 1С нечувствителен к регистру, не требует объявления типов переменных (типизация динамическая), а каждый оператор завершается точкой с запятой. Это снижает порог входа, но не отменяет необходимости понимать структуру платформы: объекты метаданных, запросы, механизм транзакций и событийную модель форм.

Где именно пишется код: виды модулей

Модуль — это текстовый контейнер с кодом, привязанный к определённому объекту конфигурации. Основные виды: модуль приложения (выполняется при старте системы), общие модули (библиотеки переиспользуемых процедур), модули объектов (например, модуль документа с обработчиками проведения), модули менеджеров объектов и модули форм.

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

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

Базовый синтаксис: переменные, условия, циклы

Переменные объявляются неявно при первом присваивании или явно через ключевое слово Перем. Тип указывать не нужно: одна и та же переменная может сначала хранить число, а затем строку, хотя злоупотреблять этим не следует — код становится трудным для чтения и отладки.

Условия записываются конструкцией Если ... Тогда ... ИначеЕсли ... Иначе ... КонецЕсли;, циклы — через Для ... По ... Цикл ... КонецЦикла;, Для Каждого ... Из ... Цикл и Пока ... Цикл. Логические операторы: И, Или, Не. Сравнение выполняется знаком равенства: Если Сумма = 0 Тогда ....

Процедура РассчитатьСкидку(СуммаЗаказа) Экспорт

Перем ПроцентСкидки;

Если СуммаЗаказа >= 100000 Тогда

ПроцентСкидки = 10;

ИначеЕсли СуммаЗаказа >= 50000 Тогда

ПроцентСкидки = 5;

Иначе

ПроцентСкидки = 0;

КонецЕсли;

СуммаСоСкидкой = СуммаЗаказа * (100 - ПроцентСкидки) / 100;

КонецПроцедуры

Обратите внимание на точку с запятой после каждого оператора и после КонецЕсли; — её отсутствие является самой частой синтаксической ошибкой новичков. Комментарии пишутся через двойной слеш: // это комментарий.

Процедуры, функции и директивы компиляции

Процедура не возвращает значение, функция возвращает его через оператор Возврат. Параметры перечисляются в скобках через запятую; по умолчанию они передаются по ссылке, а ключевое слово Знач перед параметром означает передачу по значению (изменения внутри не затронут исходную переменную).

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

В модулях форм и команд перед заголовком метода указывают директиву компиляции: &НаКлиенте, &НаСервере, &НаСервереБезКонтекста, &НаКлиентеНаСервереБезКонтекста. Директива определяет, где будет скомпилирован и исполнен код. Работа с базой данных (запросы, запись объектов) возможна только на сервере.

&НаСервереБезКонтекста

Функция ПолучитьЦенуТовара(ТоварСсылка)

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

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

"ВЫБРАТЬ

| Цены.Цена

|ИЗ

| РегистрСведений.ЦеныТоваров.СрезПоследних(, Товар = &Товар) КАК Цены";

Запрос.УстановитьПараметр("Товар", ТоварСсылка);

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

Если Результат.Следующий() Тогда

Возврат Результат.Цена;

Иначе

Возврат 0;

КонецЕсли;

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

Работа с данными: запросы вместо прямых обходов

Главная особенность разработки в 1С — для выборки данных используется встроенный язык запросов, похожий на SQL, но работающий с объектами метаданных (справочниками, документами, регистрами), а не с физическими таблицами. Текст запроса передаётся строкой в объект Запрос, параметры задаются через УстановитьПараметр.

Результат запроса обрабатывается либо выборкой (Выбрать() с обходом через Следующий()), либо выгрузкой в таблицу значений (Выгрузить()). Для изменения данных используется объектная модель: получить объект методом ПолучитьОбъект(), изменить реквизиты и вызвать Записать().

Частая ошибка начинающих — обходить большие выборки в цикле и внутри цикла выполнять ещё один запрос. Это порождает проблему «запросов в цикле» и резко замедляет работу. Правильный подход — получить все нужные данные одним запросом с соединениями таблиц, а затем обрабатывать результат в памяти.

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

Обработчики событий: когда код выполняется сам

Значительная часть кода в 1С — это обработчики событий, которые платформа вызывает автоматически. В модуле формы это ПриСозданииНаСервере, ПриОткрытии, ПередЗаписью. В модуле документа — ОбработкаПроведения, ПередЗаписью, ПриЗаписи. Разработчик не вызывает эти процедуры вручную, а лишь описывает, что должно произойти в нужный момент.

Например, чтобы при проведении документа формировались движения по регистру, код размещают в ОбработкаПроведения: там заполняют коллекцию Движения и записывают её. Если нужно проверить корректность данных до сохранения, используют ПередЗаписью с параметром Отказ — установка Отказ = Истина прерывает операцию.

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

Как написать и проверить первую процедуру
  1. 1
    Откройте конфигуратор, создайте общий модуль с флагом «Сервер»
  2. 2
    Напишите процедуру или функцию, завершая каждый оператор точкой с запятой
  3. 3
    Выполните проверку модуля через меню «Конфигурация → Проверка конфигурации» или Ctrl+F7 в окне модуля
  4. 4
    Вызовите метод из формы или внешней обработки и проверьте результат в режиме предприятия
  5. 5
    При ошибке используйте отладчик: точка останова — F9, запуск отладки — F5

Отладка и проверка кода

Перед запуском код проверяют встроенной проверкой конфигурации: она находит синтаксические ошибки, несуществующие методы и проблемы директив компиляции. Проверка модуля доступна по Ctrl+F7 прямо в окне редактора кода.

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

Для вывода промежуточной информации без остановки используют Сообщить(...) — сообщение появится в окне сообщений пользователя. Это приемлемо на этапе разработки, но отладочные сообщения нужно удалять перед передачей кода в рабочую базу.

Стандарты оформления и читаемость кода

Код, который пишется в типовых конфигурациях, следует системе стандартов разработки: имена процедур начинаются с глагола (РассчитатьСуммуДокумента), переменные называются осмысленно без транслита, модули структурируются на области через #Область ИмяОбласти ... #КонецОбласти.

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

Соблюдение этих правил не влияет на работоспособность, но определяет, сможет ли другой разработчик (или вы сами через полгода) быстро понять и безопасно изменить код. В командной разработке несоблюдение стандартов — частая причина отклонения кода на ревью.

Итог

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

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

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

Можно ли писать код 1С на английском языке?

Да, язык поддерживает два встроенных варианта синтаксиса, и их можно даже смешивать в одном модуле. На практике в российских проектах используют русский вариант, поскольку типовые конфигурации написаны на нём, и смешение затрудняет чтение.

Нужно ли знать SQL, чтобы писать запросы в 1С?

Строго не обязательно: язык запросов 1С похож на SQL, но оперирует объектами конфигурации. Однако понимание соединений таблиц, группировок и условий из SQL заметно ускоряет освоение, так как логика построения запросов совпадает.

Чем процедура отличается от функции в 1С?

Функция возвращает значение через оператор Возврат и может использоваться в выражениях, например в правой части присваивания. Процедура ничего не возвращает и вызывается отдельным оператором. Если метод должен дать результат — это функция.

Почему код в модуле формы не видит запросы к базе?

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

Как проверить код без запуска всей программы?

Используйте синтаксическую проверку модуля (Ctrl+F7) — она найдёт ошибки компиляции. Для проверки логики без полноценного интерфейса можно создать внешнюю обработку или вызвать серверный метод из отладчика через окно вычисления выражений.

Где лучше размещать общую бизнес-логику?

В общих модулях с включённым флагом «Сервер» и, при необходимости, «Вызов сервера». Так логика доступна из форм, документов и других объектов, не дублируется и выполняется там, где есть доступ к данным. Помещать общий код в модуль конкретной формы — плохая практика.