Разработка и Конфигурация · 11 мин
Какие существуют модули в 1С и для чего они нужны
Разбираем виды модулей в 1С: общие модули, модули объектов, форм, сеанса, приложения. Рассказываем, зачем нужен каждый модуль, где хранится код и как выбрать правильный.
Модуль в 1С — это контейнер для программного кода на встроенном языке. Вся логика конфигурации: проведение документов, расчёт цен, проверка заполнения реквизитов, обработка нажатий кнопок — написана в модулях. Понимание того, какие виды модулей существуют и где должен находиться тот или иной код, — базовый навык при доработке любой конфигурации.
Модули различаются по двум главным признакам: место исполнения (на клиенте, на сервере или в обоих контекстах) и область видимости (доступен ли код другим объектам конфигурации). От этих свойств зависит, какие данные модуль «видит», какие директивы компиляции ему нужны и как его вызывать.
Неправильный выбор модуля — частая причина ошибок вида «Процедура или функция с указанным именем не определена», лишних серверных вызовов и проблем с обновлением типовых конфигураций. Ниже разобраны все основные виды модулей, их назначение и критерии выбора.
Общие модули: где размещать переиспользуемый код
Общие модули — это библиотеки процедур и функций, доступные из любой точки конфигурации. Они находятся в ветке «Общие» дерева конфигурации и не привязаны к конкретному объекту. Именно здесь принято размещать расчёты, работу со строками, обмены, проверки данных — всё, что используется в нескольких местах.
Ключевые настройки общего модуля задаются в его свойствах. Флажок «Сервер» означает исполнение на сервере, «Клиент (обычное приложение)» и «Клиент (управляемое приложение)» — на клиенте, «Вызов сервера» разрешает вызывать серверный модуль с клиента. Флажок «Привилегированный режим» отключает проверку прав доступа при обращении к данным — его включают только для операций, которые пользователь не должен выполнять напрямую, но которые нужны системе.
Экспортные процедуры и функции (с ключевым словом «Экспорт») видны снаружи и вызываются через имя модуля: ОбщегоНазначения.ЗначениеРеквизитаОбъекта(Ссылка, "Наименование"). Процедуры без «Экспорт» доступны только внутри самого модуля.
Модули объектов и менеджеров
Модуль объекта есть у справочников, документов, планов счетов, регистров и других прикладных объектов. Он исполняется на сервере и содержит обработчики событий самого объекта: ПриЗаписи, ПередЗаписью, ОбработкаПроведения (у документов), ОбработкаЗаполнения, ОбработкаПроверкиЗаполнения. Здесь же размещают экспортные методы, относящиеся к конкретному экземпляру объекта.
Модуль менеджера объекта работает не с конкретной ссылкой, а с объектом «в целом»: здесь размещают функции получения данных (например, ПолучитьДанныеПечати), обработчики формирования представлений, заполнения по умолчанию. Модуль менеджера тоже исполняется на сервере.
Модули форм: клиентский и серверный контекст
Каждая форма (объекта, списка, произвольная) имеет свой модуль. Особенность модуля формы — явное разделение контекста исполнения через директивы компиляции: &НаКлиенте, &НаСервере, &НаСервереБезКонтекста, &НаКлиентеНаСервереБезКонтекста. Если директиву не указать, код будет компилироваться и там, и там, что часто приводит к ошибкам при обращении к недоступным в данном контексте объектам.
Обработчики интерактивных событий — нажатие кнопки, изменение поля, открытие формы — начинают работу на клиенте. Если для обработки нужны данные из базы, клиентская процедура вызывает серверную. Прямой запрос к базе из клиентского контекста невозможен: запросы, обращения к менеджерам объектов и транзакции доступны только на сервере.
&НаКлиенте
Процедура РассчитатьСумму(Команда)
Объект.Сумма = Объект.Количество * Объект.Цена;
КонецПроцедуры
&НаСервереБезКонтекста
Функция ПолучитьЦенуНоменклатуры(Номенклатура)
Возврат РегистрыСведений.ЦеныНоменклатуры.ПолучитьПоследнее(ТекущаяДатаСеанса(), Новый Структура("Номенклатура", Номенклатура)).Цена;
КонецФункцииМодули приложения, сеанса и внешнего соединения
Модуль управляемого приложения (и модуль обычного приложения для старого интерфейса) содержит обработчики событий всего приложения: ПередНачаломРаботыСистемы, ПриНачалеРаботыСистемы, ПриЗавершенииРаботыСистемы, обработку глобальных оповещений и навигационных ссылок. Здесь же объявляют глобальные переменные и экспортные процедуры уровня приложения.
Модуль сеанса существует в единственном экземпляре и содержит единственный обработчик — УстановкаПараметровСеанса. Он выполняется при старте сеанса и заполняет параметры сеанса (текущий пользователь, настройки ограничения доступа). Критично: в этом обработчике нельзя выполнять тяжёлые запросы без проверок — ошибка или долгое выполнение здесь может полностью заблокировать вход пользователей в базу.
Модуль внешнего соединения используется при работе через COM-соединение и в файловом варианте часто совпадает с модулем обычного приложения. В современных конфигурациях на управляемых формах он задействуется редко.
Модули команд и подписок на события
Модуль команды содержит единственный обработчик ОбработкаКоманды — он выполняется при нажатии кнопки команды в интерфейсе. Глобальные общие команды удобны для действий, не привязанных к конкретному объекту: открытие обработки, запуск обмена. Команды объектов получают параметр — ссылку или массив ссылок на выбранные элементы.
Подписки на события позволяют «подключить» свою процедуру к стандартным событиям объектов (ПередЗаписью, ПриЗаписи, ОбработкаПроведения и другим), не меняя модуль самого объекта. Процедура-обработчик подписки размещается в общем модуле. Это основной механизм доработки типовых конфигураций без снятия объектов с поддержки.
Как выбрать правильный модуль для своего кода
Алгоритм выбора простой. Если код относится к конкретному документу или справочнику и работает с его данными — это модуль объекта. Если это получение данных по ссылке без создания объекта — модуль менеджера. Если код реагирует на действия пользователя в форме — модуль формы с правильной директивой. Если процедура нужна в нескольких местах — общий модуль. Если нужно доработать типовое поведение без изменения типового кода — подписка на событие.
Как выбрать действие
Частая ошибка — размещение серверной логики в клиентском модуле формы «с обходом» через вызов общего модуля без флажка «Вызов сервера». В результате код работает в толстом клиенте, но падает в тонком или веб-клиенте. Всегда проверяйте доработку во всех режимах запуска, которые используются в компании.
Проверка результата после доработки
После размещения кода проверьте конфигурацию встроенными средствами: «Конфигурация — Проверка конфигурации» с включённой проверкой логической целостности и поиска некорректных ссылок. Дополнительно полезен синтаксический контроль модулей в режимах «Тонкий клиент» и «Веб-клиент» — он покажет обращения к объектам, недоступным в этих контекстах.
Как проверить результат
Синтакс-контроль проходит без ошибок во всех используемых режимах запуска
Ошибки вида «Переменная не определена» или «объект недоступен в данном контексте»
Вызов ИмяМодуля.Процедура() выполняется, результат возвращается
Ошибка «Процедура или функция с указанным именем не определена» — нет Экспорт или неверный контекст
Под пользователем с ограниченными правами доработка работает как задумано
Нарушение прав доступа либо, наоборот, пользователь видит лишние данные
Открытие и запись формы занимают привычное время
Паузы при каждом действии — признак серверных вызовов в цикле
Что важно запомнить
Модули в 1С делятся на общие, модули объектов и менеджеров, форм, приложения, сеанса и команд. Выбирайте модуль по двум критериям: где исполняется код и к какому объекту он относится. Для доработки типовых конфигураций предпочитайте подписки на события, а привилегированный режим и вызов сервера включайте осознанно.
Часто задаваемые вопросы
Чем общий модуль отличается от модуля объекта?
Общий модуль не привязан к конкретному объекту и содержит универсальные процедуры, доступные отовсюду. Модуль объекта относится к конкретному справочнику или документу, исполняется при работе с его экземпляром и содержит обработчики событий записи и проведения. Код из модуля объекта недоступен без создания или получения объекта.
Почему процедура из общего модуля не видна при вызове?
Чаще всего причина в отсутствии ключевого слова «Экспорт» после объявления процедуры. Также проверьте флажки контекста в свойствах модуля: если процедура вызывается с клиента, а у модуля включён только флажок «Сервер» без «Вызов сервера», вызов невозможен. Третья причина — опечатка в имени модуля или процедуры.
Что означают директивы &НаКлиенте и &НаСервере?
Это директивы компиляции в модулях форм, указывающие платформе, где исполнять процедуру. Клиентский код работает с интерфейсом и данными формы, но не имеет доступа к запросам и базе напрямую. Серверный код работает с данными, но не видит элементы формы напрямую. Директива &НаСервереБезКонтекста делает вызов дешевле, так как не передаёт на сервер данные всей формы.
Можно ли доработать типовую конфигурацию, не снимая её с поддержки?
Да. Основные механизмы — подписки на события (обработчики в собственных общих модулях), расширения конфигурации и переопределяемые процедуры в модулях с постфиксом «Переопределяемый», которые вендор специально оставляет для доработок. Прямое изменение типовых модулей делает обновление трудоёмким и должно быть крайней мерой.
Чем опасен привилегированный режим в общем модуле?
В привилегированном режиме отключается проверка прав доступа к объектам базы данных. Если такой модуль доступен для вызова с клиента, пользователь может через него получить или изменить данные, запрещённые его ролью. Включайте этот режим только для служебных операций и никогда не возвращайте из таких процедур данные, которые пользователь не должен видеть.
Сколько общих модулей должно быть в конфигурации?
Жёсткого ограничения нет, но практичный принцип — один модуль на одну предметную область: работа со строками, обмен с сайтом, расчёты зарплаты. Модули-«свалки» из сотен несвязанных процедур усложняют поиск кода и тестирование. В типовых конфигурациях можно ориентироваться на существующую структуру и добавлять свои модули с префиксом организации.