бизнес-процесс
преднастроенная страница
Технические вопросы
7.x

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

Нравится

1 комментарий
Lookup
выбор из справочника
Остаток продукта
Технические вопросы
7.x

Добрый день.
Версия 7.9

Кейс был такой: Нужно создать деталь с полем справочник (у меня это "UsrStore") c ссылкой на объект "Остаток продукта".

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

1)

Uncaught iargumentName: ""__proto__: constructor$className: "Terrasoft.exceptions.ArgumentNullOrEmptyException"alternateClassName: "Terrasoft.ArgumentNullOrEmptyException"argumentName: nullconfig: e__proto__: Objectconstructor: function ()__proto__: Objectconstructor: function Object()hasOwnProperty: function hasOwnProperty()isPrototypeOf: function isPrototypeOf()propertyIsEnumerable: function propertyIsEnumerable()toLocaleString: function toLocaleString()toString: function toString()valueOf: function valueOf()__defineGetter__: function __defineGetter__()__defineSetter__: function __defineSetter__()__lookupGetter__: function __lookupGetter__()__lookupSetter__: function __lookupSetter__()get __proto__: function __proto__()set __proto__: function __proto__()configMap: Object__proto__: ObjectinitConfigList: Array(0)length: 0__proto__: Array(0)initConfigMap: Objectmessage: "Несуществующий или пустой аргумент"self: function i()superclass: constructortoString: function ()__proto__: constructor
/core/04566becfbd71b73c17d3b4e92cd2ba9/Terrasoft/amd/core.js?:579 user: Supervisor/7f3b869f-34f3-4f20-ab4d-7480a5fdf647
 file: a href="http://176.104.2.162/core/9b78b22f0e6d6388b9ec0f8fae14cb84/combined/all-combined.js

"
title="http://176.104.2.162/core/9b78b22f0e6d6388b9ec0f8fae14cb84/combined/all-combined.js

"
>a href="http://176.104.2.162/core/9b78b22f0e6d6388b9ec0f8fae14cb84/combined/all-...">http://176.104.2.162/core/9b78b22f0e6d6388b9ec0f8fae14cb84/combined/all-... line: 846
 column: 295
 message: Uncaught Terrasoft.ArgumentNullOrEmptyException: Несуществующий или пустой аргумент
 date: Fri Mar 24 2017 11:05:50 GMT+0200 (Финляндия (зима))
 stack: undefined
writeErrorMessage @ /core/04566becfbd71b73c17d3b4e92cd2ba9/Terrasoft/amd/core.js?:579

2)

LookupPageViewModelGenerator.js:284 Uncaught i {argumentName: ""}argumentName: ""__proto__: constructor
addColumn @ all-combined.js:846
addColumn @ all-combined.js:939
(anonymous) @ LookupPageViewModelGenerator.js:284
Terrasoft.utils.array.each @ all-combined.js:225
addSelectColumns @ LookupPageViewModelGenerator.js:282
Terrasoft.each.scope @ LookupPageViewModelGenerator.js:273
Terrasoft.utils.array.each @ all-combined.js:225
getSelect @ LookupPageViewModelGenerator.js:271
loadData @ LookupPageViewModelGenerator.js:344
load @ LookupPageViewModelGenerator.js:73
(anonymous) @ /0/configuration/fec43bee7d1bd6fa3769ce764f5b8168ru-RU/LookupPage.js:176
(anonymous) @ /0/configuration/fec43bee7d1bd6fa3769ce764f5b8168ru-RU/LookupPage.js:284
execCb @ require.js:1693
check @ require.js:881
enable @ require.js:1173
init @ require.js:786
(anonymous) @ require.js:1457

3)

/core/04566becfbd71b73c17d3b4e92cd2ba9/Terrasoft/amd/core.js?:579 user: Supervisor/7f3b869f-34f3-4f20-ab4d-7480a5fdf647
 file: a href="http://176.104.2.162/core/9b78b22f0e6d6388b9ec0f8fae14cb84/combined/all-combined.js

"
title="http://176.104.2.162/core/9b78b22f0e6d6388b9ec0f8fae14cb84/combined/all-combined.js

"
>a href="http://176.104.2.162/core/9b78b22f0e6d6388b9ec0f8fae14cb84/combined/all-...">http://176.104.2.162/core/9b78b22f0e6d6388b9ec0f8fae14cb84/combined/all-... line: 846
 column: 295
 message: Uncaught Terrasoft.ArgumentNullOrEmptyException: Несуществующий или пустой аргумент
 date: Fri Mar 24 2017 11:11:48 GMT+0200 (Финляндия (зима))
 stack: undefined
writeErrorMessage @ /core/04566becfbd71b73c17d3b4e92cd2ba9/Terrasoft/amd/core.js?:579
(anonymous) @ /core/04566becfbd71b73c17d3b4e92cd2ba9/Terrasoft/amd/core.js?:740
execCb @ require.js:1693
check @ require.js:881
enable @ require.js:1173
init @ require.js:786
(anonymous) @ require.js:1457

4)

/core/04566becfbd71b73c17d3b4e92cd2ba9/Terrasoft/amd/core.js?:579 user: Supervisor/7f3b869f-34f3-4f20-ab4d-7480a5fdf647
 file: a href="http://176.104.2.162/core/9b78b22f0e6d6388b9ec0f8fae14cb84/combined/all-combined.js

"
title="http://176.104.2.162/core/9b78b22f0e6d6388b9ec0f8fae14cb84/combined/all-combined.js

"
>a href="http://176.104.2.162/core/9b78b22f0e6d6388b9ec0f8fae14cb84/combined/all-...">http://176.104.2.162/core/9b78b22f0e6d6388b9ec0f8fae14cb84/combined/all-... line: 846
 column: 295
 message: Uncaught Terrasoft.ArgumentNullOrEmptyException: Несуществующий или пустой аргумент
 date: Fri Mar 24 2017 11:11:48 GMT+0200 (Финляндия (зима))
 stack: undefined

Нравится

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

По ошибкам сложно понять в чем дело, напишите в поддержку, с предоставлением доступа к сайту:
support@terrasoft.ru
Пусть посмотрят и исправят на месте.

Ок. Спасибо.

Показать все комментарии
Установка значения поля
Технические вопросы
7.x

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

Нравится

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

Добрый день!

Добавьте его в атрибуты страницы:

[javascript]
attributes: {
"ProductType": {
dataValueType: Terrasoft.DataValueType.LOOKUP,
referenceSchemaName: "ProductType"
}
}
[/javascript]

После этого можете с ним работать методами set и get

Я конечно догадываюсь, что, скорее всего, вас интересует возможность записи в объекты посредством esq. Почитайте подробнее тут: https://academy.terrasoft.ua/documents/technic-sdk/7-6-0/ispolzovanie-r…
И если возникнут точечные вопросы, задавайте, либо более подробно объясните что вам нужно, желательно с примерами, названиями полей, и.т.д. А то вопрос звучит слишком абстрактно.
Если же вас интересует глобальная "переменная", для переиспользования её далее в рамках схемы, то ответ выше.

"Дмитрий Степанов" написал:

Добрый день!

Добавьте его в атрибуты страницы:

attributes: {

                        "ProductType": {

                                dataValueType: Terrasoft.DataValueType.LOOKUP,

                                referenceSchemaName: "ProductType"

                        }

}

После этого можете с ним работать методами set и get


Добавил. Вот только в базе изменения не отображаются.

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

"Сурмачевский Евгений Александрович" написал:Добавил. Вот только в базе изменения не отображаются

Естественно, атрибут это не физическая колонка в БД. Физическую колонку в бд вам необходимо добавить в объект, и\или если она там есть, использовать esq для установки её значения:
https://academy.terrasoft.ua/documents/technic-sdk/7-6-0/ispolzovanie-r…

Либо так как описано выше, создать атрибут, одноименнный колонке, и через this.set устанавливать её значение, не вы водя её на карточку.

"Дмитрий Степанов" написал:

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


Не до конца выразил мысль. Есть поле в объекте ("IncomeSpare") и тип его справочник. Я запросом получаю Guid и хочу это значение внести в базу в колонку "IncomeSpareID".
На самой странице редактирования я не хочу размещать данный справочник.
Использовать esq ? Описанный вами способ к сожалению не работает.

"Сурмачевский Евгений Александрович" написал:я не хочу размещать данный справочник.

Не прописывайте данное поле в diff
"Сурмачевский Евгений Александрович" написал: хочу это значение внести в базу в колонку "IncomeSpareID".

Делайте Insert в бд после получения Guid'а или [javascript]
this.set(/*название поля*/, {value: /*id*/, displayValue: /*name поля из справочника*/})
[/javascript]

1. Создаете в структуре объекта поле IncomeSpare, тип справочник
2. на странице объекта объявляете атрибут
[javascript]
attributes: {
"IncomeSpare": {
dataValueType: Terrasoft.DataValueType.LOOKUP,
referenceSchemaName: "IncomeSpareLOOKUP" //ваше наименование справочника
}
}
[/javascript]

3. В коде страницы перед сохранением присваиваете ему значение:

[javascript]
this.set("IncomeSpare", value)
[/javascript]

Сделал как описал Дмитрий.
Вот только установил значение таким способом: this.set(/*название поля*/, {value: /*id*/, displayValue: /*name поля из справочника*/})
Все получилось.
Всем спасибо.

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

Добрый день!
Возможен ли перенос между средами права доступа "Администрируется по записям" и, например Право на удаление?
Если да, то каким образом?

Нравится

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

Права доступа по записям — это записи в таблице Sys[название раздела]Right. Их можно попробовать перенести как данные в составе пакета, если даст выбрать эту таблицу, а если нет — то SQL-запросом. Главное, чтобы на старой и новой базе совпадали Id записей в разделе и Id пользователей и их групп. Также учтите, что на новом месте по записям раздела уже могут быть вручную выданы права и вместе с залитыми может возникнуть путаница.

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

Права доступа по записям — это записи в таблице Sys[название раздела]Right. Их можно попробовать перенести как данные в составе пакета, если даст выбрать эту таблицу, а если нет — то SQL-запросом. Главное, чтобы на старой и новой базе совпадали Id записей в разделе и Id пользователей и их групп. Также учтите, что на новом месте по записям раздела уже могут быть вручную выданы права и вместе с залитыми может возникнуть путаница.


Я изменил права на удаления контактов, со всех сотрудников на Supervisor. Но в таблице запись никак не отобразилась.

Права на удаление влияют на возможность удаления, а не отображения.

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

Права на удаление влияют на возможность удаления, а не отображения.


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

Если настраиваете права по операциям (а не записям), то они хранятся в SysEntitySchemaOperationRight.

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

Если настраиваете права по операциям (а не записям), то они хранятся в SysEntitySchemaOperationRight.


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

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

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

Добрый день, добавили в црм новых менеджеров.
Однако менеджерам в пользовательском разделе видна лишь часть записей и при сохранении появляется окошко, уведомляющее, что недостаточно прав для изменения записи.
Как я понимаю необходимо изменить правда доступа в “Права доступа на объекты”, пытались снять галочку для раздела на пункте “Администрируется по записям”, но появляется предупреждение: “Невозможно понизить права, которые установлены на уровне схемы объекта в дизайнере”, кнопка добавить также неактивна. Подскажите, пожалуйста, как можно решить данную проблему?

Нравится

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

Добрый день, Мария!

Пример решения типовой задачи со скриншотами прикрепил вложением.

Адасюк Валерий Викторович Можете выслать и мне вложение, та же проблема

 

Добрый день!

так как функционал нового community не позволяет выкладывать вложения (кроме скриншотов), то пошаговое решение выложил архивом по ссылке http://tsrdp.tscrm.com/support/pub/Adasyuk/Zip.zip

Показать все комментарии
ActionsDashboard
Технические вопросы
7.x

Добрый день!

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

Нравится

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

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

ActionsDashboard состоит из двух блоков: полоса стадий, которая расположена в HeaderContainer и панель действий — в ContentContainer.
В статье https://academy.terrasoft.ru/documents/technic-sdk/7-9/instrumentalnaya… об этом рассказывается.

Можно сделать "headerVisible": false в config вашего ActionsDashboardModule.

Пример создания своего ActionsDashboard - https://academy.terrasoft.ru/documents/technic-sdk/7-9/dobavlenie-instr…

Показать все комментарии
печатная форма
справочник
Технические вопросы
7.x

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

Это можно реализовать? Если да то желательно пример.
За ранее спасибо.

Нравится

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

Здравствуйте, Максим!

За функционал печатных форм отвечает миксин PrintReportUtilities. Генерация коллекции печатных форм происходит в методах initCardPrintForms и initSectionPrintForms. События клика на печатных формах в секции и карточке редактирования обрабатываются в методах generateCardPrintForm и generateSectionPrintForm. Для изменения логики стандартных печатных форм необходимо заместить данные методы с добавлением пользовательской логики(фильтрации).

Как альтернативное решение, Вы можете добавить пользовательскую кнопку печати и при клике обращаться к вэб сервису напрямую. Реализацию обращения к вэб сервису для печати "Печатных форм", Вы можете посмотреть в методе generatePrintForm схемы PrintReportUtilities (NUI).

Также вопрос обсуждался здесь:
http://www.community.terrasoft.ru/forum/topic/11555.

"Мотков Илья" написал:

Здравствуйте, Максим!

За функционал печатных форм отвечает миксин PrintReportUtilities. Генерация коллекции печатных форм происходит в методах initCardPrintForms и initSectionPrintForms. События клика на печатных формах в секции и карточке редактирования обрабатываются в методах generateCardPrintForm и generateSectionPrintForm. Для изменения логики стандартных печатных форм необходимо заместить данные методы с добавлением пользовательской логики(фильтрации).

Как альтернативное решение, Вы можете добавить пользовательскую кнопку печати и при клике обращаться к вэб сервису напрямую. Реализацию обращения к вэб сервису для печати "Печатных форм", Вы можете посмотреть в методе generatePrintForm схемы PrintReportUtilities (NUI).

Также вопрос обсуждался здесь:

http://www.community.terrasoft.ru/forum/topic/11555.

Прошу прощения, а не подскажите где это делать?

rules: {}
или
metods: {}

Добрый день, Максим!

Методы нужно добавить в methods, миксин подключить в mixins. Более подробно можете прочитать здесь: https://academy.terrasoft.ua/documents/technic-sdk/7-9/klientskie-shemy…

Показать все комментарии
отложить напоминания
Технические вопросы
7.x

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

Нравится

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

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

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

Показать все комментарии
продажи
Технические вопросы
7.x

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

Нравится

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

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

Данная идея уже зарегистрирована у команды разработки для реализации в следующих версиях системы. Номер проблемы 3762
Если Вы хотите реализовать перенос своими силами, для решения данного вопроса Вы можете воспользоваться базовым функционалом системы в виде бизнес-процессов, создав свой процесс. В данном процессе необходимо первым элементом вычитать создаваемую продажу, вторым чтением данных ту, из которой создается, третьим элементом "чтение данных" вычитать деталь "продукт в продаже" и четвертым элементом "добавление данных" перенести все продукты. Перед построением своего процесса рекомендуем ознакомится с руководством пользователя по работе с бизнес-процессами: https://academy.terrasoft.ua/documents/technic-bpms/7-9/obzor-funkciona…

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

"Мария Ватулина" написал:

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

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

Решение с процессом корректно, однако реализация должна быть другой. Есть два варианта:
1) Требующий навыков программирования на JS (для создания действия, которое будет вызывать процесс из раздела)
2) Не требующий навыков программирования.

В первом варианте:

  • Создайте параметр с типом "Уникальный идентификатор". Назовем его RecordId
  • Общая структура процесса

  • Начальный элемент
  • Элемент добавить данные в режиме выборки. Добавляем данные в объект "Продажа". Выборка по объекту "Продажа". Фильтр выборки Id = [#RecordId#]
  • Элемент добавить данные в режиме выборки. Добавляем данные в объект "Продукт в продаже". Выборка по объекту "Продукт в продаже". Фильтр выборки Продажа = [#RecordId#]
  • Конец процесса

Также можно вначале процесса добавить проверку, что параметр RecordId != Guid.Empty (проверка, что процесс запущен по записи, а не вручную).

Дополнительно нужно создать действие в разделе, который вызовет указанный процесс по выделенной записи. Например, можно создать кнопку в разделе. Подробнее можно найти по ссылке:
http://www.community.terrasoft.ru/forum/topic/14042

В втором варианте:

    Общая структура процесса
  • Начальный элемент
  • Автогенерируемая страница с полем выбора из справочника "Продажа"
  • Элемент добавить данные в режиме выборки. Добавляем данные в объект "Продажа". Выборка по объекту "Продажа". Фильтр выборки Id = [#Автогенерируемая страница.Продажа#]
  • Элемент добавить данные в режиме выборки. Добавляем данные в объект "Продукт в продаже". Выборка по объекту "Продукт в продаже". Фильтр выборки Продажа = [#Автогенерируемая страница.Продажа#]
  • Конец процесса

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

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

Есть код

getCurrencyRate: function(LogCurrencyRow) {
                                var LogCurrencyRate = 0;
                               
                                var esq = Ext.create("Terrasoft.EntitySchemaQuery", {rootSchemaName: "CurrencyRate"});
                                esq.addColumn("Rate");
                                var _tomorrow = new Date();
                                _tomorrow.setDate(_tomorrow.getDate() + 1);
                                var _yesterday = new Date();
                                _yesterday.setDate(_yesterday.getDate() - 1);
                               
                                _tomorrow = Terrasoft.endOfDay(_tomorrow);
                                _yesterday = Terrasoft.startOfDay(_yesterday);
                               
                               
                                esq.filters.addItem(Terrasoft.createColumnFilterWithParameter(
                                                this.Terrasoft.ComparisonType.EQUAL, "Currency", LogCurrencyRow));
                                esq.filters.addItem(Terrasoft.createColumnFilterWithParameter(
                                                this.Terrasoft.ComparisonType.GREATER, "StartDate", _yesterday));
                                esq.filters.addItem(Terrasoft.createColumnFilterWithParameter(
                                                this.Terrasoft.ComparisonType.LESS, "StartDate", _tomorrow));

                                esq.getEntityCollection(function(response) {
                                        if (response && response.success) {
                                                if (response.collection.getCount() > 0) {
                                                        var result = response.collection.getItems()[0];
                                                        LogCurrencyRate = result.get("Rate");
                                                } else {
                                                        LogCurrencyRate = 0;
                                                }
                                               
                                        }
                                        else {
                                                LogCurrencyRate = 0;
                                        }
                                }, this);
                                return LogCurrencyRate;
                        },

result.get("Rate"); есть значение. Но оно не возвращается функцией.

Не могу понять специфики, подскажите.

Нравится

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

Интересно, вот так сработает?
[javascript]
var result = response.collection.collection.getItems()[0];
LogCurrencyRate = result.get("Rate");
[/javascript]

Не могу понять почему
esq1.getEntityCollection(function(response)
в if (response && response.success) { не попадает
и дальше проходит по коду.
Что не так?

На картинке скрин порядок выполнения.

Может как то связано что в одной функции я использую 2 function(response)

1. esq.getEntityCollection(function(response)
2. esq1.getEntityCollection(function(response)

1 -й работает
2 й нет

"Юсупов Марат" написал:Что не так?

[javascript]
function(response) {...}
[/javascript]
Это коллбек от функции esq1.getEntityCollection.
Всё-таки попробуйте [javascript]
var result = response.collection.collection.getItems()[0];
[/javascript]

Данила он туда даже не попадает. Проскакивает.

"Юсупов Марат" написал:Проскакивает

Секунду. Он и должен проскочить. Потом пройдет немного времени, придёт ответ от бд, начнёт отрабатывать [javascript]
function(response) {...}
[/javascript]
У вас так происходит, или вообще ничего не работает(даже спустя некоторое время)?

Спустя некоторое происходит но уже значений нет.

Добрый день, Марат.

Вы написали не синхронный код и ожидаете от него синхронного поведения. Функция, передаваемая в метод getEntityCollection вызывается асинхронно после ответа от базы данных. Она будет вызвана в другом контексте и уже после того как метод getCurrencyRate отработает.

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

Илья, спасибо. помогло.
[javascript]
Terrasoft.chain(
function(next) {
//запрос
var selectRate = Ext.create("Terrasoft.EntitySchemaQuery", {rootSchemaName: "CurrencyRate"});
selectRate.addColumn("Rate");
var _tomorrow = new Date();
_tomorrow.setDate(_tomorrow.getDate() + 1);
var _yesterday = new Date();
_yesterday.setDate(_yesterday.getDate() - 1);

_tomorrow = Terrasoft.endOfDay(_tomorrow);
_yesterday = Terrasoft.startOfDay(_yesterday);

// если у нас рубль то берем курс валюты сверху
if (LogCurrencyRow.value === LogConstants.Currency.rub) {
selectRate.filters.addItem(Terrasoft.createColumnFilterWithParameter(
this.Terrasoft.ComparisonType.EQUAL, "Currency", LogCurrencySCC.value));
} else {
selectRate.filters.addItem(Terrasoft.createColumnFilterWithParameter(
this.Terrasoft.ComparisonType.EQUAL, "Currency", LogCurrencyRow.value));
}
selectRate.filters.addItem(Terrasoft.createColumnFilterWithParameter(
this.Terrasoft.ComparisonType.GREATER, "StartDate", _yesterday));
selectRate.filters.addItem(Terrasoft.createColumnFilterWithParameter(
this.Terrasoft.ComparisonType.LESS, "StartDate", _tomorrow));
selectRate.getEntityCollection(function(response) {
if (response && response.success) {
if (response.collection.getCount() > 0) {
var result = response.collection.getItems()[0];
this.set("LogCurRate2SCC", result.get("Rate"));
this.save({isSilent: true});
next();
}
}
}, this);
},
function(next) {
//обработка данных запросов
if (this.get("LogCurrencyRow").value === 0 || this.get("LogCurrencyRow").value === "") {
var currencyIN = null;
switch (LogCurrencyRow.value) {
//доллар
case (LogConstants.Currency.usd) :
currencyIN = "usd";
break;
//евро
case (LogConstants.Currency.eur) :
currencyIN = "eur";
break;
}
var serviceData = {
param: currencyIN
};
ServiceHelper.callService("LogGetCurrencyCBRF", "getCurrencyFromCBRF",
function(response) {
if (response.getCurrencyFromCBRFResult >= 0) {
this.set("LogCurRate2SCC", response.getCurrencyFromCBRFResult);
} else {
this.showInformationDialog(response.getCurrencyFromCBRFResult);
}
},
serviceData, this);
this.save({isSilent: true});
next();
}
else {
next();
}
},
function(next) {
//вычисляем итоговую стоимость в валюте РСП
this.calculateCostCur(LogCurrencySCC, LogCurrencyRow, this.get("LogCurRate2SCC"));
next();
},
this);
[/javascript]

Но вот только еще есть не до понимания...где можно поподробнее о chain узнать?

К примеру есть внешний вызов
[javascript]
debugger;
LogCurrencyRate2 = this.getCurrencyRate(LogCurrencyRow.value);
if (LogCurrencyRate2 > 0) {
LogTotalCostRowCur = (this.get("LogTotalCostRow") * LogCurrencyRate) / LogCurrencyRate2;
}
[/javascript]
а в this.getCurrencyRate(LogCurrencyRow.value);

[javascript]
getCurrencyRate: function(LogCurrencyRow) {
debugger;
var LogCurrencyRate = 0;
var _tomorrow = new Date();

_tomorrow.setDate(_tomorrow.getDate() + 1);
var _yesterday = new Date();
_yesterday.setDate(_yesterday.getDate() - 1);

_tomorrow = Terrasoft.endOfDay(_tomorrow);
_yesterday = Terrasoft.startOfDay(_yesterday);

Terrasoft.chain(
function(next) {
//запрос
var SelectRate = Ext.create("Terrasoft.EntitySchemaQuery", {rootSchemaName: "CurrencyRate"});
SelectRate.addColumn("Rate");

SelectRate.filters.addItem(Terrasoft.createColumnFilterWithParameter(
this.Terrasoft.ComparisonType.EQUAL, "Currency", LogCurrencyRow));
SelectRate.filters.addItem(Terrasoft.createColumnFilterWithParameter(
this.Terrasoft.ComparisonType.GREATER, "StartDate", _yesterday));
SelectRate.filters.addItem(Terrasoft.createColumnFilterWithParameter(
this.Terrasoft.ComparisonType.LESS, "StartDate", _tomorrow));

SelectRate.getEntityCollection(function(response) {
if (response && response.success) {
if (response.collection.getCount() > 0) {
var result = response.collection.getItems()[0];
LogCurrencyRate = result.get("Rate");
next();
}
}
}, this);

},
function(next) {
return LogCurrencyRate;
},
this);
},
[/javascript]

И почему то программа по нему 2 раза проходит...первый раз ок..значения есть...а вторая непонятная проходка уже нет значение.

Документацию о методах chain и next, Вы можете почитать на SDK https://academy.terrasoft.ru/jscoresdk/

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

[javascript]
test: function() {
var esq = Ext.create("Terrasoft.EntitySchemaQuery", {
rootSchemaName: "Lead"
});
esq.addColumn("CreatedOn");
esq.execute(function(response){
if(response.success){
this.save({isSilent: true});
this.other();
}
}.bind(this));
},
other: function() {
alert("!");
}
[/javascript]

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