Skip to content

ХранилищеСущностей

Аннотация, помечающая класс как хранилище (репозиторий) сущностей, предоставляющий методы для работы с объектами определенного типа в базе данных. Необходима для использования в связке с аннотацией &МетодЗапроса.

Синтаксис

bsl
&ХранилищеСущностей(ИмяТипаСущности, ИсточникДанных = "")
Процедура ПриСозданииОбъекта()
КонецПроцедуры

Параметры

ИмяТипаСущности

Тип: Строка

Имя типа сущности, для которой создается хранилище.

ИсточникДанных

Тип: Строка (опционально)

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

Описание

Аннотация &ХранилищеСущностей превращает обычный класс в репозиторий для работы с сущностями определенного типа. Класс автоматически получает:

  • Наследование от базового класса ХранилищеСущностей из библиотеки entity плюс расширение собственными методами
  • Доступ к базовому хранилищу сущностей поле, помеченное аннотацией &Родитель
  • Возможность определения "магических" методов с аннотацией &МетодЗапроса для автоматической генерации запросов к базе данных
  • Интеграцию с контейнером зависимостей autumn в роли желудя

Структура класса

bsl
// В поле лежит ссылка на типизированное ХранилищеСущностей библиотеки entity
&Родитель
Перем ХранилищеСущностей;

// Методы, для которых будет сгенерирована реализация на основании имени метода
&МетодЗапроса
Функция ПолучитьПоИдентификаторРавно(Идентификатор) Экспорт
    Возврат Неопределено;
КонецФункции

// Собственные методы
Функция СоздатьСоЗначениямиПоУмолчанию(Имя) Экспорт
    НовыйОбъект = ХранилищеСущностей.СоздатьЭлемент();
    НовыйОбъект.Имя = Имя;
    НовыйОбъект.ДатаСоздания = ТекущаяДата();
    НовыйОбъект.Активен = Истина;
    
    Возврат НовыйОбъект;
КонецФункции

&ХранилищеСущностей("ТипСущности")
Процедура ПриСозданииОбъекта()
КонецПроцедуры

Примеры

Простое хранилище с методом поиска

bsl
&МетодЗапроса
Функция НайтиПоИмениРавно(Имя) Экспорт
    Возврат Неопределено;
КонецФункции

&ХранилищеСущностей("Пользователь")
Процедура ПриСозданииОбъекта()
КонецПроцедуры

Хранилище с указанием источника данных

bsl
&МетодЗапроса
Функция НайтиПоНомерРавно(Номер) Экспорт
    Возврат Неопределено;
КонецФункции

&ХранилищеСущностей("Документ", ИсточникДанных = "Архивный")
Процедура ПриСозданииОбъекта()
КонецПроцедуры

Хранилище собственной логикой

bsl
&Родитель
Перем ХранилищеСущностей;

&МетодЗапроса
Функция НайтиПоEmailРавно(Email) Экспорт
    Возврат Неопределено;
КонецФункции

Функция СоздатьПользователяСАвтогенерацией(Имя, Email) Экспорт
    // Проверяем уникальность email
    СуществующийПользователь = НайтиПоEmailРавно(Email);
    Если СуществующийПользователь <> Неопределено Тогда
        ВызватьИсключение "Пользователь с таким email уже существует";
    КонецЕсли;
    
    // Создаем нового пользователя
    НовыйПользователь = ХранилищеСущностей.СоздатьЭлемент();
    НовыйПользователь.Имя = Имя;
    НовыйПользователь.Email = Email;
    НовыйПользователь.Идентификатор = Новый УникальныйИдентификатор();
    НовыйПользователь.ДатаСоздания = ТекущаяДата();
    НовыйПользователь.Активен = Истина;

    НовыйПользователь.Сохранить();
    
    Возврат НовыйПользователь;
КонецФункции

Функция ПолучитьСтатистикуПользователей() Экспорт
    ОбщееКоличество = ХранилищеСущностей.Получить().Количество();
    
    ОпцииАктивных = Новый ОпцииПоиска()
        .Отбор("Активен", ВидСравнения.Равно, Истина);
    КоличествоАктивных = ХранилищеСущностей.Получить(ОпцииАктивных).Количество();
    
    Статистика = Новый Структура();
    Статистика.Вставить("Общее", ОбщееКоличество);
    Статистика.Вставить("Активные", КоличествоАктивных);
    Статистика.Вставить("Неактивные", ОбщееКоличество - КоличествоАктивных);
    
    Возврат Статистика;
КонецФункции

&ХранилищеСущностей("Пользователь")
Процедура ПриСозданииОбъекта()
КонецПроцедуры

Регистрация в контейнере

Хранилища автоматически регистрируются в контейнере зависимостей под именами:

  • Без указания источника данных: ХранилищеСущностей[ИмяТипаСущности]
  • С указанием источника данных: ХранилищеСущности[ИсточникДанных][ИмяТипаСущности]

Например:

bsl
// Для &ХранилищеСущностей("Пользователь")
ХранилищеПользователей = Поделка.НайтиЖелудь("ХранилищеСущностейПользователь");

// Для &ХранилищеСущностей("Документ", ИсточникДанных = "Архивный")
ХранилищеДокументов = Поделка.НайтиЖелудь("ХранилищеСущностейАрхивныйДокумент");

Доступные методы базового хранилища

Все методы базового Хранилища сущностей из entity доступны для вызова из-вне:

  • СоздатьЭлемент() - создание нового объекта с функциональностью Active record
  • Сохранить(Сущность) - сохранение объекта в базе данных
  • Получить(ОпцииПоиска) - получение коллекции объектов
  • ПолучитьОдно(ОпцииПоиска) - получение одного объекта
  • Удалить(Сущность) - удаление объекта
  • НачатьТранзакцию() - открытие транзакции
  • ЗафиксироватьТранзакцию() - фиксация транзакции
  • ОтменитьТранзакцию() - откат транзакции
  • ПолучитьКоннектор() - получение коннектора для работы с базой данных
  • ПолучитьОбъектМодели() - получение объекта модели для работы с данными
  • Закрыть - закрытие хранилища и коннектора (не рекомендуется к вызову напрямую)
bsl
ХранилищеСущностей = Поделка.НайтиЖелудь("МоеХранилищеПользователей");

// Доступны как базовые методы хранилища:
НовыйПользователь = ХранилищеСущностей.СоздатьЭлемент();
НовыйПользователь.Имя = "Иван";

ХранилищеСущностей.Сохранить(НовыйПользователь);

// Так и собственные
Пользватель = ХранилищеСущностей.СоздатьПользователяСАвтогенерацией("Иван", "test@example.com");

При необходимости, собственное &ХранилищеСущностей может получить доступ к базовому хранилищу сущностей от entity серез через поле, помеченное аннотацией &Родитель.

См. также