Разработка и Конфигурация · 13 мин
Как создавать модули в 1С: виды, настройка и практика
Как создавать модули в 1С: виды модулей, общие модули, модули форм и объектов, директивы компиляции, типичные ошибки и проверка работоспособности кода.
Модуль в 1С — это контейнер для кода на встроенном языке, который привязан к конкретному объекту конфигурации или существует как самостоятельная единица. Вся бизнес-логика прикладного решения — расчёты, проверки, обработчики событий — размещается именно в модулях, поэтому умение правильно их создавать и структурировать определяет качество всей конфигурации.
Начинающие разработчики часто сталкиваются с одними и теми же проблемами: код не виден из других объектов, процедура вызывается не на той стороне (клиент вместо сервера), при обновлении конфигурации возникают ошибки компиляции. Все эти ситуации связаны с непониманием типов модулей и правил их компиляции.
Ниже разобраны виды модулей, практические шаги создания общего модуля, работа с директивами компиляции, а также типичные ошибки и способы проверки результата. Материал ориентирован на платформу 1С:Предприятие 8.3 и управляемые формы.
Какие виды модулей существуют в 1С и когда их использовать
Платформа 1С предоставляет несколько типов модулей, каждый из которых выполняется в своём контексте. Выбор неправильного типа — самая частая причина ошибок вида «Процедура или функция с указанным именем не определена».
Основные виды модулей:
- Общие модули — независимые хранилища процедур и функций, доступные из любого места конфигурации. Именно их обычно имеют в виду, когда говорят «создать модуль».
- Модуль объекта — код, относящийся к конкретному справочнику, документу или другому прикладному объекту: обработчики проведения, заполнения, проверки.
- Модуль формы — логика интерфейса: обработчики событий элементов, команды формы, работа с данными на клиенте.
- Модуль менеджера — код, работающий с объектом как с коллекцией (получение ссылок, печатные формы, обработка получения данных выбора).
- Модуль приложения и модуль сеанса — служебные модули верхнего уровня: обработчики запуска системы, установка параметров сеанса.
- Модуль команды — обработчик команды, привязанной к объекту или общей команды.
Практическое правило: если процедура нужна в нескольких объектах — выносите её в общий модуль. Если логика относится только к одному документу — оставляйте в модуле объекта. Дублирование одинакового кода в модулях объектов разных документов — прямой путь к ошибкам при доработках.
Как создать общий модуль: пошаговая инструкция
Создание общего модуля выполняется в конфигураторе и занимает несколько минут. Важно сразу правильно задать свойства, потому что от них зависит, где будет компилироваться и выполняться код.
- 1Откройте конфигуратор и разверните в дереве конфигурации ветку «Общие → Общие модули».
- 2Нажмите кнопку «Добавить» (или Insert) и задайте имя модуля латиницей без пробелов, например РаботаСДокументами.
- 3В палитре свойств установите флаги контекста: «Сервер» — для серверного кода, «Клиент (управляемое приложение)» — для клиентского.
- 4Если модуль серверный и его процедуры должны вызываться с клиента — включите флаг «Вызов сервера».
- 5Откройте закладку «Модуль» в окне редактирования и добавьте процедуры и функции, помечая публичные словом «Экспорт».
- 6Сохраните конфигурацию (F7) и выполните синтаксическую проверку модуля.
Пример простейшего серверного общего модуля:
// Общий модуль РаботаСДокументами, флаги: Сервер, Вызов сервера
Функция ПолучитьНомерДокумента(ДокументСсылка) Экспорт
Возврат ОбщегоНазначения.ЗначениеРеквизитаОбъекта(ДокументСсылка, "Номер");
КонецФункции
Процедура ЗаписатьСобытиеВЖурнал(ТекстСобытия) Экспорт
ЗаписьЖурналаРегистрации("РаботаСДокументами",
УровеньЖурналаРегистрации.Информация, , , ТекстСобытия);
КонецПроцедуры
Имя модуля становится частью пространства имён: вызов процедуры выглядит как РаботаСДокументами.ЗаписатьСобытиеВЖурнал("Текст"). Поэтому имя должно быть осмысленным и отражать область ответственности модуля.
Как настроить флаги компиляции и директивы
Флаги в свойствах общего модуля определяют, на какой стороне — клиенте или сервере — будет скомпилирован и выполнен его код. В тонком клиенте и веб-клиенте это критично: обращение к серверным данным напрямую с клиента невозможно.
| Флаг | Где выполняется код | Когда включать |
|---|---|---|
| Сервер | На сервере 1С | Запросы к базе, проведение, любая работа с данными |
| Клиент (управляемое приложение) | На клиенте | Диалоги, работа с файлами пользователя, интерфейсная логика |
| Вызов сервера | — | Обязательно, если серверный модуль вызывается с клиента |
| Привилегированный режим | На сервере без проверки прав | Когда код должен работать независимо от прав пользователя |
Внутри модулей формы и в общих модулях с несколькими контекстами используются директивы компиляции: &НаКлиенте, &НаСервере, &НаСервереБезКонтекста, &НаКлиентеНаСервереБезКонтекста. Директива ставится перед объявлением процедуры и указывает компилятору, где этот код должен существовать.
Распространённая ошибка — пометить директивой &НаКлиенте процедуру, которая обращается к запросу или менеджеру объекта. На клиенте эти типы недоступны, и при сохранении или запуске вы получите ошибку компиляции. Весь код, работающий с базой данных, должен быть на сервере.
Как организовать код: процедуры, функции и области
Внутри модуля код делится на разделы: объявление переменных, процедуры и функции, основная программа (выполняется при инициализации модуля). В общих модулях раздел основной программы обычно пуст — вся логика вызывается извне.
Типовые соглашения, которые упрощают сопровождение:
- Экспортные процедуры и функции размещайте в области
#Область ПрограммныйИнтерфейс— это публичный API модуля. - Внутренние вспомогательные процедуры (без слова Экспорт) — в области
СлужебныеПроцедурыИФункции. - Один модуль — одна область ответственности. Не смешивайте в одном модуле работу с почтой, расчёт зарплаты и печать документов.
- Функции именуйте так, чтобы имя отвечало на вопрос «что возвращает»: ПолучитьКурсВалюты, СформироватьТаблицуОстатков.
Области (#Область ... #КонецОбласти) не влияют на выполнение кода, но позволяют сворачивать блоки в редакторе и упрощают навигацию в модулях из сотен строк. В типовых конфигурациях эта структура стандартизирована, и её стоит придерживаться даже в собственных разработках.
Если общий модуль разрастается свыше нескольких сотен строк, это признак того, что его пора разделить на несколько модулей по функциональному признаку. Большие модули дольше компилируются, труднее тестируются и чаще становятся источником конфликтов при командной разработке и слиянии изменений.
Как создать модуль формы и модуль объекта
Модуль формы создаётся автоматически вместе с формой объекта. Чтобы открыть его, в дереве конфигурации выберите объект, перейдите на закладку «Формы», откройте нужную форму и переключитесь на закладку «Модуль» в нижней части редактора. Здесь размещаются обработчики событий формы (ПриСозданииНаСервере, ПриОткрытии) и команд.
Модуль объекта открывается через палитру свойств объекта: закладка «Прочее» → кнопка «Модуль объекта», либо через контекстное меню объекта в дереве конфигурации. В нём размещаются обработчики жизненного цикла объекта: ОбработкаЗаполнения, ПередЗаписью, ОбработкаПроведения, ОбработкаПроверкиЗаполнения.
Пример обработчика в модуле документа:
Процедура ОбработкаПроведения(Отказ, РежимПроведения)
Если Товары.Количество() = 0 Тогда
Отказ = Истина;
Возврат;
КонецЕсли;
// Формирование движений по регистрам
Движения.ОстаткиТоваров.Записывать = Истина;
КонецПроцедуры
Ключевое отличие: в модуле объекта доступны реквизиты объекта напрямую по имени (Товары, Дата, Номер), а в модуле формы данные объекта доступны через реквизит формы, обычно Объект. Попытка обратиться к реквизитам объекта в общем модуле без передачи ссылки или структуры данных — типичная ошибка новичков.
Как проверить работоспособность модуля
После создания модуля необходимо убедиться, что код компилируется и вызывается корректно. Минимальный набор проверок:
- Выполните синтаксическую проверку модуля: меню «Конфигурация → Проверка конфигурации» или кнопка проверки в редакторе модуля. Ошибки компиляции будут показаны с указанием строки.
- Сохраните конфигурацию (F7) и обновите конфигурацию базы данных, если менялись метаданные.
- Запустите режим предприятия и вызовите процедуру из реального сценария: проведите документ, откройте форму, выполните команду.
- Проверьте вызов с клиента серверной процедуры, если включён флаг «Вызов сервера»: убедитесь, что не возникает ошибка «Вызов сервера запрещён».
- При необходимости используйте отладчик: установите точку останова (F9) внутри процедуры и запустите отладку (F5), чтобы проследить выполнение по шагам.
Как проверить результат
Ошибок нет, модуль компилируется
Сообщения об ошибках с указанием строки — исправьте до сохранения
Процедура находится по имени Модуль.Процедура()
Ошибка «Процедура не определена» — проверьте слово Экспорт и флаги контекста
Серверная функция выполняется и возвращает значение
Ошибка о запрете вызова сервера — включите флаг «Вызов сервера»
Точка останова срабатывает, переменные видны
Точка не срабатывает — код выполняется на другой стороне или не вызывается
Типичные ошибки при создании модулей
Большинство проблем с модулями сводится к нескольким повторяющимся сценариям. Знание их заранее экономит часы отладки.
Отдельно стоит упомянуть циклические вызовы: модуль А вызывает процедуру модуля Б, а модуль Б — процедуру модуля А. Платформа обычно справляется с такими зависимостями, но при повторном использовании значений (функциональные опции, повторное использование) циклические ссылки могут приводить к ошибкам инициализации. Если возникла подобная проблема — выделите общую логику в третий модуль.
Что важно запомнить
Переиспользуемый код размещайте в общих модулях с продуманными флагами контекста, логику конкретного объекта — в модуле объекта, интерфейсную — в модуле формы. Публичные процедуры помечайте словом «Экспорт», серверные вызовы с клиента — флагом «Вызов сервера», а результат всегда проверяйте синтаксической проверкой и отладкой.
Частые вопросы о модулях в 1С
Чем общий модуль отличается от модуля объекта?
Общий модуль не привязан к конкретному объекту и доступен из любого места конфигурации через имя модуля. Модуль объекта исполняется только в контексте конкретного элемента или документа и имеет прямой доступ к его реквизитам. Общую для разных объектов логику выносят в общие модули.
Почему процедура общего модуля «не определена» при вызове?
Чаще всего причины три: у процедуры отсутствует слово «Экспорт», у модуля не включён нужный контекст (например, вызов идёт с клиента, а флаг «Клиент» или «Вызов сервера» не установлен), либо конфигурация не сохранена. Проверьте эти три пункта в указанном порядке.
Что означает флаг «Вызов сервера»?
Этот флаг разрешает вызывать процедуры серверного общего модуля с клиента. Без него платформа блокирует такие вызовы в тонком и веб-клиенте. Включайте его только для модулей, которые действительно должны принимать вызовы с клиента, и проверяйте входные параметры.
Можно ли вызывать клиентскую процедуру с сервера?
Нет, напрямую это невозможно: сервер не имеет доступа к клиентскому контексту. Обратное взаимодействие реализуется через оповещения (Оповестить), возврат значений из серверных функций или асинхронные механизмы платформы.
Как правильно именовать общие модули?
Имя задаётся латиницей без пробелов и должно отражать назначение: РаботаСПочтой, РасчетЦен, ОбменДанными. В типовых конфигурациях приняты суффиксы: Клиент — для клиентских модулей, Переопределяемый — для модулей, предназначенных для доработки. Придерживайтесь единого стиля во всей конфигурации.
Где размещать код обработчика проведения документа?
Обработчик ОбработкаПроведения размещается в модуле объекта документа — он выполняется на сервере и имеет доступ к движениям и реквизитам. Если логика проведения объёмная, из обработчика вызывают процедуры общего серверного модуля, передавая ссылку или данные документа.