Свой модуль в 1С:Предприятии 8.3: где его создать, как настроить и проверить код

· 9 мин

Содержание

Чтобы сделать модуль в 1С, откройте Конфигуратор, в дереве конфигурации раскройте ветку Общие → Общие модули, нажмите Добавить и задайте имя. Затем в палитре свойств отметьте, где модуль будет работать (Сервер, Клиент (управляемое приложение), Вызов сервера), и пишите процедуры с ключевым словом Экспорт, чтобы их было видно из других модулей.

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

Что такое модуль в 1С и какие бывают виды

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

Все модули платформы 8.3 делятся на несколько групп:

Вид модуляГде находитсяКогда выполняется
Общий модульОбщие → Общие модулиКогда его метод вызывают из другого кода
Модуль объектаУ справочника, документа, обработкиПри работе с конкретным экземпляром: запись, проведение, заполнение
Модуль менеджераУ тех же объектовПри обращении к объекту в целом: Справочники.Номенклатура.Метод()
Модуль формыВкладка Модуль в редакторе формыПока открыта форма
Модуль набора записейУ регистровПри записи набора записей регистра
Модуль командыУ общей команды или команды объектаПри нажатии команды
Модуль сеансаКорень конфигурацииПри старте сеанса, до открытия интерфейса
Модуль управляемого приложенияКорень конфигурацииПри запуске и завершении клиента
Модуль внешнего соединенияКорень конфигурацииПри подключении через COM-соединение

💡 Если сомневаетесь, куда класть код, задайте себе вопрос: «Этот код нужен одному объекту или многим?» Нужен одному — модуль объекта или менеджера. Нужен многим — общий модуль.

Куда поместить новый код?

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

Новый общий модуль

  1. Откройте базу в режиме Конфигуратор.
  2. Если дерево конфигурации не видно, откройте его через Конфигурация → Открыть конфигурацию.
  3. Раскройте Общие, щёлкните правой кнопкой по Общие модули и выберите Добавить.
  4. Введите имя латиницей или кириллицей без пробелов, например РаботаСКонтрагентамиСервер.
  5. Откройте палитру свойств (Alt+Enter) и выставьте флаги контекста.
  6. Двойным щелчком по модулю откройте редактор и пишите код.
  7. Сохраните изменения и обновите конфигурацию базы данных: F7 или Конфигурация → Обновить конфигурацию базы данных.

Если база подключена к хранилищу конфигурации, сначала захватите в хранилище ветку Общие модули, иначе пункт Добавить будет недоступен.

Где открыть встроенные модули

  • 📄 Модуль объекта и менеджера — правой кнопкой по справочнику или документу → Открыть модуль объекта или Открыть модуль менеджера.
  • 🖼 Модуль формы — откройте форму двойным щелчком, внизу редактора переключитесь на вкладку Модуль.
  • ⚙️ Модули приложения, сеанса и внешнего соединения — правой кнопкой по корню дерева конфигурации, там есть отдельные пункты открытия для каждого.

Если конфигурация типовая

Править код типовой БП 3.0, ЗУП 3.1 или УТ 11 напрямую — значит усложнить каждое следующее обновление. Правильнее создать расширение: Конфигурация → Расширения конфигурации → Добавить.

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

&После("ПередЗаписью")
Процедура Расш1_ПередЗаписью(Отказ)
    Если Не ЗначениеЗаполнено(Комментарий) Тогда
        Комментарий = "Создан автоматически";
    КонецЕсли;
КонецПроцедуры

Аннотации расширения: &Перед, &После, &Вместо и &ИзменениеИКонтроль. Последняя позволяет вставить строки внутрь чужого метода и сообщает, если после обновления типовой код изменился.

Флаги и свойства общего модуля: что за что отвечает

Главная ошибка начинающих — создать общий модуль, не трогая свойства. По умолчанию отмечен только Сервер, и метод потом «не виден» с клиента.

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

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

  • 🖥 ...Клиент — только клиентский код.
  • 🗄 ...Сервер — только серверный, без вызова с клиента.
  • 🔁 ...ВызовСервера — серверный с флагом Вызов сервера.
  • 🔀 ...КлиентСервер — отмечены и клиент, и сервер, код без обращений к базе.
  • 🔒 ...ПолныеПрава — привилегированный.
  • ⚡ ...ПовтИсп — с кешированием возвращаемых значений.

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

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

Синтаксис и структура кода в модуле

У модулей объекта, менеджера и формы три раздела в строгом порядке:

  1. Объявление переменных — Перем ИмяПеременной;.
  2. Процедуры и функции.
  3. Основная программа — операторы вне процедур, выполняются при создании объекта.

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

Минимальный рабочий общий модуль РаботаСКонтрагентамиВызовСервера с флагами Сервер и Вызов сервера:

#Область ПрограммныйИнтерфейс

// Возвращает ИНН контрагента или пустую строку.
//
// Параметры:
//  Контрагент - СправочникСсылка.Контрагенты
//
// Возвращаемое значение:
//  Строка
//
Функция ИННКонтрагента(Контрагент) Экспорт
    Если Не ЗначениеЗаполнено(Контрагент) Тогда
        Возврат "";
    КонецЕсли;
    Возврат Контрагент.ИНН;
КонецФункции

#КонецОбласти

#Область СлужебныеПроцедурыИФункции

Функция ДлинаИННКорректна(ИНН)
    Длина = СтрДлина(СокрЛП(ИНН));
    Возврат Длина = 10 Или Длина = 12;
КонецФункции

#КонецОбласти

Что здесь важно:

  • 🧩 #Область и #КонецОбласти не влияют на выполнение, но сворачиваются в редакторе и делят модуль на публичную и служебную части.
  • 📝 Комментарий над функцией в формате «Параметры / Возвращаемое значение» подхватывается контекстной подсказкой при вызове.
  • 🔤 Процедура ничего не возвращает, функция обязана вернуть значение через Возврат.

Директивы компиляции в модуле формы

В модуле формы у каждого метода своя директива. Без неё метод считается клиентским.

&НаКлиенте
Процедура ЗаполнитьИНН(Команда)
    Объект.ИНН = ПолучитьИНННаСервере(Объект.Контрагент);
КонецПроцедуры

&НаСервереБезКонтекста
Функция ПолучитьИНННаСервере(Контрагент)
    Возврат РаботаСКонтрагентамиВызовСервера.ИННКонтрагента(Контрагент);
КонецФункции
ДирективаГде выполняетсяДоступ к данным формы
&НаКлиентеКлиентЕсть
&НаСервереСерверЕсть, форма передаётся на сервер целиком
&НаСервереБезКонтекстаСерверНет, только параметры
&НаКлиентеНаСервереБезКонтекстаИ там и тамНет

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

В модулях объектов вместо директив применяют инструкции препроцессора: #Если Сервер Или ТолстыйКлиентОбычноеПриложение Или ВнешнееСоединение Тогда ... #КонецЕсли. Ими обрамляют код, который не должен попасть на клиент.

Экспорт методов и видимость между модулями

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

Где объявлен экспортный методКак вызвать из другого кода
Общий модульИмяМодуля.ИмяМетода()
Глобальный общий модульИмяМетода() без префикса
Модуль менеджераДокументы.РеализацияТоваров.ИмяМетода()
Модуль объектаДокументОбъект.ИмяМетода(), где объект получен через ПолучитьОбъект()
Модуль формыТолько из той же формы или через ПолучитьФорму() и обращение к форме

Экспортными могут быть и переменные модуля объекта: Перем ПропуститьПроверку Экспорт;. Так часто передают признак между кодом, который создаёт объект, и обработчиком ПередЗаписью.

Правила, которые чаще всего ломают вызов:

  • 🚫 Клиентский код не видит серверный общий модуль без флага Вызов сервера. Ошибка выглядит как Процедура или функция с указанным именем не определена.
  • 🚫 С клиента нельзя передать на сервер ДокументОбъект или СправочникОбъект, только ссылку или простые значения.
  • 🚫 Метод &НаСервереБезКонтекста не может вызвать метод &НаСервере той же формы: у него нет формы.
  • 🚫 Из общего модуля нельзя обратиться к методу модуля формы напрямую.

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

Отладка модуля и проверка кода

Синтаксический контроль

Перед запуском проверьте модуль: в редакторе нажмите Ctrl+F7. Для всей конфигурации есть Конфигурация → Проверка конфигурации, там можно отметить проверку для разных режимов клиента и сервера. Она ловит обращения к серверным объектам из клиентского кода, которые обычный синтаксический контроль пропускает.

Пошаговая отладка

  1. Поставьте точку останова на строке: F9.
  2. Запустите отладку: F5, откроется режим 1С:Предприятие.
  3. Выполните действие, которое вызывает код. Конфигуратор остановится на точке.
  4. Переходите по шагам: F10 — шагнуть через, F11 — шагнуть в метод, Shift+F11 — выйти из метода.
  5. Значение любой переменной смотрите через Shift+F9 — окно «Вычислить выражение».

Для клиент-серверной базы отладка серверного кода работает, только если сервер 1С запущен с разрешённой отладкой (ключ -debug в параметрах службы агента). Перезапуск службы сервера 1С обрывает все сеансы пользователей — делайте это вне рабочего времени или на тестовом сервере.

💡 Если точка останова на серверной строке не срабатывает, откройте Отладка → Подключение и проверьте, что в списке есть серверный предмет отладки.

Замер производительности

Отладка → Замер производительности включается перед запуском кода. После остановки отладки появится таблица строк модуля с числом вызовов и временем. Так видно, какая строка тормозит: чаще всего это запрос внутри цикла.

Как протестировать модуль, не меняя рабочую базу

  • 🧪 Скопируйте базу (Администрирование → Выгрузить информационную базу в Конфигураторе) и экспериментируйте на копии.
  • 🧪 Для разовой проверки создайте внешнюю обработку: Файл → Новый → Внешняя обработка. В её форме вызовите методы своего общего модуля и откройте файл .epf в режиме 1С:Предприятие.
  • 🧪 Для регулярных проверок используют фреймворки модульных тестов на встроенном языке, например YAxUnit (работает как расширение) или Vanessa-ADD. Тесты на ключевые функции повторяются после каждого обновления.
Перед переносом модуля в рабочую базу
Выполнено: 0 / 6

Типичные ошибки при создании модуля

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

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

Можно ли создать модуль в режиме 1С:Предприятие, без Конфигуратора?
Нет. Модули конфигурации создаются в Конфигураторе или в 1С:EDT. В пользовательском режиме можно только подключить готовую внешнюю обработку или расширение.
Чем общий модуль отличается от модуля менеджера?
Общий модуль не привязан к объекту и вызывается по своему имени. Модуль менеджера принадлежит конкретному справочнику или документу и вызывается через Справочники.Имя или Документы.Имя.
Сколько общих модулей можно создать?
Жёсткого лимита на количество нет. В типовых конфигурациях их сотни. Ограничивает скорее удобство: делите модули по смыслу и контексту.
Можно ли переименовать общий модуль?
Можно, но все вызовы вида ИмяМодуля.Метод() перестанут работать. Перед переименованием найдите вызовы через глобальный поиск по конфигурации (Ctrl+Shift+F) и замените их.
Где писать код, если он нужен и на клиенте, и на сервере?
В общем модуле с флагами «Клиент (управляемое приложение)» и «Сервер». Такой код не должен обращаться к базе данных: запросы на клиенте недоступны.