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

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

Какие существуют модули в 1С и для чего они нужны

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

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

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

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

Общие модули: где размещать переиспользуемый код

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

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

Экспортные процедуры и функции (с ключевым словом «Экспорт») видны снаружи и вызываются через имя модуля: ОбщегоНазначения.ЗначениеРеквизитаОбъекта(Ссылка, "Наименование"). Процедуры без «Экспорт» доступны только внутри самого модуля.

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

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

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

Модули форм: клиентский и серверный контекст

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

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

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

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

Модули приложения, сеанса и внешнего соединения

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

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

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

Модули команд и подписок на события

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

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

Как выбрать правильный модуль для своего кода

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

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

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

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

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

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

Проверка результата после доработки

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

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

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

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

Синтакс-контроль проходит без ошибок во всех используемых режимах запуска

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

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

Доступность процедуры
Норма

Вызов ИмяМодуля.Процедура() выполняется, результат возвращается

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

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

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

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

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

Нарушение прав доступа либо, наоборот, пользователь видит лишние данные

Скорость работы формы
Норма

Открытие и запись формы занимают привычное время

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

Паузы при каждом действии — признак серверных вызовов в цикле

Итог

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

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

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

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

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

Почему процедура из общего модуля не видна при вызове?

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

Что означают директивы &НаКлиенте и &НаСервере?

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

Можно ли доработать типовую конфигурацию, не снимая её с поддержки?

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

Чем опасен привилегированный режим в общем модуле?

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

Сколько общих модулей должно быть в конфигурации?

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