Типы встроенного языка, порождаемые элементом проекта вида «Документ»
После того, как вы добавили в проект документ и дали ему имя, создаст несколько типов встроенного языка. Например, если в проекте есть документ Накладная, то будут созданы следующие типы:
- Накладная
- Накладная.Ссылка
- Накладная.Объект
В общем случае имена этих типов выглядят следующим образом:
- имя-документа
- имя-документа.Ссылка
- имя-документа.Объект
После создания элемента Документ в языке запросов будет доступна таблица «имя-документа» с теми же свойствами что и у «имя-документа».Объект. Пример использования таблицы в языке запросов:
ВЫБРАТЬ Ссылка, Номер ИЗ Накладная
Тип «имя-документа»
Вспомогательный объект с общей для конкретного документа функциональностью. Сравнение ссылочное. Доступен в окружении Сервер
- Для документов с периодической
нумерацией:
НайтиПоНомеру(Номер: тип номера в зависимости от настроек в yaml, [Период:Дата]: <ИмяДокумента.Ссылка>
-
Для документов без периодической нумерации:
НайтиПоНомеру(Номер: тип номера в зависимости от настроек в yaml): <ИмяДокумента.Ссылка>
Данный метод осуществляет поиск документа по номеру в заданном временном пространстве. Присутствует только для документа, имеющего поле Номер. Если в искомом интервале найдено более одного документа выдается исключение ИсключениеПоискаСущности.
Модуль документа
В проекте модуль, расширяющий тип имя-документа, называется модулем документа и имеет название имя-документа.xbsl. Он доступен в окружении Сервер.
В этом модуле вы можете обработать событие ПолучитьЗначенияВыбора(Параметры : ПараметрыВыбораЗначений): Массив<ЭлементСпискаВыбораЗначения> | Неопределено для того, чтобы изменить стандартный алгоритм подбора объектов документа при вводе по строке.
Данное событие вызывается при попытке получить данные для выбора по введенной подстроке. В событие передается информация о набранной строке и параметрах отбора. Событие должно возвратить массив выбранных данных.
Также в модуле документа можно обработать события вычисления разрешений доступа: ВычислитьРазрешенияДоступа, ВычислитьРазрешенияДоступаДляОбъектов (подробнее).Вы можете расширить тип имя-документа, добавив в модуль документа собственные публичные методы. Например, метод, создающий элементы определенного вида:
// Создает расходные накладные в документе «Накладная»
@ВПроекте
метод СоздатьНакладнуюМосква(Контрагент: Строка): Накладная.Ссылка
пер РасходнаяНакладная = новый Накладная.Объект()
РасходнаяНакладная.Контрагент = Контрагент
РасходнаяНакладная.КодРегиона = Регионы.Москва
РасходнаяНакладная.Записать()
возврат РасходнаяНакладная.Ссылка
;
Этот метод будет доступен в других модулях:
// Вызов метода разработчика у менеджера документа «Накладная»
пер РасходнаяНакладная = Накладная.СоздатьНакладнуюМосква("ООО Наименование Фирмы")
Тип «имя-документа.Ссылка»
Данные тип предназначен для описания ссылки на один объект документа и имеет единственное свойство: Идентификатор: Ууид. Является базовым типом ссылок на документы. Тип имя-документа.Ссылка доступен в окружении КлиентИСервер. Сравнение структурное, то есть две ссылки считаются равными если равны их идентификаторы.
Тип «имя-документа.Ссылка» имеет конструктор новый имя-документа.Ссылка(ид:Ууид), который позволяет создать новую ссылку по Ууид.
Также тип «имя-документа.Ссылка» содержит метод ЗагрузитьОбъект(Заблокировать:Булево): <ИмяДокумента>.Объект, который есть только на сервере и который позволяет получить экземпляр (имя-документа.Объект) из базы данных по текущей ссылке (имя-документа.Ссылка). Если объекта нет, возвращает Неопределено. Если объект существует и Заблокировать == Истина, накладывается управляемая блокировка до конца транзакции по идентификатору объекта.
Тип «имя-документа.Объект»
Экземпляр объекта, связанный с записью в базу данных. Экземпляр этого типа содержит данные одного объекта документа и предназначен для создания, изменения или удаления объекта документа. Является базовым типом для экземпляров документов. Сравнение осуществляется по ссылке. Тип имя-документа.Объект доступен в окружении Сервер.
- Номер: Строка | Число
- Номер документа. Стандартный реквизит, с возможностью автонумерации. Может отсутствовать
- Дата: Дата | ДатаВремя | Момент
-
Момент регистрации документа. Обозначает привязку документа ко времени его появления в системе. При интерактивной работе заполняется автоматически текущим (приведенным к типу) моментом при записи. Не может отсутствовать После реализации формул в качестве значения по умолчанию (как в UI-компонентах) может заполняться по формулеПримечание: Алгоритм установки даты в пользовательском интерфейсе при записи нового документа
Если пользователь установил в форме дату вручную, то эта дата используется для записи. При этом, значение, будет приведено к хранимому типу (типу реквизита Дата в документе) по правилам конвертации типов
Если при интерактивной записи документа время равно 0:00:00, то срабатывает механизм выбора времени документа:
- Если тип даты документа — Момент, то операции с датой выполняются в текущем поясе клиента, а потом приводятся к типу Момент
- Если тип даты документа — Дата или ДатаВремя, то берется текущая дата в часовом поясе клиента и с этой датой документ записывается в БД
- Если в текущем часовом поясе клиента дата (без времени)
отличается от Сегодня-в-поясе-клиента, то время
документа устанавливается по правилу «Текущее или
последним»:
- Документ старается получить время позже самого последнего введенного документа за указанную дату
- Если в указанную дату документов не было — время устанавливается в 12:00:00
При неинтерактивной записи документа специальных поведений поля Дата нет. Документ создается с пустой датой и записывается с ней, если она не менялась. Запись с пустой датой выдаст ошибку валидации поля. То же произойдет, если дату в форме документа очистили.
- Ссылка: <имя-документа>.Ссылка
- Ссылка на данный объект
- МеткаВерсии: Ууид
- Метка версии
- Представление: Строка
- Поле представления объекта
- <объявленные реквизиты>
- Реквизиты, объявленные в описании элемента проекта «Документ»
Тип «имя-документа.Объект» имеет следующие методы:
- ЭтоНовый(): Булево
-
Возвращает признак того, что документ ещё не был записан в БД. На протяжении всех обработчиков для нового объекта возвращает значение Истина
- Удалить()
-
Удаляет текущий документ.
- Записать()
- Сохраняет текущее состояние в базу
- УстановитьПрефикс(Префикс: Строка)
-
Данный метод устанавливает значение Префикса, которое будет использовано в момент вызова Записать() для формирования нового номера. Если длина Префикса == 0 или нет автонумерации, то соответствующий метод отсутствует. Поведение автонумерации совпадает с поведением автонумерации у элемента проекта Справочник
- УстановитьПостфикс(Постфикс: Строка)
-
Данный метод устанавливает значение Постфикса, которое будет использовано в момент вызова Записать() для формирования нового номера. Если длина Постфикса == 0 или нет автонумерации, то соответствующий метод отсутствует. Поведение автонумерации совпадает с поведением автонумерации у элемента проекта Справочник
- новый имя-документа.Объект()
- Создает новый объект, Ид будет определен при записи
- новый имя-документа.Объект(ид: <ИмяДокумента>.Ссылка | Ууид)
- Создает новый объект, ид будет взят из параметра
- новый имя-документа.Объект(<Реквизит1: ТипРеквизита1> = <ЗначениеПоУмолчанию1>, ..., <РеквизитN: ТипРеквизитаN = <ЗначениеПоУмолчаниюN>)
- Конструктор по значениям всех полей — создаёт запись с указанными значениями реквизитов. Можно использовать только форму вызова с указанием имён параметров.
Модуль объекта документа
В проекте модуль, расширяющий тип имя-документа.Объект, называется модулем объекта. Он доступен в окружении Сервер.
В нем вы можете обработать такие события как:
- ПриСоздании
- ПриПроверкеДанных
- ПередЗаписью
- ПослеЗаписи
- ПередУдалением
Во время записи объекта документа открывает в базе данных транзакцию записи и события вызываются следующим образом:
Вы можете расширить тип имя-документа.Объект, добавив в модуль объекта собственные публичные методы. Например, метод, пересчитывающий данные объекта документа, которые зависят от каких-то внешних данных, которые хранятся вне документа:
@ВПроекте
метод ПересчитатьДанные()
// Алгоритм пересчета данных
....
;
Этот метод будет доступен в других модулях:
// Вызов собственного метода объекта документа «Накладная»
// В переменной РасходнаяНакладная находится значение типа Накладная.Объект
РасходнаяНакладная.ПересчитатьДанные()
РасходнаяНакладная.Записать()