Разработка и Конфигурация · 12 мин
Как писать программный код в 1С
Как писать программный код в 1С: конфигуратор, структура модулей, запросы, обработка ошибок и типичные ошибки начинающих разработчиков.
Программирование в 1С начинается с понимания того, что код на встроенном языке пишется не «в вакууме», а внутри конкретных модулей конфигурации: модулей форм, объектов, общих модулей и модулей менеджеров. Каждый модуль имеет своё назначение и контекст исполнения — клиент или сервер, — и от этого зависит, какие объекты и методы вам доступны.
Встроенный язык 1С по синтаксису напоминает упрощённый процедурный язык: есть процедуры, функции, переменные, циклы и условия, при этом весь код пишется на русском языке (допускается и английский синтаксис). Компиляция происходит при сохранении конфигурации, поэтому синтаксические ошибки выявляются быстро, а вот логические — только при тестировании.
Главная ошибка новичков — пытаться писать код «как в других языках», игнорируя типовые механизмы платформы. В 1С уже реализованы подсистемы проведения документов, обмена данными, прав доступа и формирования отчётов. Хороший код опирается на эти механизмы, а не дублирует их вручную.
Где писать код: конфигуратор и структура модулей
Вся разработка ведётся в конфигураторе — отдельном режиме запуска платформы 1С. Чтобы открыть его, при старте базы выберите «Конфигуратор» вместо «1С:Предприятие». Дерево конфигурации в левой части окна показывает все объекты: справочники, документы, регистры, отчёты, обработки.
Код привязан к конкретному месту в дереве. У документа есть модуль объекта (логика проведения, заполнения), модуль менеджера (печать, создание на основании) и модули форм (поведение интерфейса). Общие модули находятся в ветке «Общие» и содержат переиспользуемые процедуры и функции.
Чтобы открыть модуль, щёлкните правой кнопкой по объекту и выберите нужный пункт: «Открыть модуль объекта», «Открыть модуль формы» и так далее. Для формы сначала откройте саму форму, затем перейдите на вкладку «Модуль» внизу окна.
Базовый синтаксис встроенного языка
Код организуется в процедуры и функции. Процедура не возвращает значение, функция — возвращает через оператор «Возврат». Переменные объявлять заранее не обязательно, они создаются при первом присваивании, но в экспортных процедурах общих модулей лучше явно указывать типы в комментариях для читаемости.
Основные конструкции: условие «Если ... Тогда ... ИначеЕсли ... Иначе ... КонецЕсли», циклы «Для ... По ... Цикл», «Для Каждого ... Из ... Цикл» и «Пока ... Цикл». Строки заключаются в двойные кавычки, перенос строки внутри литерала делается через вертикальную черту.
Функция РассчитатьСкидку(СуммаПокупки) Экспорт
Если СуммаПокупки >= 100000 Тогда
Возврат 0.1;
ИначеЕсли СуммаПокупки >= 50000 Тогда
Возврат 0.05;
Иначе
Возврат 0;
КонецЕсли;
КонецФункции
Обращение к реквизитам объектов выполняется через точку: ДокументОбъект.Контрагент. Для чтения данных из базы напрямую используются методы вроде Справочники.Номенклатура.НайтиПоКоду("000001"), но массовую выборку всегда делайте запросом, а не перебором.
Обработчики событий: точки входа для вашего кода
Чаще всего код пишется не с нуля, а внутри предопределённых обработчиков событий. У формы это «ПриСозданииНаСервере», «ПриОткрытии», «ПередЗаписью»; у документа — «ОбработкаПроведения», «ПередЗаписью», «ПриЗаписи». Платформа сама вызывает эти процедуры в нужный момент.
Чтобы добавить обработчик, откройте палитру свойств объекта или формы, найдите раздел «События» и нажмите кнопку с лупой рядом с нужным событием — конфигуратор создаст заготовку процедуры в модуле. Удалять обработчик нужно не просто стиранием кода, а очисткой привязки в палитре свойств, иначе останутся ошибки.
В обработчиках формы обязательно обращайте внимание на директивы компиляции: &НаКлиенте, &НаСервере, &НаСервереБезКонтекста. Клиентский код не имеет доступа к запросам и объектам базы напрямую — за данными нужно обращаться на сервер через отдельную серверную процедуру.
- 1Откройте конфигуратор и найдите нужный документ в дереве конфигурации
- 2Откройте модуль объекта и добавьте процедуру ОбработкаПроведения с параметрами Отказ и Режим
- 3Напишите логику: проверку заполнения реквизитов и формирование движений по регистрам
- 4Сохраните конфигурацию (F7) и обновите конфигурацию базы данных
- 5Проведите тестовый документ в режиме предприятия и проверьте результат
Работа с данными: запросы вместо перебора
Запросы — центральный инструмент чтения данных в 1С. Язык запросов похож на SQL, но оперирует объектами конфигурации: «ВЫБРАТЬ Номенклатура.Наименование ИЗ Справочник.Номенклатура КАК Номенклатура ГДЕ ...». Текст запроса удобно собирать конструктором запроса (правый клик в модуле → «Конструктор запроса»).
Результат запроса выгружается в таблицу значений методом Выгрузить() или обходится выборкой через Выбрать(). Для отчётов и больших выборок всегда используйте запросы: перебор справочника циклом с обращением к базе на каждой итерации в разы медленнее и нагружает сервер.
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| Продажи.Номенклатура КАК Номенклатура,
| СУММА(Продажи.СуммаОборот) КАК Сумма
|ИЗ
| РегистрНакопления.Продажи.Обороты(&Начало, &Конец, , ) КАК Продажи
|СГРУППИРОВАТЬ ПО
| Продажи.Номенклатура";
Запрос.УстановитьПараметр("Начало", НачалоМесяца(ТекущаяДатаСеанса()));
Запрос.УстановитьПараметр("Конец", КонецМесяца(ТекущаяДатаСеанса()));
Результат = Запрос.Выполнить().Выгрузить();
Для виртуальных таблиц регистров не забывайте передавать параметры периода и отборы — без них платформа построит выборку по всем данным, что критично для производительности на больших базах.
Отладка и поиск ошибок
Отладчик встроен в конфигуратор: меню «Отладка» → «Начать отладку» или клавиша F5. Точки останова ставятся кликом по левому полю редактора модуля. Когда выполнение доходит до точки, вы можете смотреть значения переменных, выполнять код по шагам (F10 — шаг через, F11 — шаг внутрь) и вычислять произвольные выражения через «Вычислить выражение» (Shift+F9).
Для отладки серверного кода на сервере 1С нужно, чтобы сервер был запущен в режиме отладки, а в конфигураторе включена настройка «Отладка по протоколу HTTP» или классическая. В файловой базе серверный код отлаживается без дополнительных настроек.
Для быстрой диагностики в пользовательском режиме используйте Сообщить() для вывода промежуточных значений и «Журнал регистрации» для фиксации ошибок в фоновых заданиях. Ошибки перехватывайте конструкцией «Попытка ... Исключение ... КонецПопытки», записывая подробности через ОписаниеОшибки() или ПодробноеПредставлениеОшибки.
Как проверить результат
Конфигурация сохраняется без сообщений об ошибках в окне служебных сообщений
Ошибки вида «Процедура или функция не обнаружена» или «Переменная не определена»
Код доходит до точки останова в отладчике, переменные содержат ожидаемые значения
Точка останова не срабатывает — обработчик не привязан или вызывается другой контекст
Документ проводится, движения по регистрам соответствуют ожиданиям
Документ не проводится, появляются сообщения об отказе или пустые движения
Организация кода: общие модули и стандарты
Повторяющуюся логику выносите в общие модули. Для функций, работающих с базой, создавайте модули с флагом «Сервер», для клиентских вспомогательных процедур — «Клиент (управляемое приложение)». Флаг «Вызов сервера» у клиентских модулей включайте только при необходимости: он открывает доступ к модулю с клиента и влияет на безопасность.
Придерживайтесь единых правил именования: процедуры и функции — глаголами («ЗаполнитьДвижения», «ПолучитьОстаток»), переменные — существительными. Ключевые слова пишите с заглавной буквы, отступы — табуляцией. Эти правила закреплены в стандартах разработки фирмы «1С» и используются во всех типовых конфигурациях.
Избегайте длинных процедур на сотни строк: разбивайте логику на функции с одной задачей. Это упрощает отладку и позволяет переиспользовать код. Экспортными делайте только те процедуры и функции, которые реально вызываются снаружи модуля.
Изменение типовой конфигурации: доработка или расширение
Если вы работаете с типовой конфигурацией (1С:Бухгалтерия, Управление торговлей и другие), прямое изменение типовых модулей — крайняя мера. Каждое изменение усложняет последующие обновления: при обновлении платформа сравнивает вашу версию с новой поставкой, и конфликты приходится разрешать вручную.
Альтернатива — расширения конфигурации. Расширение подключается к базе без снятия конфигурации с поддержки и позволяет добавлять свои объекты, переопределять обработчики форм и дополнять модули аннотациями «&Вместо», «&После», «&Перед». Для большинства прикладных доработок — дополнительная печатная форма, проверка при записи, новый отчёт — расширения достаточно.
Ещё один безболезненный вариант — внешние обработки и отчёты (файлы .epf и .erf), которые подключаются через механизм дополнительных отчётов и обработок без изменения конфигурации вообще. Для разовых выгрузок, печатных форм и сервисных операций это предпочтительный путь.
Сравнение вариантов доработки
Подходит для разовых операций, печатных форм и выгрузок. Не меняет конфигурацию, легко переносится. Ограничение: нет автоматического запуска по событиям
Подходит для доработки форм, добавления проверок и новых объектов в типовой базе. Сохраняет простоту обновления. Ограничение: не все объекты и сценарии можно изменить через расширение
Даёт полную свободу, включая изменение структуры данных типовых объектов. Ограничение: каждое обновление требует ручного сопоставления изменений
Частые вопросы
Нужно ли знать другие языки программирования, чтобы писать код в 1С?
Нет, встроенный язык 1С самодостаточен для прикладных задач. Знание основ программирования (переменные, циклы, условия, функции) на любом языке ускорит обучение, но не обязательно. Полезно базовое представление о SQL — оно помогает быстрее освоить язык запросов 1С.
Можно ли писать код 1С на английском языке?
Да, платформа поддерживает английский синтаксис встроенного языка (If, Then, Function и т.д.), и в одном модуле можно смешивать оба варианта. Однако типовые конфигурации и вся документация ведутся на русском синтаксисе, поэтому для совместной работы и поддержки стоит писать по-русски.
Как добавить свою печатную форму к документу, не меняя конфигурацию?
Создайте внешнюю обработку с описанием по формату БСП (функция СведенияОВнешнейОбработке и команда печати), затем подключите её в режиме предприятия через «Администрирование» → «Печатные формы, отчёты и обработки» → «Дополнительные отчёты и обработки». Конфигурация при этом не изменяется.
Почему код в общем модуле не виден из формы документа?
Чаще всего причина в том, что процедура или функция в общем модуле объявлена без ключевого слова «Экспорт», либо у модуля не установлены нужные флаги контекста (например, «Сервер» для серверного вызова или «Вызов сервера» для обращения с клиента). Проверьте также, что модуль компилируется без ошибок.
Что делать, если после моей доработки конфигурация перестала обновляться автоматически?
Это ожидаемое поведение при прямом изменении типовых объектов: обновление потребует ручного сравнения и объединения конфигураций. Выполняйте обновление через «Поддержка» → «Обновить конфигурацию» с пошаговым разрешением конфликтов, либо перенесите доработку в расширение и верните типовые объекты на поддержку.
Как понять, где выполняется мой код — на клиенте или на сервере?
Смотрите на директиву компиляции перед процедурой: &НаКлиенте, &НаСервере или &НаСервереБезКонтекста. В общих модулях контекст задаётся флагами в свойствах модуля. Если сомневаетесь, поставьте точку останова и проверьте в отладчике, какие методы доступны — на клиенте, например, недоступен объект «Запрос».
Что важно запомнить
Код в 1С пишется в модулях конфигуратора с учётом контекста клиент/сервер. Данные читайте запросами, логику выносите в общие модули, типовые конфигурации дорабатывайте через расширения и внешние обработки. Всегда тестируйте изменения на копии базы и проверяйте результат отладчиком.