Добрый день.
Версия 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
Пусть посмотрят и исправят на месте.

Ок. Спасибо.

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

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

Нравится

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

Добрый день!

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

attributes: {
			"ProductType": {
				dataValueType: Terrasoft.DataValueType.LOOKUP,
				referenceSchemaName: "ProductType"
			}
}

После этого можете с ним работать методами 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'а или

this.set(/*название поля*/, {value: /*id*/, displayValue: /*name поля из справочника*/})

1. Создаете в структуре объекта поле IncomeSpare, тип справочник
2. на странице объекта объявляете атрибут

attributes: {
"IncomeSpare": {
         dataValueType: Terrasoft.DataValueType.LOOKUP,
         referenceSchemaName: "IncomeSpareLOOKUP"  //ваше наименование справочника
                        }
}

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

this.set("IncomeSpare", value)

Сделал как описал Дмитрий.
Вот только установил значение таким способом: 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 без полосы действий? Так как бизнес-процессов по записи много и отобразить всего один статус будет не корректно, но хочется оставить Панель действий для оперативной работы с активностями, письмами и лентой?

Нравится

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…

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

Добрый день.
В договоре у меня 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…

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

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

Нравится

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

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

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

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

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

Нравится

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 комментариев

Интересно, вот так сработает?

var result = response.collection.collection.getItems()[0];
LogCurrencyRate = result.get("Rate");

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

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

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

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

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

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

function(response) {...}

Это коллбек от функции esq1.getEntityCollection.
Всё-таки попробуйте

var result = response.collection.collection.getItems()[0];

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

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

Секунду. Он и должен проскочить. Потом пройдет немного времени, придёт ответ от бд, начнёт отрабатывать

function(response) {...}

У вас так происходит, или вообще ничего не работает(даже спустя некоторое время)?

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

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

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

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

Илья, спасибо. помогло.

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);

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

К примеру есть внешний вызов

debugger;
LogCurrencyRate2 = this.getCurrencyRate(LogCurrencyRow.value);
									if (LogCurrencyRate2 > 0) {
										LogTotalCostRowCur = (this.get("LogTotalCostRow") * LogCurrencyRate) / LogCurrencyRate2;
									}

а в this.getCurrencyRate(LogCurrencyRow.value);

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);
			},

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

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

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

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("!");
}
Показать все комментарии