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

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

Виды программных модулей в 1С: назначение и особенности

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

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

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

Модули приложения и сеанса: точки входа конфигурации

Модуль управляемого приложения (и модуль обычного приложения для старого интерфейса) выполняется при старте и завершении системы. В нём обрабатываются события ПередНачаломРаботыСистемы, ПриНачалеРаботыСистемы, ПередЗавершениемРаботыСистемы. Здесь размещают глобальные переменные клиентского контекста и логику, которая должна отработать один раз при запуске: проверку версии платформы, открытие стартовой формы, подключение обработчиков ожидания.

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

Модуль внешнего соединения используется при подключении к информационной базе через COM-connector или внешнее соединение. В типовых конфигурациях он чаще всего пуст, но для интеграционных сценариев в нём можно инициализировать параметры, необходимые внешней системе.

Общие модули: библиотека прикладного кода

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

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

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

Модули объектов и менеджеров

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

Ключевая особенность: модуль объекта вызывается при любой записи — и из формы, и программно, и при обмене данными. Поэтому всю критичную бизнес-логику (проверки, контроль остатков, формирование движений) размещают именно здесь, а не в форме. Логика в форме сработает только при интерактивной работе пользователя и будет обойдена при загрузке данных из файла или по обмену.

Модуль менеджера объекта существует в единственном экземпляре на вид объекта (например, один для всех документов «Реализация товаров»). В нём размещают обработчики, не привязанные к конкретному экземпляру: ОбработкаПолученияФормы, ОбработкаПолученияДанныхВыбора, печатные процедуры Печать в типовых конфигурациях, функции получения данных по ссылке.

Модуль объекта или модуль менеджера

Модуль объекта

Логика конкретного экземпляра: заполнение, проверки, проведение. Работает с реквизитами через ЭтотОбъект.

Модуль менеджера

Операции над коллекцией или по ссылке без создания объекта: печать, получение представления, подбор данных. Не имеет доступа к реквизитам конкретного экземпляра.

Общий модуль

Логика, общая для нескольких видов объектов: расчёт НДС, работа с курсами валют, служебные функции.

Модули форм и команд

Модуль формы содержит код, работающий с интерфейсом: обработчики событий формы (ПриСозданииНаСервере, ПриОткрытии, ПередЗаписью), обработчики событий элементов и реквизитов. Главная особенность модуля формы — директивы компиляции. Каждая процедура помечается как &НаКлиенте, &НаСервере, &НаСервереБезКонтекста или &НаКлиентеНаСервереБезКонтекста.

Директива &НаСервереБезКонтекста не имеет доступа к данным формы (реквизитам формы-объекта), поэтому вызовы к ней передают данные параметрами — это снижает объём трафика между клиентом и сервером. Директиву &НаКлиентеНаСервереБезКонтекста применяют для простых функций, которые должны компилироваться в обоих контекстах, например форматирование строк.

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

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

&НаСервереБезКонтекста
Процедура ПечатьНаСервере(Ссылка)
    Документы.РеализацияТоваров.Печать(Ссылка);
КонецПроцедуры

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

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

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

Маршрут решения

Как выбрать действие

Код должен срабатывать при любой записи объекта, включая обменыРазместите логику в модуле объекта (ПередЗаписью, ОбработкаПроверкиЗаполнения)
Нужна реакция на действие пользователя в формеИспользуйте модуль формы с подходящей директивой компиляции
Функция нужна нескольким объектам конфигурацииСоздайте общий модуль и объявите метод с ключевым словом Экспорт
Код должен выполниться один раз при входе пользователяИспользуйте модуль сеанса (параметры) или модуль приложения (стартовые действия)
Нужна кнопка в стандартной командной панели объектаСоздайте команду объекта и разместите код в её модуле

Типичные ошибки и ограничения

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

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

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

Типичные ошибки
01
Проверки и расчёты в модуле формы — обходятся при программной записи и обмене данными
02
Серверный общий модуль без флажка Вызов сервера — недоступен из клиентского кода
03
Привилегированный модуль с экспортными методами общего назначения — потенциальный обход прав доступа
04
Изменение типовых модулей вместо расширений — конфликты и потеря доработок при обновлении
05
Обращение к параметрам сеанса до их установки — рекурсивный вызов УстановкаПараметровСеанса

Как проверить, что код размещён правильно

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

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

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

Запись объекта из формы
Норма

Проверки и расчёты срабатывают

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

Логика не выполняется — она не в модуле объекта

Программная запись через Записать()
Норма

Срабатывают те же проверки, что и из формы

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

Документ записывается без контроля — логика осталась в форме

Вызов серверной процедуры с клиента
Норма

Вызов проходит без ошибки компиляции

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

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

Проверка конфигурации в конфигураторе
Норма

Нет ошибок по изменённым модулям

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

Ошибки контекста — неверная директива компиляции

Часто задаваемые вопросы

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

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

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

Да, если процедура объявлена с ключевым словом Экспорт, а у модуля включены подходящие флажки: для вызова с клиента у серверного модуля нужен флажок «Вызов сервера», для клиентского модуля — «Клиент (управляемое приложение)». Вызов выполняется по имени модуля: ИмяМодуля.ИмяПроцедуры().

Зачем нужна директива &НаСервереБезКонтекста?

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

Куда поместить код, который должен выполниться при входе пользователя?

Установку параметров сеанса (текущий пользователь, настройки прав) — в модуль сеанса, обработчик УстановкаПараметровСеанса. Интерактивные действия (открытие начальной страницы, оповещения, подключение обработчиков ожидания) — в модуль управляемого приложения, обработчик ПриНачалеРаботыСистемы.

Что такое подписка на событие и когда она лучше доработки модуля объекта?

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

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

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

Итог

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

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