7.15_()
Sales_Creatio_()

Коллеги изучаю документацию по разработке. (конкретно с миксин MONEYUTILSMIXIN, а МЕТОД GETPERCENTAGEPART)

https://academy.terrasoft.ru/documents/technic-sdk/7-13/miksin-moneyutilsmixin

Прошу помощи знающих коллег. 

!!результат данного метода получают так. 

taxAmount = this.getPercentagePart(totalAmount, discountTax);

тут мне все понятно :)

Мой вопрос почему именно метод GETPERCENTAGEPART в MONEYUTILSMIXIN  реализован именно так? 

 

 

/**

         * Calculates percent part of whole value by given percent.

         * example:

         * amount = 10, percent = 20, result = 2 (2 is 20% of 10).

         * @param {Number} amount Total value.

         * @param {Number} percent Partial percent .

         * @returns {Number}

         */

        getPercentagePart: function(amount, percent) {

            //Обьявили переменную присвоили ей значение функции 

           var decimalUtils = this.getDecimalUtils();

 



            // вернули значение переменой как функции в зависимости от переданных  параметров



            return decimalUtils.evaluate({multiply: [{divide: [percent, 100]}, amount]

            });

        },

**************************************************************************************

Зачем создали функцию getDecimalUtils и что в ней делают?

Зачем создали функции multiply и divide?

Далее смотрю эти функции getDecimalUtils, multiply и divide.

/**

         * Returns {@link Terrasoft.DecimalUtils} instance used to perform numeric computations.

         * @private

         * @return {Terrasoft.DecimalUtils}

         */

  

         

        getDecimalUtils: function(config) {

            config = config || {};

            if (!this.decimalUtils) {

                this.decimalUtils = Ext.create("Terrasoft.DecimalUtils");

            }

            this.decimalUtils.decimalPlaces = config.precision || Terrasoft.data.constants.MONEY_PRECISION;

            return this.decimalUtils;

        },

 

 

 

        /**

         * Divide x value by y value.

         * @param {Number} x Numerator.

         * @param {Number} y Denominator.

         * @return {Number} Returns result rounded to current number of decimal places.

         */

        divide: function(x, y) {

            return this.evaluate({divide: [x, y]});

        },

        /**

         * Multiplies x value by y value.

         * @param {Number} x Value.

         * @param {Number} y Value.

         * @return {Number} Returns result rounded to current number of decimal places.

         */

        multiply: function(x, y) {

            return this.evaluate({multiply: [x, y]});

        },



Зачем создали функцию evaluate которая в свою очередь использует функцию internalEvaluate ?

        /**

         * Evaluates operations provided in expression.

         * @param {Object} expression

         * Example:

         *    to compute expression ((totalAmount * discountTax) / (100 + discountTax)) used expression:

         *    {divide: [{multiply: [totalAmount, discountTax]}, {add: [100, discountTax]}]}

         *

         * @return {Number} Returns result rounded to current number of decimal places.

         */

        evaluate: function(expression) {

            var value = this.internalEvaluate(expression);

            return this.prepareValue(value);

        }

 

 



        /**

         * Evaluates passed expression.

         * @private

         * @param expression Expression to evaluate.

         * @param [operation] Expression operation (#operations).

         * @return {Object} decimal.js value, as result of evaluated expression.

         * @throw Terrasoft.InvalidFormatException if expression is incorrect.

         */

        internalEvaluate: function(expression, operation) {

            var resultItem = null;

            if (Ext.isNumber(expression)){

                resultItem = new this.decimal(expression);

            } else if (Ext.isObject(expression)) {

                Terrasoft.each(expression, function(item, operation) {

                    resultItem = this.internalEvaluate(item, operation);

                    return false;

                }, this);

            } else if (Ext.isArray(expression)) {

                if (!Ext.isDefined(operation)){

                    throw new Terrasoft.InvalidFormatException();

                }

                var resultArray = [];

                Terrasoft.each(expression, function(item, index) {

                    resultArray[index] = this.internalEvaluate(item);

                }, this);

                resultItem = this.applyOperation(operation, resultArray);

            }

            if (resultItem === null){

                return NaN;

            }

            return resultItem;

        },

Коллеги подскажите почему такая сложная реализация ?

Где можно просветится по такой методологии?

Почему не сделали   ??

amount = 10, percent = 20, result = 2 (2 is 20% of 10).

amount * percent  / 100  ( 10*20/100 ) = 2 

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

 

 

Нравится

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

Я так понял, что не используем просто формулу 

amount * percent  / 100  ( 10*20/100 ) = 2 

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

Коллеги разработчики террасофт дайте обратную связь я правильно понимаю необходимость такой реализации?

!!Далее пытаюсь понять код модуля DecimalUtils и его методов  Divide, Multiplies, evaluate, internalEvaluate, applyOperation !!!

как это позволило избежать ошибок округления?

 /**

         * Divide x value by y value.

         * @param {Number} x Numerator.

         * @param {Number} y Denominator.

         * @return {Number} Returns result rounded to current number of decimal places.

         */

        divide: function(x, y) {

            return this.evaluate({divide: [x, y]});

        },

        /**

         * Multiplies x value by y value.

         * @param {Number} x Value.

         * @param {Number} y Value.

         * @return {Number} Returns result rounded to current number of decimal places.

         */

        multiply: function(x, y) {

            return this.evaluate({multiply: [x, y]});

        },

Зачем создали функцию evaluate которая в свою очередь использует функцию internalEvaluate ?

        /**

         * Evaluates operations provided in expression.

         * @param {Object} expression

         * Example:

         *    to compute expression ((totalAmount * discountTax) / (100 + discountTax)) used expression:

         *    {divide: [{multiply: [totalAmount, discountTax]}, {add: [100, discountTax]}]}

         *

         * @return {Number} Returns result rounded to current number of decimal places.

         */

        evaluate: function(expression) {

            var value = this.internalEvaluate(expression);

            return this.prepareValue(value);

        }

        /**

         * Evaluates passed expression.

         * @private

         * @param expression Expression to evaluate.

         * @param [operation] Expression operation (#operations).

         * @return {Object} decimal.js value, as result of evaluated expression.

         * @throw Terrasoft.InvalidFormatException if expression is incorrect.

         */

        internalEvaluate: function(expression, operation) {

            var resultItem = null;

            if (Ext.isNumber(expression)){

                resultItem = new this.decimal(expression);

            } else if (Ext.isObject(expression)) {

                Terrasoft.each(expression, function(item, operation) {

                    resultItem = this.internalEvaluate(item, operation);

                    return false;

                }, this);

            } else if (Ext.isArray(expression)) {

                if (!Ext.isDefined(operation)){

                    throw new Terrasoft.InvalidFormatException();

                }

                var resultArray = [];

                Terrasoft.each(expression, function(item, index) {

                    resultArray[index] = this.internalEvaluate(item);

                }, this);

                resultItem = this.applyOperation(operation, resultArray);

            }

            if (resultItem === null){

                return NaN;

            }

            return resultItem;

        },

applyOperation

 

Такую «магию» действительно используют из-за странностей работы с плавающей запятой. Недавно в другой теме приводил ссылки на статьи.

Показать все комментарии
РФС
Ошибки_РФС
7.15_()
Sales_Creatio_()

При выполнении команды build в РФС при включенном отладчике получаю ошибку:

Error CS2012: Cannot open <Путь к сайту>\Terrasoft.WebApp\Terrasoft.Configuration\obj\Release\Terrasoft.Configuration.pdb.

Если отладку  прервать, то компиляция проходит.

Как решить данную проблему?

Нравится

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

Игорь, добрый день.

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

Показать все комментарии
7.14_()
Sales_Creatio_()
diff
ReminderNotifications

Добрый день.

Подскажите почему может не вызываться метод заголовка для дифф в модуле уведомлений?

Кейс такой: в стандартный модуль уведомлений добавлены гиперссылки на продажу и лид. Сами гиперссылки прописаны отдельными дифами. А так же к ним добавлены текстовые заголовки тоже отдельными дифами. Заголовок для Лида прописан в локализованные строки. А для Продаж значение заголовка достаётся методом из системной настройки.

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

diff: [
{
	"operation": "insert",
	"name": "NotificationOpportunityLabel",
	"parentName": "NotificationItemActivityTopContainer",
	"propertyName": "items",
	"values": {
		"itemType": Terrasoft.ViewItemType.LABEL,
		"caption": {"bindTo": "getOpportunityCaption"},
		"visible": {"bindTo": "getActivityOpportunityVisible"},
		"classes": {"labelClass": ["account-comma-contact"]}
	}
}]
methods: {
	processNotificationsCollection: function(items) {
		items.each(this.addColumnLink, this);
	},

	addColumnLink: function(item) {
		var self = this;
		item.getOpportunityCaption = function() {
			self.queryOpportunityCaption.call(self, item);
			return self.get("NotificationOpportunityCaption");
		};
	},

	queryOpportunityCaption: function() {
		Terrasoft.SysSettings.querySysSettingsItem("OpportunityLinkCaptionRemindingSchema", 
			function(value) {
				this.set("NotificationOpportunityCaption",value);
			}, this);
	}
}

Может быть кто сталкивался с таким поведением?

 

Нравится

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

Вообще, как таковой биндинг caption на функцию возможен, судя по коду в MultiDeleteResultPageV2. Может, у Вас где-то раньше ошибка и JS-код прекращает выполняться?

{
	"operation": "insert",
	"name": "ByRightsContainerHeader",
	"parentName": "ByRightsContainer",
	"propertyName": "items",
	"values": {
		"itemType": Terrasoft.ViewItemType.LABEL,
		"caption": {"bindTo": "getRightsCaption"},
		"classes": {
			"labelClass": ["container-multi-delete-caption-labelClass"]
		}
	}
},

/**
 * Returns caption for block with errors by rights.
 * return {String} Caption.
 * @protected
 */
getRightsCaption: function() {
	var items = this.get("RecordsData").getItems();
	var count = items ? items.length : 0;
	return this.Ext.String.format(this.get("Resources.Strings.ByRightsCaption"), count);
},

А в чём недостаток локализируемой строки перед системной настройкой, значение нужно часто менять? В крайнем случае можно попробовать сделать БП, синхронизирующий значение из настройки в строку на событии изменения настройки, хотя это и «костыль».

Насколько я  понял после инициализации диф не хочет от рисоввываться. Решил кейс немного по-другому. Засунул в инит вызов функции, определяющей заголовок. 

diff: [
	{
		"operation": "insert",
		"name": "NrbProcessNotificationOpportunityLabel",
		"parentName": "StartDateContainer",
		"propertyName": "items",
		"values": {
			"itemType": Terrasoft.ViewItemType.LABEL,
			"caption": {"bindTo": "getOpportunityCaption"},
			"visible": {"bindTo": "getActivityOpportunityVisible"},
			"classes": {"labelClass": ["account-comma-contact", "nrb-label"]}
		}
	}
	],
methods: {	
	init: function(){
		this.callParent(arguments);
		this.getOpportunityCaption();
	},
	
	/**
	 * Вытаскиваем из системной настройки заголовок для Продаж.
	 */
	getOpportunityCaption: function() {
		var caption;
		Terrasoft.SysSettings.querySysSettingsItem("NrbOpportunityLinkCaptionRemindingSchema", 
			function(value) {
				caption = value;
			}, this);
		return caption + " ";
	}
}

 

Показать все комментарии
7.12_()
Sales_Creatio_()

Подскажите,

пожалуйста,

где брать этот API ключ облачных сервисов bpm'online?

Изображение удалено.

Нравится

1 комментарий
преднастроенная страница
реестр детали
7.15_()
Sales_Creatio_()

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

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



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

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

То есть можно ли создать 'виртуальную' деталь, в которой данные не будут храниться ни в одной таблице, так как они нужны только для работы отдельного экземпляра процесса?

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

Нравится

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

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

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

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

Добрый день.

Что хранится в SysPrcElHistoryLog ?

Дайте рекомендации по очистке SysPrcElHistoryLog , уже несколько млн записей.

 

Нравится

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

SysPrcElHistoryLog и SysProcessLog - это можно удалять.

Записи журнала процессов доступны в разделе "Журнал процессов". 

Ниже представлена инструкция, которая позволяет очистить таблицы SysPrcElHistoryLog, SysPrcEntityHistory, SysPrcHistoryLog (это таблицы куда переводятся в архив записи из SysProcessLog)

Для очистки таблиц необходимо:

1 - создать процедуру очистки, выполнив скрипт: 

SET QUOTED_IDENTIFIER ON
GO

IF NOT OBJECT_ID('[dbo].[tsp_DeleteSysPrcHistoryLogById]') IS NULL
BEGIN
	DROP PROCEDURE [dbo].[tsp_DeleteSysPrcHistoryLogById]
END
GO

CREATE PROCEDURE [dbo].[tsp_DeleteSysPrcHistoryLogById]
	@SysProcessLogId uniqueidentifier
AS
BEGIN

	SET NOCOUNT ON
	
	DECLARE @sysProcessLogRecordsToDelete TABLE (Id uniqueidentifier)

	INSERT INTO @sysProcessLogRecordsToDelete ([Id])
		SELECT Id FROM SysPrcHistoryLog
		WHERE ParentId = @SysProcessLogId
	OPTION (OPTIMIZE FOR (@SysProcessLogId UNKNOWN))
	
	DECLARE @COUNT int = (SELECT COUNT(*) FROM @sysProcessLogRecordsToDelete)
	PRINT '-- ChildProcessLogToDeleteCount = ' + CAST(@COUNT AS nvarchar(50))
	WHILE (@COUNT) != 0
		BEGIN
			DECLARE @parentId uniqueidentifier = (SELECT TOP 1 Id from @sysProcessLogRecordsToDelete)
			PRINT '---- ChildProcessLogId = ' + CAST(@parentId AS nvarchar(50))
			DELETE FROM @sysProcessLogRecordsToDelete WHERE Id = @parentId;
			EXEC [dbo].[tsp_DeleteSysPrcHistoryLogById] @parentId
			SET @COUNT = @COUNT - 1
		END

	DELETE FROM SysPrcElHistoryLog
	WHERE SysProcessId = @SysProcessLogId
	DELETE FROM SysPrcEntityHistory
	WHERE SysProcessId = @SysProcessLogId
	DELETE FROM SysPrcHistoryLog
	WHERE Id = @SysProcessLogId

END
GO

SET QUOTED_IDENTIFIER ON
GO

IF NOT OBJECT_ID('[dbo].[tsp_DeleteSysPrcHistoryLogByStartDate]') IS NULL
BEGIN
	DROP PROCEDURE [dbo].[tsp_DeleteSysPrcHistoryLogByStartDate]
END
GO

CREATE PROCEDURE [dbo].[tsp_DeleteSysPrcHistoryLogByStartDate]
	@StartDate date
AS
BEGIN

	SET NOCOUNT ON

	IF NOT OBJECT_ID('#SysProcessLogId') IS NULL
	BEGIN
		DROP TABLE #SysProcessLogId
	END
	
	CREATE TABLE #SysProcessLogId (Id uniqueidentifier)

	INSERT INTO #SysProcessLogId ([Id])
		SELECT Top 1000000 SysPrcHistoryLog.Id FROM SysPrcHistoryLog
		WHERE SysPrcHistoryLog.ParentId IS NULL
		AND SysPrcHistoryLog.StartDate < @StartDate

	DECLARE SysProcessLogIdCursor CURSOR STATIC LOCAL FOR
	SELECT
		Id
	FROM 
		#SysProcessLogId
	
	DECLARE @COUNT int = (SELECT COUNT_BIG(*) FROM #SysProcessLogId)
	
	DECLARE @processLogId uniqueidentifier
	
	PRINT 'STATE - OPEN SysProcessLogIdCursor ' + RTRIM(CAST(CONVERT(time, GETDATE()) AS nvarchar(30)))
	OPEN SysProcessLogIdCursor
	WHILE (@COUNT > 0)
		BEGIN
			FETCH NEXT FROM SysProcessLogIdCursor INTO @processLogId
			IF @@FETCH_STATUS = -1 BREAK
			IF @@FETCH_STATUS = -2 CONTINUE
			PRINT 'START DELETE ProcessLogId = ' + CAST(@processLogId AS nvarchar(50)) + ' Time = ' + RTRIM(CAST(CONVERT(time, GETDATE()) AS nvarchar(30)))
			EXEC [dbo].[tsp_DeleteSysPrcHistoryLogById] @processLogId
			PRINT 'FINISH DELETE ProcessLogId = ' + CAST(@processLogId AS nvarchar(50)) + ' Time = ' + RTRIM(CAST(CONVERT(time, GETDATE()) AS nvarchar(30)))
			SET @COUNT = @COUNT - 1
			PRINT 'Count = ' + CAST(@COUNT AS nvarchar(50))
		END
	CLOSE SysProcessLogIdCursor
	DEALLOCATE SysProcessLogIdCursor
	PRINT 'STATE - CLOSE SysProcessLogIdCursor ' + RTRIM(CAST(CONVERT(time, GETDATE()) AS nvarchar(30)))

	IF NOT OBJECT_ID('#SysProcessLogId') IS NULL
	BEGIN
		DROP TABLE #SysProcessLogId
	END
	
END
GO

2 - выполнить запрос:

DECLARE @date date = '2017-11-01'
 
exec [dbo].[tsp_DeleteSysPrcHistoryLogByStartDate] @date

далее в запросе '2017-11-01' - это дата до которой будут безвозвратно удалены первые 1000 000 записей из SysPrcHistoryLog, Также, будут удалены связанные записи из таблиц SysPrcElHistoryLog, SysPrcEntityHistory.

У Вас очень старая 7.7, могут быть отличия, запускать осторожно.

А вообще, в 7.15.3 обещают автоматическую чистку таких архивных таблиц, есть смысл обновиться.

спасибо. настрою очистку.   мы уже обновились до 15.3 , и именно после этого начал увеличиваться SysPrcElHistoryLog, на ранних версиях я вообще не обращал внимания на эту таблицу

Владимир, ели у Вас 7.15.3, то лучше не скриптом.

Для тех, кто обновляется, а не ставит с нуля, перенос в эти таблицы из основных таблиц процессов включен, вот и растёт, а чистка на всякий случай выключена. Чтобы включить, достаточно поменять значение системной настройки «Срок хранения архивных данных (дней)» с 0 на натуральное число.

Мотков Илья,

как в переменную date добавить условие, чтобы удалял все старше 30 дней? 

 

Можно программно отнять от текущей даты 30 дней при помощи DATEADD(DAY, -30, GETDATE()) и передать результат в функцию.

 

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

Можно ли указать первую страницу которая будет запущена при входе в систему? Например определенный раздел на вкладке Итоги?

Нравится

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

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

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

Обратите внимание на системную настройку «Главная страница по умолчанию» (DefaultIntroPage), которая выбирает запись в объекте ApplicationMainMenu. А там в поле IntroPageUId указывается схема главной страницы. Возможно, получится подставить свою страницу туда и тогда она откроется вместо стартовой.

Показать все комментарии
7.15_()
Sales_Creatio_()

Добрый день, коллеги! У меня в файле cti-model.js были изменены некоторые методы для заполнения объекта звонка необходимыми данными с телефонии, но после обновления (с 7.12.1 до 5.15.2) данные перестали заполняться, и отладчик хрома перестал видеть этот файл в списке загруженных в память. Мне кажется, что какой-то параметр в конфигурации отвечал за подгрузку (этого и других файлов *-model.js), но после обновления я постарался перенести все старые параметры в новые конфиги. Подскажите, пожалуйста, что делать и куда копать

Нравится

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

Иван, добрый день!



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

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



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



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



Сейчас рекомендую корректно выполнить доработку через конфигурацию, Тут есть 2 варианта:



1) Например, замещения можно делать через  Ext классы(BaseStageControl), на примере класса "SummaryModule"(схема SummaryModuleV2):  

define("UsrSummaryModuleV2", ["SummaryModuleV2"],
    function() {
        Ext.define("Terrasoft.SummaryModuleOverrided", {
            override: "Terrasoft.SummaryModule",
 
           /*
            * @override
            */
            getESQ: function() {
                var esq = this.callParent(arguments);
                esq.queryKind = Terrasoft.QueryKind.LIMITED;
                return esq;
            }
        });
    }
);

define("BaseSectionV2", ["UsrSummaryModuleV2"], function() {
    return {
        methods: {},
        details: /**SCHEMA_DETAILS*/{}/**SCHEMA_DETAILS*/,
        diff: /**SCHEMA_DIFF*/[]/**SCHEMA_DIFF*/
    };
});

Замещаем BootstrapModulesV2:

define("BootstrapModulesV2", ["UsrSummaryModuleV2"], function() {
                return {};
});

2) Так же для CTI панели в последних версиях приложения реализован встроенный механизм доработки информации на CTI панели.



В общем случае, алгоритм следующий:

1. name = 'AdditionalSubscriberInfoContainer' - пустой контейнер, находящийся под данными об абоненте (Контрагент, Номер, Длительность разговора). В коробке его видимость завязана на возвпращаемое значение метода getIsAdditionalSubscriberInfoContainerVisible, который в коробке в схеме CtiPanelModelUtilities.js возвращает false.



2. name = 'AdditionalCallInfoContainer' - пустой контейнер, находящийся под контейнером кнопок (Поставить на удержание, Перевод звонка и т. д.). В коробке его видимость завязана на возвпращаемое значение метода getIsAdditionalCallInfoContainerVisible, который в коробке в схеме CtiPanelModelUtilities.js возвращает false.

Для того чтобы сделать эти контейнеры видимыми и добавить необходимые элементы управления, надо в своем пакете (например, Custom) заместить схему CtiPanel.js и переопределить указанные методы по своему усмотрению и "добавить" в diff необходимые элементы.

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

Создал замещающий объект Order.

Добавил событие OrderOnSaving https://yadi.sk/i/VeViyXnt6GIJzQ

(в БП Генерирую сообщение для БП родительского объекта)

Публикую объект и БП

В РФС появляется cs файл с методами данного объекта

При сохранении карточки Заказа появляется ошибка:

Процесс "Order_<Название пакета разработки>EventsProcess" остановлен. Превышено максимальное количество повторений элемента "StartMessage4".

StartMessage4  - Это название стартового сообщения БП в моём замещённом объекте.



Версия 7.15.1.1295. РФС.

Кто знает в чем причина такой ошибки? 

Нравится

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

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

Во-вторых, видимо, во втором элементе БП отправляется то же сообщение в тот же процесс, происходит вечное зацикливание.

В 5.Х было использование этого элемента с проставленной галкой отправки в родительский процесс. Сейчас специально отправлять уже не нужно.

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

Коллеги, что происходит с РФС на 7.15.2?

В конфигурации допустил ошибку в элементе скрипт.

При публикации появляется лог компиляции и страница дизайнера БП слетает в конфигурацию и появляется ошибка "Сборка конфигурации не инициализирована".

После нельзя зайти в схему БП, компиляция и генерация исходного кода не происходит.

 

Нравится

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

Обходное решение:

Экспортируйте из конфигурации ваш БП, удалите его откомпилируйте конфигурацию.

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

Обходное решение:

Экспортируйте из конфигурации ваш БП, удалите его откомпилируйте конфигурацию.

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

Григорий Чех,

Спасибо, так и сделал.

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