Свой модуль в 1С:Предприятии 8.3: где его создать, как настроить и проверить код
Содержание
Чтобы сделать модуль в 1С, откройте Конфигуратор, в дереве конфигурации раскройте ветку Общие → Общие модули, нажмите Добавить и задайте имя. Затем в палитре свойств отметьте, где модуль будет работать (Сервер, Клиент (управляемое приложение), Вызов сервера), и пишите процедуры с ключевым словом Экспорт, чтобы их было видно из других модулей.
Это путь для общего модуля. Модуль объекта, менеджера или формы отдельно не создаётся: он уже есть у каждого справочника, документа и формы, его нужно только открыть. Ниже разобраны оба случая, а также что сделать, если конфигурация типовая и менять её нельзя.
Что такое модуль в 1С и какие бывают виды
Модуль — это текст на встроенном языке 1С, привязанный к конкретному месту конфигурации. Место определяет, когда код выполняется и к каким данным у него есть доступ.
Все модули платформы 8.3 делятся на несколько групп:
| Вид модуля | Где находится | Когда выполняется |
|---|---|---|
| Общий модуль | Общие → Общие модули | Когда его метод вызывают из другого кода |
| Модуль объекта | У справочника, документа, обработки | При работе с конкретным экземпляром: запись, проведение, заполнение |
| Модуль менеджера | У тех же объектов | При обращении к объекту в целом: Справочники.Номенклатура.Метод() |
| Модуль формы | Вкладка Модуль в редакторе формы | Пока открыта форма |
| Модуль набора записей | У регистров | При записи набора записей регистра |
| Модуль команды | У общей команды или команды объекта | При нажатии команды |
| Модуль сеанса | Корень конфигурации | При старте сеанса, до открытия интерфейса |
| Модуль управляемого приложения | Корень конфигурации | При запуске и завершении клиента |
| Модуль внешнего соединения | Корень конфигурации | При подключении через COM-соединение |
💡 Если сомневаетесь, куда класть код, задайте себе вопрос: «Этот код нужен одному объекту или многим?» Нужен одному — модуль объекта или менеджера. Нужен многим — общий модуль.
Как создать общий модуль и открыть остальные
Новый общий модуль
- Откройте базу в режиме
Конфигуратор. - Если дерево конфигурации не видно, откройте его через
Конфигурация → Открыть конфигурацию. - Раскройте
Общие, щёлкните правой кнопкой поОбщие модулии выберитеДобавить. - Введите имя латиницей или кириллицей без пробелов, например
РаботаСКонтрагентамиСервер. - Откройте палитру свойств (
Alt+Enter) и выставьте флаги контекста. - Двойным щелчком по модулю откройте редактор и пишите код.
- Сохраните изменения и обновите конфигурацию базы данных:
F7илиКонфигурация → Обновить конфигурацию базы данных.
Если база подключена к хранилищу конфигурации, сначала захватите в хранилище ветку Общие модули, иначе пункт Добавить будет недоступен.
Где открыть встроенные модули
- 📄 Модуль объекта и менеджера — правой кнопкой по справочнику или документу →
Открыть модуль объектаилиОткрыть модуль менеджера. - 🖼 Модуль формы — откройте форму двойным щелчком, внизу редактора переключитесь на вкладку
Модуль. - ⚙️ Модули приложения, сеанса и внешнего соединения — правой кнопкой по корню дерева конфигурации, там есть отдельные пункты открытия для каждого.
Если конфигурация типовая
Править код типовой БП 3.0, ЗУП 3.1 или УТ 11 напрямую — значит усложнить каждое следующее обновление. Правильнее создать расширение: Конфигурация → Расширения конфигурации → Добавить.
В расширении можно добавить свой общий модуль так же, как в основной конфигурации. А чтобы изменить поведение существующего метода, его заимствуют и вешают аннотацию:
&После("ПередЗаписью")
Процедура Расш1_ПередЗаписью(Отказ)
Если Не ЗначениеЗаполнено(Комментарий) Тогда
Комментарий = "Создан автоматически";
КонецЕсли;
КонецПроцедуры
Аннотации расширения: &Перед, &После, &Вместо и &ИзменениеИКонтроль. Последняя позволяет вставить строки внутрь чужого метода и сообщает, если после обновления типовой код изменился.
Флаги и свойства общего модуля: что за что отвечает
Главная ошибка начинающих — создать общий модуль, не трогая свойства. По умолчанию отмечен только Сервер, и метод потом «не виден» с клиента.
| Свойство | Что даёт |
|---|---|
Глобальный | Методы вызываются без имени модуля, просто МойМетод() |
Клиент (управляемое приложение) | Код компилируется на клиенте тонкого и веб-клиента |
Сервер | Код выполняется на сервере 1С, доступны запросы и запись данных |
Внешнее соединение | Модуль доступен при подключении через COM |
Вызов сервера | Экспортные методы серверного модуля можно вызвать с клиента |
Привилегированный | Код выполняется без проверки прав текущего пользователя |
Повторное использование возвращаемых значений | Результат функции кешируется на время вызова или на время сеанса |
Практичное правило именования, которое используют в типовых конфигурациях: суффикс в имени модуля говорит о его контексте.
- 🖥
...Клиент— только клиентский код. - 🗄
...Сервер— только серверный, без вызова с клиента. - 🔁
...ВызовСервера— серверный с флагомВызов сервера. - 🔀
...КлиентСервер— отмечены и клиент, и сервер, код без обращений к базе. - 🔒
...ПолныеПрава— привилегированный. - ⚡
...ПовтИсп— с кешированием возвращаемых значений.
Привилегированный модуль удобен, но опасен: любой пользователь, получивший вызов его метода, обходит свои права. Держите там минимум кода и проверяйте входящие параметры.
Модуль с кешем хорошо подходит для редко меняющихся настроек: значение константы, ссылка на основную организацию. Для данных, которые пользователь меняет в течение сеанса, кеш даст устаревший результат.
Синтаксис и структура кода в модуле
У модулей объекта, менеджера и формы три раздела в строгом порядке:
- Объявление переменных —
Перем ИмяПеременной;. - Процедуры и функции.
- Основная программа — операторы вне процедур, выполняются при создании объекта.
В общем модуле разрешён только второй раздел: переменные модуля и основная программа там не допускаются, синтаксический контроль выдаст ошибку.
Минимальный рабочий общий модуль РаботаСКонтрагентамиВызовСервера с флагами Сервер и Вызов сервера:
#Область ПрограммныйИнтерфейс
// Возвращает ИНН контрагента или пустую строку.
//
// Параметры:
// Контрагент - СправочникСсылка.Контрагенты
//
// Возвращаемое значение:
// Строка
//
Функция ИННКонтрагента(Контрагент) Экспорт
Если Не ЗначениеЗаполнено(Контрагент) Тогда
Возврат "";
КонецЕсли;
Возврат Контрагент.ИНН;
КонецФункции
#КонецОбласти
#Область СлужебныеПроцедурыИФункции
Функция ДлинаИННКорректна(ИНН)
Длина = СтрДлина(СокрЛП(ИНН));
Возврат Длина = 10 Или Длина = 12;
КонецФункции
#КонецОбласти
Что здесь важно:
- 🧩
#Областьи#КонецОбластине влияют на выполнение, но сворачиваются в редакторе и делят модуль на публичную и служебную части. - 📝 Комментарий над функцией в формате «Параметры / Возвращаемое значение» подхватывается контекстной подсказкой при вызове.
- 🔤 Процедура ничего не возвращает, функция обязана вернуть значение через
Возврат.
Директивы компиляции в модуле формы
В модуле формы у каждого метода своя директива. Без неё метод считается клиентским.
&НаКлиенте
Процедура ЗаполнитьИНН(Команда)
Объект.ИНН = ПолучитьИНННаСервере(Объект.Контрагент);
КонецПроцедуры
&НаСервереБезКонтекста
Функция ПолучитьИНННаСервере(Контрагент)
Возврат РаботаСКонтрагентамиВызовСервера.ИННКонтрагента(Контрагент);
КонецФункции
| Директива | Где выполняется | Доступ к данным формы |
|---|---|---|
&НаКлиенте | Клиент | Есть |
&НаСервере | Сервер | Есть, форма передаётся на сервер целиком |
&НаСервереБезКонтекста | Сервер | Нет, только параметры |
&НаКлиентеНаСервереБезКонтекста | И там и там | Нет |
&НаСервереБезКонтекста работает быстрее &НаСервере, потому что данные формы не гоняются по сети. Используйте его всегда, когда методу хватает параметров.
В модулях объектов вместо директив применяют инструкции препроцессора: #Если Сервер Или ТолстыйКлиентОбычноеПриложение Или ВнешнееСоединение Тогда ... #КонецЕсли. Ими обрамляют код, который не должен попасть на клиент.
Экспорт методов и видимость между модулями
Метод без слова Экспорт виден только внутри своего модуля. С ним — из других модулей, но по своим правилам для каждого вида.
| Где объявлен экспортный метод | Как вызвать из другого кода |
|---|---|
| Общий модуль | ИмяМодуля.ИмяМетода() |
| Глобальный общий модуль | ИмяМетода() без префикса |
| Модуль менеджера | Документы.РеализацияТоваров.ИмяМетода() |
| Модуль объекта | ДокументОбъект.ИмяМетода(), где объект получен через ПолучитьОбъект() |
| Модуль формы | Только из той же формы или через ПолучитьФорму() и обращение к форме |
Экспортными могут быть и переменные модуля объекта: Перем ПропуститьПроверку Экспорт;. Так часто передают признак между кодом, который создаёт объект, и обработчиком ПередЗаписью.
Правила, которые чаще всего ломают вызов:
- 🚫 Клиентский код не видит серверный общий модуль без флага
Вызов сервера. Ошибка выглядит какПроцедура или функция с указанным именем не определена. - 🚫 С клиента нельзя передать на сервер
ДокументОбъектилиСправочникОбъект, только ссылку или простые значения. - 🚫 Метод
&НаСервереБезКонтекстане может вызвать метод&НаСерверетой же формы: у него нет формы. - 🚫 Из общего модуля нельзя обратиться к методу модуля формы напрямую.
Каждый вызов Вызов сервера с клиента — это сетевой запрос. Десять вызовов в цикле на тонком клиенте через интернет дают заметную задержку. Соберите данные в одну серверную функцию и верните структуру.
Отладка модуля и проверка кода
Синтаксический контроль
Перед запуском проверьте модуль: в редакторе нажмите Ctrl+F7. Для всей конфигурации есть Конфигурация → Проверка конфигурации, там можно отметить проверку для разных режимов клиента и сервера. Она ловит обращения к серверным объектам из клиентского кода, которые обычный синтаксический контроль пропускает.
Пошаговая отладка
- Поставьте точку останова на строке:
F9. - Запустите отладку:
F5, откроется режим1С:Предприятие. - Выполните действие, которое вызывает код. Конфигуратор остановится на точке.
- Переходите по шагам:
F10— шагнуть через,F11— шагнуть в метод,Shift+F11— выйти из метода. - Значение любой переменной смотрите через
Shift+F9— окно «Вычислить выражение».
Для клиент-серверной базы отладка серверного кода работает, только если сервер 1С запущен с разрешённой отладкой (ключ -debug в параметрах службы агента). Перезапуск службы сервера 1С обрывает все сеансы пользователей — делайте это вне рабочего времени или на тестовом сервере.
💡 Если точка останова на серверной строке не срабатывает, откройте Отладка → Подключение и проверьте, что в списке есть серверный предмет отладки.
Замер производительности
Отладка → Замер производительности включается перед запуском кода. После остановки отладки появится таблица строк модуля с числом вызовов и временем. Так видно, какая строка тормозит: чаще всего это запрос внутри цикла.
Как протестировать модуль, не меняя рабочую базу
- 🧪 Скопируйте базу (
Администрирование → Выгрузить информационную базув Конфигураторе) и экспериментируйте на копии. - 🧪 Для разовой проверки создайте внешнюю обработку:
Файл → Новый → Внешняя обработка. В её форме вызовите методы своего общего модуля и откройте файл.epfв режиме1С:Предприятие. - 🧪 Для регулярных проверок используют фреймворки модульных тестов на встроенном языке, например YAxUnit (работает как расширение) или Vanessa-ADD. Тесты на ключевые функции повторяются после каждого обновления.