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