Добрый день!

Отправляю к сервису OData PATCH-запрос и он падает с 404 ошибкой. При этом GET запрос отрабатывает и возвращает необходимые данные. Может кто-нибудь подсказать, что делать в данной ситуации?

Нравится

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

Без примеров запросов и ответов на них сложно сказать. Возможно, PATCH идёт к другому адресу или составлен неправильно.

 

Описание формата запросов, в том числе и PATCH, для OData 3 и OData 4 есть в академии.

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

Добрый день,

 

может кто-то уже сделал эту задачу. У меня есть 3 мультивалютных поля, взял пример BaseOrderPage,и https://academy.terrasoft.ru/documents/technic-sdk/7-16/dobavlenie-multivalyutnogo-polya. Но когда я меняю в одной поле, меняются все 3, но мне надо что бы у каждого поле было свое отдельное валюта. 

За ранее спасибо.

Нравится

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

Тот кто ищет - тот всегда найдет. Решение не мое, а найдено на просторах англоязычного community.

Суть в том, чтобы повторить логику для каждого из полей. Что делаем:

1. Заменяем prepareCurrencyMenu из MultiCurrencyEditUtilities

prepareCurrencyMenu: function() {
	this.mixins.MultiCurrencyEditUtilities.prepareCurrencyMenu.call(this);
	var currencyRateList = this.get("CurrencyRateList");
	if (!currencyRateList) {
		return;
	}
	var columnsList = ["NavDamageSize", "NavSumCurrency"];
	this.Terrasoft.each(columnsList, function(column) {
		var menu = this.Ext.create(this.Terrasoft.BaseViewModelCollection);
		currencyRateList.each(function(item) {
			var menuItem = Ext.create("Terrasoft.BaseViewModel", {
				values: {
					Id: item.value,
					Caption: item.Symbol || item.displayValue,
					MarkerValue: item.Symbol || item.displayValue,
					Tag: item.value,
					//Click: {"bindTo": "onCurrencyMenuItemClick"}
					Click: {"bindTo": "on" + column + "CurrencyMenuItemClick"}
				}
			});
			menu.addItem(menuItem);
		}, this);
		//this.set("CurrencyButtonMenuList", menu);
		this.set(column + "CurrencyButtonMenuList", menu);
	}, this);
},

2. делаем для каждого поля свой "on" + column + "CurrencyMenuItemClick" и column +"CurrencyButtonMenuList"

3. Переопределяем generateCurrencyButton из MultiCurrencyEditViewGenerator. я создал весьб свой класс на основе MultiCurrencyEditViewGenerator

generateCurrencyButton: function(config) {
	var buttonConfig = {
		id: "multiCurrencyButton-currency" + config.name,
		className: "Terrasoft.Button",
		classes: {
			wrapperClass: ["currency-button"]
		},
		style: Terrasoft.controls.ButtonEnums.style.TRANSPARENT,
		menu: {
			//items: {"bindTo": "CurrencyButtonMenuList"}
			items: {"bindTo": config.name + "CurrencyButtonMenuList"}//
		},
		enabled: true,
        markerValue: config.name + " MultiCurrencyButton"
	};
	return this.generateButton(buttonConfig);
},

4. Виртуальную колонку Currency и её метод убираем.

Результат:

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

Минусы: потеряли треугольник у поля. По каким причинам не могу понять.

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

Я так полагаю проблема не в том, что на страницу добавлено одно кастомное поле валюта. Их скорее всего добавлено 3. А в том, что надо создавать виртуальную колонку Currency для совместимости с модулем MultiCurrencyEditUtilities.

Далее при инициализации страницы мы его заполняем. 

this.set("Currency", this.get("UsrCurrency"), {silent: true});

А Сама колонка Currency при изменении вызывает метод onVirtualCurrencyChange, который собственно меняет кастомное поле валюта.

onVirtualCurrencyChange: function() {
	var currency = this.get("Currency");
	this.set("UsrCurrency", currency);
}

Итого получаем, что для одного Мультивалютного поля все замечательно работает, а если их более одного, то как создавать поле Currency. 2 и более таких полей не создашь. 

Сам столкнулся с подобной ситуацией и не понимаю как мне добавить второе мультивалютное поле на страницу.

Тот кто ищет - тот всегда найдет. Решение не мое, а найдено на просторах англоязычного community.

Суть в том, чтобы повторить логику для каждого из полей. Что делаем:

1. Заменяем prepareCurrencyMenu из MultiCurrencyEditUtilities

prepareCurrencyMenu: function() {
	this.mixins.MultiCurrencyEditUtilities.prepareCurrencyMenu.call(this);
	var currencyRateList = this.get("CurrencyRateList");
	if (!currencyRateList) {
		return;
	}
	var columnsList = ["NavDamageSize", "NavSumCurrency"];
	this.Terrasoft.each(columnsList, function(column) {
		var menu = this.Ext.create(this.Terrasoft.BaseViewModelCollection);
		currencyRateList.each(function(item) {
			var menuItem = Ext.create("Terrasoft.BaseViewModel", {
				values: {
					Id: item.value,
					Caption: item.Symbol || item.displayValue,
					MarkerValue: item.Symbol || item.displayValue,
					Tag: item.value,
					//Click: {"bindTo": "onCurrencyMenuItemClick"}
					Click: {"bindTo": "on" + column + "CurrencyMenuItemClick"}
				}
			});
			menu.addItem(menuItem);
		}, this);
		//this.set("CurrencyButtonMenuList", menu);
		this.set(column + "CurrencyButtonMenuList", menu);
	}, this);
},

2. делаем для каждого поля свой "on" + column + "CurrencyMenuItemClick" и column +"CurrencyButtonMenuList"

3. Переопределяем generateCurrencyButton из MultiCurrencyEditViewGenerator. я создал весьб свой класс на основе MultiCurrencyEditViewGenerator

generateCurrencyButton: function(config) {
	var buttonConfig = {
		id: "multiCurrencyButton-currency" + config.name,
		className: "Terrasoft.Button",
		classes: {
			wrapperClass: ["currency-button"]
		},
		style: Terrasoft.controls.ButtonEnums.style.TRANSPARENT,
		menu: {
			//items: {"bindTo": "CurrencyButtonMenuList"}
			items: {"bindTo": config.name + "CurrencyButtonMenuList"}//
		},
		enabled: true,
        markerValue: config.name + " MultiCurrencyButton"
	};
	return this.generateButton(buttonConfig);
},

4. Виртуальную колонку Currency и её метод убираем.

Результат:

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

Минусы: потеряли треугольник у поля. По каким причинам не могу понять.

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

Добрый всем. Заметил странное поведение детали "Стадии" во вкладке "История продажи".

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

Запускается только один бизнес-процесс, так что влияние сторонних исключено, это проверил.

Видимо в логике именно добавления именно в таблицу что-то.

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

Нравится

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

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

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

 

Если воспроизводится стабильно, то где-то в коде реализовано: или во встроенном БП, или в отдельных, или в событийном слое, или в кейсах этого раздела, или в коде карточки на JS, или, что наименее вероятно, вообще в триггерах.

 

Тут ещё нужно понять, только ли деталь стадий менялась, или реально каждый раз менялось поле «стадия» продажи. Это можно выяснить, настроив стандартный механизм журнала изменений для раздела.

Владимир Соколов,

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

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

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

Нужно смотреть во встроенном БП объекта «Продажа» в функции SynchronizeOpportunityStage:

  public virtual void SynchronizeOpportunityStage() {
   if (UserConnection.GetIsFeatureEnabled("DisableOldOpportunityStageSynchronizers")) {
    return;
   }
   if (UserConnection.GetIsFeatureEnabled("NewOpportunityStageManager")) {
    var opportunityStageRepository =
     Terrasoft.Core.Factories.ClassFactory.Get<Terrasoft.Configuration.OpportunityStageRepository>(
      new Terrasoft.Core.Factories.ConstructorArgument("userConnection", UserConnection));
    var opportunityInStageRepository =
     Terrasoft.Core.Factories.ClassFactory.Get<Terrasoft.Configuration.OpportunityInStageRepository>(
      new Terrasoft.Core.Factories.ConstructorArgument("userConnection", UserConnection));
    var opportunityStageManager =
     Terrasoft.Core.Factories.ClassFactory.Get<Terrasoft.Configuration.OpportunityStageManager>(
      new Terrasoft.Core.Factories.ConstructorArgument("userConnection", UserConnection),
      new Terrasoft.Core.Factories.ConstructorArgument("opportunityStageRepository", opportunityStageRepository),
      new Terrasoft.Core.Factories.ConstructorArgument("opportunityInStageRepository", opportunityInStageRepository));
    opportunityStageManager.SynchronizeStage(StageOldValue, OldOwnerId, Entity);
   } else {
    var oppInStageSchema = UserConnection.EntitySchemaManager.GetInstanceByName("OpportunityInStage");
    var stageHelper = Terrasoft.Core.Factories.ClassFactory.Get<Terrasoft.Configuration.OpportunityStageHelper>(
     new Terrasoft.Core.Factories.ConstructorArgument("userConnection", UserConnection),
     new Terrasoft.Core.Factories.ConstructorArgument("oppInStageSchema", oppInStageSchema));
    stageHelper.SynchronizeStage(StageOldValue, OldOwnerId, Entity);
   }
  }

Если, конечно, она не отключается сразу же по фиче во второй строке и работает новая логика где-то в другом месте.

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

 

К сожалению настройка "DisableOldOpportunityStageSynchronizers" по умолчанию включена, значит синхронизацию стадий реализовали в другом совершенно методе, возможно даже через какой-то бизнес процесс, так как весь метод только начавшись заканчивается сразу return. Так и не нашел как. Самое интересное:

- во первых, что проблема появилась после обновления с 7.12.4 до 7.15.2 (да, много пропустили потому массово пришлось обновлять), на 7.12.4 проблемы не было

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

 

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

А в кейсах для этого раздела проверяли, может, логика там реализована?

 

Если есть доступ к базе, проверьте, что за записи в момент такого поведения появляются в SysProcessLog и SysProcessElementLog, там видно все выполняющиеся процессы (включая кейсы) и шаги.

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

Добрый день.

После обновления платформы на версию 7.15.4.3055 стали формироваться пустые отчеты с использованием шаблона через приложение Advanced excel reports for Creatio.

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

В истории формировании отчета никаких ошибок нет.

 

Прошу помочь. В чем может быть причина и какие способы решения?

 

Нравится

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

Добрый день, Эдуард,

 

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

Ирина Лазоренко,

 

"Product": "SalesEnterprise_Marketing_ServiceEnterprise".

Пробовали:

  • Добавлять в качестве шаблона пустой XLSX файл;
  • Добавить шаблон в отчет, по которому раньше не было шаблона;
  • Добавить вручную (не через экспорт/импорт) новый отчет по другим объектам. Без шаблона данные выгружаются. При использовании шаблона возвращается шаблон без данных;
  • Переустановить приложение.

Все равно выгружается пустой шаблон.

Ирина Лазоренко, добрый день.

Есть еще какие-либо предложения, что попробовать/проверить?

Эдуард, добрый день!

 

подскажите, предложение по исправлению от пользователя Алексея Пичурина в посте https://community.terrasoft.ru/questions/pechatnaya-forma-advanced-excel-reports-creatio помог решить ошибку с формированием пустого отчета?

Добрый день, Ирина.

Да, это предложение помогло.

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

Добрый день

Кастомизируем страничку OrderPageV2. На заголовке выведены Виджеты в виде графиков и индикаторов. Мнение пользователей разделилось надвое. Одни рады  этому, а другим не нужно - только место занимает. 

Теперь сам вопрос можно лина области Header страницу сделать Группу полей (как на вкладках страницы), и уже в неё поместить все виджеты? чтобы появилась возможность скрывать и разворачивать на усмотрение пользователя.

Нравится

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

У меня получилось: мастером добавил группу на вкладке, потом туда виждет, а потом в коде OrderPageV2 у создавшегося элемента OrderProductTabGroup8c09e07e поменял родителя на Header:

"parentName": "Header",//"OrderProductTab",

Выглядит так:

Сворачивается-разворачивается нормально.

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

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

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

При создании отчета в детали Пользоватлеьские фильтры не сохраняется Путь к заголовку http://prntscr.com/slrin8

Из-за этого невозможно настроить фильтр

Нравится

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

Добрый день, Павел!

 

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

Ирина Лазоренко,

Спасибо, буду ждать

Добрый день, Павел,

 

ответственная команда выпустит обновление решения с исправлением этой ошибки 8 июня. Отдельно напишу, когда обновленный пакет будет доступен на маркетплейсе.

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

Коллеги, добрый день. 

 

Не могу найти информацию о том, как настроить права доступа на вкладки "Обращение". 

Требуется "забрать" возможноть видеть вкладки у части агентов, после определённого события. 

Нравится

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

Обычно такое делается так: создаётся администрируемая операция, добавляются права на неё нужным пользователям (а лучше группе, а пользователей туда), затем в коде карточки на открытии проверяют права на операцию и показывают или скрывают вкладку. Как тут.

 

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

 

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

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

Зачастую не требуется настолько секьюрного подхода.

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

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

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

Как в детали c полями получить дополнительные атрибуты отображаемого поля? (аналог LookupListConfig columns)?

Нравится

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

В конфигурации такой схемы нет.

Анна, например, в схеме карточек деталей OrganizationDetailPage и ServiceInServicePactDetailPage работают с lookupListConfig справочных полей.

 

Если же интересует в реестре детали, то в схеме SysAdminUnitInWorkplaceDetailV2 настраивают выбор из справочника пользователей и ролей, налагают ему фильтры:

/**
 * Open administration objects directories.
 * @private
 */
openSysAdminLookup: function() {
	this._getSysAdminLookupConfig(function openLookupByConfig(config) {
		this.openLookup(config, this.addCallBack, this);
	}, this);
},
 
/**
 * Creates a config to open a directory.
 * @private
 * @param {Function} callback Callback function.
 * @param {Object} scope Callback execution context.
 * @return {Object} Configuration object.
 */
_getSysAdminLookupConfig: function(callback, scope) {
	var config = {
		entitySchemaName: "SysAdminUnit",
		multiSelect: true,
		hideActions: true
	};
	this._getSysAdminUnitFilter(function(filterGroup) {
		config.filters = filterGroup;
		Ext.callback(callback, scope || this, [config]);
	}, this);
},

 

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

имелась в виду FieldsDetail

В конфигурации такой схемы нет.

BaseFieldsDetail

Опытным путем выяснили, что дополнительные атрибуты можно добавить в initESQColumns, тогда они доступны в строке детали с полями

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

Добрый день, столкнулся с проблемой при установке Conference room booking for Creatio на SalesTeam_7.15.4 для PostgreSQL.

Ошибка падает на установке пакета:

Terrasoft.Common.DbOperationException: Npgsql.PostgresException (0x80004005): 23503: INSERT или UPDATE в таблице "SysPackageDataLcz" нарушает ограничение внешнего ключа "FKfg1JPl35PDx2FCE8Oagxv7VAMIc"

 

Насколько я понимаю, проблема связана с тем, что для культуры fr-FR для MSSQL и PostgreSQL разные Id.

Нравится

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

Добрый день, Артем,

 

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

Добрый день, Артем,

 

не получилось воспроизвести указанную вами ошибку на чистой сборке Sales Team 7.15.4 для PostgreSQL (даже с включенной культурой fr-FR), дополнение устанавливается без ошибок. Пришлите, пожалуйста, лог установки с ошибкой для более детального анализа и предоставьте в личное сообщение, если есть такая возможность, доступ к сайту, где воспроизводится ошибка.

 

Ирина Лазоренко,

2020-05-15 17:56:45,334 Загрузка файла: ConferenceRoom.gz 100%

2020-05-15 17:56:45,415 Началось резервное копирование конфигурации.

2020-05-15 17:56:45,431 Загрузка пакетов из архива

2020-05-15 17:56:45,943 Пакет "ConferenceRoom" загружен

2020-05-15 17:56:45,943 Загрузка пакетов из базы данных

2020-05-15 17:56:47,704 Загрузка пакетов из базы данных

2020-05-15 17:56:49,479 Резервная копия конфигурации успешно создана.

2020-05-15 17:56:49,529 Установка приложения из файла началась. Имя приложения: ConferenceRoom. Код: ConferenceRoom.

2020-05-15 17:56:49,532 Подготовка пакетов к инсталляции

2020-05-15 17:56:49,555 Загрузка пакетов из архива

2020-05-15 17:56:49,690 Пакет "ConferenceRoom" загружен

2020-05-15 17:56:49,703 Загрузка пакетов из базы данных

2020-05-15 17:56:51,335 Сравнение пакетов

2020-05-15 17:56:51,576 Сохранена схема "Activity" в пакете "ConferenceRoom"

2020-05-15 17:56:51,593 Сохранена схема "ActivityMiniPage" в пакете "ConferenceRoom"

2020-05-15 17:56:51,606 Сохранена схема "ActivityPageV2" в пакете "ConferenceRoom"

2020-05-15 17:56:51,619 Сохранена схема "ActivitySectionConferenceRoomGridRowViewModel" в пакете "ConferenceRoom"

2020-05-15 17:56:51,632 Сохранена схема "ActivitySectionV2" в пакете "ConferenceRoom"

2020-05-15 17:56:51,647 Сохранена схема "ConferenceRoom" в пакете "ConferenceRoom"

2020-05-15 17:56:51,658 Сохранена схема "ConferenceRoomEntityEventListener" в пакете "ConferenceRoom"

2020-05-15 17:56:51,658 Сохранена схема "ConferenceRoomFilterModule" в пакете "ConferenceRoom"

2020-05-15 17:56:51,684 Сохранена схема "ConferenceRoomFilterSchema" в пакете "ConferenceRoom"

2020-05-15 17:56:51,694 Сохранена схема "ConferenceRoomHandler" в пакете "ConferenceRoom"

2020-05-15 17:56:51,707 Сохранена схема "ConferenceRoomInActivity" в пакете "ConferenceRoom"

2020-05-15 17:56:51,719 Сохранена схема "ConferenceRoomMixin" в пакете "ConferenceRoom"

2020-05-15 17:56:51,719 Сохранена схема "ConferenceRoomValidator" в пакете "ConferenceRoom"

2020-05-15 17:56:51,802 Terrasoft.Common.DbOperationException: Npgsql.PostgresException (0x80004005): 23503: INSERT или UPDATE в таблице "SysPackageDataLcz" нарушает ограничение внешнего ключа "FKfg1JPl35PDx2FCE8Oagxv7VAMIc"

   в Npgsql.NpgsqlConnector.<DoReadMessage>d__157.MoveNext()

--- Конец трассировка стека из предыдущего расположения, где возникло исключение ---

   в System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()

   в System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)

   в Npgsql.NpgsqlConnector.<ReadMessage>d__156.MoveNext()

--- Конец трассировка стека из предыдущего расположения, где возникло исключение ---

   в System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()

   в Npgsql.NpgsqlConnector.<ReadMessage>d__156.MoveNext()

--- Конец трассировка стека из предыдущего расположения, где возникло исключение ---

   в System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()

   в Npgsql.NpgsqlDataReader.<NextResult>d__32.MoveNext()

--- Конец трассировка стека из предыдущего расположения, где возникло исключение ---

   в System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()

   в System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)

   в Npgsql.NpgsqlDataReader.NextResult()

   в Npgsql.NpgsqlCommand.<Execute>d__71.MoveNext()

--- Конец трассировка стека из предыдущего расположения, где возникло исключение ---

   в System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()

   в System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)

   в Npgsql.NpgsqlCommand.<ExecuteNonQuery>d__84.MoveNext()

--- Конец трассировка стека из предыдущего расположения, где возникло исключение ---

   в System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()

   в System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)

   в Npgsql.NpgsqlCommand.ExecuteNonQuery()

   в Polly.Policy.<>c__DisplayClass119_0`1.<Execute>b__0(Context ctx, CancellationToken ct)

   в Polly.Policy.<>c__DisplayClass129_0`1.<ExecuteInternal>b__0(Context ctx, CancellationToken ct)

   в Polly.Policy.<>c__DisplayClass103_0.<NoOp>b__1(Context ctx, CancellationToken ct)

   в Polly.NoOp.NoOpEngine.Implementation[TResult](Func`3 action, Context context, CancellationToken cancellationToken)

   в Polly.Policy.<>c.<NoOp>b__103_0(Action`2 action, Context context, CancellationToken cancellationToken)

   в Polly.Policy.ExecuteInternal[TResult](Func`3 action, Context context, CancellationToken cancellationToken)

   в Polly.Policy.Execute[TResult](Func`3 action, Context context, CancellationToken cancellationToken)

   в Polly.Policy.Execute[TResult](Func`1 action)

   в Terrasoft.Core.DB.DBExecutor.ExecuteCommand[TResult](Func`2 commandExecutionCallback, String sqlText, QueryParameterCollection queryParameters, CancellationToken cancellationToken)

   в Terrasoft.DB.PostgreSql.PostgreSqlExecutor.Execute(String sqlText, QueryParameterCollection queryParameters)

   в Terrasoft.Core.Entities.Entity.InsertToDB(Boolean skipLookupColumnValues, Boolean validateRequired) ---> Npgsql.PostgresException: 23503: INSERT или UPDATE в таблице "SysPackageDataLcz" нарушает ограничение внешнего ключа "FKfg1JPl35PDx2FCE8Oagxv7VAMIc"

   в Npgsql.NpgsqlConnector.<DoReadMessage>d__157.MoveNext()

--- Конец трассировка стека из предыдущего расположения, где возникло исключение ---

   в System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()

   в System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)

   в Npgsql.NpgsqlConnector.<ReadMessage>d__156.MoveNext()

--- Конец трассировка стека из предыдущего расположения, где возникло исключение ---

   в System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()

   в Npgsql.NpgsqlConnector.<ReadMessage>d__156.MoveNext()

--- Конец трассировка стека из предыдущего расположения, где возникло исключение ---

   в System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()

   в Npgsql.NpgsqlDataReader.<NextResult>d__32.MoveNext()

--- Конец трассировка стека из предыдущего расположения, где возникло исключение ---

   в System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()

   в System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)

   в Npgsql.NpgsqlDataReader.NextResult()

   в Npgsql.NpgsqlCommand.<Execute>d__71.MoveNext()

--- Конец трассировка стека из предыдущего расположения, где возникло исключение ---

   в System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()

   в System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)

   в Npgsql.NpgsqlCommand.<ExecuteNonQuery>d__84.MoveNext()

--- Конец трассировка стека из предыдущего расположения, где возникло исключение ---

   в System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()

   в System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)

   в Npgsql.NpgsqlCommand.ExecuteNonQuery()

   в Polly.Policy.<>c__DisplayClass119_0`1.<Execute>b__0(Context ctx, CancellationToken ct)

   в Polly.Policy.<>c__DisplayClass129_0`1.<ExecuteInternal>b__0(Context ctx, CancellationToken ct)

   в Polly.Policy.<>c__DisplayClass103_0.<NoOp>b__1(Context ctx, CancellationToken ct)

   в Polly.NoOp.NoOpEngine.Implementation[TResult](Func`3 action, Context context, CancellationToken cancellationToken)

   в Polly.Policy.<>c.<NoOp>b__103_0(Action`2 action, Context context, CancellationToken cancellationToken)

   в Polly.Policy.ExecuteInternal[TResult](Func`3 action, Context context, CancellationToken cancellationToken)

   в Polly.Policy.Execute[TResult](Func`3 action, Context context, CancellationToken cancellationToken)

   в Polly.Policy.Execute[TResult](Func`1 action)

   в Terrasoft.Core.DB.DBExecutor.ExecuteCommand[TResult](Func`2 commandExecutionCallback, String sqlText, QueryParameterCollection queryParameters, CancellationToken cancellationToken)

   в Terrasoft.DB.PostgreSql.PostgreSqlExecutor.Execute(String sqlText, QueryParameterCollection queryParameters)

   в Terrasoft.Core.Entities.Entity.InsertToDB(Boolean skipLookupColumnValues, Boolean validateRequired)

   --- Конец трассировки внутреннего стека исключений ---

   в Terrasoft.Core.Entities.Entity.InsertToDB(Boolean skipLookupColumnValues, Boolean validateRequired)

   в Terrasoft.Core.Entities.Entity.InternalSave(Boolean validateRequired, Boolean setColumnDefValue)

   в Terrasoft.Core.Entities.Entity.Save(Boolean validateRequired, Boolean setColumnDefValue)

   в Terrasoft.Core.Packages.PackageDBStorage.SavePackageSchemaDataLocalization(Package package, PackageSchemaDataDescriptor dataDescriptor, IPackageContentProvider contentProvider, Guid sysPackageSchemaDataId)

   в Terrasoft.Core.Packages.PackageDBStorage.SaveSchemaData(Package package, PackageSchemaDataDescriptor dataDescriptor, IPackageContentProvider contentProvider)

   в Terrasoft.Core.Packages.PackageDBStorage.SavePackageSchemaDatas(Package package, IPackageContentProvider contentProvider)

   в Terrasoft.Core.Packages.PackageDBStorage.SavePackage(Package package, IPackageContentProvider contentProvider)

   в Terrasoft.Core.Packages.PackageDBStorage.ProcessPackage(Package package, IPackageContentProvider packageContentProvider, Dictionary`2 packageIdCollection)

   в Terrasoft.Core.Packages.PackageDBStorage.ProcessPackages(IPackageContentProvider packageContentProvider, Dictionary`2 packageIdCollection)

   в Terrasoft.Core.Packages.PackageDBStorage.Save(IPackageContentProvider packageContentProvider)

   в Terrasoft.Core.AppInstallation.Packages.Operations.SystemPackageOperations.PackageDBStorageInternal.Save(IPackageContentProvider packageContentProvider)

   в Terrasoft.Core.AppInstallation.Packages.Operations.SystemPackageOperations.Save(IEnumerable`1 packages, PackageInstallOptions options)

   в Terrasoft.Core.AppInstallation.Packages.SystemPackageManager.Save(PackageInstallOptions installOptions)

   в Terrasoft.Core.AppInstallation.Packages.AppInstaller.Install(String sourcePath, String destinationPath, PackageInstallOptions installOptions, IInstalledAppInfo installedAppInfo)

   в Terrasoft.WebApp.PackageInstaller.AppInstallerServiceInternal.<>c__DisplayClass7_0.<InstallApp>b__0()

   в Terrasoft.WebApp.PackageInstaller.BaseInstallerServiceInternal.InvokeWithLogging[TResult](Func`1 action)

2020-05-15 17:58:34,754 Начало восстановления конфигурации из резервной копии

2020-05-15 17:58:34,754 Загрузка пакетов из архива

2020-05-15 17:58:34,754 Загрузка пакетов из базы данных

2020-05-15 17:58:36,423 Сравнение пакетов

2020-05-15 17:58:36,423 Восстановление конфигурации из резервной копии завершено

Добрый день, Артем,

 

получила обратную связь от ответственной команды, что ранее такая ошибка возникала. Уточните, пожалуйста, еще версию сборки 7.15.4 (четыре цифры после минорной версии, например, 7.15.4.3055).

Добрый день, Артем,

 

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

Отлично

Добрый день, Артем!

 

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

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

Добрый день

Появилась необходимость дать части пользователям права на ведение части справочников. 

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

Но! Если я дам права на CanManageLookups, то получается, пользователь сможет вести практически все справочники через пункт Добавить в выпадающем списке. Или что хуже додумается перейти через главную страницу к разделу справочники.

Есть еще идеи?

Нравится

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

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

 

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

 

Но нужно ещё учесть, что на уровне объекта «Базовый справочник», от которого унаследованы остальные, есть проверка на это право:

Скрипт запускает функцию:

public virtual void CheckCanManageLookups() {
	UserConnection.DBSecurityEngine.CheckCanExecuteOperation("CanManageLookups");
}

Чтобы она не срабатывала, нужно в объекте нужного справочника переопределить её пустой. Насколько я понимаю, для ряда справочников это уже сделано в стандартной поставке.

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