Разработка и Конфигурация · 12 мин
Что такое модуль в 1С и для чего он нужен
Разбираем, что такое модуль в 1С, какие виды модулей существуют, где хранится программный код и как правильно размещать процедуры и функции.
Модуль в 1С — это контейнер для программного кода на встроенном языке платформы. Каждая процедура и функция, которую вы пишете в конфигураторе, физически хранится внутри какого-либо модуля: платформа не позволяет разместить код «сам по себе», вне модульной структуры. Поэтому понимание того, какие бывают модули и чем они отличаются, — базовый навык для любого, кто дорабатывает конфигурацию или разбирается в чужом коде.
За пределами простого определения модуль определяет контекст исполнения: где будет выполняться код (на клиенте или на сервере), какие объекты ему доступны, в какой момент он вызывается и какие данные видит. Ошибка в выборе модуля — одна из самых частых причин неработающего кода у начинающих разработчиков: процедура написана верно, но размещена не там, и платформа её просто не вызывает.
Ниже разберём виды модулей, их назначение, правила выбора места для кода и типичные ошибки при работе с ними.
Что представляет собой модуль и как он устроен
Модуль состоит из трёх секций, которые идут в строго определённом порядке. Первая — раздел описания переменных: здесь объявляются переменные, доступные во всех процедурах модуля. Вторая — раздел процедур и функций, основная часть модуля. Третья — раздел основной программы: код, который выполняется один раз при инициализации модуля (например, при открытии формы или запуске приложения).
Каждая процедура или функция внутри модуля может сопровождаться директивами компиляции: &НаКлиенте, &НаСервере, &НаСервереБезКонтекста и другими. Эти директивы уточняют, в каком окружении будет исполняться конкретный метод, и особенно важны в модулях форм, где клиентский и серверный код соседствуют в одном месте.
Основные виды модулей в конфигурации
Платформа 1С:Предприятие 8 предусматривает несколько типов модулей, каждый из которых привязан к определённому объекту или событию. Увидеть их можно в конфигураторе: у большинства объектов дерева конфигурации в контекстном меню есть пункты открытия соответствующих модулей.
- Модуль приложения — содержит обработчики событий запуска и завершения системы, а также глобальные переменные и процедуры.
- Общие модули — библиотеки переиспользуемых процедур и функций, доступных из любой точки конфигурации.
- Модули объектов (справочников, документов, отчётов и др.) — код, относящийся к поведению конкретного объекта: обработка проведения, заполнение, проверки.
- Модули форм — код, обслуживающий интерфейс: реакции на нажатия кнопок, изменения полей, открытие и закрытие формы.
- Модуль менеджера объекта — процедуры, работающие с объектом как с коллекцией: создание, подбор, печатные формы.
- Модуль набора записей — для регистров: обработчики перед записью и при записи движений.
- Модуль сеанса — выполняется при установке соединения, обычно задаёт параметры сеанса.
Отдельно стоит упомянуть модули команд и модули обработчиков подписок на события — они тоже являются точками входа для кода, но вызываются платформой при выполнении команды интерфейса или при наступлении события, на которое оформлена подписка.
Общие модули: главный инструмент переиспользования кода
Общие модули — это отдельные объекты конфигурации, созданные специально для хранения кода, который нужен в нескольких местах. Если одна и та же логика используется в документе, отчёте и обработке, её выносят в общий модуль, чтобы не дублировать и не поддерживать три копии одного алгоритма.
У общего модуля есть важные свойства, которые задаются в палитре свойств. Флаг «Сервер» означает, что модуль компилируется на сервере и может обращаться к базе данных. Флаг «Клиент (управляемое приложение)» позволяет вызывать модуль из клиентского кода. Свойство «Вызов сервера» разрешает обращаться к серверному модулю с клиента — без него попытка вызвать серверную функцию из формы завершится ошибкой. Флаг «Привилегированный режим» отключает проверку прав доступа при выполнении кода модуля.
Имена общих модулей в типовых конфигурациях обычно строятся по шаблону: назначение плюс суффикс контекста, например РаботаСДокументами, РаботаСДокументамиВызовСервера, РаботаСДокументамиКлиент. Такая группировка помогает быстро понять, где исполняется код, ещё до открытия модуля.
Модуль объекта и модуль формы: в чём разница
Модуль объекта (например, документа «Реализация товаров») работает с данными объекта: здесь размещают обработчик ОбработкаПроведения, где формируются движения по регистрам, обработчик ОбработкаЗаполнения для автозаполнения нового документа, проверки в ОбработкаПроверкиЗаполнения. Код модуля объекта выполняется на сервере и не имеет доступа к элементам формы.
Модуль формы, напротив, отвечает за поведение интерфейса: что происходит при нажатии кнопки, как пересчитывается сумма при изменении количества, какие поля видны пользователю. Здесь критичны директивы компиляции: клиентская процедура не может напрямую выполнить запрос к базе, а серверная — показать пользователю диалог выбора файла.
Где размещать код
Логика нужна в нескольких объектах или вызывается извне. Ограничение: нет доступа к данным конкретной формы.
Логика относится к данным объекта: проведение, заполнение, контроль. Не подходит для интерфейсных действий.
Реакция на действия пользователя и управление элементами формы. Тяжёлые серверные операции здесь размещать не стоит.
Типичная схема взаимодействия
Распространённый паттерн в управляемых формах: клиентская процедура обрабатывает нажатие кнопки, вызывает серверную функцию общего модуля, та обращается к базе и возвращает результат, а клиент обновляет отображение. Такое разделение минимизирует количество серверных вызовов и ускоряет работу формы.
Как выбрать модуль для новой процедуры
При добавлении кода задайте себе три вопроса. Первый: к каким данным нужен доступ? Если к реквизитам конкретного объекта — это модуль объекта или формы. Если логика универсальна — общий модуль. Второй: где должен исполняться код? Работа с базой данных, запросы, проведение — только сервер. Диалоги, предупреждения, навигация по форме — только клиент. Третий: кто будет вызывать процедуру? Если другие объекты конфигурации — размещайте её в общем модуле с ключевым словом Экспорт.
Как выбрать место для кода
Не забывайте про область видимости: процедура без слова Экспорт доступна только внутри своего модуля. Попытка вызвать её извне даст ошибку «Процедура или функция с указанным именем не определена» — частая причина путаницы у новичков.
Как проверить, что код размещён и вызывается правильно
После размещения кода выполните синтаксическую проверку модуля: в конфигураторе это команда «Конфигурация — Проверка конфигурации» или кнопка проверки модуля в редакторе. Она выявит ошибки компиляции, несуществующие методы и проблемы с директивами ещё до запуска.
Дальше — отладка. Поставьте точку останова в процедуре и запустите отладку (F5). Если точка не сработала, значит, платформа не вызывает этот обработчик: проверьте, что событие вообще наступает, а процедура названа и расположена корректно. Для серверного кода убедитесь, что в отладчике включена отладка на сервере.
Как проверить результат
Процедура объявлена с Экспорт, модуль доступен в данном контексте
Ошибка «Процедура не определена» — нет Экспорт или неверный флаг контекста
У общего модуля включён «Вызов сервера», функция возвращает сериализуемые данные
Ошибка вызова или передача несериализуемых типов (например, запрос) на клиента
Процедура привязана к событию элемента через палитру свойств или создана автоматически
Процедура написана вручную, но не связана с событием — не вызывается
Типичные ошибки при работе с модулями
Большинство проблем с модулями сводится к неправильному выбору контекста и нарушению правил видимости. Ниже — ошибки, которые встречаются чаще всего.
Ещё одна ошибка архитектурного уровня — превращение общего модуля в «свалку»: сотни несвязанных процедур в одном модуле затрудняют поиск и увеличивают время компиляции. Группируйте код по смыслу: отдельный модуль для работы с номенклатурой, отдельный — для обмена данными, отдельный — для печатных форм.
Практические рекомендации по организации кода
Держите модули компактными и сфокусированными: один модуль — одна предметная область. Используйте области (#Область ... #КонецОбласти) для структурирования больших модулей: это упрощает навигацию и сворачивание кода в редакторе. В типовых конфигурациях принято делить модуль на области «ПрограммныйИнтерфейс», «СлужебныеПроцедурыИФункции» и т. п. — следование этому стандарту облегчит чтение вашего кода другими разработчиками.
При изучении чужой конфигурации начинайте с общих модулей: именно там сосредоточена бизнес-логика. Поиск по всей конфигурации (Ctrl+Shift+F в конфигураторе) по имени процедуры быстро покажет, откуда она вызывается и в каких модулях есть похожий код.
Перед изменением модуля в рабочей базе всегда делайте выгрузку конфигурации или убедитесь, что есть свежая резервная копия. Ошибка в модуле объекта документа может привести к неверным движениям при проведении, а исправление уже записанных данных — задача куда более трудоёмкая, чем профилактика.
Что важно запомнить
Модуль — это контейнер кода с заданным контекстом исполнения. Вид модуля определяет, где выполняется код и что ему доступно. Универсальную логику размещайте в общих модулях, поведение объекта — в модуле объекта, интерфейсные реакции — в модуле формы, и всегда проверяйте директивы компиляции, слово Экспорт и флаги доступности модуля.
Частые вопросы о модулях в 1С
Чем модуль отличается от процедуры?
Процедура — это отдельный фрагмент кода, выполняющий конкретное действие. Модуль — контейнер, в котором такие процедуры и функции хранятся. Один модуль обычно содержит десятки процедур, объединённых общим назначением.
Сколько общих модулей можно создать в конфигурации?
Количество общих модулей не ограничено платформой. На практике в крупных конфигурациях их сотни. Важнее не число, а осмысленная группировка: каждый модуль должен отвечать за свою предметную область.
Почему моя процедура не вызывается из другого модуля?
Чаще всего причин три: процедура объявлена без ключевого слова Экспорт, общий модуль недоступен в нужном контексте (не стоят флаги «Сервер», «Клиент» или «Вызов сервера») либо допущена опечатка в имени. Проверьте эти три пункта в указанном порядке.
Можно ли выполнить запрос к базе данных из модуля формы?
Да, но только в процедуре с директивой &НаСервере или &НаСервереБезКонтекста. Из клиентской процедуры формы запрос выполнить нельзя — нужно вызвать серверную процедуру, которая выполнит запрос и вернёт результат.
Что такое модуль менеджера объекта и когда он нужен?
Модуль менеджера содержит процедуры, работающие с объектом как с коллекцией, без обращения к конкретному экземпляру: например, функции создания документа, получения печатной формы, подбора данных. Типовые конфигурации активно используют его для механизмов печати и обмена.
Чем отличается &НаСервере от &НаСервереБезКонтекста?
Процедура &НаСервере имеет доступ к данным формы (реквизитам, элементам) и может их изменять. Процедура &НаСервереБезКонтекста работает быстрее и дешевле по ресурсам, но не видит данные формы — всё необходимое нужно передавать через параметры. Для вычислений, не требующих данных формы, предпочтителен второй вариант.