Здравствуйте.
Подскажите как в системе реализован автоматический расчёт итоговой стоимости товара в зависимости от количества?
Реализовано посредством написания кода или просто создана зависимая деталь "Итого" от детали "Количества"?
Нужно создать дополнительную колонку, которая будет автоматически рассчитывать бонусы, в зависимости от суммы приобретённых продуктов.
Благодарю

Нравится

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

/**
* Обновляет значение итога.
*/
updateSummary: function() {
var summary = this.sandbox.publish("GetOrderProductSummary", null, [this.sandbox.id]);
this.set("TotalCount", summary.count);
this.set("TotalAmount", this.Ext.String.format("{0} {1}", summary.currency,
this.Terrasoft.getFormattedNumberValue(summary.amount || 0)));
this.set("SummaryLoaded", Boolean(summary.currency));
},

Это не он случайно?

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

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

"Демьяник Алексей Олегович" написал:при изменении состояния счета

Только, наверное, при изменении суммы счёта

"Владимир Соколов" написал:
Демьяник Алексей Олегович пишет:

при изменении состояния счета

Только, наверное, при изменении суммы счёта

Зачем считать бонус, если счет не оплачен?:wink:

"Демьяник Алексей Олегович" написал:

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

Итог рассчитывается после события сохранения записи в самом объекте "Заказ".

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

Здравствуйте. А нельзя реализовать данный процесс не создавая счёт? Поставить зависимость колонки "Бонус" от колонки "Итого"?

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

Уточните Вашу задачу, пожалуйста.

Не совсем понятно, что Вы пытаетесь реализовать - каким образом Вы заполните поле "Итого", если счет создан не будет?

"Демьяник Алексей Олегович" написал:

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

Уточните Вашу задачу, пожалуйста.

Не совсем понятно, что Вы пытаетесь реализовать - каким образом Вы заполните поле "Итого", если счет создан не будет?

В разделе "Заказы" при добавлении нового продукта в заказ. Колонка "Итого" автоматически показывает итого, в зависимости от кол-ва продуктов и их стоимости. В разделе "Продукт в заказе" будет добавлена новая колонка "Бонусы". Допустим, итог приобретённых продуктов составил 100 у.е., а бонусы составляют 1% от суммы, т.е. 1 у.е. Нужно, чтобы этот процент автоматически отображался.
Надеюсь понятно написал:biggrin:

Я не совсем понимаю почему Вы выбрали такую реализацию.

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

Если Вы хотите раздавать "плюшки" за каждый оплаченный заказ, то лучше создать колонку "Бонусы" в объекте "Заказ" и заполнять его, как 0,01*(Сумма по полю "Итого" объекта "Продукт в заказе" с фильтром Продукт в заказе.Заказ == Заказ.Id).

Если Вы добавите данное поле в объект "Продукт в заказе", то данные в этой колонке будут дублироваться.

Бизнес процесс:
Два стартовых сигнала:
0.А) После добавления записи в объект "Заказ"
0.Б) После изменения записи колонки "Итого" в объекте "Заказ"

1) Чтение данных по объекту "Продукт в заказе" в режиме "Функция" по полю "Итого" с фильтром Заказ == Id стартового сигнала
2) Изменение данных объекта "Заказ" в поле "Бонус" с фильтром Id == Id стартового сигнала
3) Конец процесса.

Я не совсем понимаю почему Вы выбрали такую реализацию.

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

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

Если Вы добавите данное поле в объект "Продукт в заказе", то данные в этой колонке будут дублироваться.

Бизнес процесс:
Два стартовых сигнала:
0.А) После добавления записи в объект "Заказ"
0.Б) После изменения записи колонки "Итого" в объекте "Заказ"

1) Чтение данных по объекту "Продукт в заказе" в режиме "Функция" по полю "Итого" с фильтром Заказ == Id стартового сигнала
2) Изменение данных объекта "Заказ" в поле "Бонус", как 0,01*(Параметр предыдущего чтения данных), с фильтром Id == Id стартового сигнала
3) Конец процесса.

"Ануфриев Дмитрий Юрьевич" написал:Нужно, чтобы этот процент автоматически отображался.

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

"Демьяник Алексей Олегович" написал:

Я не совсем понимаю почему Вы выбрали такую реализацию.

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

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

Если Вы добавите данное поле в объект "Продукт в заказе", то данные в этой колонке будут дублироваться.

Бизнес процесс:

Два стартовых сигнала:

0.А) После добавления записи в объект "Заказ"

0.Б) После изменения записи колонки "Итого" в объекте "Заказ"

1) Чтение данных по объекту "Продукт в заказе" в режиме "Функция" по полю "Итого" с фильтром Заказ == Id стартового сигнала

2) Изменение данных объекта "Заказ" в поле "Бонус", как 0,01*(Параметр предыдущего чтения данных), с фильтром Id == Id стартового сигнала

3) Конец процесса.


Посмотрите пожалуйста правильно ли создан БП?

[URL=http://hostingkartinok.com/show-image.php?id=ef6b4027874b7ea0ecce1a33a9…]
[URL=http://hostingkartinok.com/show-image.php?id=cdcd49f5b51b08f3f3c7542a36…]
[URL=http://hostingkartinok.com/show-image.php?id=80cd33c8e5ddfb82f8ab18e980…]
[URL=http://hostingkartinok.com/show-image.php?id=89532dc814cefe7d5820e49de3…]

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

Неправильно! Такой процесс будет запускать сам себя!

1) В стартовом сигнале в поле "Должна быть изменена любая колонка из списка" выберите поле "Итого"
2) Чтение данных построено корректно
3) Так нельзя считать - создайте параметр бизнес процесса с типом Дробное число с двумя знаками после запятой. Перед элементом используйте элемент "Формула":

  • В "Поле установить параметр в" укажите созданный параметр бизнес процесса
  • В поле ниже укажите 0.01*[Читать данные продукта в заказе.Результат функции]

4) В элементе изменить данные выберите колонку "Бонусы", а в качестве значения укажите параметр процесса.

PS. Не уверен в "." в числе 0.01. Как вариант может быть 0,01.
PPS. 100% правильный вариант: [Читать данные продукта в заказе.Результат функции]/100

"Демьяник Алексей Олегович" написал:
3) Так нельзя считать - создайте параметр бизнес процесса с типом Дробное число с двумя знаками после запятой. Перед элементом используйте элемент "Формула":

  • В "Поле установить параметр в" укажите созданный параметр бизнес процесса
  • В поле ниже укажите 0.01*[Читать данные продукта в заказе.Результат функции]

4) В элементе изменить данные выберите колонку "Бонусы", а в качестве значения укажите параметр процесса.

PS. Не уверен в "." в числе 0.01. Как вариант может быть 0,01.

PPS. 100% правильный вариант: [Читать данные продукта в заказе.Результат функции]/100


Здравствуйте, Алексей. Понимаю, что достал, но пока не сделаю всё не отстану от вас))))
Объясните пожалуйста как добавить этот злополучный параметр бизнес-процесса?

"Ануфриев Дмитрий Юрьевич" написал:

Объясните пожалуйста как добавить этот злополучный параметр бизнес-процесса?

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

Вы можете найти инструкцию здесь.

"Демьяник Алексей Олегович" написал:
Ануфриев Дмитрий Юрьевич пишет:

Объясните пожалуйста как добавить этот злополучный параметр бизнес-процесса?

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

Вы можете найти инструкцию здесь.


Большое спасибо, Алексей. Настроил как вы и написали. Всё работает!

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

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

Наталья Осянина пишет:

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



А если хотите посчитать записи без учёта удаленной, то добавьте в условие суммирования "не равно Id удалённой записи"

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

спасибо) 

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

Дайте пожалуйста ссылку на SDK, где описывается создание страницы на Java Script.

Нравится

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

Здравствуйте, Евгений.

Страницу редактирования Вы можете создать с помощью мастера раздела (если речь идет о версии 7.3 и выше).

Если речь идет о 7.2.2 и ниже, посмотрите статью на SDK:
http://www.terrasoft.ua/bpmonlinesdk/CreateStandartSection.html

А в 7.6 страницу "Продукт в счёте" и "Продукт в заказе" уже в Мастере не поредактировать :(

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

Данные и другие детали, где есть упоминается продукт («Продукт в счете», «Продукт в заказе» или например, пользовательская деталь «Продукт в документе»), нельзя редактировать через мастер, так как в приложении присутствует («защита») определенная логика работы данного объекта.

Как вариант детали можно редактировать через конфигурацию.

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

Добрый день!

Периодически возникает ошибка при обновлении файла - "Object doesn't support interface IWindowEvents ({BCA3E874-2A30-4F24-B0C4-7D5FD94D2B22})", скрин ошибки со стеком вызова в приложении.
С чем может быть связанна подобная ошибка, пока появляется только на одном компьютере у одного пользователя, кэш и настройки чистили не помогло.

Terrasoft 3.3.2.274

Нравится

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

А библиотеки перерегистрировали?

Нет, подскажите пожалуйста как это сделать - попробую этот вариант.

Удалите кэш и перезарегистрируйте библиотеки Terrasoft

Очистка кэша:
1) Закройте Terrasoft и приложения Microsoft Office.
2) Пуск –> Выполнить -> %appdata%\Terrasoft

3) В открывшейся папке перейдите в папку с Вашей используемой версией программы, далее в папку Cache, где удалите все папки (они имеют вид «161213B7652E46D9885C0D4ABEE19A92»).

Кэш очищен.

Павел, с кэшем понятно, спасибо. Как перерегистрировать библиотеки Terrasoft?

Переригистрация библиотек:
1) Закройте Terrasoft и приложения Microsoft Office.
2) Пуск –> Выполнить ->cmd

3) Перейдите с помощью команды cd в нужную папку (пример): C:\>cd Install\3.4.1.170\bin\
4) Введите команду: C:\Install\3.4.1.170\Bin>TSRegSvr.exe /unreg
5) Введите команду: C:\Install\3.4.1.170\Bin>TSRegSvr.exe /reg

Прикрепил bat файл (в архиве), который необходимо поместить в папку bin и запустить. Сначала будет выполнена отмена регистрации библиотек, а затем регистрация.

Версия приложения 3.3.2.274. В папке Bin нет файла TSRegSvr.exe. как для этой версии?

Запустите TSLauncher.exe от имени администратора

Как вариант, можно просто переименовать папку Program Files\Terrasoft (скажем, в Terrasoft1), запустить TSClient и дождаться загрузки программы. Потом закрыть, переименовать папку обратно и снова запустить TSClient и дождаться.

"Зверев Александр" написал:

Как вариант, можно просто переименовать папку Program Files\Terrasoft (скажем, в Terrasoft1), запустить TSClient и дождаться загрузки программы. Потом закрыть, переименовать папку обратно и снова запустить TSClient и дождаться.


Спасибо, ваш способ подошел для всех версий.

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

Добрый день!
В ITIL в разделе Обращения есть фильтр-галочка "Показать закрытые".
По умолчанию закрытые обращения не отображаются, при нажатии на фильтр-галочку начинают показываться.

сам фильтр( его отображение) добавляется в схеме CaseSection

Хотелось бы создать по аналогии фильтр-галочку в этом же разделе - "показать разрешенные".
Унаследована схема CaseSection
Прописаны по аналогии атрибуты и расположение фильтра в разделе
attributes: {
"IsDesideActive": {
dataValueType: Terrasoft.DataValueType.BOOLEAN,
type: Terrasoft.ViewModelColumnType.VIRTUAL_COLUMN,
value: false
},
"StatusDesideFilterContainerDisplay": {
dataValueType: Terrasoft.DataValueType.BOOLEAN,
type: Terrasoft.ViewModelColumnType.VIRTUAL_COLUMN,
value: true
}
},

diff: /**SCHEMA_DIFF*/[
//FiltersContainer
{
"operation": "insert",
"parentName": "IsActiveFiltersContainer",
"propertyName": "items",
"name": "IsDesideActive",
"values": {
"caption": {
bindTo: "Resources.Strings.CheckBoxDesideFilterCaption"
},
"bindTo": "IsDesideActive",
"controlConfig": {
"className": "Terrasoft.CheckBoxEdit",
"checkedchanged": {
"bindTo": "onCheckboxChecked"
},
"checked": {
"bindTo": "IsDesideActive"
}
}
}
}
]/**SCHEMA_DIFF*/

При этом новый фильтр-галочка не вмещается и накладывается на фильтр фиксированный по ответственному

Скажите, пожалуйста, как правильно расположить фильтр в разделе?
Унаследовала схему CheckBoxFixedFilterStyle - полагаю, что в нее нужно внести какие-то изменения,
чтобы разместить фильтр правильно - но вот какие?

Нравится

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

я бы попробовал внутри "values" описания новых "галочек" добавить параметр "layout", а вот в нем подобрать значения определяющие положение контрола
"values": {
...
"layout": {"column": 14, "row": 0, "colSpan": 2},
...
}

не помогает, я так понимаю, что нужно именно подвинуть как-то расположение уже существующих фиксированных фильтров

"Татаровская Дарья" написал:нужно именно подвинуть как-то расположение уже существующих фиксированных фильтров

я вот пока как их сдвинуть не нашел :)
Тоже попробовал в эту панель добавить элементы, пока не особо получилось, подождем может что кудесники из поддержки подскажут

В первую очередь необходимо увеличить размер контейнера, в который Вы добавляете свой элемент:
{
"operation": "merge",
"name": "IsActiveFiltersContainer",
"values": {
"styles": {"width":"360px"},
"layout": {"column": 0, "row": 0, "colSpan": 24}
}
}
Далее необходимо, чтобы уже находящийся в контейнере первый чекбокс не заполнял все доступное пространство:
{
"operation": "merge",
"name": "IsActive",
"values": {
"layout": {"column": 0, "row": 0, "colSpan": 12},
"styles": {"width":"50%"}
}
}
Для корректного отображения у себя в определении элемента, добавьте следующие свойства:
"values": {
"caption": {
bindTo: "Resources.Strings.CheckBoxDesideFilterCaption"
},
"layout": {"column": 12, "row": 0, "colSpan": 12},
"styles": {"width":"50"},

"Александр Зубков" написал:Далее необходимо, чтобы уже находящийся в контейнере первый чекбокс не заполнял все доступное пространство

Вот теперь понятно почему у меня контрол не виден новый был. Спасибо)

Спасибо

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

Доброго времени суток, сообщество! Столкнулся со следующей проблемой и надеюсь на вашу помощь.

В разделе есть два преднастроенных фильтра: Дистрибьютор и ShipTo . Нужно чтобы после выбора значения в фильтре "Дистрибьютор" обновлялся параметр "filter" для фильтра "ShipTo".

Подробнее: В фильтре "ShipTo" пользователь должен иметь возможность выбрать запись только из тех, которые есть у Дистрибьютора, выбранного в фильтре "Дистрибьютор", на детали ShipTo.

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

Надеюсь понятно объяснил, это было не легко :smile:

Прилагаю код моих преднастроенных фильтров:

initFixedFiltersConfig: function(recursion) {
                    var self = this;
                    var fixedFilterConfig = {
                        entitySchema: this.entitySchema,
                        filters: [
                            {
                                name: "SxDistributor",
                                caption: this.get("Resources.Strings.SxDistributorFilterCaption"),
                                addSxDistributorCaption: this.get("Resources.Strings.SxAddDistributorFilterCaption"),
                                referenceSchemaName: "Account",
                                entityColumn: {
                                    isLookup: true
                                },
                                notNeedCurrentUser: true,
                                dataValueType: this.Terrasoft.DataValueType.LOOKUP,
                                filter: function(){
                                    // Получаем список контрагентов у которых есть тип "Дистрибьютор"
                                    if(self.get('AccountId').length > 0) {
                                        //  Фильтруем контрагентов по полученному списку
                                        return Terrasoft.createColumnInFilterWithParameters(
                                            "Id", self.get('AccountId'));
                                    }else{
                                        return false;
                                    }
                                },
                                getFilter: function (filterInfo) {
                                    if(filterInfo.value) {
                                        /*  Генерируем фильтр для ShipTo   */
                                        var ShipToId = [];  //  Список ShipTo выбранного Контрагента
                                        var esq = Ext.create('Terrasoft.EntitySchemaQuery', {
                                            rootSchemaName: 'SxShipTo'
                                        });
                                        esq.addColumn('Id');
                                        esq.filters.add('SxAccount',
                                            esq.createColumnFilterWithParameter(
                                                Terrasoft.ComparisonType.EQUAL, 'SxAccount', filterInfo.value[0]));
                                        esq.getEntityCollection(function (response) {
                                            if (response.success) {
                                                ShipToId = [];
                                                response.collection.each(function (item) {
                                                    ShipToId.push(item.values.Id);
                                                });
                                                self.set('ShipToId', ShipToId);

                                                // TODO Надо обновить filter для фильтра ShipTo
                                            }
                                        }, this);

                                        /*  Фильтруем раздел по полю Контрагент    */
                                        var filter;
                                        filterInfo.value && (filter = Terrasoft.createColumnInFilterWithParameters(
                                            "SxAccount", filterInfo.value));
                                        return filter;
                                    }
                                }
                            },

                            {
                                name: "SxShipTo",
                                caption: this.get("Resources.Strings.SxShipToFilterCaption"),
                                addSxShipToCaption: this.get("Resources.Strings.SxAddShipToCaption"),
                                referenceSchemaName: "SxShipTo",
                                entityColumn: {
                                    isLookup: true
                                },
                                notNeedCurrentUser: true,
                                dataValueType: this.Terrasoft.DataValueType.LOOKUP,
                                filter: function(){
                                    //  Получаем список записей ShipTo выбранного Контрагента
                                    if(self.get('ShipToId').length > 0) {
                                        return Terrasoft.createColumnInFilterWithParameters(
                                            "Id", self.get('ShipToId'));
                                    }else{
                                        //  Если ShipTo пустой ставим невыполнимый фильтр. Список пуст.
                                        return Terrasoft.createColumnIsNullFilter("Id");
                                    }
                                },
                                getFilter: function (filterInfo) {
                                    //  Фильтруем раздел по полю ShipTo
                                    var filter;
                                    filterInfo.value && (filter = Terrasoft.createColumnInFilterWithParameters(
                                        "SxShipTo", filterInfo.value));
                                    return filter;
                                }
                            }
                        ]
                    };
                    this.set("FixedFilterConfig", fixedFilterConfig);
                }

Нравится

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

Вячеслав, добрый день!

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

Как вариант, можно вызвать повторную инициализацию всех фильтров, добавив вызов метода self.initFilters() примерно в том месте, где у Вас расположен комментарий

// TODO Надо обновить filter для фильтра ShipTo

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

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

1) Изменить метод getFilter первого фильтра примерно так:

getFilter: function (filterInfo) {
	if (!self.get("ChildFiltersInitializing")) {
		if(filterInfo.value) {
			/*  Генерируем фильтр для ShipTo   */
			var ShipToId = [];  //  Список ShipTo выбранного Контрагента
			var esq = Ext.create('Terrasoft.EntitySchemaQuery', {
				rootSchemaName: 'SxShipTo'
			});
			esq.addColumn('Id');
			esq.filters.add('SxAccount',
			esq.createColumnFilterWithParameter(
				Terrasoft.ComparisonType.EQUAL, 'SxAccount', filterInfo.value[0]));
			esq.getEntityCollection(function (response) {
				if (response.success) {
					ShipToId = [];
					response.collection.each(function (item) {
						ShipToId.push(item.values.Id);
					});
					self.set('ShipToId', ShipToId);
 
					// TODO Надо обновить filter для фильтра ShipTo
 
					self.set("ChildFiltersInitializing", true);
					self.initFilters();
				}
			}, this);
		} else {
			if ((self.get("ChildFiltersInitializing") !== undefined) && self.get("ShipToId")) {
				self.set("ShipToId", null);
				self.set("ChildFiltersInitializing", true);
				self.initFilters();
			}
		}
	}
 
	/*  Фильтруем раздел по полю Контрагент    */
	var filter;
	filterInfo.value && (filter = Terrasoft.createColumnInFilterWithParameters(
		"SxAccount", filterInfo.value));
	return filter;
}

2) добавить переопределение метода onFilterUpdate для инициализации флага:

onFilterUpdate: function() {
	this.callParent(arguments);
	if (this.get("ChildFiltersInitializing")) {
		this.set("ChildFiltersInitializing", false);
	}
}

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

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

Добрый день!
Стоит задача: добавить в реестр детали продуктов изображение восклицательный знак возле записи, у которой выполняется некое условие, наподобие функционала в подборе продуктов.
Как это можно реализовать?
Версия 7.6

Нравится

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

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

В разделе "Продажи" есть колонка "Настроение", которая выводится в реестр в виде изображения.

Вы можете посмотреть реализацию и сделать по аналогии.

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

Добрый день!

Пытаюсь в процессе задать время срабатывания таймера.

Timer1.StartOffset = 40;

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

Версия 7.2.0.1530

Нравится

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

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

Создайте параметр процесса с типом "Целое число". В элементе "Таймер" значение параметра StartOffset задайте значение созданного параметра.
Тогда Вам нужно будет задавать значение не параметру самого таймера, а параметру бизнес процесса. Попробуйте - должно сработать!

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

Прикладываю процесс.

В логе:

2015-09-23 17:42:08,509 [6336] DEBUG RND-DTZ-SRV2\user2 .. ScriptTask6Execute - XX before exec
2015-09-23 17:42:08,509 [6336] DEBUG RND-DTZ-SRV2\user2 .. ScriptTask1Execute - YY before exec
2015-09-23 17:42:21,024 [BPMonlineQuartzScheduler_Worker-3] DEBUG RND-DTZ-SRV2\user2 .. ScriptTask10Execute - XX after exec

Второй таймер не срабатывает.

Вообще таймеры работают очень странно. Никак не могу с ними разобраться.

"Бардашев Юрий Николаевич" написал:

Вообще таймеры работают очень странно. Никак не могу с ними разобраться.

2015-09-23_1845.png
93.99 кб

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

Поставьте собирающее "И" для двух веток перед завершающим элементом.

Спасибо! Теперь всё работает.

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

Создал раздел через мастер разделов. В объекте раздела установил для справочного поля "Автор" значение по умолчанию - Текущий пользователь. При сохранении получаю ошибку - Конфликт инструкции INSERT с ограничением FOREIGN KEY "FKMUz8mt4GOdEmSGqDq6UKqFRng". Конфликт произошел в базе данных "ClientPortal_7.6.0_SO", таблица "dbo.Contact", column 'Id'.
Выполнение данной инструкции было прервано.
Если очистить поле - эффект тот же.
Если убрать значение по умолчанию - все сохраняется.

Нравится

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

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

Правильно - не Текущий пользователь, а Контакт Текущего Пользователя.

Текущий пользователь ссылается на SysAdminUnit, в то время как колонка Автор - Contact.

Спасибо большое. И как я сразу не догадался...

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

Прошу помочь!!!
При входе в систему выдает : Ошибка открытия конфигурации Named Pipes Provider: Could not open a connection to SQL Server [53]
На ноуте уст Windows 8 (64).

Нравится

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

Проверьте корректность заполненных данных:

  • Название SQL сервера
  • Название БД

Так же убедитесь, что на Вашей машине отключен firewall, и антивирус не блокирует порт 1433 (по умолчанию для SQL сервера)

Дополнительные ссылки на эту же тему:

Проверили корректность заполненных данных. Все в норме. Порт 1433 также не блокируется. Может еще какие варианты возможны?

Выполните такую последовательность действий:

  • Запустите Terrasoft на сервере, для исключения неисправностей в сети
  • При появление проблемы с подключением, необходимо проверить настройки SQL сервера
  • При успешном подключение, необходимо проверить firewall на самом сервере
  • Запустите Terrasoft на другой машине и попытайтесь выполнить вход в приложение
  • При появлении проблемы, необходимо проверить настройки сети и настройки firewall
  • При успешном подключение, необходимо посмотреть какие установлены настройки на текущей машине и перенести их на проблемую машину
  • Установить на на проблемной машине SQL Management Studio или командную строку MS SQL и с помощью их выполнить подключение к БД

Ок. Это все проверим. Пока вот что заметил. Если запускать программу на сервере под терминальным доступом, то тоже ошибка, но если войти под другим пользователем, то все нормально работает и без проблем. Но под этим проблемным пользователем никак.

И еще. Остальные пользователи работают с других машин и под терминальным доступом без проблем.

Необходимо проверить на ограничения доступа проблемного пользователя

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

Не смогу подсказать, т.к. это связно с администрированием системы и ни как не связано с Terrasoft.
Вам необходимо проверять связку: MS SQL + Проблемный пользовать.
Terrasoft только выдает сообщение, которое ему пришло в ответ

Понял. Спасибо. Будем все проверять.

Итак пользователь проверен по доступу. Но вот в чем вопрос: если попробовать зайти под проблемным пользователем с другого ПК (на котором другой пользователь работает с terrasoft без проблем).

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

Извините не дописал. В смысле на другой машине проблемный пользователь тоже не работает.

"Прошко Алексей Анатольевич" написал:

Извините не дописал. В смысле на другой машине проблемный пользователь тоже не работает.


доменный пользователь что ли?

Нет. Обычный пользователь.

Может профиль пользователя в базе поврежден?

При повреждении профиля, была бы другая ошибка.
Запустите SQL Server Profiler и посмотрите на чем произойдет свал и попробуйте ее устранит.
Если возникнут сложности с запросами, можете обратиться в службу поддержки support@terrasoft.ru, для более оптимального и быстрого решения вопроса.

Большое спасибо. После проверки отпишусь о результатах.

"Прошко Алексей Анатольевич" написал:В смысле на другой машине проблемный пользователь тоже не работает

Вот это самое странное, так как ошибка в первом посте у вас 100% транспортного уровня. И связана она с конкретным пользователем Terrasoft ну никак не может быть.
Еще вариант включить для sql сервера в настройках протокол named pipes не предлагали?

А вообще наверное оптимально - удаленно суппорта пустите, все вам и настроят :)

Это тоже вариант. Как это лучше сделать и в какое время?

На этот вопрос смогут ответить в службе поддержки (support@terrasoft.ru)

Вообщем по совету техподдержки обновил бинарники и обновил заново лицензии. Все равно при входе проблемного пользователя выскакивает ошибка "Требуется объект..."

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

Проблема решена.
Ее суть заключалась в том, что у Контакта пользователя не было заполнено поле [Часовой пояс]
Для выяснения выполняем загрузку окна wnd_Main или нет, была залогирована функция wnd_MainOnPrepare:

function wnd_MainOnPrepare(Window) {
	Log.Write(1, 'wnd_MainOnPrepare: begin');
/* MODULE WORKFLOW */
	DatasetTriggers.Load();
	SetServicesEvents();
/* ENDMODULE WORKFLOW */
	Log.Write(1, 'wnd_MainOnPrepare: CheckTimeZone');	
	CheckTimeZone();
	Log.Write(1, 'wnd_MainOnPrepare: ReadSystemSettings');				
	ReadSystemSettings();
	Initialize();
	InitializeUserSettings(true);
	InitializeCallClient();
	FillReferencesDictionary();
	CheckAnniversary();
	if (!CheckWorkspacesAllowed()) {
		return;
	}
 
	IntitializeTimer();
	ActivateHyperlink();
	InitializeJumpActions();
	Log.Write(1, 'wnd_MainOnPrepare: end');
}

После вывода сообщения: Log.Write(1, 'wnd_MainOnPrepare: CheckTimeZone'); мы не получили вывод сообщения Log.Write(1, 'wnd_MainOnPrepare: ReadSystemSettings');. Что и обозначило причину возникновения проблемы.
Функция CheckTimeZone() сервиса scr_Main, отвечают за установку текущему пользователю часовой пояс.

Решение:

function CheckTimeZone() {
	var UserTimeZone = Connector.CurrentUser.TimeZone;
	var SystemTimeZone = System.GetSystemTimeZone();
 
	var TimeZoneEnum = GetSingleItemByCode('enm_TimeZone');
	var EnmUserTimeZone = TimeZoneEnum.ItemsByCode(UserTimeZone);	
	if (IsEmptyValue(EnmUserTimeZone)) {
		UserTimeZone = '';
	}
 
	if (!UserTimeZone) {
		UserTimeZone = SystemTimeZone;
		Connector.CurrentUser.TimeZone = UserTimeZone;
	}
	if (UserTimeZone == SystemTimeZone) {
		return;
	}
	var Message = FormatStr(
		"Часовой пояс системы: %1\rЧасовой пояс текущего контакта: %2\rИспользовать часовой пояс системы?",
		GetTimeZoneFullCaption(SystemTimeZone), GetTimeZoneFullCaption(UserTimeZone));			
	if (ShowConfirmationDialog(Message) != wmrYes) {
		return;
	}	
	Connector.CurrentUser.TimeZone = SystemTimeZone;
	var UpdateQuery = GetSingleItemByCode('uq_ContactTimeZone');
	UpdateRecordField(UpdateQuery, Connector.CurrentUser.ContactID, 
		Array('TimeZone'), Array(SystemTimeZone));		
}
Показать все комментарии

Добрый день!
Подскажите пожалуйста как сделать редактируемый реестр детали не редактируемым по условию в родительской записи (к примеру деталь продуты в заказе, состояние заказа == выполнен) в версии BPM 7.6?
Заранее благодарен...

Нравится

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

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

Редактируемый реестр довольно сильно отличается от обычного: это отдельный компонент системы, который хоть и является расширением Terrasoft.Grid, но многие его методы переопределены и работают совсем по-другому.

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

Если подобные варианты не подходят, и задача заключается именно в динамической подмене контрола обычного реестра (Terrasoft.Grid) на редактируемый (Terrasoft.ConfigurationGrid), можно попробовать следующий вариант: добавить на деталь два разных реестра и в зависимости от условия изменять видимость этих реестров, чтобы видимым всегда оставался только один из них. Возможно, придётся переопределить некоторые из методов, которые выполняют действия над строками реестра. Должен предупредить, что примеров решения подобных задач у нас пока не было.

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

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

Это возможно сделать с помощью натсройки прав доступа [Администрируется по колонкам]

http://academy.terrasoft.ua/documents/docs/product/bpm'online%20sales/t…

Я имел ввиду блокировать их редактирование по условию, а не перманентно.

Блокирование отдельных ячеек записи в редактируемом реестре можно осуществить с помощью бизнес правил:
http://academy.terrasoft.ru/documents/docs/technic/SDK/7.6.0/AddBusines…

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