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