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

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

Как прописать модуль в 1С: подробная инструкция

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

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

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

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

Какие виды модулей существуют в 1С и какой выбрать

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

Основные виды модулей:

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

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

Как создать общий модуль в конфигураторе

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

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

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

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

Как написать процедуры и функции внутри модуля

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

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

bsl
// Общий модуль РаботаСДокументами, флаги: Сервер, Вызов сервера

Функция ПолучитьСуммуДокумента(ДокументСсылка) Экспорт

	Запрос = Новый Запрос;
	Запрос.Текст = "ВЫБРАТЬ СУММА(Товары.Сумма) КАК Сумма ИЗ Документ.РеализацияТоваров.Товары КАК Товары ГДЕ Товары.Ссылка = &Ссылка";
	Запрос.УстановитьПараметр("Ссылка", ДокументСсылка);

	Выборка = Запрос.Выполнить().Выбрать();
	Если Выборка.Следующий() Тогда
		Возврат Выборка.Сумма;
	Иначе
		Возврат 0;
	КонецЕсли;

КонецФункции

Обратите внимание на несколько правил оформления. Имена процедур пишутся по-русски или транслитом в соответствии со стандартами проекта, но единообразно. Параметры, которые не должны меняться внутри, объявляйте с Знач, чтобы избежать случайной передачи по ссылке. Каждую нетривиальную функцию снабжайте комментарием-описанием — это требование большинства стандартов разработки и существенно упрощает сопровождение.

Если модуль должен работать и в клиентском, и в серверном контексте, используйте инструкции препроцессора #Если Сервер Тогда ... #КонецЕсли либо разделите логику на два модуля — клиентский и серверный. Второй вариант предпочтительнее: смешанные модули сложнее отлаживать.

Как вызвать процедуру модуля из другого кода

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

Для вызова серверной логики из клиентской формы потребуется обертка. В модуле формы создаётся серверная процедура с директивой &НаСервере, которая уже обращается к общему модулю, а клиентский обработчик вызывает эту обёртку. Прямой вызов серверного модуля из клиентского контекста формы возможен только при включённом флаге «Вызов сервера» у общего модуля.

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

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

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

Затем проверьте поведение в режиме предприятия. Удобный способ быстрой отладки — точка останова (F9 на строке) с запуском отладки (F5): можно пошагово пройти код и посмотреть значения переменных. Для серверного кода убедитесь, что в параметрах отладки включена отладка на сервере, иначе точки останова в серверных модулях не сработают.

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

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

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

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

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

Сообщения «Процедура или функция не определена», «Переменная не определена»

Вызов извне
Норма

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

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

Ошибка о недоступности процедуры или несовпадении контекста клиент/сервер

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

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

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

«Нарушение прав доступа» при обращении к объектам — проверьте привилегированный режим и роли

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

Большинство проблем с модулями сводится к неправильному контексту исполнения и видимости процедур. Они диагностируются быстро, если знать, на что смотреть в тексте ошибки.

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

Ограничения и когда нужна помощь опытного разработчика

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

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

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

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

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

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

Три основные причины: у процедуры нет ключевого слова «Экспорт», опечатка в имени модуля или процедуры, либо код вызывается в контексте, где модуль недоступен (например, серверный модуль без флага «Вызов сервера» вызывается с клиента). Проверьте эти три пункта в указанном порядке.

Нужно ли обновлять конфигурацию базы данных после добавления модуля?

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

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

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

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

Включите в конфигураторе «Отладка → Подключение» и убедитесь, что отладка разрешена на сервере (для файловой базы — запуск конфигуратора с ключом отладки, для клиент-серверной — параметр debug в настройках кластера). После этого точки останова в серверных модулях начнут срабатывать.

Что делает флаг «Привилегированный режим» и когда его включать?

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

Итог

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

Модуль в 1С прописывается через конфигуратор: выбирается тип модуля под задачу, задаются флаги контекста (Сервер, Клиент, Вызов сервера), процедуры объявляются с ключевым словом «Экспорт» для внешнего вызова. Результат проверяется синтаксическим контролем и отладкой. Типовые конфигурации дорабатывайте через расширения, а перед изменениями рабочей базы делайте резервную копию.