К статье
Практический материал

Разработка и Конфигурация · 10 мин

Что такое модули в 1С и как с ними работать

Разбираем, что такое модули в 1С: виды модулей конфигурации, где хранится код, чем общие модули отличаются от модулей объектов и как безопасно их изменять.

Модуль в 1С — это контейнер для программного кода на встроенном языке платформы. Вся логика конфигурации: расчёт проводок, проверка заполнения документов, формирование печатных форм, обмен данными — написана именно в модулях. Без них конфигурация была бы просто набором таблиц и экранных форм без какого-либо поведения.

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

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

Какие виды модулей существуют в конфигурации 1С

Платформа 1С:Предприятие делит модули по месту их расположения в дереве конфигурации. Каждый вид привязан к определённому объекту и решает свою задачу.

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

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

Модуль приложения (в обычном приложении — модуль обычного приложения) содержит обработчики событий запуска и завершения системы: что происходит при старте сеанса пользователя. Модуль сеанса выполняется один раз при установке соединения и обычно задаёт параметры сеанса — например, текущего пользователя для механизма ограничения доступа. Есть также модули менеджеров объектов, внешних соединений и команд — они применяются реже и в специальных сценариях.

Общие модули: флажки и правила размещения кода

У каждого общего модуля в свойствах есть набор флажков, которые определяют, где он компилируется и откуда доступен. Ключевые из них: «Сервер», «Клиент (управляемое приложение)», «Клиент (обычное приложение)», «Внешнее соединение», «Вызов сервера», «Привилегированный режим».

Модуль с установленным флажком «Сервер» компилируется на сервере и может обращаться к базе данных напрямую. Клиентский модуль работает в интерфейсе пользователя и не имеет прямого доступа к данным — только через вызовы серверных процедур. Если в клиентском модуле попытаться выполнить запрос к базе, конфигуратор выдаст ошибку ещё на этапе проверки.

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

Клиент и сервер: почему место кода имеет значение

В управляемом приложении платформа жёстко разделяет исполнение кода между клиентом и сервером. Работа с базой данных — запросы, запись объектов, проведение документов — возможна только на сервере. Клиент отвечает за интерфейс: формы, предупреждения, диалоги выбора файлов.

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

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

bsl
&НаКлиенте
Процедура РассчитатьИтог(Команда)
	Итог = РассчитатьИтогНаСервере(Объект.Ссылка);
	ПоказатьПредупреждение(, "Итог: " + Итог);
КонецПроцедуры

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

Как найти нужный модуль и внести изменение безопасно

Чтобы понять, где находится код, отвечающий за конкретное поведение, начните с объекта. Если проблема в проведении документа — откройте конфигуратор, найдите документ в дереве конфигурации и откройте его модуль объекта, раздел «ОбработкаПроведения». Если ошибка в кнопке на форме — ищите обработчик в модуле формы.

Глобальный поиск по конфигурации (Ctrl+Shift+F в конфигураторе) находит процедуру по имени или фрагменту текста во всех модулях сразу. Это быстрый способ понять, откуда вызывается нужная функция и не продублирована ли она.

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

Порядок безопасного изменения модуля
  1. 1
    Сделайте копию информационной базы или выгрузите конфигурацию в файл
  2. 2
    Найдите нужный модуль через дерево конфигурации или глобальный поиск
  3. 3
    Проверьте, можно ли решить задачу расширением вместо правки типового кода
  4. 4
    Внесите изменение и выполните проверку конфигурации (Конфигурация — Проверка конфигурации)
  5. 5
    Обновите конфигурацию базы данных и протестируйте сценарий на копии
  6. 6
    Только после успешной проверки переносите изменение в рабочую базу

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

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

Вторая ошибка — чрезмерное число вызовов сервера из клиентского кода в цикле. Каждый вызов — это обращение по сети, и при сотнях итераций форма заметно «зависает». Решение — собрать данные на клиенте и передать их на сервер одним вызовом.

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

Типичные ошибки
01
Код в модуле формы вместо общего модуля — логику нельзя переиспользовать, она дублируется и расходится между копиями
02
Запрос к базе в клиентском контексте — ошибка компиляции или падение при выполнении
03
Правка типового модуля без расширения — потеря поддержки и конфликты при обновлении
04
Включённый привилегированный режим без необходимости — обход прав доступа пользователей
05
Множественные вызовы сервера в цикле — резкое падение скорости работы формы

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

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

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

Контрольные точки

Как проверить результат

Компиляция модуля
Норма

Проверка конфигурации завершается без ошибок по изменённому модулю

Тревожный признак

Ошибки вида «Процедура или функция не обнаружена» — проблема с контекстом или флажками модуля

Выполнение сценария
Норма

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

Тревожный признак

Исключение при выполнении или неверные данные в результате

Права доступа
Норма

Пользователь с ограниченными правами не получает доступ к закрытым данным

Тревожный признак

После включения привилегированного режима открылись данные, недоступные ранее

FAQ: частые вопросы о модулях 1С

Чем общий модуль отличается от модуля объекта?

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

Почему моя процедура «не обнаружена» при вызове?

Чаще всего процедура не объявлена с ключевым словом «Экспорт», либо модуль скомпилирован не в том контексте: например, вы вызываете серверную процедуру с клиента, но у модуля не установлен флажок «Вызов сервера». Проверьте также точное имя модуля и процедуры.

Можно ли изменять модули типовой конфигурации?

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

Что делает флажок «Привилегированный режим» у общего модуля?

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

Где искать код, который срабатывает при запуске программы?

В модуле приложения — обработчик «ПриНачалеРаботыСистемы». Если нужно выполнить действие один раз при установке соединения до входа пользователя в интерфейс, смотрите модуль сеанса и обработчик установки параметров сеанса.

Чем модуль формы отличается от модуля команды?

Модуль формы обрабатывает события конкретной формы и имеет доступ к её реквизитам и элементам. Модуль команды содержит только обработчик выполнения команды интерфейса и не привязан к данным какой-либо формы — он подходит для простых действий вроде открытия обработки.

Итог

Что важно запомнить

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