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

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

Как писать на 1С: с чего начать и как устроен язык платформы

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

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

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

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

Что нужно освоить перед написанием кода

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

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

Где размещается код: виды модулей

Код в 1С не существует «сам по себе» — он всегда привязан к модулю. От выбора модуля зависит, где код выполняется (на клиенте или сервере) и какие данные ему доступны.

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

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

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

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

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

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

Скидка = 10;

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

Скидка = 5;

Иначе

Скидка = 0;

КонецЕсли;

ИтоговаяСумма = СуммаЗаказа * (100 - Скидка) / 100;

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

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

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

Работа с данными: запросы и объектная модель

Есть два способа получить данные в 1С, и выбор между ними — первое, что должен освоить разработчик. Объектная модель (Справочники.Номенклатура.НайтиПоКоду(...), Документы.Реализация.СоздатьДокумент()) подходит для создания и изменения объектов. Язык запросов — для чтения и выборки больших объёмов данных.

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

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

"ВЫБРАТЬ

| Реализация.Ссылка,

| Реализация.СуммаДокумента

|ИЗ

| Документ.РеализацияТоваровУслуг КАК Реализация

|ГДЕ

| Реализация.Дата МЕЖДУ &НачалоПериода И &КонецПериода";

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

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

Выборка = Запрос.Выполнить().Выбрать();

Пока Выборка.Следующий() Цикл

// обработка строки выборки

КонецЦикла;

Критичное правило производительности: никогда не выполняйте запрос внутри цикла. Если нужны данные по списку объектов — передайте список параметром и обработайте одним запросом. Запрос в цикле — главная причина «тормозов» самописных доработок.

Конструктор запроса (правый клик в модуле → «Конструктор запроса») собирает текст запроса визуально и сам расставляет соединения таблиц. Используйте его, пока не выучите синтаксис, а затем разбирайте сгенерированный текст — это быстрый способ освоить язык запросов.
ПЗ
Практическое замечание

Обработчики событий: куда подписывать код

Большинство прикладных доработок — это реакция на событие. У документа ключевые события: ОбработкаПроведения (формирование движений по регистрам), ОбработкаЗаполнения, ПередЗаписью. У формы: ПриОткрытии, ПриИзменении поля, команды формы.

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

Маршрут решения

Как выбрать способ доработки

Нужно добавить действие при записи или проведении типового документаСоздайте подписку на событие или расширение — типовой код останется нетронутым
Нужна новая печатная форма или отчётСделайте внешнюю обработку или отчёт — вообще без изменения конфигурации
Доработка глубоко меняет логику типового объектаИспользуйте расширение с аннотацией &Вместо, изменение типового модуля — крайний вариант

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

Отладчик встроен в конфигуратор: откройте нужную базу в режиме отладки (Отладка → Начать отладку), поставьте точку останова клавишей F9 на строке кода и выполните действие в предприятии. Исполнение остановится, и вы сможете посмотреть значения переменных, вычислить произвольные выражения и пройти код по шагам.

Для диагностики в боевой базе, где отладчик недоступен, используются сообщения (Сообщить() — только на этапе разработки) и журнал регистрации через ЗаписьЖурналаРегистрации(). Ошибки, перехваченные конструкцией Попытка ... Исключение ... КонецПопытки, всегда должны логироваться, иначе проблема останется незамеченной.

Контрольные точки

Как проверить результат

Компиляция модуля
Норма

Конфигуратор не выдаёт ошибок при сохранении и проверке модуля (Ctrl+F7)

Тревожный признак

Сообщения о синтаксических ошибках или неопределённых переменных

Проведение документа
Норма

Документ проводится, движения по регистрам соответствуют ожидаемым суммам

Тревожный признак

Движения дублируются, отсутствуют или суммы не сходятся

Производительность
Норма

Операция над типовым объёмом данных выполняется без заметной паузы

Тревожный признак

Формирование отчёта или проведение занимает десятки секунд — ищите запросы в цикле

Типичные ошибки начинающих

Большинство проблем у новичков повторяются и легко устраняются, если знать о них заранее. Разберите этот список до первой самостоятельной доработки.

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

Порядок освоения: учебный маршрут

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

Порядок действий
  1. 1
    Установите платформу и разверните учебную демонстрационную базу
  2. 2
    Напишите простую внешнюю обработку с одной кнопкой и выводом сообщения
  3. 3
    Сделайте отчёт на СКД с запросом, собранным конструктором
  4. 4
    Добавьте расширением обработчик события к типовому документу
  5. 5
    Освойте отладчик: точки останова, просмотр переменных, пошаговое исполнение
  6. 6
    Изучите обработку проведения и движения по регистрам на учебном примере

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

Итог

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

Код в 1С размещается в модулях и привязывается к событиям. Данные читают запросами, изменяют через объектную модель. Типовую конфигурацию дорабатывают расширениями и подписками, а не прямым изменением. Все эксперименты — только на копии базы, результат проверяется отладчиком.

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

Нужно ли знать другие языки программирования, чтобы писать на 1С?

Нет, встроенный язык 1С самодостаточен и часто осваивается как первый язык. Знание основ логики (условия, циклы, переменные) помогает, но приобретается прямо в процессе. Опыт SQL полезен для языка запросов, поскольку синтаксис выборок во многом похож.

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

Да, встроенный язык имеет англоязычный синтаксис (If, For, Procedure и т.д.), и оба варианта можно смешивать. Однако типовые конфигурации и большинство документации используют русский синтаксис, поэтому для работы с чужим кодом русский вариант знать необходимо.

Чем расширение отличается от внешней обработки?

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

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

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

Как понять, почему документ не проводится после моей доработки?

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