При изучении объектной модели платформы 1С:Предприятие и попытках сопоставить её с классическим объектно-ориентированным программированием (ООП) нередко возникает путаница относительно назначения менеджеров объектов метаданных. Разберем подробно, что представляет собой СправочникМенеджер, является ли он ссылочным типом или коллекцией данных, и как устроена работа с ним в памяти и контекстах платформы.
Для понимания архитектуры 1С проанализируем три ключевых типа данных, связанных с каждым справочником в конфигурации:
Менеджер не содержит списка или массива записей таблицы базы данных. Попытка воспринимать его как структуру или массив элементов ошибочна: менеджер не хранит состояние данных таблицы, а предоставляет методы для взаимодействия с ней.
Если сопоставлять платформу 1С:Предприятие с классическими корпоративными шаблонами проектирования (Enterprise Patterns), то связка объектов справочника реализует следующие роли:
СправочникМенеджер выступает в роли комбинации паттернов Table Data Gateway (Шлюз к таблице данных), Repository (Репозиторий) и Factory (Фабрика). Это слой сервисов, который принимает высокоуровневые вызовы прикладного кода и преобразует их в запросы к СУБД или создание новых экземпляров объектов.СправочникОбъект реализует паттерн Row Data Gateway / Active Record, инкапсулируя данные одной строки таблицы и бизнес-логику работы с ней.СправочникСсылка представляет собой Identity Map / Value Object / Proxy, предоставляющий неизменяемый идентификатор сущности с возможностью ленивого чтения реквизитов.СправочникВыборка реализует паттерн Iterator / Cursor, позволяющий последовательно обходить записи выборки порциями без одновременной загрузки всей таблицы в память.Рассмотрим состав базовых методов и свойств, которые платформа предоставляет разработчику через менеджер справочника:
СоздатьЭлемент() и СоздатьГруппу(), возвращающие новый экземпляр типа СправочникОбъект.НайтиПоКоду(), НайтиПоНаименованию(), НайтиПоРеквизиту(), которые выполняют поиск в базе и возвращают СправочникСсылка.Выбрать() и ВыбратьИерархически(), возвращающие объект типа СправочникВыборка.ПолучитьФорму(), ПолучитьФормуСписка(), ПолучитьФормуВыбора()), макетов (ПолучитьМакет()) и проверка пустых значений (ПустаяСсылка()).Посмотрим на практический пример использования методов менеджера на стороне сервера:
// Получение ссылки на предопределенный или найденный элемент через менеджер
СсылкаНаТовар = Справочники.Номенклатура.НайтиПоКоду("00-000001");
Если СсылкаНаТовар = Справочники.Номенклатура.ПустаяСсылка() Тогда
// Создание нового элемента через фабричный метод менеджера
НовыйОбъект = Справочники.Номенклатура.СоздатьЭлемент();
НовыйОбъект.Код = "00-000001";
НовыйОбъект.Наименование = "Новый товар";
НовыйОбъект.Записать();
КонецЕсли;
Выясним особенности передачи параметров и ограничения вызовов менеджера в среде 1С:
СправочникМенеджер вручную с помощью оператора Новый. Доступ к нему осуществляется через глобальное свойство Справочники.<ИмяСправочника>.СправочникМенеджер имеет урезанный состав методов. Платформенные методы выборки, создания и прямого поиска элементов доступны исключительно на стороне сервера, так как требуют прямого обращения к СУБД.