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