Создание и подключение модулей в конфигурации 1С

· 9 мин

Содержание

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

Ниже — куда писать код под конкретную задачу: как завести общий модуль и выставить его флаги, где живёт логика документов и форм, какие директивы компиляции управляют местом выполнения, как сделать процедуру видимой через Экспорт и как отладить готовый код. Весь разбор — для платформы 8.3 с интерфейсом «Такси» и управляемыми формами.

Какие бывают модули и за что отвечает каждый

Модуль — это текст на встроенном языке 1С, привязанный к объекту конфигурации или к приложению в целом. Открывается он в Конфигураторе двойным кликом по строке Модуль... в палитре свойств объекта либо из контекстного меню.

Основные типы модулей и их назначение:

  • 🧩 Общие модули — процедуры и функции, которые вызываются из разных мест конфигурации. Лежат в ветке Общие → Общие модули.
  • 📄 Модуль объекта (справочника, документа, обработки) — логика экземпляра: обработчики ПередЗаписью, ОбработкаПроведения, ПроверкаЗаполнения.
  • 🗂️ Модуль менеджера — методы, работающие с объектом как с классом, без конкретного экземпляра (например, подготовка данных для печати).
  • 🖥️ Модуль формы — реакция интерфейса: нажатия кнопок, изменение полей, открытие и закрытие формы.
  • ⚙️ Модуль команды — код команды, добавленной на форму или в раздел.
  • 🚀 Модуль управляемого приложения и модуль сеанса — запуск приложения и установка параметров сеанса.

Отдельно держитесь модуля управляемого приложения и модуля сеанса. Первый отрабатывает при старте приложения — в нём пишут обработчики ПередНачаломРаботыСистемы и ПриНачалеРаботыСистемы. Второй особый: в нём разрешён единственный обработчик УстановкаПараметровСеанса, и выполняется он на сервере раньше любого другого кода. Складывать туда произвольную логику нельзя.

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

Как создать общий модуль и выставить его свойства

Общий модуль — самый частый способ «прописать» переиспользуемый код. Порядок такой:

  1. В дереве конфигурации раскройте ветку Общие, встаньте на Общие модули.
  2. Нажмите Ins или правой кнопкой → Добавить.
  3. Задайте осмысленное имя латиницей без пробелов, например РаботаСКонтрагентами или ОбщегоНазначения.
  4. В палитре свойств выставьте флаги, которые определяют, где модуль компилируется.

Флаги общего модуля — это и есть главная настройка, от неё зависит, откуда код будет доступен:

ФлагЧто даёт
Клиент (управляемое приложение)Методы доступны и выполняются на клиенте
СерверМетоды выполняются на сервере
Вызов сервераРазрешает вызывать экспортные серверные методы прямо с клиента
Внешнее соединениеКод доступен при работе через COM-соединение
ПривилегированныйКод выполняется без проверки прав доступа
ГлобальныйЭкспортные методы вызываются без указания имени модуля
Повторное использованиеКеширует результат функции на время вызова или сеанса

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

Проверка перед сохранением общего модуля
Выполнено: 0 / 5

Куда писать код: модули объекта, менеджера и формы

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

Модуль объекта отвечает за поведение записи. Открывается из палитры свойств документа ссылкой Модуль объекта. Сюда идут обработчики событий:

  • ОбработкаПроведения — формирование движений по регистрам при проведении.
  • ПередЗаписью и ПриЗаписи — проверки и действия в момент сохранения.
  • ОбработкаЗаполнения — заполнение реквизитов при создании на основании.

Модуль менеджера работает с объектом как с типом в целом. Удобен, когда данные нужны без открытия конкретной записи — например, метод, который возвращает список документов за период, или серверная подготовка макета.

Модуль формы содержит всю интерактивную логику. Создать обработчик проще всего так: откройте форму, перейдите на закладку Команды или выделите элемент, в палитре свойств найдите нужное событие (например, ПриИзменении у поля) и нажмите на лупу справа от него. Платформа сама создаст процедуру-обработчик с правильной директивой и подставит её в модуль.

Не дублируйте бизнес-логику в модуле формы. Форма должна собрать данные и вызвать метод объекта или общего модуля, а не хранить расчёты у себя. Иначе та же логика на разных формах быстро разъедется.

Директивы компиляции: где именно выполнится ваш код

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

Основные директивы:

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

Типичная связка выглядит так: обработчик кнопки &НаКлиенте собирает ввод пользователя, вызывает процедуру &НаСервере, та обращается к базе и возвращает результат клиенту.

&НаКлиенте
Процедура ПересчитатьНажатие(Команда)
    РезультатСервера = ПолучитьИтогНаСервере();
    Сообщить("Итог: " + Формат(РезультатСервера, "ЧГ=0"));
КонецПроцедуры

&НаСервереБезКонтекста
Функция ПолучитьИтогНаСервере()
    // чтение данных базы доступно только здесь
    Возврат 42;
КонецФункции

Обратите внимание на один нюанс: при вызове сервера с клиента все параметры и возвращаемые значения передаются по сети. Поэтому туда можно передавать только сериализуемые типы — числа, строки, ссылки, структуры из таких же значений. Форму, менеджер записи или другой «несериализуемый» объект между клиентом и сервером не протащить.

Отдельно стоит препроцессор — инструкции #Если … Тогда, которые включают фрагмент кода в зависимости от среды выполнения:

#Если Клиент Тогда
    Сообщить("Этот блок компилируется только на клиенте");
#Иначе
    // серверная ветка
#КонецЕсли

Доступны условия Клиент, Сервер, ТонкийКлиент, ВебКлиент, ВнешнееСоединение. Не путайте препроцессор с директивами: директива управляет местом выполнения метода, а #Если — тем, попадёт ли строка в скомпилированный модуль вообще.

Как сделать процедуру видимой: экспорт и вызовы

Чтобы процедуру из одного модуля можно было вызвать из другого, её помечают ключевым словом Экспорт:

Функция ПолучитьКурсВалюты(Валюта, Дата) Экспорт
    // тело функции
    Возврат Курс;
КонецФункции

Вызов зависит от того, глобальный модуль или нет:

  • Обычный общий модуль — через имя: РаботаСВалютой.ПолучитьКурсВалюты(Валюта, Дата).
  • Глобальный модуль — просто по имени метода: ПолучитьКурсВалюты(Валюта, Дата).

Внутри модуля объекта экспортные методы доступны через ссылку на объект, а внутри модуля формы — в пределах самой формы без префикса.

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

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

Как устроить код внутри модуля

Хорошо «прописать» модуль — это не только положить код в нужное место, но и разложить его по понятной структуре. Устоявшийся в индустрии подход (его же использует Библиотека стандартных подсистем) делит модуль на области:

  1. Программный интерфейс — экспортные методы, которыми пользуются снаружи.
  2. Служебный программный интерфейс — экспортные методы для «своих» подсистем.
  3. Служебные процедуры и функции — внутренняя кухня, без Экспорт.

Области размечаются инструкциями #Область ИмяОбласти и #КонецОбласти — они сворачиваются в редакторе и делают навигацию по большому модулю удобной.

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

Перем КэшКурсов Экспорт;
Перем СлужебныйСчётчик;

Злоупотреблять переменными модуля не стоит: они делают поведение кода менее предсказуемым. В большинстве случаев достаточно передавать данные параметрами процедур.

Несколько практик, которые экономят время:

  • 📌 Имена процедур — глаголом или по действию: ЗаполнитьРеквизиты, ПроверитьЗаполнение.
  • 📌 Один метод — одна задача. Функцию на 300 строк почти всегда можно разбить.
  • 📌 Для «тяжёлых» справочных функций, которые часто вызываются с одними и теми же параметрами, включайте Повторное использование возвращаемых значений — но только если функция не меняет данные.
  • 📌 Комментируйте не очевидное «как», а неочевидное «почему»: зачем здесь такое условие.
  • 📌 Не делайте запрос к базе внутри цикла по строкам — соберите данные одним запросом заранее. Это самая частая причина медленных отчётов и обработок.

Флаг Привилегированный отключает проверку прав доступа ко всем данным. Ставьте его осознанно и только там, где это действительно нужно, иначе получите дыру в разграничении доступа.

Отладка кода и типичные ошибки

Написанный модуль почти никогда не работает правильно с первого раза — его нужно отладить.

Чтобы отладка заработала в клиент-серверной базе, её сначала разрешают на стороне сервера (в параметрах информационной базы или кластера), а в Конфигураторе включают в настройках запуска: Сервис → Параметры, закладка запуска 1С:Предприятия, группа Отладка.

Дальше порядок обычный:

  1. Поставьте точку останова на нужной строке клавишей F9.
  2. Запустите отладку — F5 (Начать отладку).
  3. Когда выполнение остановится на точке, шагайте: F11 — зайти внутрь вызова, F10 — выполнить строку целиком, Shift+F11 — выйти из процедуры.
  4. Значения переменных смотрите в окне Табло или наведением курсора.

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

Ошибки, на которые уходит больше всего времени:

Диагностика: выберите симптом

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

Чем модуль объекта отличается от модуля менеджера?
Модуль объекта работает с конкретной записью (экземпляром) и её событиями записи и проведения. Модуль менеджера работает с объектом как с типом в целом — без открытия конкретного элемента, например для подготовки общих данных или печати.
Можно ли вызвать клиентскую процедуру из серверной?
Нет. Серверный код не имеет доступа к клиентскому контексту и интерфейсу. Передайте результат на клиент и вызовите клиентскую процедуру уже там, в методе &НаКлиенте.
Нужен ли общий модуль, если код используется только в одном документе?
Нет. Код, относящийся к одному объекту, держите в его модуле объекта или формы. Общий модуль заводят, когда одну и ту же логику используют несколько объектов.
Что делает флаг «Повторное использование возвращаемых значений»?
Платформа кеширует результат экспортной функции для одинаковых параметров — на время вызова или на время сеанса. Это ускоряет частые обращения, но подходит только для функций, которые не меняют данные.
Почему не срабатывают точки останова при отладке?
Чаще всего отладка не разрешена на стороне сервера либо не включена в настройках запуска Конфигуратора. Проверьте параметры информационной базы и раздел Отладка в настройках запуска.