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