Где живёт код 1С: модули конфигурации, расширения и внешние обработки

· 9 мин

Содержание

Модуль 1С — это контейнер для программного кода на встроенном языке. Он всегда к чему-то привязан: к приложению целиком, к справочнику, к форме или к общему набору процедур. Посмотреть модули можно в Конфигураторе: откройте дерево Конфигурация → Открыть конфигурацию, щёлкните правой кнопкой по объекту и выберите нужный модуль.

Путаница начинается, когда бухгалтер просит программиста «поставить модуль». Чаще всего речь идёт не о модуле в строгом смысле, а о готовой доработке: расширении конфигурации (файл .cfe) или внешней обработке (.epf, .erf). Ниже разобраны оба значения: виды модулей внутри конфигурации и способы подключить чужой код к базе, не ломая обновления.

Какие модули есть в конфигурации 1С 8.3

Модули делятся на две группы. Одни отвечают за поведение программы в целом, другие — за конкретный объект.

Модули уровня приложения

  • 🚀 Модуль управляемого приложения — выполняется на клиенте при запуске и закрытии программы в управляемом режиме. Здесь обработчики ПередНачаломРаботыСистемы, ПриНачалеРаботыСистемы, ПередЗавершениемРаботыСистемы.
  • 🖥️ Модуль обычного приложения — то же самое для старого режима «обычных форм». В типовых на «Такси» почти пустой.
  • 🔐 Модуль сеанса — выполняется на сервере при старте сеанса. Обработчик УстановкаПараметровСеанса заполняет параметры сеанса, например текущего пользователя.
  • 🔌 Модуль внешнего соединения — работает, когда к базе подключаются через COM-соединение из другой программы.

Общие модули

Общий модуль — библиотека процедур, которые вызываются из разных мест. В типовых конфигурациях их сотни: ОбщегоНазначения, ОбщегоНазначенияКлиент, ПользователиСервер и так далее. Где модуль будет доступен, задают флажки в его свойствах.

СвойствоЧто даёт
Клиент (управляемое приложение)Процедуры доступны на клиенте
СерверПроцедуры выполняются на сервере
Вызов сервераСерверную процедуру можно вызвать прямо с клиента
Внешнее соединениеДоступ из COM-соединения
ГлобальныйПроцедуры вызываются без имени модуля
ПривилегированныйКод выполняется без проверки прав пользователя
Повторное использование возвращаемых значенийКеш результата: на время вызова или на время сеанса

💡 По суффиксу в имени легко понять назначение: Клиент — клиентский, Сервер — серверный, ВызовСервера — серверный с флажком вызова, ПовтИсп — с кешированием результата. Это соглашение типовых конфигураций, платформа его не требует, но держаться его полезно.

Модули объектов

  • 📄 Модуль объекта — код конкретного элемента справочника или документа. Обработчики ПередЗаписью, ОбработкаПроведения, ОбработкаЗаполнения.
  • 📚 Модуль менеджера — код, который относится ко всему виду объектов, а не к одному экземпляру. Здесь обычно процедуры печати, команды заполнения, выборки.
  • 🧾 Модуль набора записей — у регистров: обработчики записи набора движений.
  • 🪟 Модуль формы — код конкретной формы: реакция на кнопки, изменение полей, открытие и закрытие.
  • ⚙️ Модуль команды — код команды, которую можно разместить в командном интерфейсе.
  • 🔢 Модуль менеджера значения — у констант, аналог модуля объекта.

Если нужно понять, откуда «растёт» поведение документа при проведении, начинайте с модуля объекта, затем смотрите вызываемые из него общие модули.

Внешние обработки и подключаемый код: чем они отличаются от встроенных модулей

Встроенный модуль — часть конфигурации. Изменить его можно только в Конфигураторе, и типовая конфигурация после этого становится «снятой с поддержки» полностью или частично. Каждое следующее обновление придётся объединять вручную.

Внешняя обработка (.epf) или внешний отчёт (.erf) — отдельный файл со своим модулем объекта и формами. Конфигурацию он не меняет, его открывают или регистрируют в базе. Но и возможности у него меньше: внешняя обработка не может добавить новый реквизит в документ, поменять типовую форму или перехватить проведение.

Расширение конфигурации (.cfe) стоит посередине. Оно встраивается в конфигурацию «поверх», может добавлять объекты и реквизиты, менять формы и перехватывать процедуры типовых модулей. При этом сама типовая остаётся на поддержке и обновляется как обычно.

СпособЧто умеетВлияние на обновленияКто ставит
Правка модуля в конфигурацииВсёРучное объединение при каждом обновленииПрограммист
Расширение .cfeНовые объекты, реквизиты, правка форм и процедурОбновление штатное, расширение надо проверитьАдминистратор или программист
Внешняя обработка .epfПечатные формы, заполнение, загрузка, сервисные операцииНе влияетПользователь с правами
Внешний отчёт .erfОтчёты по данным базыНе влияетПользователь с правами
Какая доработка вам нужна?

Как установить расширение и внешнюю обработку

Перед установкой чужого кода сделайте резервную копию базы. Расширение и обработка выполняются с правами пользователя, который их запустил, и могут менять данные.

Расширение из пользовательского режима

В Бухгалтерии 3.0, ЗУП 3.1 и УТ 11 путь одинаковый, так как он идёт из Библиотеки стандартных подсистем:

  1. Откройте Администрирование → Печатные формы, отчеты и обработки.
  2. Перейдите по ссылке Расширения.
  3. Нажмите Добавить из файла и выберите файл .cfe.
  4. Программа покажет предупреждение о безопасности. Убедитесь, что файл получен от доверенного разработчика, и подтвердите.
  5. Перезапустите программу: расширение начнёт работать только в новом сеансе.

В списке расширений есть флажки Активно и Безопасный режим. Если расширение должно писать файлы на диск или обращаться к внешним ресурсам, безопасный режим ему мешает. Снимайте флажок только для проверенных расширений.

Расширение через Конфигуратор

  1. Откройте базу в Конфигураторе.
  2. Меню Конфигурация → Расширения конфигурации.
  3. Нажмите Добавить, затем в меню Конфигурация открытого расширения выберите загрузку из файла.
  4. Выполните Обновить конфигурацию базы данных (F7) для расширения. Без этого шага загруженный .cfe не применится.

Если расширение добавляет реквизиты в справочники и документы, для его применения нужно обновление структуры данных. Делайте это вне рабочего времени: пользователи могут получить сообщение о необходимости перезапуска.

Внешняя обработка

Есть два способа:

  1. Разовое открытие. В главном меню (кнопка с тремя полосками) выберите Файл → Открыть и укажите файл .epf. Обработка откроется в текущем сеансе. Нужно право на интерактивное открытие внешних обработок.
  2. Регистрация в базе. Администрирование → Печатные формы, отчеты и обработки → Дополнительные отчеты и обработки, кнопка Добавить из файла. После регистрации укажите, в каких разделах или документах обработка появится и каким пользователям она доступна.

Регистрировать можно не любую обработку. В модуле объекта должна быть экспортная функция СведенияОВнешнейОбработке(), которая описывает вид обработки и её команды. Если при добавлении программа пишет, что обработка не поддерживает регистрацию, открывайте её разово через меню Файл.

После установки доработки
Выполнено: 0 / 5

Клиент и сервер в коде модулей

В управляемом приложении код выполняется в двух местах: на компьютере пользователя и на сервере 1С. Где именно — задают директивы компиляции перед каждой процедурой модуля формы и команды.

ДирективаГде выполняетсяДоступ к данным формы
&НаКлиентеКлиентЕсть
&НаСервереСерверЕсть, форма передаётся на сервер
&НаСервереБезКонтекстаСерверНет, только параметры
&НаКлиентеНаСервереБезКонтекстаИ там, и тамНет

Главное правило: с клиента нельзя напрямую читать базу. Запросы, обращение к ссылкам за реквизитами, запись объектов — только на сервере. Поэтому типичная пара выглядит так:

&НаКлиенте
Процедура ЗаполнитьСумму(Команда)
	Объект.СуммаДокумента = ПолучитьСуммуНаСервере(Объект.Контрагент);
КонецПроцедуры

&НаСервереБезКонтекста
Функция ПолучитьСуммуНаСервере(Контрагент)
	Запрос = Новый Запрос;
	Запрос.Текст = "ВЫБРАТЬ
	|	СУММА(Т.СуммаДокумента) КАК Сумма
	|ИЗ
	|	Документ.РеализацияТоваровУслуг КАК Т
	|ГДЕ
	|	Т.Контрагент = &Контрагент
	|	И Т.Проведен";
	Запрос.УстановитьПараметр("Контрагент", Контрагент);
	Выборка = Запрос.Выполнить().Выбрать();
	Если Выборка.Следующий() И ЗначениеЗаполнено(Выборка.Сумма) Тогда
		Возврат Выборка.Сумма;
	КонецЕсли;
	Возврат 0;
КонецФункции

💡 &НаСервереБезКонтекста быстрее, чем &НаСервере: на сервер не уходит вся форма со всеми таблицами. Если серверной процедуре нужны два-три значения, передавайте их параметрами.

В модулях объектов и менеджеров директив нет, этот код работает на сервере. Для общих модулей место выполнения задаётся флажками свойств, а внутри модуля можно отделить куски инструкциями препроцессора #Если Сервер Тогда … #КонецЕсли.

Крупные модули удобно делить на области #Область ПрограммныйИнтерфейс … #КонецОбласти. На выполнение это не влияет, но дерево процедур в редакторе сворачивается по областям.

Отладка: как найти ошибку в модуле

Сначала синтаксис. В Конфигураторе в открытом модуле вызовите проверку синтаксиса из меню Текст или контекстного меню. Для всей конфигурации — Конфигурация → Проверка конфигурации: она находит ошибки компиляции, ссылки на удалённые объекты и неиспользуемые процедуры.

Дальше пошаговая отладка:

  1. Откройте модуль и поставьте точку останова на нужной строке клавишей F9.
  2. Запустите Отладка → Начать отладку (F5). Откроется пользовательский режим, подключённый к отладчику.
  3. Выполните действие, которое вызывает ошибку. Программа остановится на точке.
  4. Шагайте по коду: F10 — шаг через процедуру, F11 — шаг внутрь.
  5. Значения переменных смотрите в табло или через Вычислить выражение (Shift+F9).

Для серверного кода в клиент-серверной базе отладка на сервере должна быть разрешена. Служба агента сервера запускается с ключом -debug — это делает администратор сервера.

Изменение параметров запуска службы ragent требует её перезапуска. Все сеансы пользователей на этом сервере оборвутся. Делайте это вне рабочего времени и предупредите пользователей заранее.

Ошибка в расширении часто выглядит как ошибка типовой конфигурации. Чтобы проверить, виновато ли расширение, снимите у него флажок Активно, перезапустите сеанс и повторите действие. Ошибка пропала — разбирайтесь с расширением.

Диагностика: выберите симптом

Права и безопасность кода

Любой внешний код выполняется с правами пользователя. Если бухгалтер с полными правами открыл неизвестную обработку, она может удалить документы или выгрузить данные. Поэтому ограничения стоит настроить заранее.

  • 👤 Право на внешние обработки. В ролях есть права интерактивного открытия внешних отчётов и обработок. В типовых конфигурациях их дают только администраторам. Обычным пользователям — только зарегистрированные обработки.
  • 🛡️ Безопасный режим. Код в безопасном режиме не может работать с файлами, COM-объектами и внешними компонентами. Для расширений он включается флажком, для зарегистрированных обработок — настраивается при регистрации.
  • 🔒 Привилегированный режим. Общий модуль с флажком Привилегированный обходит проверку прав. Кладите туда минимум кода и только то, что действительно должно работать независимо от ролей.
  • 🧱 Защита от опасных действий. Платформа предупреждает при открытии внешнего файла с кодом. Отключать это предупреждение в свойствах пользователя не стоит.
  • 📦 Поставка без исходных текстов. Разработчик может закрыть код своих модулей при поставке конфигурации. Модуль работает, но текст в Конфигураторе не виден.

Храните все установленные расширения и обработки в одной папке с указанием версии и источника. Когда через год что-то сломается после обновления, будет понятно, что и кем ставилось.

Частые вопросы

Можно ли подключить несколько расширений одновременно?
Да. Они применяются в порядке списка. Если два расширения перехватывают одну и ту же процедуру, результат зависит от порядка и логики обоих, поэтому такие пары проверяйте на копии базы.
Чем расширение лучше доработки типовой конфигурации?
Типовая остаётся на поддержке и обновляется штатно. Доработку не надо объединять вручную при каждом релизе, достаточно проверить расширение после обновления.
Где хранится код расширения?
В самой базе данных, а не в файле конфигурации. При выгрузке базы в .dt расширения попадают в выгрузку. Сам файл .cfe после установки можно не держать на диске, но копию лучше сохранить.
Почему код формы не виден в модуле объекта?
Это разные модули. Код формы хранится в модуле самой формы: откройте форму в Конфигураторе и перейдите на вкладку «Модуль».
Можно ли удалить расширение без последствий?
Если расширение добавляло реквизиты, при удалении пропадут и данные в них. Перед удалением сделайте резервную копию и при необходимости выгрузите эти данные.