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