Где живёт код 1С: модули конфигурации, расширения и внешние обработки
Содержание
Модуль 1С — это контейнер для программного кода на встроенном языке. Он всегда к чему-то привязан: к приложению целиком, к справочнику, к форме или к общему набору процедур. Посмотреть модули можно в Конфигураторе: откройте дерево Конфигурация → Открыть конфигурацию, щёлкните правой кнопкой по объекту и выберите нужный модуль.
Путаница начинается, когда бухгалтер просит программиста «поставить модуль». Чаще всего речь идёт не о модуле в строгом смысле, а о готовой доработке: расширении конфигурации (файл .cfe) или внешней обработке (.epf, .erf). Ниже разобраны оба значения: виды модулей внутри конфигурации и способы подключить чужой код к базе, не ломая обновления.
Какие модули есть в конфигурации 1С 8.3
Модули делятся на две группы. Одни отвечают за поведение программы в целом, другие — за конкретный объект.
Модули уровня приложения
- 🚀 Модуль управляемого приложения — выполняется на клиенте при запуске и закрытии программы в управляемом режиме. Здесь обработчики
ПередНачаломРаботыСистемы,ПриНачалеРаботыСистемы,ПередЗавершениемРаботыСистемы. - 🖥️ Модуль обычного приложения — то же самое для старого режима «обычных форм». В типовых на «Такси» почти пустой.
- 🔐 Модуль сеанса — выполняется на сервере при старте сеанса. Обработчик
УстановкаПараметровСеансазаполняет параметры сеанса, например текущего пользователя. - 🔌 Модуль внешнего соединения — работает, когда к базе подключаются через COM-соединение из другой программы.
Общие модули
Общий модуль — библиотека процедур, которые вызываются из разных мест. В типовых конфигурациях их сотни: ОбщегоНазначения, ОбщегоНазначенияКлиент, ПользователиСервер и так далее. Где модуль будет доступен, задают флажки в его свойствах.
| Свойство | Что даёт |
|---|---|
Клиент (управляемое приложение) | Процедуры доступны на клиенте |
Сервер | Процедуры выполняются на сервере |
Вызов сервера | Серверную процедуру можно вызвать прямо с клиента |
Внешнее соединение | Доступ из COM-соединения |
Глобальный | Процедуры вызываются без имени модуля |
Привилегированный | Код выполняется без проверки прав пользователя |
Повторное использование возвращаемых значений | Кеш результата: на время вызова или на время сеанса |
💡 По суффиксу в имени легко понять назначение: Клиент — клиентский, Сервер — серверный, ВызовСервера — серверный с флажком вызова, ПовтИсп — с кешированием результата. Это соглашение типовых конфигураций, платформа его не требует, но держаться его полезно.
Модули объектов
- 📄 Модуль объекта — код конкретного элемента справочника или документа. Обработчики
ПередЗаписью,ОбработкаПроведения,ОбработкаЗаполнения. - 📚 Модуль менеджера — код, который относится ко всему виду объектов, а не к одному экземпляру. Здесь обычно процедуры печати, команды заполнения, выборки.
- 🧾 Модуль набора записей — у регистров: обработчики записи набора движений.
- 🪟 Модуль формы — код конкретной формы: реакция на кнопки, изменение полей, открытие и закрытие.
- ⚙️ Модуль команды — код команды, которую можно разместить в командном интерфейсе.
- 🔢 Модуль менеджера значения — у констант, аналог модуля объекта.
Если нужно понять, откуда «растёт» поведение документа при проведении, начинайте с модуля объекта, затем смотрите вызываемые из него общие модули.
Внешние обработки и подключаемый код: чем они отличаются от встроенных модулей
Встроенный модуль — часть конфигурации. Изменить его можно только в Конфигураторе, и типовая конфигурация после этого становится «снятой с поддержки» полностью или частично. Каждое следующее обновление придётся объединять вручную.
Внешняя обработка (.epf) или внешний отчёт (.erf) — отдельный файл со своим модулем объекта и формами. Конфигурацию он не меняет, его открывают или регистрируют в базе. Но и возможности у него меньше: внешняя обработка не может добавить новый реквизит в документ, поменять типовую форму или перехватить проведение.
Расширение конфигурации
(.cfe) стоит посередине. Оно встраивается в конфигурацию «поверх», может добавлять объекты и реквизиты, менять формы и перехватывать процедуры типовых модулей. При этом сама типовая остаётся на поддержке и обновляется как обычно.
| Способ | Что умеет | Влияние на обновления | Кто ставит |
|---|---|---|---|
| Правка модуля в конфигурации | Всё | Ручное объединение при каждом обновлении | Программист |
Расширение .cfe | Новые объекты, реквизиты, правка форм и процедур | Обновление штатное, расширение надо проверить | Администратор или программист |
Внешняя обработка .epf | Печатные формы, заполнение, загрузка, сервисные операции | Не влияет | Пользователь с правами |
Внешний отчёт .erf | Отчёты по данным базы | Не влияет | Пользователь с правами |
Как установить расширение и внешнюю обработку
Перед установкой чужого кода сделайте резервную копию базы. Расширение и обработка выполняются с правами пользователя, который их запустил, и могут менять данные.
Расширение из пользовательского режима
В Бухгалтерии 3.0, ЗУП 3.1 и УТ 11 путь одинаковый, так как он идёт из Библиотеки стандартных подсистем:
- Откройте
Администрирование → Печатные формы, отчеты и обработки. - Перейдите по ссылке
Расширения. - Нажмите
Добавить из файлаи выберите файл.cfe. - Программа покажет предупреждение о безопасности. Убедитесь, что файл получен от доверенного разработчика, и подтвердите.
- Перезапустите программу: расширение начнёт работать только в новом сеансе.
В списке расширений есть флажки Активно и Безопасный режим. Если расширение должно писать файлы на диск или обращаться к внешним ресурсам, безопасный режим ему мешает. Снимайте флажок только для проверенных расширений.
Расширение через Конфигуратор
- Откройте базу в Конфигураторе.
- Меню
Конфигурация → Расширения конфигурации. - Нажмите
Добавить, затем в менюКонфигурацияоткрытого расширения выберите загрузку из файла. - Выполните
Обновить конфигурацию базы данных(F7) для расширения. Без этого шага загруженный.cfeне применится.
Если расширение добавляет реквизиты в справочники и документы, для его применения нужно обновление структуры данных. Делайте это вне рабочего времени: пользователи могут получить сообщение о необходимости перезапуска.
Внешняя обработка
Есть два способа:
- Разовое открытие. В главном меню (кнопка с тремя полосками) выберите
Файл → Открытьи укажите файл.epf. Обработка откроется в текущем сеансе. Нужно право на интерактивное открытие внешних обработок. - Регистрация в базе.
Администрирование → Печатные формы, отчеты и обработки → Дополнительные отчеты и обработки, кнопкаДобавить из файла. После регистрации укажите, в каких разделах или документах обработка появится и каким пользователям она доступна.
Регистрировать можно не любую обработку. В модуле объекта должна быть экспортная функция СведенияОВнешнейОбработке(), которая описывает вид обработки и её команды. Если при добавлении программа пишет, что обработка не поддерживает регистрацию, открывайте её разово через меню Файл.
Клиент и сервер в коде модулей
В управляемом приложении код выполняется в двух местах: на компьютере пользователя и на сервере 1С. Где именно — задают директивы компиляции перед каждой процедурой модуля формы и команды.
| Директива | Где выполняется | Доступ к данным формы |
|---|---|---|
&НаКлиенте | Клиент | Есть |
&НаСервере | Сервер | Есть, форма передаётся на сервер |
&НаСервереБезКонтекста | Сервер | Нет, только параметры |
&НаКлиентеНаСервереБезКонтекста | И там, и там | Нет |
Главное правило: с клиента нельзя напрямую читать базу. Запросы, обращение к ссылкам за реквизитами, запись объектов — только на сервере. Поэтому типичная пара выглядит так:
&НаКлиенте
Процедура ЗаполнитьСумму(Команда)
Объект.СуммаДокумента = ПолучитьСуммуНаСервере(Объект.Контрагент);
КонецПроцедуры
&НаСервереБезКонтекста
Функция ПолучитьСуммуНаСервере(Контрагент)
Запрос = Новый Запрос;
Запрос.Текст = "ВЫБРАТЬ
| СУММА(Т.СуммаДокумента) КАК Сумма
|ИЗ
| Документ.РеализацияТоваровУслуг КАК Т
|ГДЕ
| Т.Контрагент = &Контрагент
| И Т.Проведен";
Запрос.УстановитьПараметр("Контрагент", Контрагент);
Выборка = Запрос.Выполнить().Выбрать();
Если Выборка.Следующий() И ЗначениеЗаполнено(Выборка.Сумма) Тогда
Возврат Выборка.Сумма;
КонецЕсли;
Возврат 0;
КонецФункции
💡 &НаСервереБезКонтекста быстрее, чем &НаСервере: на сервер не уходит вся форма со всеми таблицами. Если серверной процедуре нужны два-три значения, передавайте их параметрами.
В модулях объектов и менеджеров директив нет, этот код работает на сервере. Для общих модулей место выполнения задаётся флажками свойств, а внутри модуля можно отделить куски инструкциями препроцессора #Если Сервер Тогда … #КонецЕсли.
Крупные модули удобно делить на области #Область ПрограммныйИнтерфейс … #КонецОбласти. На выполнение это не влияет, но дерево процедур в редакторе сворачивается по областям.
Отладка: как найти ошибку в модуле
Сначала синтаксис. В Конфигураторе в открытом модуле вызовите проверку синтаксиса из меню Текст или контекстного меню. Для всей конфигурации — Конфигурация → Проверка конфигурации: она находит ошибки компиляции, ссылки на удалённые объекты и неиспользуемые процедуры.
Дальше пошаговая отладка:
- Откройте модуль и поставьте точку останова на нужной строке клавишей F9.
- Запустите
Отладка → Начать отладку(F5). Откроется пользовательский режим, подключённый к отладчику. - Выполните действие, которое вызывает ошибку. Программа остановится на точке.
- Шагайте по коду: F10 — шаг через процедуру, F11 — шаг внутрь.
- Значения переменных смотрите в табло или через
Вычислить выражение(Shift+F9).
Для серверного кода в клиент-серверной базе отладка на сервере должна быть разрешена. Служба агента сервера запускается с ключом -debug — это делает администратор сервера.
Изменение параметров запуска службы ragent требует её перезапуска. Все сеансы пользователей на этом сервере оборвутся. Делайте это вне рабочего времени и предупредите пользователей заранее.
Ошибка в расширении часто выглядит как ошибка типовой конфигурации. Чтобы проверить, виновато ли расширение, снимите у него флажок Активно, перезапустите сеанс и повторите действие. Ошибка пропала — разбирайтесь с расширением.
Права и безопасность кода
Любой внешний код выполняется с правами пользователя. Если бухгалтер с полными правами открыл неизвестную обработку, она может удалить документы или выгрузить данные. Поэтому ограничения стоит настроить заранее.
- 👤 Право на внешние обработки. В ролях есть права интерактивного открытия внешних отчётов и обработок. В типовых конфигурациях их дают только администраторам. Обычным пользователям — только зарегистрированные обработки.
- 🛡️ Безопасный режим. Код в безопасном режиме не может работать с файлами, COM-объектами и внешними компонентами. Для расширений он включается флажком, для зарегистрированных обработок — настраивается при регистрации.
- 🔒 Привилегированный режим. Общий модуль с флажком
Привилегированныйобходит проверку прав. Кладите туда минимум кода и только то, что действительно должно работать независимо от ролей. - 🧱 Защита от опасных действий. Платформа предупреждает при открытии внешнего файла с кодом. Отключать это предупреждение в свойствах пользователя не стоит.
- 📦 Поставка без исходных текстов. Разработчик может закрыть код своих модулей при поставке конфигурации. Модуль работает, но текст в Конфигураторе не виден.
Храните все установленные расширения и обработки в одной папке с указанием версии и источника. Когда через год что-то сломается после обновления, будет понятно, что и кем ставилось.
Частые вопросы
Можно ли подключить несколько расширений одновременно?
Чем расширение лучше доработки типовой конфигурации?
Где хранится код расширения?
.dt расширения попадают в выгрузку. Сам файл .cfe после установки можно не держать на диске, но копию лучше сохранить.