Ошибка 1с модуль объекта 1с

Обновлено: 06.07.2024

Использование модуля объекта, модуля менеджера объекта и общих модулей

Область применения: управляемое приложение, мобильное приложение, обычное приложение.

Методическая рекомендация (полезный совет)

1. Модуль объекта предназначен для реализации поведения отдельного экземпляра объекта ( СправочникОбъект , ДокументОбъект и т.п.). В модуле объекта размещаются процедуры и функции, которые работают с данными объекта ( ЭтотОбъект и переменные модуля объекта), в том числе когда он еще не записан в информационную базу.

Например, в модуле объекта могут размещаться:

  • обработчики событий объекта
  • процедуры заполнения экземпляра объекта.

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

2. Модуль менеджера объекта предназначен для размещения "статической" функциональности, которая логически неразрывно связана с объектом метаданных, но не зависит от состояния конкретного экземпляра объекта данных. Это могут быть процедуры и функции:

  • относящиеся не к одному, а сразу к некоторой совокупности объектов. Например, это функции для вывода на печать списка объектов; функции, возвращающие информацию, общую для всех экземпляров объекта метаданных; процедуры обновления данных информационной базы, которые связаны с объектом метаданных; и т.п.
  • которые работают с объектом, записанным в ИБ. В таких функциях входным параметром является ссылка на объект. Например, это функции для получения печатной формы по ссылке на объект, процедуры формирования движений по ссылке на объект и т.п.

Для выполнения функций модуля менеджера объекта не должен требоваться экземпляр объекта данных ( СправочникОбъект , ДокументОбъект и т.п.).

3. Если функциональность невозможно однозначно отнести к тому или иному объекту метаданных, то она является логически общей для нескольких объектов. В этом случае ее следует размещать в общем модуле .


Модуль объекта есть почти у всех основных прикладных объектов конфигурации в 1С.


Также модуль объекта можно открыть из контекстного меню объекта:


Или из меню Действия:


Модуль объекта выполняется при создании объекта. В нем можно объявлять переменные модуля. Экспортные процедуры и функции можно вызывать у созданных программных объектов. К экспортным переменным можно обращаться как к свойствам программных объектов. В модуле есть прямой доступ к реквизитам и табличным частям объекта.

Вызов методов модуля объекта


В модуле объекта напишем следующий код:

Теперь создадим обработку с одной формой и в модуле обработки в событии ПриСозданииНаСервере напишем следующий код:

Процедура ПриСозданииНаСервере ( Отказ , СтандартнаяОбработка ) ОбъектНоменклатура = Справочники . Номенклатура . СоздатьЭлемент ( ) ; //заполняем экспортную переменную модуля объекта вызвав экспортную функцию ОбъектНоменклатура . ОбщийОстаток = ОбъектНоменклатура . ОбщийОстаток ( ) ;

Здесь мы сначала создаем новый программный объект справочника Номенклатура вызвав встроенный метод Справочники.Номенклатура.СоздатьЭлемент(). Потом через ссылку на этот объект обращаемся к экспортным переменной и функции объекта.

Теперь поменяем код в модуле формы обработки на следующий:

Процедура ПриСозданииНаСервере ( Отказ , СтандартнаяОбработка ) ОбъектНоменклатура = Справочники . Номенклатура . СоздатьЭлемент ( ) ; //пытаемся заполнить переменную модуля объекта вызвав функцию модуля объекта ОбъектНоменклатура . ПолноеНаименование = ОбъектНоменклатура . ПолноеНаименованиеНоменклатуры ( ) ; Сообщить ( ОбъектНоменклатура . ПолноеНаименование ) ; //ошибка

Здесь мы делаем все то же самое, но обращаемся к не экспортным переменной и функции.


Так как переменная ПолноеНаименование не является экспортной, то к ней нет доступа из других модулей.

Теперь попробуем обратиться к не экспортной функции модуля объекта. Вставим в модуль формы следующий код и откроем обработку:

Процедура ПриСозданииНаСервере ( Отказ , СтандартнаяОбработка ) ОбъектНоменклатура = Справочники . Номенклатура . СоздатьЭлемент ( ) ; Сообщить ( ОбъектНоменклатура . ПолноеНаименованиеНоменклатуры ( ) ) ; //опять ошибка


Теперь вставим в форму обработки такой код и откроем обработку:

Процедура ПриСозданииНаСервере ( Отказ , СтандартнаяОбработка ) ОбъектНоменклатура = Справочники . Номенклатура . СоздатьЭлемент ( ) ;

Здесь мы вызываем экспорную процедуру модуля объекта, а потом встроенным методом Записать записываем объект в базу данных.

В результате в базе данных будет создан новый элемент, у которого заполнен артикул и добавлены 2 строки в табличную часть:


В методе ЗаполнитьРеквизиты() мы обращались напрямую к реквизитам объекта, после чего записали его методом Записать(). Значения реквизитов сохранились в базе данных.

Обработчики событий


В результате откроется список возможных событий:


Рассмотрим основные события модуля объекта:

Для примера создадим в модуле объекта 3 обработчика события и вставим в них следующий код:

тс хочет сказать, что ОбработкаПроверкиЗаполнения работает и он это видит в отладчике, а &Перед("ОбработкаПроверкиЗаполнения") никак не срабатывает?

(3) Ну первое что я в таком случае делаю - удаляю базу из списка и добавляю снова.
в 90% помогает.
Остальные 10% - косячный код в расширении и его неприменение

(2) Работает
(3) Да. Именно так В стандартный обработчик заходит в Перед никак

(5) безопасный режим и тд поснимал?
закомментируй свой код и напиши а=1; и посмотри, остановится или нет

режим совместимости обработки и расширения совпадает? В пользовательском режиме расширение отображается как активное?

(6) Безопасный режим снят изначально, код именно такой а = 0; с точкой останова
Расширения активны в пользовательском режиме

(1) Вопрос. Почему Адаптация только одна возможна? Нишде не читал об этом. В конфе 5 расширений 1 Адаптация, 1 Исправление и три Дополнение. Может это как-то влиять? Та что глючит - дополнение

(10) Сам н сталкивался. Написано десятков 7-8 расширений. Задолбался с этим

(11) А только отладчик не отрабатывает или вообще не работает, попробуй через запись в ЖР глянь чокак

У меня не настолько много одновременных расширений. Я стараюсь не злоупотреблять их количеством - сворачиваю в одно.

(12) Нет. Эта часть точно не отрабатывает
(13) Оч много изменений в конфе. Все перевожу на расширения. В одно запихнуть - неверно. Делю по подсистемам.

Проверил. Переписал Перед на После. Тоже не заходит. Честно, ничего не понимаю

(16) Может быть все таки в расширении косяку и оно в момент выполнения отключается и перестает приниматься в этом сеансе?
Сделай прям новое только на этот обработчик

(17) Попробую. Пока удалил все расширения кроме этого. Не заходит

Добавлял через кнопку процедуры или руками? Если кнопку процедуры нажать там типовая в доступных есть?

(21) Это УНФ. В расширении два дока ЗаказНаПроизводство и Сборка. В Сборку в модуль объекта заходит без проблем, а вот в ЗаказНаПроизводство похоже не идет в модуль объекта. Сейчас пооверяю. пока не уверен

(25) извините, тупой вопрос. в 22-м посте же было. у меня больше идей нет.

(22) Ты новое расширение только для этой штуки создал?
Остальные отключил?
Все равно проблемы?

(27) Там два документа, но изменений много. Доп таблица, доб расчеты, оприходование обрезков и много еще чего

(27) Нашел. Удалил Заказ на производство из расширения и снова добавил. Теперь заходит. Но почему рабочее расширение (а оно работало, именно это расширение) вдруг накрылось?

(30) В том-то и дело, что не кэш. И чистил кэш и удалял базу и снова добавлял. Не помогало

Наведи порядок в своей работе используя конфигурацию 1C "Управление IT-отделом 8"


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

Строка . СуммаСтроки = Строка . КоличествоСтроки * Строка . ЦенаСтроки ;

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

В этом случае целесообразно вынести данную процедуру в общий модуль, добавить ключевое слово Экспорт, чтобы данная процедура была доступна из других модулей и вызывать ее из модуля формы:

//обработчик вызываемый при изменении количества в строке табличной части

Вызов общего модуля


В свойствах общего модуля установим флаг Клиент:


В самом модуле добавим следующий код:

В модуле обработки вызовем оба метода общего модуля:

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

Клиентский общий модуль

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


Серверный общий модуль

Если установлен только флаг Сервер, то к методам такого модуля можно будет обращаться только на сервер.


Вызов сервера

При установленных двух флагах Сервер и Вызов сервера к методам модуля можно обращаться как на клиенте, так и на сервере. Но само выполнение методов будет выполнено на сервере.


Клиент-серверный общий модуль

У такого общего модуля в свойствах нужно установить и флаг Клиент и флаг Сервер.


Чтобы при компиляции такого общего модуля не было ошибок нужно с помощью инструкций препроцессора разделить процедуры на клиентские и серверные:

Вызывать серверные методы общего модуля можно только на сервере:

//чтобы вызвать серверный метод нужно перейти на сервер

Глобальный общий модуль

Если в свойствах модуля поставить флаг Глобальный, то для вызова методов общего модуля не нужно указывать имя общего модуля.


Глобальные общие модули будут скомпилированы при запуске конфигурации.

Привилегированный общий модуль

Общий модуль с таким флагом всегда выполняется без проверки прав доступа. Такой общий модуль может быть только серверным.


Повторное использование возвращаемых значений

Использование данного свойства позволяет сохранять в кеше параметры и результат функций. Работает только для функций в неглобальных общих модулях.

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

Есть два варианта повторного использования возвращаемых значений:

Кешированный результат выполнения может быть удален в нескольких случаях:

  • Если в рабочем процессе сервера 1С не хватает оперативной памяти
  • Рабочий процесс был перезапущен
  • Клиент был переключен на другой рабочий процесс
  • Прошло 20 минут после сохранения или 6 минут после последнего использования
  • Если вызвать метод ОбновитьПовторноИспользуемыеЗначения

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

Для сохранения в кеше и повторного использования можно использовать параметры следующих типов:

Читайте также: