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

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

Как писать программный код в 1С

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

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

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

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

Где писать код: конфигуратор и структура модулей

Вся разработка ведётся в конфигураторе — отдельном режиме запуска платформы 1С. Чтобы открыть его, при старте базы выберите «Конфигуратор» вместо «1С:Предприятие». Дерево конфигурации в левой части окна показывает все объекты: справочники, документы, регистры, отчёты, обработки.

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

Чтобы открыть модуль, щёлкните правой кнопкой по объекту и выберите нужный пункт: «Открыть модуль объекта», «Открыть модуль формы» и так далее. Для формы сначала откройте саму форму, затем перейдите на вкладку «Модуль» внизу окна.

Базовый синтаксис встроенного языка

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

Основные конструкции: условие «Если ... Тогда ... ИначеЕсли ... Иначе ... КонецЕсли», циклы «Для ... По ... Цикл», «Для Каждого ... Из ... Цикл» и «Пока ... Цикл». Строки заключаются в двойные кавычки, перенос строки внутри литерала делается через вертикальную черту.

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

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

Возврат 0.1;

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

Возврат 0.05;

Иначе

Возврат 0;

КонецЕсли;

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

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

Обработчики событий: точки входа для вашего кода

Чаще всего код пишется не с нуля, а внутри предопределённых обработчиков событий. У формы это «ПриСозданииНаСервере», «ПриОткрытии», «ПередЗаписью»; у документа — «ОбработкаПроведения», «ПередЗаписью», «ПриЗаписи». Платформа сама вызывает эти процедуры в нужный момент.

Чтобы добавить обработчик, откройте палитру свойств объекта или формы, найдите раздел «События» и нажмите кнопку с лупой рядом с нужным событием — конфигуратор создаст заготовку процедуры в модуле. Удалять обработчик нужно не просто стиранием кода, а очисткой привязки в палитре свойств, иначе останутся ошибки.

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

Порядок действий: первый обработчик
  1. 1
    Откройте конфигуратор и найдите нужный документ в дереве конфигурации
  2. 2
    Откройте модуль объекта и добавьте процедуру ОбработкаПроведения с параметрами Отказ и Режим
  3. 3
    Напишите логику: проверку заполнения реквизитов и формирование движений по регистрам
  4. 4
    Сохраните конфигурацию (F7) и обновите конфигурацию базы данных
  5. 5
    Проведите тестовый документ в режиме предприятия и проверьте результат

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

Запросы — центральный инструмент чтения данных в 1С. Язык запросов похож на SQL, но оперирует объектами конфигурации: «ВЫБРАТЬ Номенклатура.Наименование ИЗ Справочник.Номенклатура КАК Номенклатура ГДЕ ...». Текст запроса удобно собирать конструктором запроса (правый клик в модуле → «Конструктор запроса»).

Результат запроса выгружается в таблицу значений методом Выгрузить() или обходится выборкой через Выбрать(). Для отчётов и больших выборок всегда используйте запросы: перебор справочника циклом с обращением к базе на каждой итерации в разы медленнее и нагружает сервер.

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

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

"ВЫБРАТЬ

| Продажи.Номенклатура КАК Номенклатура,

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

|ИЗ

| РегистрНакопления.Продажи.Обороты(&Начало, &Конец, , ) КАК Продажи

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

| Продажи.Номенклатура";

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

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

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

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

Отладка и поиск ошибок

Отладчик встроен в конфигуратор: меню «Отладка» → «Начать отладку» или клавиша F5. Точки останова ставятся кликом по левому полю редактора модуля. Когда выполнение доходит до точки, вы можете смотреть значения переменных, выполнять код по шагам (F10 — шаг через, F11 — шаг внутрь) и вычислять произвольные выражения через «Вычислить выражение» (Shift+F9).

Для отладки серверного кода на сервере 1С нужно, чтобы сервер был запущен в режиме отладки, а в конфигураторе включена настройка «Отладка по протоколу HTTP» или классическая. В файловой базе серверный код отлаживается без дополнительных настроек.

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

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

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

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

Конфигурация сохраняется без сообщений об ошибках в окне служебных сообщений

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

Ошибки вида «Процедура или функция не обнаружена» или «Переменная не определена»

Выполнение обработчика
Норма

Код доходит до точки останова в отладчике, переменные содержат ожидаемые значения

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

Точка останова не срабатывает — обработчик не привязан или вызывается другой контекст

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

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

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

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

Организация кода: общие модули и стандарты

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

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

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

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

Изменение типовой конфигурации: доработка или расширение

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

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

Ещё один безболезненный вариант — внешние обработки и отчёты (файлы .epf и .erf), которые подключаются через механизм дополнительных отчётов и обработок без изменения конфигурации вообще. Для разовых выгрузок, печатных форм и сервисных операций это предпочтительный путь.

Сравнение вариантов доработки

Внешняя обработка (.epf)

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

Расширение конфигурации

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

Прямое изменение конфигурации

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

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

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

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

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

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

Как добавить свою печатную форму к документу, не меняя конфигурацию?

Создайте внешнюю обработку с описанием по формату БСП (функция СведенияОВнешнейОбработке и команда печати), затем подключите её в режиме предприятия через «Администрирование» → «Печатные формы, отчёты и обработки» → «Дополнительные отчёты и обработки». Конфигурация при этом не изменяется.

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

Чаще всего причина в том, что процедура или функция в общем модуле объявлена без ключевого слова «Экспорт», либо у модуля не установлены нужные флаги контекста (например, «Сервер» для серверного вызова или «Вызов сервера» для обращения с клиента). Проверьте также, что модуль компилируется без ошибок.

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

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

Как понять, где выполняется мой код — на клиенте или на сервере?

Смотрите на директиву компиляции перед процедурой: &НаКлиенте, &НаСервере или &НаСервереБезКонтекста. В общих модулях контекст задаётся флагами в свойствах модуля. Если сомневаетесь, поставьте точку останова и проверьте в отладчике, какие методы доступны — на клиенте, например, недоступен объект «Запрос».

Итог

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

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