Типы встроенного языка, порождаемые элементом проекта вида «Документ»

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

  • Накладная
  • Накладная.Ссылка
  • Накладная.Объект

В общем случае имена этих типов выглядят следующим образом:

  • имя-документа
  • имя-документа.Ссылка
  • имя-документа.Объект

После создания элемента Документ в языке запросов будет доступна таблица «имя-документа» с теми же свойствами, что и у «имя-документа».Объект. Пример использования таблицы в языке запросов:

ВЫБРАТЬ Ссылка, Номер ИЗ Накладная

Тип «имя-документа»

Вспомогательный объект с общей для конкретного документа функциональностью. Сравнение ссылочное. Доступен в окружении Сервер.

Экспортные методы модуля менеджера "пробрасываются" в объект, то есть возможно вызывать Документы.Накладная.МойЭкспортныйМетод(Параметр1). Содержит методы ПересчитатьДескрипторыДоступа() и ПересчитатьДескрипторыДоступаДляОбъектов(), унаследованные от базового типа Документ. Также содержит метод НайтиПоНомеру со следующей сигнатурой:
  • Для документов с периодической нумерацией:
    НайтиПоНомеру(Номер: тип номера в зависимости от настроек в yaml, [Период:Дата]: <ИмяДокумента.Ссылка>
  • Для документов без периодической нумерации:

    НайтиПоНомеру(Номер: тип номера в зависимости от настроек в yaml): <ИмяДокумента.Ссылка>

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

Модуль документа

В проекте модуль, расширяющий тип имя-документа, называется модулем документа и имеет название имя-документа.xbsl. Он доступен в окружении Сервер.

В этом модуле вы можете обработать событие ПолучитьЗначенияВыбора(Параметры : ПараметрыПолученияЗначенийВыбора): Массив<ЭлементСпискаВыбора> | Неопределено для того, чтобы изменить стандартный алгоритм подбора объектов документа при вводе по строке.

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

Также в модуле документа можно обработать события вычисления разрешений доступа: ВычислитьРазрешенияДоступа, ВычислитьРазрешенияДоступаДляОбъектов (подробнее).

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

// Создает расходные накладные в документе «Накладная»
@ВПроекте
метод СоздатьНакладнуюМосква(Контрагент: Строка): Накладная.Ссылка

    пер РасходнаяНакладная = новый Накладная.Объект()
    РасходнаяНакладная.Контрагент = Контрагент
    РасходнаяНакладная.КодРегиона = Регионы.Москва
    РасходнаяНакладная.Записать()

    возврат РасходнаяНакладная.Ссылка
;

Этот метод будет доступен в других модулях:

// Вызов метода разработчика у менеджера документа «Накладная»
пер РасходнаяНакладная = Накладная.СоздатьНакладнуюМосква("ООО Наименование Фирмы")
Совет: В модуле документа может находиться реализация контракта сервиса.

Тип «имя-документа.Ссылка»

Данный тип предназначен для описания ссылки на один объект документа и имеет единственное свойство: Идентификатор: Ууид. Является базовым типом ссылок на документы. Тип имя-документа.Ссылка доступен в окружении КлиентИСервер. Сравнение структурное, то есть две ссылки считаются равными, если равны их идентификаторы.

Тип «имя-документа.Ссылка» имеет конструктор новый имя-документа.Ссылка(ид:Ууид), который позволяет создать новую ссылку по Ууид.

Также тип «имя-документа.Ссылка» содержит метод ЗагрузитьОбъект(Заблокировать:Булево): <ИмяДокумента>.Объект, который есть только на сервере и который позволяет получить экземпляр (имя-документа.Объект) из базы данных по текущей ссылке (имя-документа.Ссылка). Если объекта нет, возвращает Неопределено. Если объект существует и Заблокировать == Истина, накладывается управляемая блокировка до конца транзакции по идентификатору объекта.

Тип «имя-документа.Объект»

Экземпляр объекта, связанный с записью в базу данных. Экземпляр этого типа содержит данные одного объекта документа и предназначен для создания, изменения или удаления объекта документа. Является базовым типом для экземпляров документов. Сравнение осуществляется по ссылке. Тип имя-документа.Объект доступен в окружении КлиентИСервер.

Тип «имя-документа.Объект» имеет следующие свойства:
Номер
Строка. Номер документа. Стандартный реквизит, с возможностью автонумерации. Может отсутствовать
Дата
ДатаВремя. Обязательное свойство. Момент регистрации документа. Обозначает привязку документа ко времени его появления в системе. При интерактивной работе заполняется автоматически текущим (приведенным к типу) моментом при записи. После реализации формул в качестве значения по умолчанию (как в компонентах интерфейса) может заполняться по формуле.
Примечание: Алгоритм установки даты в пользовательском интерфейсе при записи нового документа

Если пользователь установил в форме дату вручную, то эта дата используется для записи. При этом значение будет приведено к хранимому типу (типу реквизита Дата в документе) по правилам конвертации типов.

Если при интерактивной записи документа время равно 0:00:00, то срабатывает механизм выбора времени документа:

  • если тип даты документа — Момент, то операции с датой выполняются в текущем поясе клиента, а потом приводятся к типу Момент;
  • если тип даты документа — Дата или ДатаВремя, то берется текущая дата в часовом поясе клиента и с этой датой документ записывается в БД;
  • если в текущем часовом поясе клиента дата (без времени) отличается от Сегодня-в-поясе-клиента, то время документа устанавливается по правилу «Текущее или последнее»:
    • документ пытается получить время позже самого последнего введенного документа за указанную дату;
    • если в указанную дату документов не было, то время устанавливается на 12:00:00.

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

Ссылка
<имя-документа>.Ссылка. Ссылка на данный объект
МеткаВерсии
Ууид. Метка версии
Представление
Строка. Поле представления объекта
<объявленные реквизиты>
Реквизиты, объявленные в описании элемента проекта «Документ»

Тип «имя-документа.Объект» имеет следующие методы:

ЭтоНовый(): Булево
Признак того, что объект только что создан и еще не был записан
Удалить()

Удаляет текущий документ

Записать()
Сохраняет текущее состояние в базу
Тип «имя-документа.Объект» имеет конструктор новый имя-документа.Объект(), который позволяет создать новый объект документа. Заполнив этот экземпляр данными, вы можете затем сохранить его в базе данных. Конструктор имеет следующую сигнатуру:
новый имя-документа.Объект()
Создает новый объект, Ид будет определен при записи
новый имя-документа.Объект(ид: <ИмяДокумента>.Ссылка | Ууид)
Создает новый объект, Ид будет взят из параметра
новый имя-документа.Объект(<Реквизит1: ТипРеквизита1> = <ЗначениеПоУмолчанию1>, ..., <РеквизитN: ТипРеквизитаN = <ЗначениеПоУмолчаниюN>)
Конструктор по значениям всех полей — создает запись с указанными значениями реквизитов. Можно использовать только форму вызова с указанием имен параметров.

Модуль объекта документа

В проекте модуль, расширяющий тип имя-документа.Объект, называется модулем объекта. Он доступен в окружении Сервер.

В нем вы можете обработать такие события, как:

  • ПриЗаполнении,
  • ПередЗаписью,
  • ПослеЗаписи,
  • ПередУдалением.
Например:
@Обработчик
метод ПередЗаписью(ПредыдущееЗначение: МойДокумент.Данные,
                   ПараметрыЗаписи: МойДокумент.ПараметрыЗаписи)
    // Действия, которые выполняются перед записью документа
;

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

Вы можете расширить тип имя-документа.Объект, добавив в модуль объекта собственные публичные методы. Например, метод, пересчитывающий данные объекта документа, которые зависят от каких-то внешних данных, которые хранятся вне документа:

@ВПроекте
метод ПересчитатьДанные()

    // Алгоритм пересчета данных
    ....

;

Этот метод будет доступен в других модулях:

// Вызов собственного метода объекта документа «Накладная»
// В переменной РасходнаяНакладная находится значение типа Накладная.Объект
РасходнаяНакладная.ПересчитатьДанные()
РасходнаяНакладная.Записать()
Совет: В модуле объекта документа может находиться реализация методов контракта типа и контракта сущности.