Добрый день.

Стоит задача добавить булево поле в карточку Очереди (SupervisorSingleWindowPageV2).
Добавление произвожу через мастер раздела.
Предварительно в свойствах своего пакета добавляю на вкладке "Завист от пакетов" добавляю:
OperatorSingleWindow,
OperatorCustomerEngagementCenter,
ServiceEnterpriseDefSettings
CustomerCenterDefSettings.

Булево поле создаётся и отображается в карточке. В пакете создан замещающий объект Queue, замещающая схема карточки (SupervisorSingleWindowPageV2) и замещающая схема раздела(SupervisorSingleWindowSectionV2).

Но при попытке создания новой очереди (нажатие на "Сохранить") BPMOnline подвисает и в итоге выдает следующую ошибку.
В консоли только ошибки таймаута.

Если удаляю замещающие объекты/схемы, то сохранение новой очереди происходит без проблем.
Что делаю не так?

В Академии по запросу "Обработка обращений из очереди в Едином окне" проблематично что-либо найти, кроме описания самого раздела.

Нравится

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

Автора такого user-friendly уведомления усадить бы туда кнопку "Подробнее" вставить да редирект на страницу сделать... :smile:
В пожелания, пожалуйста :cool:

Игорь, добрый день!!
Проблема, скорее всего, не в вашем поле. Для того, чтобы процесс можно было использовать в чоереди, у него должно быть добавлено два параметра глобальных: queueItemId и entityRecordId. Оба с типом "Unique identifier". В первое передается Id записи из очереди (именно объекта "Элемент очереди"), а во второй - Id записи образения/заказа/конаткта и т.д. - самого наполнения очереди.

В последних билдах в сообщении именно это и говорится. А ранее было вот такое непонятное.

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

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

Как это сделать на on-demand?

Мне кажется, что до момента вызова самого БП, вся логика происходит на клиенте, а его можно отладить и в облаке. https://academy.terrasoft.ru/documents/technic-sdk/7-8-0/otladka-klient….
Или вы проверяли и там сразу идет запрос ан сервер?

Но чем вызвано подобное поведение, ведь я наследовался от всех необходимых пакетов?

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

Добрый день!

Подскажите, почему в нашей версии bpm данные записи не считаются дублями по Названиям Контрагентов:

1. ГКУ СОН СО "Организационно-методический центр социальной помощи"

2. ГКУ СОН СО "Организационно-методический центр социальной помощи" (ОМЦ СП)

Нравится

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

Поиск идет по полному совпадению названия, разве нет?

при полном заполнении средств связи по ним и найдутся дубликаты

Поиск идет по полному совпадению символов в названии

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

Добрый день!

Подскажите, как прикрепить свой профиль в фб карточке Контакта?

Если я жму значок FB на детале Средства связи, вижу длинный список профилей других моих однофамилиц, но меня среди них нет.

Тогда я в строку поиска профиля вставляю ссылку на свой профиль, но поиск не приносит результат.

Нравится

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

Здравствуйте, Екатерина!

Попробуйте поискать не по ФИО. Находясь на странице Facebook Вы можете кликнуть на значок Вашего профиля - в результате откроется страница приблизительно следующего вида:
https://www.facebook.com/Name.Surname, где:

  • Name - Ваше имя
  • Surname - Ваша фамилия

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

Алексей, так искать я пробовала. Имя профиля в моем случае выглядит так SurnameName. Поиск не приносит результатов. Такая ситуация наблюдается не только с моим профилем.
Гугл и яндекс находят мой профиль, значит, он не скрыт, так?

Екатерина, добрый день!

По вопросу привязки контакта/контрагента с учетной записью Facebook.
И-за политики безопасности и конфиденциальности сервис Facebook по прямой ссылке запретил искать пользователей (например, https://www.facebook.com/zuck). Если ссылка на профиль контакта в Facebook не содержит числовой ID пользователя, искомый профиль не отобразится в результатах. (этот момент упоминается в «Академии» - http://www.academy.terrasoft.ru/documents/docs/product/bpm'online%20sal…)

Вы можете найти учетную запись Facebook по ссылке если вставите ID профиля (например, ссылка на пользователя «Mark Zuckerberg» -https://www.facebook.com/4)
Как обходное решение для того, чтобы узнать ID, Вы можете открыть фотографию пользователя и скопировать часть адресной строки, где после точки указан ID пользователя.

По поводу поиска профиля Facebook по имени. Для того, чтобы в приложении bmp’online приходил результат необходимо, чтобы у пользователя Facebook в настройках конфиденциальности был проставлен признак «Разрешить поисковым системам за пределами Facebook выводить ваш профиль в результатах поиска».

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

Дмитрий, здравствуйте!

Сработал поиск по ID. Спасибо за подсказку!

А в настройках Конфиденциальности стоит разрешение на показ поисковым системам. Ну это к слову.

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

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

Нравится

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

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

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

можете подробнее рассказать про веб сервис и как потом в JS обратиться к веб сервису?
ранее не сталкивался с этим.

Привет.
Прикладываю примерные коды. Из js делаем вызов C# модуля, а в модуле уже вызываем хранимку и оборачиваем все это дело в транзакцию.
"...работать с результатом." - Как вариант: хранимка кладет все нужные данные в таблицу (которую нужно будет предварительно создать в BPM), и в коде, в коллбэке, вы делаете ESQ запрос в эту таблицу, выгребая нужные данные. Как-то так.

"Варфоломеев Данила Викторович" написал:

Привет.

Прикладываю примерные коды.

привет.
спасибо за примеры буду разбираться.

вчера попробовал взять пример работы с веб сервисом из
https://academy.terrasoft.ru/documents/technic-sdk/7-8-0/kak-sozdat-svo…
почему то пример не сработал можете посмотреть в чем проблема?

вот коды сервиса

// Класс конфигурационного сервиса должен быть реализован в пространстве имен Terrasoft.Configuration.
// При необходимости можно создавать для веб-сервиса свое рабочее пространство, но оно должно быть
// обязательно вложенным в Terrasoft.Configuration.
namespace Terrasoft.Configuration.CustomConfigurationService
{
using System;
using System.ServiceModel;
using System.ServiceModel.Web;
using System.ServiceModel.Activation;

// Класс сервиса помечен обязательными атрибутами [ServiceContract] и
// [AspNetCompatibilityRequirements] с параметрами.
[ServiceContract]
[AspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibilityRequirementsMode.Required)]
public class CustomConfigurationService
{
// Метод сервиса помечен обязательными атрибутами [OperationContract] и
// [WebInvoke] с параметрами.
[OperationContract]
[WebInvoke(Method = "POST", RequestFormat = WebMessageFormat.Json, BodyStyle = WebMessageBodyStyle.Wrapped,
ResponseFormat = WebMessageFormat.Json)]
public string GetTransformValue(string inputParam)
{
var result = inputParam + " + output string";
return result;
}
}
}

а это вызов в JS

poisksumtotal: function()
{

var name = 'привет';
// Объект, инициализирующий входящие параметры для метода сервиса.
var serviceData = {
// Название свойства совпадает с именем входящего параметра метода сервиса.
inputParam: name
};

// Вызов веб-сервиса и обработка результатов.
ServiceHelper.callService("CustomConfigurationService", "GetTransformValue",
function(response) {
var result = response.GetTransformValueResult;
this.showInformationDialog(result);
}, serviceData, this);
// this.showInformationDialog(name);
},

"Евдокимов Евгений" написал:почему то пример не сработал можете посмотреть в чем проблема?

Вроде все правильно. К сожалению, без скрина ошибок в консоли не разберешься.
Из частых проблем - не добавлен ServiceHelper в define или название CustomConfigurationService указано иное (там вроде как namespace, class и название объекта должны совпадать).

"Варфоломеев Данила Викторович" написал:
Евдокимов Евгений пишет:

почему то пример не сработал можете посмотреть в чем проблема?

Вроде все правильно. К сожалению, без скрина ошибок в консоли не разберешься.

Из частых проблем - не добавлен ServiceHelper в define или название CustomConfigurationService указано иное (там вроде как namespace, class и название объекта должны совпадать).


ошибок вроде нет, ServiceHelper добавлен, все имена проверил,
при нажатии на пункт меню не выходит сообщение,

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

кодировка сбилась видимо

"Варфоломеев Данила Викторович" написал:

кодировка сбилась видимо


спасибо

ошибку нашел в консоле прикрепил в файле

"Евдокимов Евгений" написал:ошибку нашел в консоле прикрепил в файле

Хм. Bpm не может достучаться до метода. попробуйте в define прописать ServiceHelper с самого начала.
Что-то вроде:

define("UsrCustomPage",["ServiceHelper", "Terrasoft".....],
	function(ServiceHelper, terrasoft.....) 

"Варфоломеев Данила Викторович" написал:
Евдокимов Евгений пишет:

ошибку нашел в консоле прикрепил в файле

Хм. Bpm не может достучаться до метода. попробуйте в define прописать ServiceHelper с самого

да уж)) даже и не подумал бы что из за порядка написания ServiceHelper может не работать весь код...

спасибо получилось !!

скажите а в чем разница в вашем примере сервис вызывается с помощью Terrasoft.AjaxProvider.request
а в этом примере через
ServiceHelper.callService("CustomConfigurationService", "GetTransformValue",
function(response) {

в чем разница и какой лучше использовать в дальнейшем??

"Евдокимов Евгений" написал:в чем разница и какой лучше использовать в дальнейшем??

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

Но, блин, ни в каких SDK не написано, что оказывается в ServiceHelper, в конфиге, можно указывать timeout. Если его не указывать и хранимка долго собирает данные, то запрос просто обрывается (столкнулся с этим).

да посмотрел так и есть Helper поудобнее,
насчет тайм-аута учту

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

"Евдокимов Евгений" написал:так же нужно описывать или другой код будет?

Через mixins. Посмотрите в конфигурации BaseGridDetailV2 (базовая деталь с гридом), в define подключается "GridUtilitiesV2" (JS модуль, конкретно методы по работе с гридом), в Mixins:

GridUtilities: "Terrasoft.GridUtilities". 

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

Ну или, опять же, смотрите в сторону ServiceHelper) Это же JS модуль с 1 встроенной функцией. И вызывается он отовсюду, подключается в схемы через define.

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

"Варфоломеев Данила Викторович" написал:

Привет.

нт: хранимка кладет все нужные данные в таблицу (которую нужно будет предварительно создать в BPM), и в коде, в коллбэке, вы делаете ESQ запрос в эту таблицу, выгребая нужные данные. Как-то так.

Добрый день!
Практически применил ваши примеры к своей задаче, обращение работает,
хотел спросить, каким образом результат работы процедуры вывести в JS
т е вместо return "OK"; значение которое подсчитывается в процедуре.

или в дальнейшем набор строк (результат select) без создания таблиц и дополнительных запросов типа ESQ

"Евдокимов Евгений" написал:или в дальнейшем набор строк (результат select) без создания таблиц и дополнительных запросов типа ESQ

В конце хранимки дописать select нужных столбцов. В коде немного по другому вызвать процедуру:

string sqlText = "exec [dbo].[tsp_Procedure] '"+UserConnection.CurrentUser.ContactId+"',30, ...куча параметров..."'";
var resultQuery = new CustomQuery(UserConnection, sqlText);
DataTable dt = new DataTable();
using (DBExecutor dbExecutor = UserConnection.EnsureDBConnection()) {
	using(var dr = resultQuery.ExecuteReader(dbExecutor)) {
		dt.Load(dr);      
	}
}

Ну и потом в C# коде работать с datatable как вам угодно. И в конце return нужного вам параметра. Ну или public string[] в объявлении функции и в конце возвращать массивы из datatable.
Или гуглить

спасибо буду разбираться

"Варфоломеев Данила Викторович" написал:
вы делаете ESQ запрос в эту таблицу, выгребая нужные данные. Как-то так.

Добрый день!
Могу я у вас еще спросить кое что,
разобрался с процедурой с вызовом и обработкой результата, теперь пытаюсь выгрузить результат в Excel с помощью метода
DataUtilities.exportToCsvFile("TestReportTable");
передаю имя схемы откуда выгружать все данные.
система выдает ошибку
"Объект не поддерживает свойство или метод "on"" (см прикрепл файл)
не могу понять в чем ошибка.

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

Добрый день.

Стоит следующая задача:
По БП после сохранения карточки лида необходимо открыть карточку продажи. Использую стандартный элемент БП "Открыть страницу редактирования".
Столкнулся с проблемой, что страница продажи не открывается, если предыдущая по БП карточка Лида открыта тоже с использованием элемента БП "Открыть страницу редактирования".

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

И ещё один вопрос:
Можно ли отключить создание активности при использовании элемента "Открыть страницу редактирования"?

Нравится

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

Добрый день!

1. Элемент “Страница редактирования” считается выполненным после сохранения карточки. Т.е. если в процессе последовательно стоят 2 элемента “Страница редактирования” – для того, чтобы открылась вторая страница пользователь должен нажать кнопку [Сохранить] на первой странице.
По другому страницу редактирования открыть не получится.

2. Элементы Вопрос пользователю/Страница редактирования/Автогенерируемая страница при выполнении создают служебную активность, которая выполняет переадресацию пользователя на целевую страницу. Это базовый механизм работы элементов.

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

Здравствуйте, есть задача скрыть для пользователей в справочнике "Причина отмены заказов" строку "Недозвон".
Я так понимаю, что скрыть значение из колонки - это просто ее удалить из таблици, но скорее всего это повлияет на старые заказы, где используется это значение. Можно написать бизнес правило для данной задачи?

Нравится

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

Добрый день.
Можно отфильтровать это поле в атрибутах

attributes: {
       "Type": {
                    lookupListConfig: {
                        filter: function () {
                            var filters = Terrasoft.createFilterGroup();
                            filters.addItem(Terrasoft.createColumnFilterWithParameter(
                                Terrasoft.ComparisonType.NOT_EQUAL, 'Id', Constants.DocumentType.ActWork));
                            return filters;
                        }
                    }
                }
}

Вместо Constants.DocumentType.ActWork указать Id записи из вашего справочника.

Пример аналогичного функционала, но через бизнес-правила:

rules: {
          "WeightUnit":{
					"FiltrationUnitsWeight":{
						ruleType: BusinessRuleModule.enums.RuleType.FILTRATION,
						baseAttributePatch: 'UseforWeight',
						comparisonType: Terrasoft.ComparisonType.NOT_EQUAL,
						type: BusinessRuleModule.enums.ValueType.CONSTANT,
						value: true
					}
				}
}

Спасибо за подсказку, реализовал через атрибуты, что прекрасно работает).

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

Добрый день!
Подскажите, может быть кто-то сталкивался с подобной ситуацией...
Настраиваю БП по обработке обращения, выполняю действия: при добавлении нового обращения , проверяется поле статус, в зависимости от статуса обращение распределяется на разных ответственных.
БП работал, все верно, как только внесла изменение(изменение несущественное), бп перестал запускаться.
В журнале процесса его нет. Удалила все изменения, однако бп не запустился.
Обнаружила,что все новые бп не запускаются, в конфигурации при обновлении структуры бд появляется ошибка.
Подскажите, пожалуйста, с чем это может быть связано?

Нравится

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

Картинка, к сожалению, не читабельна
Может быль связано с тем, что бп не был правильно скомпилирован.

Нашла временное решение.

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

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

Еще новичок в разработке. Нужно создать замещающий клиентский модуль.
Вот родительская схема:

define('CityPage', ['ext-base', 'terrasoft', 'sandbox',
'City', 'CityPageStructure', 'CityPageResources', 'GeneralDetails', 'LookupUtilities', 'BusinessRuleModule'],
function(Ext, Terrasoft, sandbox, entitySchema, structure, resources, GeneralDetails, LookupUtilities,
BusinessRuleModule) {
structure.userCode = function() {
this.entitySchema = entitySchema;
this.name = 'CityCardViewModel';
this.schema.leftPanel = LookupUtilities.GetBaseLookupPageStructure();
};
structure.finalizeStructure = function() {
var baseElementsControlGroup = this.find('baseElementsControlGroup');
if (baseElementsControlGroup) {
var items = baseElementsControlGroup.items;
items.splice(2, 0, {
type: Terrasoft.core.enums.ViewModelSchemaItem.ATTRIBUTE,
name: 'Country',
columnPath: 'Country',
dataValueType: Terrasoft.DataValueType.LOOKUP,
visible: true
});
items.splice(3, 0, {
type: Terrasoft.core.enums.ViewModelSchemaItem.ATTRIBUTE,
name: 'Region',
columnPath: 'Region',
dataValueType: Terrasoft.DataValueType.LOOKUP,
visible: true,
rules: [{
ruleType: BusinessRuleModule.enums.RuleType.FILTRATION,
autocomplete: true,
baseAttributePatch: 'Country',
comparisonType: Terrasoft.ComparisonType.EQUAL,
type: BusinessRuleModule.enums.ValueType.ATTRIBUTE,
attribute: 'Country',
attributePath: '',
value: ''
}]
});
items.splice(4, 0, {
type: Terrasoft.core.enums.ViewModelSchemaItem.ATTRIBUTE,
name: 'TimeZone',
columnPath: 'TimeZone',
dataValueType: Terrasoft.DataValueType.LOOKUP,
visible: true
});
baseElementsControlGroup.items = items;
}
};
return structure;
});

Вот моя схема, которая должна замещать родительскую (выше). Что не так в коде замещающей схемы:
define("CityPage", ['ext-base', 'terrasoft', 'sandbox',
'City', 'CityPageStructure', 'CityPageResources', 'GeneralDetails', 'LookupUtilities', 'BusinessRuleModule'],
function(Ext, Terrasoft, sandbox, entitySchema, structure, resources, GeneralDetails, LookupUtilities,
BusinessRuleModule) {
return {
structure: "City",
items.splice(4, 0, {
type: Terrasoft.core.enums.ViewModelSchemaItem.ATTRIBUTE,
name: 'UsrRayon',
columnPath: 'UsrRayon',
dataValueType: Terrasoft.DataValueType.LOOKUP,
visible: true
});
};
});

Нравится

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

Здравствуйте, Анастасия.

"Злыднева Анастасия Сергеевна" написал:Что не так в коде замещающей схемы:

Все зависит от задачи, которую вы себе поставили

Во первых, вы должны создать замещающий модуль так, как указано с статье https://academy.terrasoft.ru/documents/technic-sdk/7-8-0/sozdanie-polzo… (если вдруг вы не знали этого, т.к.

"Злыднева Анастасия Сергеевна" написал:Еще новичок в разработке.

Во вторых, судя по исходному коду базового модуля, он является моделью представления в связке MVVM. Подробнее смотрите здесь https://academy.terrasoft.ru/documents/technic-sdk/7-7-0/shablon-mvvm-e…

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

define("CityPage", ['ext-base', 'terrasoft', 'sandbox','City', 'CityPageStructure', 'CityPageResources', 'GeneralDetails', 'LookupUtilities', 'BusinessRuleModule'],
	function(Ext, Terrasoft, sandbox, entitySchema, structure, resources, GeneralDetails, LookupUtilities, BusinessRuleModule) {
	return {
		//Запомнить свойство-метод в локальную переменную
		var s = structure.finalizeStructure;
		//Переопределить свойство-метод базового модуля в замещающем
		structure.finalizeStructure = function() {
			//вызвать свойство-метод базового модуля
			s();
			// получить группу контролов
			var baseElementsControlGroup = this.find('baseElementsControlGroup');
			//если найдена
			if (baseElementsControlGroup) {
				//получить ее элементы
				var items = baseElementsControlGroup.items;
				// добавить атрибут в элемент
				items.splice(4, 0, {
					type: Terrasoft.core.enums.ViewModelSchemaItem.ATTRIBUTE,
					name: 'UsrRayon',
					columnPath: 'UsrRayon',
					dataValueType: Terrasoft.DataValueType.LOOKUP,
					visible: true
				});
			};
		};
	};
});
Показать все комментарии

Добрый день.
Возникла следующая ошибка при фиксации доработок в хранилище.
Ранее фиксировал в этот репозиторий без проблем.
Доступ к рабочей копии BPMOnline открыт для всех пользователей.
Обновление пакета / Восстановление из хранилища/ Установка пакета происходят без ошибок.
Кто подскажет, что за проблема?

Нравится

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

Здравствуйте, Игорь.

Попробуйте обновить пакет _RcGorizont

"Сергей Кy6риш" написал:Здравствуйте, Игорь.

Попробуйте обновить пакет _RcGorizont

Делал не однократно. Не помогло

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

В версии bpm'online 7.7 real estate в карточках сущности "Объект недвижимости" есть деталь Параметры, на которую нужно бизнес-процессом добавить значения параметров.

Процесс стартует при ручном запуске. В бизнес-процессе используем только элемент "Добавление данных". В свойствах элемента пишем:

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

После запуска процесса значения на деталь "Параметры "в карточках не добавляются. Что неправильно в процессе?

Нравится

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

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

Неправильный объект, в который записываются данные.

Пробовали также выбирать записывать в объект "Значения параметра объекта или листинга" с различными выборками и значениями полей. Все равно процесс не работает.

Как бы понять, в чем ошибка. В журнале процессов статусы процессов - Завершен.

Добрый день!

Интересуют два момента:
1) Каким образом процесс понимает к какому объекту необходимо прикрепить параметры выборки?
2) Какие настройки элемента "Добавить данные"?

1) это мы указываем в "Условиях фильтрации выборки".
2) вот последние варианты настройки, которые также не работают:

1 вариант.
В какой объект добавить данные : Подтип параметра.
Режим добавления данных: результат выборки
Выборка по объекту: Параметр.

Условие фильтрации выборки:
Название равно Номер квартиры
Раздел Объекты Да

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

Условие фильтрации выборки:
Параметр равно Номер квартиры
Объект недвижимости.Тип равно Квартира

Анастасия, добрый день!

Перед тем как строить бизнес-процесс рекомендую предварительно посмотреть в каком виде хранятся параметры и связь между параметрами и объектами недвижимости в БД.
1. Параметры – таблица Amenity.
2. Значения параметров – AmenitySubtype (AmenityId – ссылка на Amenity).
3. Объекты недвижимости – Property.
4. Связь между параметрами и объектами недвижимости – AmenityInObject. (AmenityId – ссылка на Amenity, PropertyId – ссылка на Property)

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