1с общий модуль получить реквизит объекта

Обновлено: 06.07.2024

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

Опции Общего модуля

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

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

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

  • присутствует у Справочников, Документов, Отчетов, Обработок, ПВХ
    • отсутствует у Констант, Перечислений, Журналов, Внешних источников данных
    • у Регистров аналогичную роль выполняет Модуль Записи
    • переменные объявленные как Экспорт доступны у объекта как реквизиты <объект>.<Переменная>, но в отличие от реквизита она не сохраняется при записи
    • процедуры и функции описанные как Экспорт доступны у объекта как методы <объект>.<Процедура>(<параметры>)
      • по неизвестной причине доступ к переменным и методам у Обработок не действует

      Примеры

      Пример описания переменной, конструктора объекта, экспортной функции и пример вызова:

      ДанныеИсточника = ИсточникОбъект . ЭкспортнаяФункция ( ) ;

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

      • присутствует у Справочников, Документов, Журналов, Перечислений, Отчетов, Обработок, ПВХ, Регистров, Бизнес-процессов, Задач
        • отсутствует у Внешних источников данных
        • доступность обеспечивается только из модулей на Сервере
        • могут при необходимости получить объект или ссылку в параметре вызова

        Примеры

        Пример описания статической экспортной функции и ее вызов из другого модуля , где эти типы доступны (на Сервере). :

        ДанныеИсточника = Справочники . Источник . ЭкспортнаяФункция ( ) ;

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

        • компиляция по умолчанию выполняется на Сервере, но отдельные фрагменты модуля могут устанавливать другую область компиляции директивами компиляции
        • НаКлиенте
          • реквизиты объекта формы доступны через Объект.<Реквизит>
          • реквизиты формы доступны непосредственно по имени <Реквизит>
          • элементы формы доступны через Элементы.<Элемент>
          • статические переменные существуют только на время обработки события формы, а затем удаляются
          • реквизиты объекта формы доступны через Объект.<Реквизит>
          • реквизиты формы доступны непосредственно по имени <Реквизит>
          • элементы формы на Сервере недоступны
          • статические переменные существуют только на время вызова метода на Сервере, а затем удаляются
          • данные реквизитов при каждом вызове НаКлиенте->НаСервере и возврате НаСервере->НаКлиенте все (целиком в полном объеме) проходят через XDTO сериализацию
          • доступные методы реквизитов на Клиенте и на Сервере отличаются

          Временный динамический модуль создается платформой при использовании оператора Выполнить() :

          Пять директив определяют область исполнения функций и процедур. Их следует применять только в коде модулей управляемых форм и в коде модулей команд, в остальных модулях рекомендуется применять инструкции препроцессора.

          • директива должна предшествовать каждому определению в модуле
          • по умолчанию действует директива &НаСервере
          • директива &НаСервереБезКонтекста имеет смысл только в формах (чей контекст директива подразумевает)
          • определение в общем модуле с директивой &НаСервере в общем модуле имеет
          • директива &НаСервереНаКлиенте применяется только в коде модулей команд
          • приведенный в таблице порядок директив соответствует иерархии доступности, так функции и процедуры определенные с некоторой директивой имеют доступ к процедурам и функциям определенным с той же директивой, либо с любой директивой следующей ниже, но не имеют доступа к определенным с предшествующей директивой
            • определениям с директивой &НаКлиенте доступны все определения на Клиенте и все определения на Сервере, для которых предусмотрен серверный вызов
            • определениям с директивой &НаКлиентеНаСервереБезКонтекста доступны определения только с такой же директивой

            Инструкции препроцессора управляют включением и исключением фрагментов модуля прежде чем он будет скомпилирован для выполнения, все инструкции препроцессора и исключенные ими фрагменты кода отсутствуют в коде передаваемом компилятору модуля.

            Предусмотрены четыре инструкции

            • <Логическое выражение> = [НЕ] <Символ препроцессора> [<Булева операция> [НЕ] <Символ препроцессора> [<Булева операция> [НЕ] <Символ препроцессора>]…]
            • <Символ препроцессора> =
              <Булева операция> =

            Области

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

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

            • <имя области> должно соответствовать общим требованиям к именам переменных (не может начинаться с цифры, содержать пробелы, знаки и символы и т.п.).
            • области могут быть вложены друг в друга или в другие группируемые конструкции языка.
            • 1С не рекомендует разрывать отдельные грамматические конструкции, выражения, а также объявления и места вызова процедур и функций.

            Конфигурации применяют следующие области:

            Три аннотации позволяют определить перехват порядка вызова типовых методов новыми методами.


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


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


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


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

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


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

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

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

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

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

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

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


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

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

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


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

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

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

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


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

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


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


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

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

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

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

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

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

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

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

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

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

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

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

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


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

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

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

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

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

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


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


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

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

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

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

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


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

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


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

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


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

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


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

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

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

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

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


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

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

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


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

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

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

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

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

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

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

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

            приведет к ошибке. Такие конструкции возможны только на сервере.

            Предположим, что стоит задача при нажатии на кнопку отобразить ИНН контрагента, выбранного на форме. Для решения поставленной задачи необходимо обратиться на сервер для получения требуемой информации(ИНН). Программный код может иметь вид:

            При нажатии на кнопку ПолучитьИНН вызывается серверная функция ПолучитьИНННаСервере () . В единственном параметре передается контрагент, выбранный интерактивно пользователем. Функция получает ИНН через точку и сразу же возвращает значение обратно на клиент. Результат работы серверной функции помещается в переменную ИННКонтрагента и выводится пользователю с помощью метода Сообщить () .

            Серверная функция является внеконтекстной ( &НаСервереБезКонтекста ). Это значит, что данные, содержащиеся в форме, не будут отсылаться на сервер, что уменьшит объем передаваемых данных и скорость возврата результата функции.

            Внимание!

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

            можно заменить на:

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

            Рассмотрим пример: на форме документа рядом с полем ввода контрагента должен выводиться его ИНН. Для этого перенесем реквизит ИНН на форму:

            Выбор подчиненного реквизита

            В пользовательском режиме при указании контрагента, его ИНН будет автоматически отображен на форме. Никакого программирования в этом случае не потребовалось.

            Остались вопросы?
            Спросите в комментариях к статье.

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