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

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

1С: куда писать код — полный разбор мест разработки

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

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

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

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

Где физически пишется код: конфигуратор и редактор модулей

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

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

Редактор модулей поддерживает подсветку синтаксиса, контекстную подсказку (Ctrl+Пробел), переход к определению процедуры (F12) и синтаксическую проверку. Код сохраняется только после обновления конфигурации базы данных (клавиша F7) — до этого момента изменения существуют лишь в памяти конфигуратора и в режиме предприятия не видны.

Модуль объекта и модуль менеджера: логика данных

Модуль объекта — основное место для кода, который описывает поведение прикладного объекта: документа, справочника, плана счетов. Здесь размещают обработчики событий ПриЗаписи, ОбработкаПроведения, ПередЗаписью, ПриКопировании и другие. Код модуля объекта исполняется на сервере и имеет прямой доступ к реквизитам объекта через контекст — можно писать ЭтотОбъект.Сумма или просто имя реквизита.

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

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

Как открыть модуль объекта

В дереве конфигурации найдите нужный объект (например, «Документы» → «РеализацияТоваровУслуг»), щёлкните правой кнопкой и выберите «Открыть модуль объекта». Если пунктов несколько, убедитесь, что не перепутали модуль объекта с модулем формы или модулем менеджера — это частая причина «неработающего» кода.

Модуль формы: интерфейсная логика

Модуль формы содержит код, связанный с отображением: обработчики нажатий кнопок, изменения полей, события ПриОткрытии, ПриСозданииНаСервере, команды формы. Открывается он из редактора формы: правый клик по объекту → «Формы» → открыть нужную форму → вкладка «Модуль» внизу окна.

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

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

1c
&НаКлиенте
Процедура КнопкаРассчитать(Команда)
    Сумма = РассчитатьСуммуНаСервере(Объект.Ссылка);
    ПоказатьОповещениеПользователя("Сумма: " + Сумма);
КонецПроцедуры

&НаСервереБезКонтекста
Функция РассчитатьСуммуНаСервере(Ссылка)
    Запрос = Новый Запрос("ВЫБРАТЬ СУММА(Т.Сумма) КАК Итог ИЗ Документ.Заказ.Товары КАК Т ГДЕ Т.Ссылка = &Ссылка");
    Запрос.УстановитьПараметр("Ссылка", Ссылка);
    Выборка = Запрос.Выполнить().Выбрать();
    Возврат ?(Выборка.Следующий(), Выборка.Итог, 0);
КонецФункции

Общие модули: переиспользуемый код

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

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

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

Модуль приложения, сеанса и внешнего соединения

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

Модуль сеанса содержит единственный обязательный обработчик — УстановкаПараметровСеанса. Он выполняется при каждом старте сеанса, поэтому тяжёлый код здесь напрямую замедляет вход всех пользователей. Правильный подход — инициализировать параметры лениво, только те, что реально запрошены.

Модуль внешнего соединения используется редко: он работает, когда к базе подключаются через COM-соединение извне. Если вы не строите интеграцию через COM, этот модуль можно не трогать.

Внешние обработки и расширения: код без изменения конфигурации

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

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

Сравнение вариантов размещения кода

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

Полная свобода доработки, но усложняет обновление типовых решений; подходит для собственных конфигураций

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

Сохраняет поддержку и простое обновление; ограничения — нельзя менять некоторые объекты, роли и схемы данных

Внешняя обработка

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

Порядок действий: от задачи до работающего кода

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

Порядок действий
  1. 1
    Сделайте резервную копию базы (выгрузку .dt) перед любыми доработками
  2. 2
    Определите тип логики: данные — модуль объекта, интерфейс — модуль формы, общая функция — общий модуль
  3. 3
    Проверьте, на поддержке ли конфигурация; если да — используйте расширение
  4. 4
    Откройте нужный модуль и напишите код с учётом контекста (клиент/сервер)
  5. 5
    Выполните синтаксическую проверку модуля (Ctrl+F7 или кнопка на панели)
  6. 6
    Обновите конфигурацию базы данных клавишей F7
  7. 7
    Протестируйте в режиме предприятия на копии документа, а не на боевых данных
Контрольные точки

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

Синтаксическая проверка модуля
Норма

Ошибок нет, предупреждения осмысленны

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

Сообщения о необъявленных переменных или недоступных методах — код не выполнится

Запуск в режиме предприятия
Норма

Обработчик срабатывает, результат соответствует ожиданию

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

Код молча не выполняется — вероятно, он написан не в том модуле или директива компиляции не та

Обновление конфигурации БД
Норма

F7 проходит без ошибок, изменения видны пользователям

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

Ошибка реструктуризации — откатитесь на копию и разберитесь с изменением данных

Типичные ошибки новичков

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

Типичные ошибки
01
Код написан в модуле формы, а ожидался в модуле объекта: обработчик ОбработкаПроведения в форме никогда не вызовется платформой
02
Вызов серверной процедуры с клиента без директивы &НаСервере или без флага «Вызов сервера» у общего модуля — ошибка компиляции или недоступности
03
Забыто обновление конфигурации БД (F7): в предприятии работает старый код, и кажется, что изменения не сохранились
04
Тяжёлые запросы в УстановкаПараметровСеанса: вход в систему замедляется для всех пользователей
05
Доработка типовой конфигурации напрямую вместо расширения: при очередном обновлении изменения теряются или блокируют обновление
Маршрут решения

Как выбрать место для кода

Логика относится к записи, проведению или проверке конкретного документа/справочникаПишите в модуль объекта, в соответствующий обработчик события
Нужно отреагировать на действие пользователя в формеПишите в модуль формы, клиентская часть вызывает серверную процедуру
Функция нужна в нескольких объектахСоздайте общий модуль с флагом «Сервер» и «Вызов сервера», процедуры пометьте Экспорт
Конфигурация типовая и обновляется поставщикомИспользуйте расширение конфигурации с аннотациями &Перед, &После, &Вместо
Нужна разовая операция или дополнительная печатная форма без доработкиСоздайте внешнюю обработку .epf
Итог

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

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

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

Можно ли писать код 1С в стороннем редакторе, например VS Code?

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

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

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

Чем расширение лучше прямого изменения конфигурации?

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

Где писать код для печатной формы документа?

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

Что делает директива &НаСервереБезКонтекста и когда её применять?

Эта директива означает, что процедура выполняется на сервере и не имеет доступа к данным формы (реквизитам формы, объекту формы). Её применяют для функций, которым достаточно переданных параметров — например, запрос к базе по ссылке. Такие процедуры работают быстрее, потому что не требуют сериализации всей формы при серверном вызове.

Можно ли отладить код без остановки работы пользователей?

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