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

Нравится

1 комментарий

Здравствуйте, Олег!

 

В основном приложении, в разделе [Системные настройки] есть настройка с кодом [MobileSectionsWithSearchOnly]. Она отвечает за список разделов в мобильном приложении, данные в которых отображаются только через использование поиска.
Если в поле [Значение по умолчанию] проставить значение "0", то во всех разделах записи будут сразу отображаться, без использования поиска.

Если необходимо, чтобы в некоторых разделах записи отображались лишь через использование поиска, требуется прописать в поле [Значение по умолчанию] список объектов разделов, разделяемых точкой с запятой.
 

Эта логика задействована по нескольким причинам:
- с целью уменьшения потребления трафика на моб. приложении;
- уменьшение запросов к серверу на select, что снижает нагрузку на БД;
- зачастую, в рабочей практике, нет необходимости листать весь список записей, а удобнее просматривать список недавних.
 

На СУБД PostgreSQL нет данной настройки, поэтому есть обходное решение для отображения записей в разделах мобильного приложения.
Так как настройки нет, за основу берется фича UseMobileSearchOnlyInSections и режим работы приложения (онлайн-режим). Если фичу отключить, то данные в разделах будут подгружаться автоматически в моб. приложении в онлайн режиме. В оффлайн режиме все записи в разделах кешируются по умолчанию.

Скрипт по включению/выключению фичей ниже:
https://academy.terrasoft.ua/docs/developer/ehlementy_interfejsa/upravl…

 

Частично описание настроек мобильного приложения есть на Академии:
https://academy.terrasoft.ua/docs/8-0/user/ustanovka_i_administrirovani…

 

Так же некоторые настройки подписаны в самом приложении, если их открыть в разделе "Системные настройки".

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

Здравствуйте

 

Я установил приложение от DeVLabs - Настройка колонок реестра раздела в разрезе групп (Advanced list setup for Creatio) и последнее время, возможно при работе ТП над какими-то запросами у меня начали слетать настройки при переключении между группами.

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

Нравится

1 комментарий

Павел, добрый день!
Вы могли бы предоставить более детальные кейсы или скриншоты, по которым мы могли бы провести тестирование?
Если у Вас есть пошаговый кейс воспроизведения ошибки - это поможет в анализе.

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

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

Добрый день!

Каким образом В реестре Обращения установить фиксированную высоту записей. Т.е. чтобы не было такого: 

А все были одной высоты.

7.18.2

Нравится

2 комментария
Лучший ответ

Добрый день!

 

Высота записи в реестре зависит от кол-ва вводимого текста в колонке, в данном случае это "Тема", в нем установлено ограничение в 500 символов и вот все они выводятся в реестр. 

 

Пользовательски изменить данное поведение нет возможности, только при помощи разработки.

 

Фиксированную высоту сделать не получиться, но можно сделать что бы тест не занимал более одной строки добавив следующее стили:

.grid [class*='grid-cols-'] {
    overflow: hidden;
    text-overflow: ellipsis;
    white-space: nowrap;
}

Сделать это можно добавив новый модуль в конфигурации и прописав у него css 
а затем подключить ранее созданый модуль в BootstrapModulesV2 или BootstrapModules

Добрый день!

 

Высота записи в реестре зависит от кол-ва вводимого текста в колонке, в данном случае это "Тема", в нем установлено ограничение в 500 символов и вот все они выводятся в реестр. 

 

Пользовательски изменить данное поведение нет возможности, только при помощи разработки.

 

Фиксированную высоту сделать не получиться, но можно сделать что бы тест не занимал более одной строки добавив следующее стили:

.grid [class*='grid-cols-'] {
    overflow: hidden;
    text-overflow: ellipsis;
    white-space: nowrap;
}

Сделать это можно добавив новый модуль в конфигурации и прописав у него css 
а затем подключить ранее созданый модуль в BootstrapModulesV2 или BootstrapModules

Ivan Kuchma,

Спасибо!

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

Доброго дня!

 

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

 

Есть предположение, что нужно как-то грамотно организовать колбэки с this.reloadGridData(), но никак не выходит. Может кто сталкивался с подобным кейсом

 

Исходный код прилагаю.

addRecord: function(typeColumnValue) {
    var config = {
	    recordId: Terrasoft.GUID_EMPTY,
		operation: Terrasoft.ConfigurationEnums.CardOperation.ADD,
		entitySchemaName: "Account",
		valuePairs: this.getAddMiniPageDefaultValues(),
		miniPageSchemaName: "AccountMiniPage",
	};
    this.openMiniPage(config);
},
 
getAddMiniPageDefaultValues: function() {
    var defaultValues = [];
    defaultValues.push({
        name: "Parent", 
        value: this.get("MasterRecordId")
    });
	defaultValues.push({
	    name: "Category",
		value: "dc199b6d-e948-4598-8a12-c38ca90428d8"
	});
	return defaultValues;
}

Благодарю за ваши ответы

Нравится

3 комментария
Лучший ответ

Вадим, добрый день

У вас деталь - это один модуль, а миникарточка - другой. Единственный вариант общения между модулями - это сообщения. И да, при  работе с этой миникарточкой вы всегда будете отправлять сообщение, а вот реагировать на него будет деталь только в том случае, если этот модуль сейчас загружен в системе (фактически, если он отображается на экране)

Вадим, добрый день.

 

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

Алла Савельева,

Спасибо за ответ! Однако реализация не совсем очевидна. Неужели для реализации этого кейса придется постоянно публиковать сообщение со стороны добавляемого объекта для обновления детали? Учитывая то, что добавляемый объект, помимо детали, может создаваться и из других мест

Вадим, добрый день

У вас деталь - это один модуль, а миникарточка - другой. Единственный вариант общения между модулями - это сообщения. И да, при  работе с этой миникарточкой вы всегда будете отправлять сообщение, а вот реагировать на него будет деталь только в том случае, если этот модуль сейчас загружен в системе (фактически, если он отображается на экране)

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

Добрый день, коллеги! Хотел узнать есть ли возможность переопределить командную строку, чтобы отображать реестр КОНТАКТ не по отображаемому полю ФИО, а по полю МОБИЛЬНЫЙ ТЕЛЕФОН.

 

Попытался переопределить метод getFilters в ContactSectionV2, но при открытие переходит раздела КОНТАКТЫ он вновь сбивает и делает по ФИО. Добавил в раздел КОНТАКТЫ колонку (секцию) МОБИЛЬНЫЙ ТЕЛЕФОН, но все равно переходит на ФИО.

Пример взял отсюда:

https://community.terrasoft.ru/questions/kastomizaciya-stroki-poiska-co…

 

После попробовал переопределить первичную колонку по этому примеру, но при открытие и фильтр отрабатывает корректно, но при открытие любой карточки требует обязательного заполнения МОБИЛЬНЫЙ ТЕЛЕФОН:

https://community.terrasoft.ru/questions/komandnaya-stroka

 

Может кто-то решил подобную проблему?

 

 

 

Нравится

1 комментарий

Добрый день, Алексей!

В указанном вами примере в коде переопределённого метода есть условие на выполнение фильтра 
if (emailFilter && emailFilter.includes("@")). Скорее всего следует копать именно в этом месте, поскольку вместо вашего фильтра используется базовый.  Рекомендую сделать что-то наподоби регулярного выражения на номер телефона, вместо наведённого в примере символа "@".

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

Добрый день, я сделал справочное поле мульти справочным
вот так

attributes: {
           "qrtClientAccountSigner": { // поле, в котором создаем мультилукап
              "dataValueType": this.Terrasoft.DataValueType.LOOKUP,
              "multiLookupColumns": ["qrtContact", "qrtCounterparty"]  // перечисляем созданные нами колонки, которые будет содержать мультилукап
          }
        },

С разделами оно работает все нормально, но когда я пытаюсь выбрать через него поле значение в редактируемом реестре, то представление этого поля просто становится пустым, хотя если упасть в саму карточку оно наполнено

Нравится

4 комментария

Дмитрий, мультисправочное поле отображается только на карточке, реально данные хранятся не в поле, по которому назван компонент, а в одном из двух или более указанных в свойстве multiLookupColumns. Следовательно, в реестр нет смысла выводить пустое поле объекта, а нужно вывести те два справочных поля.

Зверев Александр,
т.е вывести результат этого поля в реестре не выйдет?
и решение таковое, что выводим поля , по которым оно сформировано, а значения этих полей формируем при создании записи в мультисправочном поле

Зверев Александр,

 

При выборе контрагента в мульти-поле Инвестор, контрагент сохраняется и в инвесторе и
Дублируется в поле Контрагент.
При выборе контакта в мультиполе Инвестор, Контакт заполняется в поле Контрагента, но сразу исчезает с детали
Из поля Инвестор, но в карточке детали в поле Инвестор отображается.

В другом объекте системы на подобной детали все наоборот. Сохраняются контракты в мультиполе на детали.

 

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

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

Пытаюсь перенести настройки реестра деталей на другую среду 
Мой алгоритм действий такой
В данных выбираю объект sysprofiledata с типом установки установка
Далее на вкладке привязка данных по ключу ищу детали для фиксации настройки реестра, далее сохраняю, фиксирую изменения и заливаю на целевую среду,   но настройки реестра не применяются 
(в пятницу по этому алгоритму все получилось, но сегодня утром сказали, что все сбросилось,хотя я все изменения фиксировал
Раньше при фиксации изменений настройек реестра было больше колонок для выбора, а именнно нету данные и objectdifference, которые ставил обязательно для обновления)
Версия на которой фиксирую изменения 7 17 , целевая среда на 7 16
 

Нравится

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

Дима, больше всего смущает это: 

Версия на которой фиксирую изменения 7 17 , целевая среда на 7 16

Лучше всего переносить между идентичными версиями системы, в крайнем случае — от старой на новую, но не наоборот, из новой в старую, поскольку такое использование никто не тестировал. Если на базах разных версий привести содержимое поля ObjectData в SysProfileData у аналогичных записей к текстовому виду при помощи «cast([ObjectData] as varchar(max))», видно различия в параметрах и формате информации о столбцах. Вероятно, дело в этом. Более подробно можно сказать, сравнивая конкретное наполнение поля у Вас: дело в формате, дубле записей или ещё чём-то.

дев и прод еще не обновили, поэтому он на 16
Но меня больше смущает то. куда пропали колонки данные и objectdifference  в новой версии ?

У меня в 7.17 есть и [ObjectData], и [ObjectDifference] (в последней всегда null или «0x», и в 7.16, и в 7.17).

Зверев Александр,

у меня на привязках созданных до обновления они тоже есть, но на новых ее нет

Если Вы всё равно выполняете обновления, не вижу смысла переносить настройки реестра с более новой на более старую, лучше делать в пределах одинаковой версии.

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

Здравствуйте!

 

Подскажите есть ли возможность сохранять реестр для нескольких культур разом?

Нравится

2 комментария
Лучший ответ

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

Уже зарегистрировано пожелание на отдел разработки для рассмотрения реализации функциональности настроек колонок для всех культур. 

 

при сохранении настройки колонки идёт обращение к сервису /0/DataService/json/SyncReply/UserProfile, там передаётся в поле profileCultureId ссылка на Id конкретной культуры:

{
   "key":"AccountSectionV2GridSettingsGridDataView",
   "data":"{\"tiledColumnsConfig\":\"{}\",\"listedColumnsConfig\":\"{}\",\"DataGrid\":{\"tiledConfig\":\"{\\\"grid\\\":{\\\"rows\\\":2,\\\"columns\\\":24},\\\"items\\\":[{\\\"column\\\":0,\\\"caption\\\":\\\"Название\\\",\\\"metaPath\\\":\\\"Name\\\",\\\"isTitleText\\\":true,\\\"width\\\":8,\\\"dataValueType\\\":1,\\\"bindTo\\\":\\\"Name\\\",\\\"position\\\":{\\\"column\\\":0,\\\"colSpan\\\":8,\\\"row\\\":1},\\\"isCaptionHidden\\\":true,\\\"isURLType\\\":false,\\\"columnType\\\":\\\"title\\\",\\\"captionConfig\\\":{\\\"visible\\\":false},\\\"type\\\":\\\"title\\\"},{\\\"column\\\":8,\\\"caption\\\":\\\"Web\\\",\\\"metaPath\\\":\\\"Web\\\",\\\"isTitleText\\\":false,\\\"width\\\":6,\\\"bindTo\\\":\\\"Web\\\",\\\"position\\\":{\\\"column\\\":8,\\\"colSpan\\\":6,\\\"row\\\":1},\\\"isCaptionHidden\\\":false,\\\"isURLType\\\":false,\\\"captionConfig\\\":{\\\"visible\\\":true}},{\\\"column\\\":14,\\\"caption\\\":\\\"Основной телефон\\\",\\\"metaPath\\\":\\\"Phone\\\",\\\"isTitleText\\\":false,\\\"width\\\":5,\\\"bindTo\\\":\\\"Phone\\\",\\\"position\\\":{\\\"column\\\":14,\\\"colSpan\\\":5,\\\"row\\\":1},\\\"isCaptionHidden\\\":false,\\\"isURLType\\\":false,\\\"captionConfig\\\":{\\\"visible\\\":true}},{\\\"column\\\":19,\\\"caption\\\":\\\"Тип\\\",\\\"metaPath\\\":\\\"Type\\\",\\\"isTitleText\\\":false,\\\"width\\\":5,\\\"bindTo\\\":\\\"Type\\\",\\\"position\\\":{\\\"column\\\":19,\\\"colSpan\\\":5,\\\"row\\\":1},\\\"isCaptionHidden\\\":false,\\\"isURLType\\\":false,\\\"captionConfig\\\":{\\\"visible\\\":true}},{\\\"column\\\":0,\\\"caption\\\":\\\"Основной контакт\\\",\\\"metaPath\\\":\\\"PrimaryContact\\\",\\\"isTitleText\\\":false,\\\"width\\\":8,\\\"dataValueType\\\":10,\\\"bindTo\\\":\\\"PrimaryContact\\\",\\\"position\\\":{\\\"column\\\":0,\\\"colSpan\\\":8,\\\"row\\\":2},\\\"isCaptionHidden\\\":false,\\\"isURLType\\\":false,\\\"columnType\\\":\\\"text\\\",\\\"captionConfig\\\":{\\\"visible\\\":true},\\\"type\\\":\\\"text\\\"},{\\\"column\\\":8,\\\"caption\\\":\\\"Адрес\\\",\\\"metaPath\\\":\\\"Address\\\",\\\"isTitleText\\\":false,\\\"width\\\":6,\\\"dataValueType\\\":1,\\\"bindTo\\\":\\\"Address\\\",\\\"position\\\":{\\\"column\\\":8,\\\"colSpan\\\":6,\\\"row\\\":2},\\\"isCaptionHidden\\\":false,\\\"isURLType\\\":false,\\\"captionConfig\\\":{\\\"visible\\\":true}},{\\\"column\\\":14,\\\"caption\\\":\\\"Город\\\",\\\"metaPath\\\":\\\"City\\\",\\\"isTitleText\\\":false,\\\"width\\\":5,\\\"bindTo\\\":\\\"City\\\",\\\"position\\\":{\\\"column\\\":14,\\\"colSpan\\\":5,\\\"row\\\":2},\\\"isCaptionHidden\\\":false,\\\"isURLType\\\":false,\\\"captionConfig\\\":{\\\"visible\\\":true}},{\\\"column\\\":19,\\\"caption\\\":\\\"Страна\\\",\\\"metaPath\\\":\\\"Country\\\",\\\"isTitleText\\\":false,\\\"width\\\":5,\\\"bindTo\\\":\\\"Country\\\",\\\"position\\\":{\\\"column\\\":19,\\\"colSpan\\\":5,\\\"row\\\":2},\\\"isCaptionHidden\\\":false,\\\"isURLType\\\":false,\\\"captionConfig\\\":{\\\"visible\\\":true}}]}\",\"listedConfig\":\"{\\\"items\\\":[{\\\"column\\\":0,\\\"caption\\\":\\\"Название\\\",\\\"metaPath\\\":\\\"Name\\\",\\\"isTitleText\\\":false,\\\"width\\\":9,\\\"dataValueType\\\":1,\\\"bindTo\\\":\\\"Name\\\",\\\"position\\\":{\\\"column\\\":0,\\\"colSpan\\\":9,\\\"row\\\":1},\\\"columnType\\\":\\\"text\\\",\\\"isURLType\\\":false,\\\"type\\\":\\\"text\\\"},{\\\"column\\\":9,\\\"caption\\\":\\\"Тип\\\",\\\"metaPath\\\":\\\"Type\\\",\\\"width\\\":5,\\\"bindTo\\\":\\\"Type\\\",\\\"position\\\":{\\\"column\\\":9,\\\"colSpan\\\":5,\\\"row\\\":1}},{\\\"column\\\":14,\\\"caption\\\":\\\"Основной телефон\\\",\\\"metaPath\\\":\\\"Phone\\\",\\\"width\\\":5,\\\"bindTo\\\":\\\"Phone\\\",\\\"position\\\":{\\\"column\\\":14,\\\"colSpan\\\":5,\\\"row\\\":1}},{\\\"column\\\":19,\\\"caption\\\":\\\"Основной контакт\\\",\\\"metaPath\\\":\\\"PrimaryContact\\\",\\\"width\\\":5,\\\"bindTo\\\":\\\"PrimaryContact\\\",\\\"position\\\":{\\\"column\\\":19,\\\"colSpan\\\":5,\\\"row\\\":1}}]}\",\"isTiled\":true,\"type\":\"tiled\",\"key\":\"AccountSectionV2GridSettingsGridDataView\"},\"DataGridVerticalProfile\":{\"tiledConfig\":\"{\\\"grid\\\":{\\\"rows\\\":5,\\\"columns\\\":24},\\\"items\\\":[{\\\"bindTo\\\":\\\"Name\\\",\\\"caption\\\":\\\"Название\\\",\\\"type\\\":\\\"title\\\",\\\"position\\\":{\\\"column\\\":0,\\\"colSpan\\\":24,\\\"row\\\":1},\\\"dataValueType\\\":1,\\\"metaPath\\\":\\\"Name\\\",\\\"captionConfig\\\":{\\\"visible\\\":false}},{\\\"bindTo\\\":\\\"Type\\\",\\\"caption\\\":\\\"Тип\\\",\\\"position\\\":{\\\"column\\\":0,\\\"colSpan\\\":24,\\\"row\\\":2},\\\"dataValueType\\\":10,\\\"metaPath\\\":\\\"Type\\\",\\\"captionConfig\\\":{\\\"visible\\\":true}},{\\\"bindTo\\\":\\\"PrimaryContact\\\",\\\"caption\\\":\\\"Основной контакт\\\",\\\"position\\\":{\\\"column\\\":0,\\\"colSpan\\\":24,\\\"row\\\":3},\\\"dataValueType\\\":10,\\\"metaPath\\\":\\\"PrimaryContact\\\",\\\"captionConfig\\\":{\\\"visible\\\":true}},{\\\"bindTo\\\":\\\"Phone\\\",\\\"caption\\\":\\\"Основной телефон\\\",\\\"type\\\":\\\"text\\\",\\\"position\\\":{\\\"column\\\":0,\\\"colSpan\\\":24,\\\"row\\\":4},\\\"dataValueType\\\":1,\\\"metaPath\\\":\\\"Phone\\\",\\\"captionConfig\\\":{\\\"visible\\\":true}}]}\",\"listedConfig\":\"{\\\"items\\\":[]}\",\"key\":\"AccountSectionV2GridSettingsGridDataView\",\"isTiled\":true,\"type\":\"tiled\"},\"key\":\"AccountSectionV2GridSettingsGridDataView\",\"Filters\":{},\"isTiled\":true,\"MobileDataGrid\":{\"tiledConfig\":\"{\\\"grid\\\":{\\\"rows\\\":7,\\\"columns\\\":24},\\\"items\\\":[{\\\"bindTo\\\":\\\"City\\\",\\\"caption\\\":\\\"Город\\\",\\\"position\\\":{\\\"column\\\":0,\\\"colSpan\\\":24,\\\"row\\\":1},\\\"dataValueType\\\":10,\\\"metaPath\\\":\\\"City\\\",\\\"captionConfig\\\":{\\\"visible\\\":true}},{\\\"bindTo\\\":\\\"Web\\\",\\\"caption\\\":\\\"Web\\\",\\\"position\\\":{\\\"column\\\":0,\\\"colSpan\\\":24,\\\"row\\\":2},\\\"dataValueType\\\":1,\\\"metaPath\\\":\\\"Web\\\",\\\"captionConfig\\\":{\\\"visible\\\":true}},{\\\"bindTo\\\":\\\"Address\\\",\\\"caption\\\":\\\"Адрес\\\",\\\"position\\\":{\\\"column\\\":0,\\\"colSpan\\\":24,\\\"row\\\":3},\\\"dataValueType\\\":1,\\\"metaPath\\\":\\\"Address\\\",\\\"captionConfig\\\":{\\\"visible\\\":true}},{\\\"bindTo\\\":\\\"ModifiedBy\\\",\\\"caption\\\":\\\"Изменил\\\",\\\"position\\\":{\\\"column\\\":0,\\\"colSpan\\\":24,\\\"row\\\":4},\\\"dataValueType\\\":10,\\\"metaPath\\\":\\\"ModifiedBy\\\",\\\"captionConfig\\\":{\\\"visible\\\":true}},{\\\"bindTo\\\":\\\"AlternativeName\\\",\\\"caption\\\":\\\"Альтернативные названия\\\",\\\"position\\\":{\\\"column\\\":0,\\\"colSpan\\\":24,\\\"row\\\":5},\\\"dataValueType\\\":1,\\\"metaPath\\\":\\\"AlternativeName\\\",\\\"captionConfig\\\":{\\\"visible\\\":true}},{\\\"bindTo\\\":\\\"AdditionalPhone\\\",\\\"caption\\\":\\\"Дополнительный телефон\\\",\\\"position\\\":{\\\"column\\\":0,\\\"colSpan\\\":24,\\\"row\\\":6},\\\"dataValueType\\\":1,\\\"metaPath\\\":\\\"AdditionalPhone\\\",\\\"captionConfig\\\":{\\\"visible\\\":true}},{\\\"bindTo\\\":\\\"City\\\",\\\"caption\\\":\\\"Город\\\",\\\"position\\\":{\\\"column\\\":0,\\\"colSpan\\\":24,\\\"row\\\":7},\\\"dataValueType\\\":10,\\\"metaPath\\\":\\\"City\\\",\\\"captionConfig\\\":{\\\"visible\\\":true}}]}\",\"listedConfig\":\"{\\\"items\\\":[]}\",\"isTiled\":true,\"type\":\"tiled\"},\"profileCultureId\":\"1a778e3f-0a8e-e111-84a3-00155d054c03\"}",
   "isDef":false
}

Настройка задаётся для себя с isDef =  false или для всех с isDef =  true.

Стандартно для отправки настроек в другой культуре функции нет, нужно делать доработку: либо отправлять ещё один запрос к сервису с указанием другой культуры и того же значения key, либо менять (или добавлять, если нет) в базе значения в таблице SysProfileData, отфильтровав там по Key и SysCultureId.

Сами настройки хранятся в поле ObjectData, его значение можно увидеть, написав в SQL-запросе «cast(ObjectData as varchar(max))».

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

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

Уже зарегистрировано пожелание на отдел разработки для рассмотрения реализации функциональности настроек колонок для всех культур. 

 

при сохранении настройки колонки идёт обращение к сервису /0/DataService/json/SyncReply/UserProfile, там передаётся в поле profileCultureId ссылка на Id конкретной культуры:

{
   "key":"AccountSectionV2GridSettingsGridDataView",
   "data":"{\"tiledColumnsConfig\":\"{}\",\"listedColumnsConfig\":\"{}\",\"DataGrid\":{\"tiledConfig\":\"{\\\"grid\\\":{\\\"rows\\\":2,\\\"columns\\\":24},\\\"items\\\":[{\\\"column\\\":0,\\\"caption\\\":\\\"Название\\\",\\\"metaPath\\\":\\\"Name\\\",\\\"isTitleText\\\":true,\\\"width\\\":8,\\\"dataValueType\\\":1,\\\"bindTo\\\":\\\"Name\\\",\\\"position\\\":{\\\"column\\\":0,\\\"colSpan\\\":8,\\\"row\\\":1},\\\"isCaptionHidden\\\":true,\\\"isURLType\\\":false,\\\"columnType\\\":\\\"title\\\",\\\"captionConfig\\\":{\\\"visible\\\":false},\\\"type\\\":\\\"title\\\"},{\\\"column\\\":8,\\\"caption\\\":\\\"Web\\\",\\\"metaPath\\\":\\\"Web\\\",\\\"isTitleText\\\":false,\\\"width\\\":6,\\\"bindTo\\\":\\\"Web\\\",\\\"position\\\":{\\\"column\\\":8,\\\"colSpan\\\":6,\\\"row\\\":1},\\\"isCaptionHidden\\\":false,\\\"isURLType\\\":false,\\\"captionConfig\\\":{\\\"visible\\\":true}},{\\\"column\\\":14,\\\"caption\\\":\\\"Основной телефон\\\",\\\"metaPath\\\":\\\"Phone\\\",\\\"isTitleText\\\":false,\\\"width\\\":5,\\\"bindTo\\\":\\\"Phone\\\",\\\"position\\\":{\\\"column\\\":14,\\\"colSpan\\\":5,\\\"row\\\":1},\\\"isCaptionHidden\\\":false,\\\"isURLType\\\":false,\\\"captionConfig\\\":{\\\"visible\\\":true}},{\\\"column\\\":19,\\\"caption\\\":\\\"Тип\\\",\\\"metaPath\\\":\\\"Type\\\",\\\"isTitleText\\\":false,\\\"width\\\":5,\\\"bindTo\\\":\\\"Type\\\",\\\"position\\\":{\\\"column\\\":19,\\\"colSpan\\\":5,\\\"row\\\":1},\\\"isCaptionHidden\\\":false,\\\"isURLType\\\":false,\\\"captionConfig\\\":{\\\"visible\\\":true}},{\\\"column\\\":0,\\\"caption\\\":\\\"Основной контакт\\\",\\\"metaPath\\\":\\\"PrimaryContact\\\",\\\"isTitleText\\\":false,\\\"width\\\":8,\\\"dataValueType\\\":10,\\\"bindTo\\\":\\\"PrimaryContact\\\",\\\"position\\\":{\\\"column\\\":0,\\\"colSpan\\\":8,\\\"row\\\":2},\\\"isCaptionHidden\\\":false,\\\"isURLType\\\":false,\\\"columnType\\\":\\\"text\\\",\\\"captionConfig\\\":{\\\"visible\\\":true},\\\"type\\\":\\\"text\\\"},{\\\"column\\\":8,\\\"caption\\\":\\\"Адрес\\\",\\\"metaPath\\\":\\\"Address\\\",\\\"isTitleText\\\":false,\\\"width\\\":6,\\\"dataValueType\\\":1,\\\"bindTo\\\":\\\"Address\\\",\\\"position\\\":{\\\"column\\\":8,\\\"colSpan\\\":6,\\\"row\\\":2},\\\"isCaptionHidden\\\":false,\\\"isURLType\\\":false,\\\"captionConfig\\\":{\\\"visible\\\":true}},{\\\"column\\\":14,\\\"caption\\\":\\\"Город\\\",\\\"metaPath\\\":\\\"City\\\",\\\"isTitleText\\\":false,\\\"width\\\":5,\\\"bindTo\\\":\\\"City\\\",\\\"position\\\":{\\\"column\\\":14,\\\"colSpan\\\":5,\\\"row\\\":2},\\\"isCaptionHidden\\\":false,\\\"isURLType\\\":false,\\\"captionConfig\\\":{\\\"visible\\\":true}},{\\\"column\\\":19,\\\"caption\\\":\\\"Страна\\\",\\\"metaPath\\\":\\\"Country\\\",\\\"isTitleText\\\":false,\\\"width\\\":5,\\\"bindTo\\\":\\\"Country\\\",\\\"position\\\":{\\\"column\\\":19,\\\"colSpan\\\":5,\\\"row\\\":2},\\\"isCaptionHidden\\\":false,\\\"isURLType\\\":false,\\\"captionConfig\\\":{\\\"visible\\\":true}}]}\",\"listedConfig\":\"{\\\"items\\\":[{\\\"column\\\":0,\\\"caption\\\":\\\"Название\\\",\\\"metaPath\\\":\\\"Name\\\",\\\"isTitleText\\\":false,\\\"width\\\":9,\\\"dataValueType\\\":1,\\\"bindTo\\\":\\\"Name\\\",\\\"position\\\":{\\\"column\\\":0,\\\"colSpan\\\":9,\\\"row\\\":1},\\\"columnType\\\":\\\"text\\\",\\\"isURLType\\\":false,\\\"type\\\":\\\"text\\\"},{\\\"column\\\":9,\\\"caption\\\":\\\"Тип\\\",\\\"metaPath\\\":\\\"Type\\\",\\\"width\\\":5,\\\"bindTo\\\":\\\"Type\\\",\\\"position\\\":{\\\"column\\\":9,\\\"colSpan\\\":5,\\\"row\\\":1}},{\\\"column\\\":14,\\\"caption\\\":\\\"Основной телефон\\\",\\\"metaPath\\\":\\\"Phone\\\",\\\"width\\\":5,\\\"bindTo\\\":\\\"Phone\\\",\\\"position\\\":{\\\"column\\\":14,\\\"colSpan\\\":5,\\\"row\\\":1}},{\\\"column\\\":19,\\\"caption\\\":\\\"Основной контакт\\\",\\\"metaPath\\\":\\\"PrimaryContact\\\",\\\"width\\\":5,\\\"bindTo\\\":\\\"PrimaryContact\\\",\\\"position\\\":{\\\"column\\\":19,\\\"colSpan\\\":5,\\\"row\\\":1}}]}\",\"isTiled\":true,\"type\":\"tiled\",\"key\":\"AccountSectionV2GridSettingsGridDataView\"},\"DataGridVerticalProfile\":{\"tiledConfig\":\"{\\\"grid\\\":{\\\"rows\\\":5,\\\"columns\\\":24},\\\"items\\\":[{\\\"bindTo\\\":\\\"Name\\\",\\\"caption\\\":\\\"Название\\\",\\\"type\\\":\\\"title\\\",\\\"position\\\":{\\\"column\\\":0,\\\"colSpan\\\":24,\\\"row\\\":1},\\\"dataValueType\\\":1,\\\"metaPath\\\":\\\"Name\\\",\\\"captionConfig\\\":{\\\"visible\\\":false}},{\\\"bindTo\\\":\\\"Type\\\",\\\"caption\\\":\\\"Тип\\\",\\\"position\\\":{\\\"column\\\":0,\\\"colSpan\\\":24,\\\"row\\\":2},\\\"dataValueType\\\":10,\\\"metaPath\\\":\\\"Type\\\",\\\"captionConfig\\\":{\\\"visible\\\":true}},{\\\"bindTo\\\":\\\"PrimaryContact\\\",\\\"caption\\\":\\\"Основной контакт\\\",\\\"position\\\":{\\\"column\\\":0,\\\"colSpan\\\":24,\\\"row\\\":3},\\\"dataValueType\\\":10,\\\"metaPath\\\":\\\"PrimaryContact\\\",\\\"captionConfig\\\":{\\\"visible\\\":true}},{\\\"bindTo\\\":\\\"Phone\\\",\\\"caption\\\":\\\"Основной телефон\\\",\\\"type\\\":\\\"text\\\",\\\"position\\\":{\\\"column\\\":0,\\\"colSpan\\\":24,\\\"row\\\":4},\\\"dataValueType\\\":1,\\\"metaPath\\\":\\\"Phone\\\",\\\"captionConfig\\\":{\\\"visible\\\":true}}]}\",\"listedConfig\":\"{\\\"items\\\":[]}\",\"key\":\"AccountSectionV2GridSettingsGridDataView\",\"isTiled\":true,\"type\":\"tiled\"},\"key\":\"AccountSectionV2GridSettingsGridDataView\",\"Filters\":{},\"isTiled\":true,\"MobileDataGrid\":{\"tiledConfig\":\"{\\\"grid\\\":{\\\"rows\\\":7,\\\"columns\\\":24},\\\"items\\\":[{\\\"bindTo\\\":\\\"City\\\",\\\"caption\\\":\\\"Город\\\",\\\"position\\\":{\\\"column\\\":0,\\\"colSpan\\\":24,\\\"row\\\":1},\\\"dataValueType\\\":10,\\\"metaPath\\\":\\\"City\\\",\\\"captionConfig\\\":{\\\"visible\\\":true}},{\\\"bindTo\\\":\\\"Web\\\",\\\"caption\\\":\\\"Web\\\",\\\"position\\\":{\\\"column\\\":0,\\\"colSpan\\\":24,\\\"row\\\":2},\\\"dataValueType\\\":1,\\\"metaPath\\\":\\\"Web\\\",\\\"captionConfig\\\":{\\\"visible\\\":true}},{\\\"bindTo\\\":\\\"Address\\\",\\\"caption\\\":\\\"Адрес\\\",\\\"position\\\":{\\\"column\\\":0,\\\"colSpan\\\":24,\\\"row\\\":3},\\\"dataValueType\\\":1,\\\"metaPath\\\":\\\"Address\\\",\\\"captionConfig\\\":{\\\"visible\\\":true}},{\\\"bindTo\\\":\\\"ModifiedBy\\\",\\\"caption\\\":\\\"Изменил\\\",\\\"position\\\":{\\\"column\\\":0,\\\"colSpan\\\":24,\\\"row\\\":4},\\\"dataValueType\\\":10,\\\"metaPath\\\":\\\"ModifiedBy\\\",\\\"captionConfig\\\":{\\\"visible\\\":true}},{\\\"bindTo\\\":\\\"AlternativeName\\\",\\\"caption\\\":\\\"Альтернативные названия\\\",\\\"position\\\":{\\\"column\\\":0,\\\"colSpan\\\":24,\\\"row\\\":5},\\\"dataValueType\\\":1,\\\"metaPath\\\":\\\"AlternativeName\\\",\\\"captionConfig\\\":{\\\"visible\\\":true}},{\\\"bindTo\\\":\\\"AdditionalPhone\\\",\\\"caption\\\":\\\"Дополнительный телефон\\\",\\\"position\\\":{\\\"column\\\":0,\\\"colSpan\\\":24,\\\"row\\\":6},\\\"dataValueType\\\":1,\\\"metaPath\\\":\\\"AdditionalPhone\\\",\\\"captionConfig\\\":{\\\"visible\\\":true}},{\\\"bindTo\\\":\\\"City\\\",\\\"caption\\\":\\\"Город\\\",\\\"position\\\":{\\\"column\\\":0,\\\"colSpan\\\":24,\\\"row\\\":7},\\\"dataValueType\\\":10,\\\"metaPath\\\":\\\"City\\\",\\\"captionConfig\\\":{\\\"visible\\\":true}}]}\",\"listedConfig\":\"{\\\"items\\\":[]}\",\"isTiled\":true,\"type\":\"tiled\"},\"profileCultureId\":\"1a778e3f-0a8e-e111-84a3-00155d054c03\"}",
   "isDef":false
}

Настройка задаётся для себя с isDef =  false или для всех с isDef =  true.

Стандартно для отправки настроек в другой культуре функции нет, нужно делать доработку: либо отправлять ещё один запрос к сервису с указанием другой культуры и того же значения key, либо менять (или добавлять, если нет) в базе значения в таблице SysProfileData, отфильтровав там по Key и SysCultureId.

Сами настройки хранятся в поле ObjectData, его значение можно увидеть, написав в SQL-запросе «cast(ObjectData as varchar(max))».

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

Зверев Александр,

Спасибо

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

Добрый день, уважаемые коллеги!

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

Попыталась поискать решение по материалам сообщества, но так и не разобралась, можно ли реализовать такую потребность и каким образом.

https://community.terrasoft.ru/articles/susestvuet-li-v-79-sposob-zadat-cvet-stroke-v-reestre-mobilnogo-prilozenia

https://community.terrasoft.ru/questions/napisanie-stilei-dla-mobilnoi-versii

https://community.terrasoft.ru/articles/kak-v-mobilnoi-versii-prilozenia-vyvesti-dopolnitelnye-kolonki-v-reestra-razdela

 

Подскажите, пожалуйста, понять как работает Terrasoft.util.writeStyles:

  1. можно ли и как в данном случае использовать Terrasoft.util.writeStyles (сложилось впечатление, что стиль определяется для реестра/схемы в целом)?
  2. Если реализация возможна, то на каком типе схемы для реестра надо обращаться к Terrasoft.util.writeStyles ?

Благодарю за помощь

Нравится

4 комментария
Лучший ответ

Марина, это немного нетривиальная задача, но она реализуема.

 

Как подобное можно реализовать. Для этого нужно по сути реализовать свой компонент реестра\грида, расширив базовый компонент list. Именно так сделано в разделе «Лента»\”Feed” (см. MobileFeedList, MobileSocialMessageGridPageView).

  1. Создать свой компонент, расширив базовый list. Например, если нужно менять стиль только основного выводимого поля, то можно реализовать в нем только метод getApplyItemTplPrimaryColumnFn. Что-то типа:

 

Ext.define("Terrasoft.configuration.MyList", {
   extend: "Ext.Terrasoft.List",
   xtype: "cfmylist",
 
   getApplyItemTplPrimaryColumnFn: function() {
      return function(values) {
         var config = this.primaryColumnConfig;
         var value = this.getValueByConfig(config, values);
         var typeId = values["Type"];
         var isRed = false;
         if (typeId === "some_type_value") {
            isRed = true;
         }
         if (value) {
            return "<div class=\"x-list-title\" " + isRed ? "style=\"color: red;\"" : "" + ">" + value + "</div>";
         }
         return "";
      };
   }
 
});

 

  1. Во view страницы реестра своего раздела указать в качестве используемого компонента свой разработанный компонент из п.1.
Ext.define("Terrasoft.configuration.view.ContactGridPage", {
   extend: "Terrasoft.view.BaseGridPage.View",
   xtype: "contactgridpageview",
   config: {
      grid: {
         xtype: "cfmylist",
      },
   },
  1. Прописать в манифесте в CustomSchemas схему, в которой реализовали свой компонент.

Марина, это немного нетривиальная задача, но она реализуема.

 

Как подобное можно реализовать. Для этого нужно по сути реализовать свой компонент реестра\грида, расширив базовый компонент list. Именно так сделано в разделе «Лента»\”Feed” (см. MobileFeedList, MobileSocialMessageGridPageView).

  1. Создать свой компонент, расширив базовый list. Например, если нужно менять стиль только основного выводимого поля, то можно реализовать в нем только метод getApplyItemTplPrimaryColumnFn. Что-то типа:

 

Ext.define("Terrasoft.configuration.MyList", {
   extend: "Ext.Terrasoft.List",
   xtype: "cfmylist",
 
   getApplyItemTplPrimaryColumnFn: function() {
      return function(values) {
         var config = this.primaryColumnConfig;
         var value = this.getValueByConfig(config, values);
         var typeId = values["Type"];
         var isRed = false;
         if (typeId === "some_type_value") {
            isRed = true;
         }
         if (value) {
            return "<div class=\"x-list-title\" " + isRed ? "style=\"color: red;\"" : "" + ">" + value + "</div>";
         }
         return "";
      };
   }
 
});

 

  1. Во view страницы реестра своего раздела указать в качестве используемого компонента свой разработанный компонент из п.1.
Ext.define("Terrasoft.configuration.view.ContactGridPage", {
   extend: "Terrasoft.view.BaseGridPage.View",
   xtype: "contactgridpageview",
   config: {
      grid: {
         xtype: "cfmylist",
      },
   },
  1. Прописать в манифесте в CustomSchemas схему, в которой реализовали свой компонент.

Зверев Александр,

 

Александр, огромное спасибо за подробное описание алгоритма с примерами. Стала пытаться реализовать алгоритм и столкнулась с проблемой во 2-м пункте :)

 

В конкретной ситуации рассматривается реестр Контрагентов. Сейчас отображается MobileAccountGridPage, который надо изменить и в коде которого:

Ext.define("AccountGridPage.View", {
	extend: "Terrasoft.view.BaseGridPage.View",
	xtype: "accountgridpage",
	config: {
		id: "AccountGridPage",
		navigationPanel: {
			id: "AccountGridPage_navigationPanel",
			title: LocalizableStrings["AccountGridPage_navigationPanel_title"]
		},
		grid: {
			id: "AccountGridPage_grid",
			iconCls: "user",
			store: "AccountGridPage.Store"
		}
	}
});

Так как здесь я не могу вносить изменения, то пытаюсь реализовать либо как:

- расширение от вышеуказанного класса "AccountGridPage.View", но в этом случае возникает ошибка - Uncaught Error: [Ext.Loader] Failed loading 'AccountGridPage/View.js', please verify that the file exists

- расширение от класса "Terrasoft.view.AccountGridPage.View" , возникает ошибка - sencha-touch-all-debug.js:8634 Uncaught Error: [Ext.Loader] Failed loading 'app/view/AccountGridPage/View.js', please verify that the file exists,

- расширение от "Terrasoft.view.BaseGridPage.View", но в этом случае ничего не происходит.

Ext.define("Terrasoft.configuration.view.UsrAccountGridPage", {
 // extend: "Terrasoft.view.AccountGridPage.View", //  Failed loading 'app/view/AccountGridPage/View.js'
 // extend: "AccountGridPage.View", // ошибка Failed loading 'AccountGridPage/View.js
  extend: "Terrasoft.view.BaseGridPage.View", // ничего не происходит
   xtype: "usraccountgridpage",
   config: {
      grid: {
         xtype: "cfmylist",
      },
   }
});

Как правильно выполнить расширение в данном случае? Благодарю за помощь

Можно скопировать текст текущей view (MobileAccountGridPage, если не ошибаюсь), создать свою схему, вставить туда скопированный текст, у свойства grid указать свой новый xtype компонента грида и не забыть указать эту схему в манифесте в свойстве Grid у модели Account.

Зверев Александр,

 

Александр, попробую. Благодарю Вас за ценные рекомендации

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

Коллеги, доброго времени суток!

Есть необходимость вывести дополнительную информацию в виде колонки реестра раздела для каждой записи.

 

Кейс: 

в реестре раздела Контрагенты вывести дополнительную колонку с названием "Контакты", и для каждой записи выводить имена всех Контактов соответствующего Контрагента (из детали "Контакты контрагента").

 

Необходимо, чтобы контакты отображались даже когда строка неактивна, то есть также, как данные других колонок (всегда).
Обычным способом такую колонку добавить не получается.

Если есть варианты, как реализовать этот кейс другим путем, буду рад их рассмотреть.

Заранее спасибо за помощь!

 

Нравится

6 комментариев
Лучший ответ

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

Дмитрий Анисько пишет:
то на мой взгляд проще добавить строковое поле в объект Контрагент и обновлять его на все нужные события для поддержания актуальности данных.

Лучше всего именно так. На уровне встроенного БП объекта детали или отдельным БП заполнять новое текстовое поле в объекте раздела. Можно ещё триггером в базе, но это Вам не подойдёт.

Дмитрий Анисько пишет:
Может быть Вы знаете, как можно добавить колонку в реестр именно на этапе формирования вью-модели?

 Даже если такое возможно, рисков больше, чем преимуществ. От большей нагрузки на сервер и базу, когда для каждой видимой в реестре строки будет отдельный запрос, до неполной функциональности, когда такая колонка не будет полноценно работать в выгрузке в Excel, итогах, печатных формах, OData и прочих интеграциях.

Здравствуйте!

 

Базовыми средствами, не прибегая к разработке, Вы не сможете реализовать подобный функционал.

Вариантов решения такой задачи несколько, например:

1. Добавляем view с 2 колонками - Guid и string. Средствами sql формируем запрос, который в первую колонку будет возвращать Id контрагента, во вторую все "склеенные" в одну строку имена относящихся к нему контактов

2. В контрагенте добавляем колонку-справочник на нашу view (не забываем про галочку контроля целосности)

3. На событии OnInserting контрагента копируем значение колонки Id в колонку из п.2

4. Дальше пользуемся базовой настройкой колонок

 

Манипуляции из пп. 2-3 нужны для того, чтобы сохранить прямую связь

Лопатин Константин,

Большое спасибо за ответ, но указанный способ не подходит.
Нужно сохранить поддержку всех 3-х субд, а создавать View для каждой - не очень удобно. Да и если идти подобным путем, то на мой взгляд проще добавить строковое поле в объект Контрагент и обновлять его на все нужные события для поддержания актуальности данных.

 

Может быть Вы знаете, как можно добавить колонку в реестр именно на этапе формирования вью-модели? Может вы знаете, что можно попробовать переопределить, чтобы изменить стандартное поведение?

 

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

Дмитрий Анисько пишет:
то на мой взгляд проще добавить строковое поле в объект Контрагент и обновлять его на все нужные события для поддержания актуальности данных.

Лучше всего именно так. На уровне встроенного БП объекта детали или отдельным БП заполнять новое текстовое поле в объекте раздела. Можно ещё триггером в базе, но это Вам не подойдёт.

Дмитрий Анисько пишет:
Может быть Вы знаете, как можно добавить колонку в реестр именно на этапе формирования вью-модели?

 Даже если такое возможно, рисков больше, чем преимуществ. От большей нагрузки на сервер и базу, когда для каждой видимой в реестре строки будет отдельный запрос, до неполной функциональности, когда такая колонка не будет полноценно работать в выгрузке в Excel, итогах, печатных формах, OData и прочих интеграциях.

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

Дмитрий Анисько пишет:

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

Дело, конечно же, Ваше, но я, если честно, так и не понял каким образом уменьшится нагрузка на БД если сравнивать view и обновление колонки после каждого чиха на событийном слое

 

Нужно сохранить поддержку всех 3-х субд, а создавать View для каждой - не очень удобно

Тоже не вижу особой проблемы с учетом того, что синтаксис аналогичный.

Лопатин Константин пишет:
Дело, конечно же, Ваше, но я, если честно, так и не понял каким образом уменьшится нагрузка на БД если сравнивать view и обновление колонки после каждого чиха на событийном слое

Честно, не тестировал три обсуждаемых варианта, но можно предположить, что данные меняют намного реже, чем читают, следовательно затраты на обновление меньше, чем каждый раз вычислять. Хотя, возможно, с view всё не так страшно, ведь запрос отрабатывает не сервере БД раз и  целиком через веб-сервер попадает в браузер. В случае же программной вычитки для каждой записи каждый раз будут отрабатывать и БД, и сервер приложений.

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