Порядок создания раздела вручную

Добрый день!

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

Не мог бы кто-нибудь предоставить пошаговую инструкцию по созданию и регистрации нового раздела без использования мастера разделов?

Нравится

8 комментариев

Иван, здравствуйте!

Мастером можно создать раздел только вместе с новым объектом, создать раздел на основании существующего объекта можно пока только вручную. 

Ниже приведен приблизительный алгоритм реализации (объект «OrderProduct»):

1) Создать страницу раздела.

Для этого Вам необходимо создать схему AlDOrderProductSectionV2 со следующим кодом:

define("AlDOrderProductSectionV2", [],
	function() {
		return {
			entitySchemaName: "OrderProduct",
			messages: {},
            mixins: {},
            attributes: {},
            methods: {},
            diff: /**SCHEMA_DIFF*/[]/**SCHEMA_DIFF*/
		};
	}
);

 

2) Для объекта "OrderProduct" уже есть запись в таблице SysModuleEntity (объекты разделов). Для получения Id записи необходимо выполнить скрипт:

select SysModuleEntity.Id from SysModuleEntity
join SysSchema
on SysSchema.UId = SysModuleEntity.SysEntitySchemaUId
where SysSchema.Name = 'OrderProduct'

 

3) Получив SysModuleEntity.Id необходимо зарегистрировать сам раздел.

Для регистрации раздела необходимо добавить запись в таблицу SysModule.

Запрос приблизительно следующий:

insert into SysModule
(SectionSchemaUId, Code, SysModuleEntityId, CardSchemaUid, SectionModuleSchemaUid, CardModuleUid)
values
(/*Uid созданной на первом шаге схемы*/, /*Код раздела*/, /*Результат запроса из второго пункта*/, /*UID незамещенной схемы OrderProductPageV2 из таблицы SysSchema*/, /*DF58589E-26A6-44D1-B8D4-EDF1734D02B4*/, /*4E1670DC-10DB-4217-929A-669F906E5D75*/)

Также необходимо заполнить значения полей:

Caption, Image16, Image20, ModuleHeader, Image32d, LogoId

 

4) Добавьте раздел в нужное рабочее место

В результате очистки кеша, Redis и перезахода в систему раздел будет в нужном рабочем месте, но без кнопки "Добавить".

 

5) Скрипт добавит кнопку:

update SysModuleEdit
set ActionKindCaption = 'Добавить продукт к заказу'
where SysModuleEntityId = (select SysModuleEntity.Id from SysModuleEntity
join SysSchema
on SysSchema.UId = SysModuleEntity.SysEntitySchemaUId
where SysSchema.Name = 'OrderProduct')

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

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

Add comment

Одеяненко Юлия,

К сожалению, после вышеуказанных действий, раздел не появился. Пытался отследить запросы через профайлер в момент добавления раздела через мастер, но там сотни запросов, этот вариант тоже, кажется, отпадает.

Иван, проверила сама данную инструкцию - она работает, после выполнения всех действий раздел появляется в списке разделов для добавления в рабочее место, после добавления открывается. Также, если у Вас версия 7.11+, рекомендуем после выполнения всех действий сгенерировать исходный код и скомпилировать конфигурацию (связано с появлением статического контента в новых версиях). Также рекомендуем установить у созданной в п.1 схемы в качестве родителя BaseSectionV2

Одеяненко Юлия,

Спасибо, Юлия! Новый раздел действительно появился в списке добавления в рабочее место, в прошлый раз я этого не заметил (к своему стыду).

После добавления он долго не появлялся в основном меню и подвисал при сохранении с надписью "регистрация раздела", но в конечном итоге после перекомпиляций и сбросов редиса появился, но зависал при попытке его открыть. Отладчик показал, что сбой в загрузке происходит в схеме ProfileUtilities в методе getDefaultGridSettings() на строке:

var columnName = config.primaryDisplayColumn.name;

config.primaryDisplayColumn приходил undefined, в итоге я остановил выполнение в этом месте и в консоли вручную задал его значение:

config.primaryDisplayColumn = {

  name: "Name" //Подставил имя столбца из моего объекта

};

После этого отладчик проглотил это место, и мне открылся "голый" раздел, в котором я уже настроил столбцы для отображения. После сохранения раздел заработал нормально.

Еще раз спасибо!

Одеяненко Юлия,

Юлия, к сожалению, я столкнулся с новой проблемой:

в добавленном разделе нельзя настроить фильтры. Я добавил объект ***Folder, и унаследовал его от базовой группы. Теперь фильтрацию можно сохранить, но элемент меню "показать группы" отсутствует, они видны только после добавления новой группы, и работают не так, как хотелось бы.

Не могли бы Вы мне помочь, рассказав, какие действия мне необходимо выполнить для того, чтобы этот функционал заработал корректно?

Небеддаг Иван Владимирович,

для того, чтоб можно было настраивать группы в новом разделе, необходимо создать 2 новых объекта с названиями в БД, которые формируются определенным образом:

1) *название объекта раздела*Folder (например, ContactFolder), родитель - "Базовая группа ( Base )" (BaseFolder);

2) *название объекта раздела*InFolder (например, ContactInFolder), родитель - "Базовый элемент в группе ( Base )" (BaseItemInFolder).

Параметры объектов указывайте аналогичные тем, которые установлены у объектов группы для базовых разделов, например, у тех же ContactFolder и ContactInFolder. Также в объекте *...*InFolder необходимо указать у колонки "Folder" справочник - объект *...*Folder из п.1, а также создать справочную колонку, которая будет ссылаться на объект раздела. Пример - http://prntscr.com/jz06kf.

Примечание. Если Вы регистрируете раздел на основании объекта, в названии которого отсутствует префикс (например, Usr), то у объектов в п.1 и 2 тоже префикса не должно быть. Можно временно отключить необходимость префикса в системной настройке SchemaNamePrefix. 

Иван Небеддаг пишет:

config.primaryDisplayColumn приходил undefined, в итоге я остановил выполнение в этом месте и в консоли вручную задал его значение:config.primaryDisplayColumn = {   name: "Name" //Подставил имя столбца из моего объекта };

Подскажите пожалуйста где именно в консоли вы задали значение? И что за "имя столбца объекта" подставили?

Идрисов Артур Ильдарович,

Имя столбца объекта можете подставить любое, лишь бы оно в Вашем объекте было. Можете использовать "Id", не ошибетесь. 

А на первый вопрос даже не знаю, что ответить. Вы просто ставите точку останова перед строкой, где происходит ошибка, переходите во вкладку консоль и пишете config.primaryDisplayColumn = {   name: "Id" }, после чего продолжаете выполнение кода.

Но, возможно, вместо всех этих действий, будет достаточно открыть в конфигурации объект, и в его свойствах (расширенных) в блоке "системные колонки" задать отображаемый по умолчанию столбец в параметре "отображаемое значение". Я не проверял такой вариант, но мне кажется, что должно помочь, судя по ошибке.

Показать все комментарии