Создание и подключение модулей в конфигурации 1С
Содержание
Код в 1С живёт не «в одном месте», а в десятке разных модулей, и у каждого своя роль: где-то он выполняется на клиенте, где-то на сервере, где-то только при проведении документа. Чтобы процедура заработала, её мало написать — нужно положить её в правильный модуль и пометить правильной директивой.
Ниже — куда писать код под конкретную задачу: как завести общий модуль и выставить его флаги, где живёт логика документов и форм, какие директивы компиляции управляют местом выполнения, как сделать процедуру видимой через Экспорт и как отладить готовый код. Весь разбор — для платформы 8.3 с интерфейсом «Такси» и управляемыми формами.
Какие бывают модули и за что отвечает каждый
Модуль — это текст на встроенном языке 1С, привязанный к объекту конфигурации или к приложению в целом. Открывается он в Конфигураторе двойным кликом по строке Модуль... в палитре свойств объекта либо из контекстного меню.
Основные типы модулей и их назначение:
- 🧩 Общие модули — процедуры и функции, которые вызываются из разных мест конфигурации. Лежат в ветке
Общие → Общие модули. - 📄 Модуль объекта (справочника, документа, обработки) — логика экземпляра: обработчики
ПередЗаписью,ОбработкаПроведения,ПроверкаЗаполнения. - 🗂️ Модуль менеджера — методы, работающие с объектом как с классом, без конкретного экземпляра (например, подготовка данных для печати).
- 🖥️ Модуль формы — реакция интерфейса: нажатия кнопок, изменение полей, открытие и закрытие формы.
- ⚙️ Модуль команды — код команды, добавленной на форму или в раздел.
- 🚀 Модуль управляемого приложения и модуль сеанса — запуск приложения и установка параметров сеанса.
Отдельно держитесь модуля управляемого приложения и модуля сеанса. Первый отрабатывает при старте приложения — в нём пишут обработчики ПередНачаломРаботыСистемы и ПриНачалеРаботыСистемы. Второй особый: в нём разрешён единственный обработчик УстановкаПараметровСеанса, и выполняется он на сервере раньше любого другого кода. Складывать туда произвольную логику нельзя.
Одно простое правило: логику, общую для нескольких объектов, выносите в общий модуль, а всё, что касается одного документа или одной формы, держите в его собственном модуле. Это избавляет от копирования кода и упрощает поддержку.
Как создать общий модуль и выставить его свойства
Общий модуль — самый частый способ «прописать» переиспользуемый код. Порядок такой:
- В дереве конфигурации раскройте ветку
Общие, встаньте наОбщие модули. - Нажмите
Insили правой кнопкой →Добавить. - Задайте осмысленное имя латиницей без пробелов, например
РаботаСКонтрагентамиилиОбщегоНазначения. - В палитре свойств выставьте флаги, которые определяют, где модуль компилируется.
Флаги общего модуля — это и есть главная настройка, от неё зависит, откуда код будет доступен:
| Флаг | Что даёт |
|---|---|
| Клиент (управляемое приложение) | Методы доступны и выполняются на клиенте |
| Сервер | Методы выполняются на сервере |
| Вызов сервера | Разрешает вызывать экспортные серверные методы прямо с клиента |
| Внешнее соединение | Код доступен при работе через COM-соединение |
| Привилегированный | Код выполняется без проверки прав доступа |
| Глобальный | Экспортные методы вызываются без указания имени модуля |
| Повторное использование | Кеширует результат функции на время вызова или сеанса |
Для набора серверных функций общего назначения достаточно одного флага Сервер. Если эти функции нужно дёргать с клиента — добавьте флаг Вызов сервера. Глобальным модуль делайте только при явной необходимости: глобальные методы грузятся при старте и замедляют запуск.
Куда писать код: модули объекта, менеджера и формы
Если задача привязана к конкретному документу или справочнику, общий модуль не нужен — код пишется в модуль самого объекта или его формы.
Модуль объекта отвечает за поведение записи. Открывается из палитры свойств документа ссылкой Модуль объекта. Сюда идут обработчики событий:
ОбработкаПроведения— формирование движений по регистрам при проведении.ПередЗаписьюиПриЗаписи— проверки и действия в момент сохранения.ОбработкаЗаполнения— заполнение реквизитов при создании на основании.
Модуль менеджера работает с объектом как с типом в целом. Удобен, когда данные нужны без открытия конкретной записи — например, метод, который возвращает список документов за период, или серверная подготовка макета.
Модуль формы содержит всю интерактивную логику. Создать обработчик проще всего так: откройте форму, перейдите на закладку Команды или выделите элемент, в палитре свойств найдите нужное событие (например, ПриИзменении у поля) и нажмите на лупу справа от него. Платформа сама создаст процедуру-обработчик с правильной директивой и подставит её в модуль.
Не дублируйте бизнес-логику в модуле формы. Форма должна собрать данные и вызвать метод объекта или общего модуля, а не хранить расчёты у себя. Иначе та же логика на разных формах быстро разъедется.
Директивы компиляции: где именно выполнится ваш код
В 1С 8.3 код исполняется либо на клиенте, либо на сервере, и перед каждой процедурой в модуле формы и объекта ставится директива компиляции — она говорит платформе, где метод скомпилировать и выполнить.
Основные директивы:
&НаКлиенте— выполняется на клиенте. Отсюда доступны диалоги, работа с формой, но нет прямого доступа к базе.&НаСервере— выполняется на сервере, форме передаётся весь контекст. Здесь можно читать и писать данные.&НаСервереБезКонтекста— тоже сервер, но без передачи контекста формы. Работает быстрее, подходит для чистых серверных операций.&НаКлиентеНаСервереБезКонтекста— метод компилируется и для клиента, и для сервера; вызывается из обоих мест.
Типичная связка выглядит так: обработчик кнопки &НаКлиенте собирает ввод пользователя, вызывает процедуру &НаСервере, та обращается к базе и возвращает результат клиенту.
&НаКлиенте
Процедура ПересчитатьНажатие(Команда)
РезультатСервера = ПолучитьИтогНаСервере();
Сообщить("Итог: " + Формат(РезультатСервера, "ЧГ=0"));
КонецПроцедуры
&НаСервереБезКонтекста
Функция ПолучитьИтогНаСервере()
// чтение данных базы доступно только здесь
Возврат 42;
КонецФункции
Обратите внимание на один нюанс: при вызове сервера с клиента все параметры и возвращаемые значения передаются по сети. Поэтому туда можно передавать только сериализуемые типы — числа, строки, ссылки, структуры из таких же значений. Форму, менеджер записи или другой «несериализуемый» объект между клиентом и сервером не протащить.
Отдельно стоит препроцессор — инструкции #Если … Тогда, которые включают фрагмент кода в зависимости от среды выполнения:
#Если Клиент Тогда
Сообщить("Этот блок компилируется только на клиенте");
#Иначе
// серверная ветка
#КонецЕсли
Доступны условия Клиент, Сервер, ТонкийКлиент, ВебКлиент, ВнешнееСоединение. Не путайте препроцессор с директивами: директива управляет местом выполнения метода, а #Если — тем, попадёт ли строка в скомпилированный модуль вообще.
Как сделать процедуру видимой: экспорт и вызовы
Чтобы процедуру из одного модуля можно было вызвать из другого, её помечают ключевым словом Экспорт:
Функция ПолучитьКурсВалюты(Валюта, Дата) Экспорт
// тело функции
Возврат Курс;
КонецФункции
Вызов зависит от того, глобальный модуль или нет:
- Обычный общий модуль — через имя:
РаботаСВалютой.ПолучитьКурсВалюты(Валюта, Дата). - Глобальный модуль — просто по имени метода:
ПолучитьКурсВалюты(Валюта, Дата).
Внутри модуля объекта экспортные методы доступны через ссылку на объект, а внутри модуля формы — в пределах самой формы без префикса.
Если метод вызывается только внутри своего модуля, Экспорт не ставьте. Лишние экспортные методы расширяют публичный интерфейс и мешают потом менять код, ничего не ломая снаружи.
Частая ошибка новичков — попытка вызвать серверную экспортную функцию прямо с клиента, когда у общего модуля не стоит флаг Вызов сервера. Платформа при компиляции выдаст, что метод не определён. Решение: либо добавить флаг, либо вызывать серверный метод из процедуры &НаСервере.
Как устроить код внутри модуля
Хорошо «прописать» модуль — это не только положить код в нужное место, но и разложить его по понятной структуре. Устоявшийся в индустрии подход (его же использует Библиотека стандартных подсистем) делит модуль на области:
- Программный интерфейс — экспортные методы, которыми пользуются снаружи.
- Служебный программный интерфейс — экспортные методы для «своих» подсистем.
- Служебные процедуры и функции — внутренняя кухня, без
Экспорт.
Области размечаются инструкциями #Область ИмяОбласти и #КонецОбласти — они сворачиваются в редакторе и делают навигацию по большому модулю удобной.
Кроме процедур и функций, в начале модуля объявляют переменные модуля — через Перем. Они живут всё время, пока существует объект (например, открыта форма), и видны всем методам модуля. Если переменная нужна снаружи, её тоже помечают Экспорт:
Перем КэшКурсов Экспорт;
Перем СлужебныйСчётчик;
Злоупотреблять переменными модуля не стоит: они делают поведение кода менее предсказуемым. В большинстве случаев достаточно передавать данные параметрами процедур.
Несколько практик, которые экономят время:
- 📌 Имена процедур — глаголом или по действию:
ЗаполнитьРеквизиты,ПроверитьЗаполнение. - 📌 Один метод — одна задача. Функцию на 300 строк почти всегда можно разбить.
- 📌 Для «тяжёлых» справочных функций, которые часто вызываются с одними и теми же параметрами, включайте
Повторное использование возвращаемых значений— но только если функция не меняет данные. - 📌 Комментируйте не очевидное «как», а неочевидное «почему»: зачем здесь такое условие.
- 📌 Не делайте запрос к базе внутри цикла по строкам — соберите данные одним запросом заранее. Это самая частая причина медленных отчётов и обработок.
Флаг Привилегированный отключает проверку прав доступа ко всем данным. Ставьте его осознанно и только там, где это действительно нужно, иначе получите дыру в разграничении доступа.
Отладка кода и типичные ошибки
Написанный модуль почти никогда не работает правильно с первого раза — его нужно отладить.
Чтобы отладка заработала в клиент-серверной базе, её сначала разрешают на стороне сервера (в параметрах информационной базы или кластера), а в Конфигураторе включают в настройках запуска: Сервис → Параметры, закладка запуска 1С:Предприятия, группа Отладка.
Дальше порядок обычный:
- Поставьте точку останова на нужной строке клавишей
F9. - Запустите отладку —
F5(Начать отладку). - Когда выполнение остановится на точке, шагайте:
F11— зайти внутрь вызова,F10— выполнить строку целиком,Shift+F11— выйти из процедуры. - Значения переменных смотрите в окне
Таблоили наведением курсора.
Для анализа скорости используйте Замер производительности — он покажет, в каких строках модуля код проводит больше всего времени.
Ошибки, на которые уходит больше всего времени:
Частые вопросы
Чем модуль объекта отличается от модуля менеджера?
Можно ли вызвать клиентскую процедуру из серверной?
&НаКлиенте.Нужен ли общий модуль, если код используется только в одном документе?
Что делает флаг «Повторное использование возвращаемых значений»?
Почему не срабатывают точки останова при отладке?
Отладка в настройках запуска.