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