ХранилищеСущностей
Аннотация, помечающая класс как хранилище (репозиторий) сущностей, предоставляющий методы для работы с объектами определенного типа в базе данных. Необходима для использования в связке с аннотацией &МетодЗапроса
.
Синтаксис
&ХранилищеСущностей(ИмяТипаСущности, ИсточникДанных = "")
Процедура ПриСозданииОбъекта()
КонецПроцедуры
Параметры
ИмяТипаСущности
Тип: Строка
Имя типа сущности, для которой создается хранилище.
ИсточникДанных
Тип: Строка
(опционально)
Имя источника данных, который будет использоваться для данной сущности. Может быть не указан, если используется единственный источник данных.
Описание
Аннотация &ХранилищеСущностей
превращает обычный класс в репозиторий для работы с сущностями определенного типа. Класс автоматически получает:
- Наследование от базового класса
ХранилищеСущностей
из библиотеки entity плюс расширение собственными методами - Доступ к базовому хранилищу сущностей поле, помеченное аннотацией
&Родитель
- Возможность определения "магических" методов с аннотацией
&МетодЗапроса
для автоматической генерации запросов к базе данных - Интеграцию с контейнером зависимостей autumn в роли желудя
Структура класса
// В поле лежит ссылка на типизированное ХранилищеСущностей библиотеки entity
&Родитель
Перем ХранилищеСущностей;
// Методы, для которых будет сгенерирована реализация на основании имени метода
&МетодЗапроса
Функция ПолучитьПоИдентификаторРавно(Идентификатор) Экспорт
Возврат Неопределено;
КонецФункции
// Собственные методы
Функция СоздатьСоЗначениямиПоУмолчанию(Имя) Экспорт
НовыйОбъект = ХранилищеСущностей.СоздатьЭлемент();
НовыйОбъект.Имя = Имя;
НовыйОбъект.ДатаСоздания = ТекущаяДата();
НовыйОбъект.Активен = Истина;
Возврат НовыйОбъект;
КонецФункции
&ХранилищеСущностей("ТипСущности")
Процедура ПриСозданииОбъекта()
КонецПроцедуры
Примеры
Простое хранилище с методом поиска
&МетодЗапроса
Функция НайтиПоИмениРавно(Имя) Экспорт
Возврат Неопределено;
КонецФункции
&ХранилищеСущностей("Пользователь")
Процедура ПриСозданииОбъекта()
КонецПроцедуры
Хранилище с указанием источника данных
&МетодЗапроса
Функция НайтиПоНомерРавно(Номер) Экспорт
Возврат Неопределено;
КонецФункции
&ХранилищеСущностей("Документ", ИсточникДанных = "Архивный")
Процедура ПриСозданииОбъекта()
КонецПроцедуры
Хранилище собственной логикой
&Родитель
Перем ХранилищеСущностей;
&МетодЗапроса
Функция НайтиПоEmailРавно(Email) Экспорт
Возврат Неопределено;
КонецФункции
Функция СоздатьПользователяСАвтогенерацией(Имя, Email) Экспорт
// Проверяем уникальность email
СуществующийПользователь = НайтиПоEmailРавно(Email);
Если СуществующийПользователь <> Неопределено Тогда
ВызватьИсключение "Пользователь с таким email уже существует";
КонецЕсли;
// Создаем нового пользователя
НовыйПользователь = ХранилищеСущностей.СоздатьЭлемент();
НовыйПользователь.Имя = Имя;
НовыйПользователь.Email = Email;
НовыйПользователь.Идентификатор = Новый УникальныйИдентификатор();
НовыйПользователь.ДатаСоздания = ТекущаяДата();
НовыйПользователь.Активен = Истина;
НовыйПользователь.Сохранить();
Возврат НовыйПользователь;
КонецФункции
Функция ПолучитьСтатистикуПользователей() Экспорт
ОбщееКоличество = ХранилищеСущностей.Получить().Количество();
ОпцииАктивных = Новый ОпцииПоиска()
.Отбор("Активен", ВидСравнения.Равно, Истина);
КоличествоАктивных = ХранилищеСущностей.Получить(ОпцииАктивных).Количество();
Статистика = Новый Структура();
Статистика.Вставить("Общее", ОбщееКоличество);
Статистика.Вставить("Активные", КоличествоАктивных);
Статистика.Вставить("Неактивные", ОбщееКоличество - КоличествоАктивных);
Возврат Статистика;
КонецФункции
&ХранилищеСущностей("Пользователь")
Процедура ПриСозданииОбъекта()
КонецПроцедуры
Регистрация в контейнере
Хранилища автоматически регистрируются в контейнере зависимостей под именами:
- Без указания источника данных:
ХранилищеСущностей[ИмяТипаСущности]
- С указанием источника данных:
ХранилищеСущности[ИсточникДанных][ИмяТипаСущности]
Например:
// Для &ХранилищеСущностей("Пользователь")
ХранилищеПользователей = Поделка.НайтиЖелудь("ХранилищеСущностейПользователь");
// Для &ХранилищеСущностей("Документ", ИсточникДанных = "Архивный")
ХранилищеДокументов = Поделка.НайтиЖелудь("ХранилищеСущностейАрхивныйДокумент");
Доступные методы базового хранилища
Все методы базового Хранилища сущностей из entity доступны для вызова из-вне:
СоздатьЭлемент()
- создание нового объекта с функциональностью Active recordСохранить(Сущность)
- сохранение объекта в базе данныхПолучить(ОпцииПоиска)
- получение коллекции объектовПолучитьОдно(ОпцииПоиска)
- получение одного объектаУдалить(Сущность)
- удаление объектаНачатьТранзакцию()
- открытие транзакцииЗафиксироватьТранзакцию()
- фиксация транзакцииОтменитьТранзакцию()
- откат транзакцииПолучитьКоннектор()
- получение коннектора для работы с базой данныхПолучитьОбъектМодели()
- получение объекта модели для работы с даннымиЗакрыть
- закрытие хранилища и коннектора (не рекомендуется к вызову напрямую)
ХранилищеСущностей = Поделка.НайтиЖелудь("МоеХранилищеПользователей");
// Доступны как базовые методы хранилища:
НовыйПользователь = ХранилищеСущностей.СоздатьЭлемент();
НовыйПользователь.Имя = "Иван";
ХранилищеСущностей.Сохранить(НовыйПользователь);
// Так и собственные
Пользватель = ХранилищеСущностей.СоздатьПользователяСАвтогенерацией("Иван", "test@example.com");
При необходимости, собственное &ХранилищеСущностей может получить доступ к базовому хранилищу сущностей от entity серез через поле, помеченное аннотацией &Родитель
.