Решил написать, поскольку часто сталикиваюсь с этой ситуацией.

Создал окно с гридом и использовал в качестве шаблона wnd_BaseGridArea.
окно-наследник

В скрипте шаблона окна видно ряд подключенных скриптов.
скрипт окна-шаблона

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

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

Terrasoft XRM 3.4.0.143

Нравится

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

Добрый день, Андрей.
Это не ошибка, на самом деле. Это особенность работы конфигуратора.

Обратите, например, внимение на сервис Common\Dictionaries\Communication Type\wnd_CommunicationTypeEditScript. В function wnd_CommunicationTypeEditOnPrepare(Window) есть вызов из наследуемого сервиса: wnd_BaseDBEditOnPrepare(Window); Но, если удержать клавишу CTRL и кликнуть на wnd_CommunicationTypeEditOnPrepare мышкой - редактор не перейдет к обявлению wnd_CommunicationTypeEditOnPrepare. Подключение функций wnd_BaseDBEdit происходит в ядре, во время запуска приложения. К функциям, которые объявлены в явно подключенных сервисах - перейти таким же образам получится.

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

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

1) Пересохранить скрипт и окно скрипта в TSAdmin.
2) Пересохранить окно шаблона и его скрипт.
3) Перезапустить TSAdmin.
4) Если не поможет – обновить бинарники до последних 3.4.0, т.к. 3.4.0.143 – довольно старые. После этого повторить действия 1) – 3).

Анна, спасибо :twisted:

Обновил бинарные файлы до версии 3.4.0.165, выполнил Ваши действия 1) - 3) и все заработало :smile:

Показать все комментарии
Технические вопросы
Разработка

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

Нравится

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

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

Контакт > ФИО = Excel ФИО

настроить соответствие для поля "Контрагент"

Контрагент(таблица Контрагент) = Excel Контрагент
Контрагент = Excel Контрагент

т.е в поле Контрагент у Вас должно быть два поля

|Excel Контраген|
| Контакт.Контрагент |Контрагент.Контрагент

Руслан, спасибо за ответ.
Я сначала загрузил контрагентов, потом загрузил контакты. При загрузке контактов соответствие такое настроил. В карточке контактов ссылки на контрагентов отображаются, а в разделе Контрагенты, деталь Контакты пусто.
Непонятно(

Дмитрий, попробуйте заполнить деталь карьера

в иморте используйте обратные связи

Дмитрий, на детали [Контакты] раздела [Контрагенты] отображаются те контакты, у которых есть запись на детали [Карьера] с соответствующим контрагентом.
Поэтому, при настройке импорта следует настроить связь с таблицей карьера. Инструкция во вложении.

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

Добрый день!

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

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

Нравится

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

Используйте условный поток вместо потока управления.
Добавьте в параметры ту переменную, которую хотите использовать (не забудь потом убрать ее объявление из скриптов, т.к. теперь она будет объявлена глобально).
В вашем случаи (если 1 из 2) можно добавить в параметры логическую переменную Flag. И где-то в скрипте присвоить ей значение в зависимости от нужных вам условий. А потом сделать 2 условных потока, один с Flag == true, другой Flag == false.

Александр, спасибо! А как прописать условия для условных потоков? В поле окна свойств "Условие"??

Да, все вот так вот просто

Доброго времени суток.
Александр прав, но еще правильнее, если Вы добавите в поток перед ветвлением "Исключающее ИЛИ".
Из него исходит один условный поток с Вашим условием, а второй - Поток по умолчанию. При таком подходе Вы избавитесь от программных ошибок, когда у Вас процесс не пойдет ни по одной из ветвей. Такого быть не должно, если Вы правильно установите условие, но все же :smile: Как программист Вам скажу иногда такие глюки бывают и береженного Бог бережет.

Андрей, спасибо за дополнение, как раз думал об этом:)

"Сазанов Александр Владимирович" написал:

Да, все вот так вот просто

В данном случае в "Условии" можно просто указать имя переменной. Движок процессов пытается интерпретировать содержимое поля "Условие" как C#-выражение в конструкции if.

Показать все комментарии
настройка окна
Технические вопросы
Разработка

Добрый день!
Никак не могу настроить окно редактирования, чтобы поля отображались в 2 колонки, как, например, в счетах. Не регулируется ширина полей. Подскажите, пожалуйста, как это можно настроить?

Нравится

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

Горизонтальное выравнивание для полей Left поставьте и задавайте нужную ширину. Если необходимо - фрейм тоже можно выравнивание Left поставить

Спасибо. Получилось. Оказывается нужно закрыть и открыть окно, чтобы ширина корректно отразилась.

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

BPM 5.4.0
Создал кнопку реестре, для обработки необходимо получить id и другие поля выделенной записи. Как это сделать?
И еще вопрос, как потом в эту запись что-то добавить или изменить?

Нравится

1 комментарий
Page.TreeGrid.SelectedNodes

вернет Вам выделенные клиентом в реестре записи как ObservableCollection
А свойство

SelectedNodePrimaryColumnValue

- Id той записи на которой находится курсор

Какой-то странный вопрос??? Как в уже существующую запись можно что либо добавить. Если Вам нужно изменить запись, то вот код:

var esq = new EntitySchemaQuery(UserConnection.EntitySchemaManager, Page.DataSource.Schema.Name);
esq.AddAllSchemaColumns();
var entity = esq.GetEntity(UserConnection, SelectedNodePrimaryColumnValue);
// код модификации записи
// entity.SetValueAndText("Id записи лукапного", "Текстовое представление лукапного поля");
entity.Save();

Для создания новой записи код:

var manager = UserConnection.EntitySchemaManager.GetInstanceByName(Page.DataSource.Schema.Name);
var entity = manager.CreateEntity(UserConnection);
entity.SetDefValues();
// код модификации записи см. выше
entity.Save();

Показать все комментарии
Технические вопросы
Разработка

Отладчик орет поле не найдено, но оно точно есть.....

Скрипт на событие OnPrepare окна редактирования

wnd_BaseDBEditOnPrepare(Window) {

var Dataset = dlData.Dataset;
var DateNow = new Date();

Dataset.ValAsDateTime('TaskSetDate') = DateNow.getVarDate();
}

Отладчик говорит:

TSObjectLibrary.DBDataset: Field 'TaskSetDate' not found

Нравится

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

это функция онПрепаре Вашего окна или базового?
если Вашего, то сначала нужно вызвать базовую функцию "подготовки окна" -- она проинициализирует датасет, откроет его и т.п. -- и только потом обращаться к полям датасета.
т.е. допишите перед своим кодом (в начале функции) строчку:

scr_BaseDBEdit.wnd_BaseDBEditOnPrepare(Window);

Ольга, Вы прелесть, заработало....спасибо!

Показать все комментарии
Технические вопросы
Разработка

Где нормальная документация по сервисам?
Сразу оговорюсь, я человек в Terrasoftовкой платформе новый, мы тестируем систему, если я не прав и оно есть, ткните пальцем сразу, я извинюсь.

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

Но для платформы это абсурд короче какой то....

Есть куча стандартных сервисов (вроде scr_WorkflowUtils, scr_DB, scr_WindowsUtils и тд и тп), когда что то хочется сделать, ищешь наугад в коммюнити.
Нет, коммюнити -- это замечательно, но мне бы тупо справочник, вроде:
"Модуль scr_YYY -- функция XXX: берет в качестве параметра имя пользователя, как результат посылает его подальше."

Для примера WFGetParamValue и GetDatasetFieldValueByID, я нашел на форуме, а сколько их еще....
Копаться в исходниках занятие увлекательное, не спорю, но для этого просто нет времени...

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

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

В общем честно скажу, слова менеджера Terrasoft про роскошную документацию оказались далеки от истины, по крайней мере для разработчика точно (для примера скриншот с ДЕЙСТВИТЕЛЬНО роскошной документации такого типа, к слову абсолютно свободно доступной)

Terrasoft Platform SDK -- это хорошо. Но это -- не все что требуется, причем очень далеко не все.

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

UPD: кстати, поиск на коммьюнити тоже еще тот: он ищет только отдельные слова, так что найти что то нужное задачка еще та....
UPD2: в общем я в том смысле, что систематизированная документация с примерами не помешала бы......

Нравится

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

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

Есть SDK.
Есть руководство пользователя и руководство администратора.

Есть глобальный поиск в Администраторе.
Есть в коде используется какая либо функция, с зажатой клавишей Ctrl можно перейти к её объявлению.
Есть Community. Есть тех. поддержка.


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

        var Attributes = GetNewDictionary();
	var RecordID = GUID_NULL;
	Attributes.Add('RecordID', RecordID);
	var DefaultValues = GetNewDictionary();
        var PrimaryContactID = 'SOME_ID';
        DefaultValues.Add('ContactID', PrimaryContactID);
	ShowEditWindowEx(EditWindowUSI, Attributes, DefaultValues);

Я говорил не об этом.
Конкретный пример из Вашего приведенного кода, две функции:
ShowEditWindowEx
GetNewDictionary

по пунктам:

1. SDK
результат поиска -- нулевой
2. руководство пользователя и руководство администратора (правда не знаю при чем тут они)
результат поиска -- нулевой
3. про Ctrl я уже сказал "Копаться в исходниках занятие увлекательное, не спорю, но для этого просто нет времени...". Тем более что объявление функции не дает полного представления о ней.
4. Про community и тех поддержку тоже смотри выше

Александр, Вы правы - в SDK описаны лишь интерфейсы, классы, функции и свойства ядра.

ShowEditWindowEx в данном конкретном случае это функция конфигурационная (хранится в сервисах в БД). Принимает три параметра - USI окна, которое необходимо открыть (wnd_AccountEdit), массив атрибутов и массив начальных значений полей (DefaultValues).
В атрибуты, а конкретно в атрибут RecordID, можно передать конкретный ID, тогда откроется запись с этим идентификатором, если RecordID будет пуст - откроется новая запись.

Будут вопросы - задавайте.

Я в свое время мечтал о некой блок-схеме по базовым функция террасофта...
Это утопия :wink: Код даже базовых конфигураций постоянно меняется - нет адекватной возможности вести какой-то хелп по ним.
Все (ладно - большинство) функции названы предельно логично и понятно. На самом деле необходимо небольшое усилие для понимания структуры конфигурации и все - Вам ничего больше не понадобится. Главное это понять.
Раз вы на стадии тестирования платформы - тестируйте платформу, а не конфигурацию. Все те многочисленные скрипты, в которых Вы последнее время увязли - это то пространство, в котором Вы можете делать все, что угодно - но в рамках возможностей платформы. Важнее понять, что такое датасеты, сервисы таблиц, окон и т.д. Как это все взаимосвязано и что можно с этим делать.
Копаться в конфигурации нужно только тогда, когда выполняется конкретная задача. Возможно некоторое время Вы и будете злиться, прыгая по функциям туда-сюда, но через некоторое время Вы начнете понимать все сходу или находить вещи даже из разряда "найди то, не знаю что".
Поверьте функционал настройки конфигурации и документация по ним избыточна. Все функции описаны прямо в скриптах в унифицированных терминах и читаются очень просто - и к их описанию можно перейти за клик и при необходимости переделать под свои нужды. То, что не описано в сервисах конфигурации - Вы найдете в SDK.

Кстати, даже если Вам не хватит возможностей самой платформы - всегда можно прикрутить свою dll или воспользоваться возможностями ActiveX и VBScript

"это то пространство, в котором Вы можете делать все, что угодно - но в рамках возможностей платформы." -- это мне знакомо по Lotus Domino :-), только там понятно было где искать...
Ну да ладно, ситуация проясняется потихоньку.....

P.S. то что с Ctrl можно к описанию функции перейти -- действительно упустил.....:-)

"Шамуилов Александр" написал:P.S. то что с Ctrl можно к описанию функции перейти -- действительно упустил.....:-)

А обратно можно по [Alt] + [←].

"Зверев Александр" написал:А обратно можно по [Alt] + [←].

кстати, полезная ссылка: http://www.community.terrasoft.ua/blogs/7724

и для отладки: http://www.community.terrasoft.ua/blogs/6549

Полностью поддерживаю автора ... TS действительно не хватает документации.
можно посмотреть серьезный подход к делу здесь http://v8.1c.ru/metod/books/

"Ольга Прилипко" написал:
кстати, полезная ссылка: http://www.community.terrasoft.ua/blogs/7724

Спасибо, почитаю.:razz:

[quote="Катыхин Руслан"]можно посмотреть серьезный подход к делу здесь http://v8.1c.ru/metod/books/[/quote]

Там часть книг – сторонних авторов. Возможно, 1C им обещает за это какие-нибудь печеньки. Если появится независимый учебник по 3.X, жаждущие его с радостью купят. Или, open source way - начать совместно писать такой учебник на площадках вроде викибукс.

"Зверев Александр" написал:Спасибо, почитаю.

))) я автору темы "подбросила":smile:

я и 10 т.р купил бы типа "Библия Delphi" Михаил Флёнов ))) если бы была такая по TS

"Ольга Прилипко" написал:
Зверев Александр пишет:

Спасибо, почитаю.

))) я автору темы "подбросила":smile:


Автор оценил и записал в энергонезависимую память :-)
Спасибо.

Не хочет Террасофт открывать свои секреты, это видно. Документации для разработчиков явно не хватает.

Николай, Вы можете задать вопрос прямо в этой теме по интересующему Вас вопросу.

Кроме того - http://www.community.terrasoft.ru/forum/topic/9247#comment-39123

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

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

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

Нравится

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

Здравствуйте, Акмаль.

Сложность интеграции со сторонней системой зависит от следующих факторов:

1. Глубины интеграции (должно быть полноценное техническое задание, вплоть до сопоставления полей двух БД);

2. Метод интеграции (через COM-объекты, веб-сервисы, на уровне БД и т.д.);

3. Периодичность синхронизации.

Самый простой вариант - когда BPMonline и сторонняя БД работают на Oracle и находятся на одном сервере. В этом случае можно настроить хранимые процедуры на сервере, которые по расписанию будут синхронизировать данные.

Если базы находятся на разных серверах и/или разных СУБД, необходимо использовать веб-сервис либо утилиту, которая в зависимости от ТЗ будет производить синхронизацию данных.

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

Анна, спасибо за ответ.

Скажите, если упростить задачу до минимума - по нажатию на кнопку происходит синхронизация заданных полей и таблиц в обеих СУБД.
Как лучше решить такую задачу - с помощью независимой утилиты-посредника, или можно написать всё в BPMonline?

Можно написать хранимку в БД BPMonline и по кнопке вызывать её.

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

Да, конечно.
Если это разные схемы, то достаточно просто поставить признак схемы, если же это разные БД, то используйте технологию DBLink.

Здесь ещё упоминался способ интеграции через веб-сервисы. Может кто-нибудь объяснить механизм осуществления подобного вида интеграции? Хотя бы в общих чертах...

Здравствуйте, Акмаль!

В общих чертах механизм таков:

1. Вами пишется веб-сервис на любом языке программирования, который направляет запросы в формате протокола OData (http://odata.org)

2. Данный веб-сервис настраивается на BPMonline в соответствии с механизмом, описанные по следующей ссылке

3. Реализовать интеграцию веб-сервиса с БД биллинга;

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

Показать все комментарии
Технические вопросы
Разработка

Добавляю деталь в разделе при помощи мастера, добавляется, все хорошо.
Удаляю ненужные детали, меняю порядок деталей...ничего не меняется. Чистил кэш, ничего не помогает.
Где управлять порядком и видимостью деталей?

Нравится

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

Дело в том, что каждый пользователь может сам управлять видимостью и порядком деталей. Чтобы управлять надо в TSClient щелкнуть правой кнопкой на названии детали -> Параметры.

Это хорошо, но почему если я деталь удаляю, а она все равно остается?!
В частности "Веб", "Запросы" и "Графики". Я догадываюсь, что это какие то наследованные системные прибамбасы.....но они то мне не нужны в данном конкретном случае.

Удаляете с помощью мастера?
Тогда попробуйте удалить напрямую из Администратора.
Найдите окно раздела (должно быть что-то типа wnd_...Workspace) слева найдите pcDetails там расположены все страницы деталей, удалите ненужные.

Это я в первую очередь посмотрел......
НО ИХ ТАМ НЕТ!

UPD: сорри, не туда смотрел, есть такое, сделал им False на все что можно....

1) В базовом окне раздела (wnd_BaseWorkspace) найти деталь «Графики» (pgGraphsDetail) и установить ей свойство IsAccessible равным true.
2) Если текст функции ниже – это то, что есть на данный момент у Вас, её необходимо также изменить. Должно быть так (установите коммент и добавьте строки):

function PrepareCommonDetails(ParentItemFieldName, DontShowGraphs, 
       CustomGridTable, ParentItemIDName, DontShowWebAndQueries) {
       PrepareChangesLogDetail(ParentItemFieldName, CustomGridTable, ParentItemIDName);
       if (DontShowWebAndQueries != null) {
              pgWebInfoDetail.IsVisible = !DontShowWebAndQueries;
              pgQueryDetail.IsVisible = !DontShowWebAndQueries;
       }
       pgWebInfoDetail.IsAccessible = !DontShowWebAndQueries;
       pgQueryDetail.IsAccessible = !DontShowWebAndQueries;
       if (!!DontShowWebAndQueries) {
              PrepareWebInfoDetail(CustomGridTable);
       }
       var ShowGraphs = !DontShowGraphs;
       if (ShowGraphs) {
              ShowGraphs = PrepareGraphsDetail();
       }
      // pgGraphsDetail.IsAccessible = ShowGraphs;
      //   pgGraphsDetail.IsVisible = ShowGraphs;
 
       if (DontShowGraphs != null) {
              pgGraphsDetail.IsVisible = ShowGraphs;
       }
       pgGraphsDetail.IsAccessible = ShowGraphs;
       pgGraphs.IsAccessible = ShowGraphs;
       pgGraphs.IsVisible = ShowGraphs;
 
       var CallsDetail = Self.ComponentsByName('pgCallsDetail');
       if (CallsDetail) {
              var HasCallLicense = System.GetHasLicense('Call');
              pgCallsDetail.IsVisible = HasCallLicense && pgCallsDetail.IsVisible;
              pgCallsDetail.IsAccessible = HasCallLicense && pgCallsDetail.IsAccessible;
       }
       BaseWorkspace.DetailsControlSizeOld = pcDetails.Size;
}

Что касается детали «Журнал изменений» - для исправления необходимо внести следующие изменения в функцию PrepareChangesLogDetail скрипта scr_BaseWorkspace

function PrepareChangesLogDetail(ParentItemFieldName, CustomGridTable, 
                ParentItemIDName) {
                if (!System.GetHasLicense('DatabaseLog') || (!ParentItemFieldName)) {
                    BaseWorkspace.ShowChangesLogDetail = false;
                } else {
                    BaseWorkspace.ParentItemFieldName = ParentItemFieldName;
                               BaseWorkspace.ShowChangesLogDetail = 
                                               DoShowChangesLogDetail(CustomGridTable);
                }
                pgChangesLogDetail.IsAccessible = BaseWorkspace.ShowChangesLogDetail;
//    if (BaseWorkspace.ShowChangesLogDetail) {
//            pgChangesLogDetail.IsVisible = true;
//            } else {
//        return;
//            }
                pgChangesLogDetail.IsVisible = !!BaseWorkspace.ShowChangesLogDetail &&
                               pgChangesLogDetail.IsVisible;
if (!BaseWorkspace.ShowChangesLogDetail) {
                                return;
                }
                BaseWorkspace.ChangesLogWindow = wndChangesLogDetail.Window;
                if (!ParentItemIDName) {
                               BaseWorkspace.ParentItemIDName = 'ID';
                } else {
                               BaseWorkspace.ParentItemIDName = ParentItemIDName;
                }
                BaseWorkspace.InitializeChangesLogFlag = false;
}

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

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

А профиль (рядом с кэшем) чистили?

кэш чистил, профиль нет, сейчас попробую...

UPD: Не помогло ни разу.

выложите, пожалуйста, сервис scr_BaseWorkspace, я посмотрю.

// ----------------------------------------------------------------------------
// scr_BaseWorkspace
// ----------------------------------------------------------------------------

var BaseWorkspace = new Object();

var QueryString = "Запрос";
var QueryDetailPageTagValue = 'QueryDetail';

BaseWorkspace.LastGroupIsFiltered = false;
BaseWorkspace.DisableRefreshDetailCounter = 0;
BaseWorkspace.GroupsWereInitialized = false;
BaseWorkspace.ReportsWerePrepared = false;
BaseWorkspace.ActionsWerePrepared = false;
BaseWorkspace.OpenGroupDatasetInBaseScript = true;
BaseWorkspace.GroupsWereLocated = false;

function GetIsInSingleRowMode() {
return Boolean(GetAttribute(Self, IsInSingleRowModeAttrName));
}

function CanNotRefreshDetail() {
if (!Assigned(BaseWorkspace.GridDataset)) {
return true;
}
var DetailsPages = Self.ComponentsByName('pcDetails');
if ((DetailsPages) && (DetailsPages.Size == 0)) {
return true;
}
var Result = (BaseWorkspace.DisableRefreshDetailCounter > 0) ||
(BaseWorkspace.GridDataset.State == dstInactive);
return Result;
}

function ApplyFilters() {
var Dataset = fbcFilters.DatasetLink.Dataset;
try {
fbcFilters.ApplyFilter();
} catch (e) {
ShowErrorDialog(e.message);
return false;
}
if (BaseWorkspace.GridDataset) {
RefreshWorkspace();
} else {
if (Dataset.State != dstInactive) {
Dataset.Close();
}
Dataset.Open();
}
}

function SaveFilters() {
var FilterDataset = fbcFilters.FilterDatasetLink.Dataset;
if (!CurrentGroupIsFiltered(FilterDataset)) {
return;
}
FilterDataset.Edit();
fbcFilters.Save();
FilterDataset.Post();
}

function ClearFilters() {
var Dataset = fbcFilters.DatasetLink.Dataset;
fbcFilters.ClearFilter();
if (!Assigned(Dataset)) {
return;
}
if (BaseWorkspace.GridDataset) {
RefreshWorkspace();
} else {
if (Dataset.State != dstInactive) {
Dataset.Close();
}
Dataset.Open();
}
}

function PrepareFiltersBuilder(GroupsDataset, SupportsDynamicGroups) {
var IsFiltered = false;
if (SupportsDynamicGroups) {
IsFiltered = CurrentGroupIsFiltered(GroupsDataset);
}
if (IsFiltered) {
fbcFilters.Load();
} else {
if (BaseWorkspace.LastGroupIsFiltered) {
fbcFilters.ClearFilter();
}
}
amiFilterApplyAndSave.IsEnabled = IsFiltered;
BaseWorkspace.LastGroupIsFiltered = IsFiltered;
}

function OpenGroupsDataset() {
var Dataset = dlGroups.Dataset;
OpenDatasetWithDisabledEvents(Dataset);
BaseWorkspace.GroupsWereInitialized = true;
LocateToRootGroup(Dataset, BaseWorkspace.GroupParentIDFieldName,
BaseWorkspace.SavedGroupID);
ExpandCurrentNode(BaseWorkspace.GroupsTreeGrid);
BaseWorkspace.GroupsWereLocated = true;
}

function GetDatePeriodMemoryDataset(PeriodTypeValue) {
var Dataset = Services.GetNewItemByUSI('mds_DatePeriod');
Dataset.Open();
Dataset.Edit();
Dataset.Values('PeriodType') = PeriodTypeValue;
return Dataset;
}

function ApplyStandardWorkspaceFilter() {
EnableDatasetFilters(BaseWorkspace.GridDataset, false);
fbcFilters.ApplyFilter();
ApplyDatasetGroupIDFilter(BaseWorkspace.GroupsDataset,
BaseWorkspace.GridDataset);
var Grid = BaseWorkspace.Grid;
ApplyGridViewFilter(Grid.ActiveView);
}

function RefreshWorkspace() {
var GridDataset = BaseWorkspace.GridDataset;
if (!GridDataset) {
return;
}
try {
GridDataset.Close();
GridDataset.Open();
} catch (E) {
System.MessageDialog(E.message, mdtWarning, mdbOK, 0);
}
if (pcData.ActivePage.Name == pgGraphs.Name) {
System.ProcessMessages();
RefreshGraphs();
}
}

function CreateQueriesDetails() {
if (BaseWorkspace.IsQueriesDetailsBuilt) {
return;
}
BaseWorkspace.IsQueriesDetailsBuilt = true;
var QueriesDataset = BaseWorkspace.QueriesDataset;
if (!QueriesDataset) {
QueriesDataset = Services.GetNewItemByUSI('ds_Query');
if (!QueriesDataset) {
return;
}
var DataFields = QueriesDataset.DataFields;
EnableDatasetDataFields(QueriesDataset, false, true);
EnableDatasetFields(QueriesDataset, true,
['ID', 'Name', 'SeparateDetail']);
BaseWorkspace.QueriesDataset = QueriesDataset;
}
var WorkspaceCode = System.ExtractUSICode(Self.USI);
ApplyDatasetFilter(QueriesDataset, 'WorkspaceCode', WorkspaceCode, true);
QueriesDataset.FetchRecordsCount = -1;
QueriesDataset.Close();
QueriesDataset.Open();
if (IsDatasetEmpty(QueriesDataset)) {
return;
}
var Pages = Self.ComponentsByName('pcDetails');
var SeparateQueriesCount = 0;
//Self.BeginUpdate();
try {
while (!QueriesDataset.IsEOF) {
if (QueriesDataset('SeparateDetail') == 1) {
CreateQueryDetail(Pages, QueriesDataset);
SeparateQueriesCount++;
}
QueriesDataset.GoToNext();
}
var CommonQueriesCount =
QueriesDataset.RecordsCount - SeparateQueriesCount;
var QueriesDetail = Self.ComponentsByName('pgQueryDetail');
QueriesDetail.IsVisible = (CommonQueriesCount > 0);
}
finally {
// Self.EndUpdate();
}
}

function CreateQueryDetail(PageControl, QueriesDataset) {
var QueryName = QueriesDataset('Name');
var PageName = 'pgQueryDetail' + GUIDtoUID(QueriesDataset('ID'));
if (Assigned(Self.ComponentsByName(PageName))) {
return;
}
var Page = Self.CreateComponent('Page', PageName);
if (!Assigned(Page)) {
return;
}
Page.Caption = QueryString + ': ' + QueryName;
Page.Tag = QueryDetailPageTagValue;
Page.UID = QueriesDataset('ID');
var WindowContainer = Self.CreateComponent('WindowContainer',
'wnd' + PageName);
WindowContainer.AlignVertical = alvClient;
WindowContainer.AlignHorizontal = alhClient;
WindowContainer.Window = Services.GetNewItemByUSI('wnd_QueriesDetail');
var fmControlsComponent =
WindowContainer.Window.ComponentsByName('fmControls');
fmControlsComponent.IsVisible = false;
WindowContainer.Window.Attributes('QueryID') = QueriesDataset('ID');
var QueryResultsComponent =
WindowContainer.Window.ComponentsByName('grdQueryResults');
QueryResultsComponent.OffsetTop = 5;
Page.Add(WindowContainer);
PageControl.Add(Page);
}

function PrepareGridWindow(Window, Datalink) {
var WorkspaceWindowUSI = ExtractUSICodeEx(Self.USI);
if ((WorkspaceWindowUSI == 'wnd_MailWorkspace') ||
(WorkspaceWindowUSI == 'wnd_PipeLineWorkspace') ||
(WorkspaceWindowUSI == 'wnd_OLAPWorkspace') ||
(WorkspaceWindowUSI == 'wnd_UsersWorkspace') ||
(WorkspaceWindowUSI == 'wnd_PlanningView') ||
(WorkspaceWindowUSI == 'wnd_AnalysisWorkspace')) {
amiExcludeFromTheGroup.IsVisible = false;
} else {
amiExcludeFromTheGroup.IsVisible = true;
}
BaseWorkspace.GridWindow = Window;
BaseWorkspace.Grid = Window.ComponentsByName('grdData');
BaseWorkspace.GridDatalink = Datalink;
SetAttribute(Window, 'WorkspaceWindow', Self);
SetAttribute(Window, 'AddActionsMenu', Self);
Window.Prepare();
BaseWorkspace.GridDataset = GetDatasetFromWindow(Window,
DefDatasetLinkName);
Datalink.Dataset = BaseWorkspace.GridDataset;
SetDatasetAttributesForCall(BaseWorkspace.GridDataset);

}

function InitializeGroups(GroupTableUSI, ItemInGroupDatasetUSI,
ParentItemFieldName, GroupDatasetUSI , ParentIDFieldName) {
var GroupsWindow = wndGroups.Window;
BaseWorkspace.GroupsWindow = GroupsWindow;
if (IsEmptyValue(GroupDatasetUSI)) {
GroupDatasetUSI = 'ds_ItemGroup';
}
if (IsEmptyValue(ParentIDFieldName)) {
ParentIDFieldName = 'ParentGroupID';
}
SetAttribute(GroupsWindow, 'DatasetUSI', GroupDatasetUSI);
BaseWorkspace.GroupParentIDFieldName = ParentIDFieldName;
SetAttribute(GroupsWindow, 'TableUSI', GroupTableUSI);
SetAttribute(GroupsWindow, 'IDFieldName', 'ID');
SetAttribute(GroupsWindow, 'ParentIDFieldName', ParentIDFieldName);
SetAttribute(GroupsWindow, 'NameFieldName', 'Name');
SetAttribute(GroupsWindow, 'ItemInGroupDatasetUSI', ItemInGroupDatasetUSI);
SetAttribute(GroupsWindow, 'ParentItemFieldName', ParentItemFieldName);
SetAttribute(GroupsWindow, 'WorkspaceWindow', Self);
GroupsWindow.Prepare();
var Dataset = GetDatasetFromWindow(GroupsWindow, DefDatasetLinkName);
BaseWorkspace.GroupsDataset = Dataset;
BaseWorkspace.GroupsTreeGrid = GroupsWindow.ComponentsByName('grdData');
dlGroups.Dataset = Dataset;
}

function ReportMenuItemOnExecute(ActionMenuItem){
var GridDataset = BaseWorkspace.GridDataset;
var DataGrid = BaseWorkspace.GridWindow.Attributes('DataGrid');
ReportMenuItemExecute(ActionMenuItem, GridDataset, DataGrid,
ExtractUSICodeEx(Self.USI));
}

function PrepareChangesLogDetail(ParentItemFieldName, CustomGridTable,
ParentItemIDName) {
if (!System.GetHasLicense('DatabaseLog') || (!ParentItemFieldName)) {
BaseWorkspace.ShowChangesLogDetail = false;
} else {
BaseWorkspace.ParentItemFieldName = ParentItemFieldName;
BaseWorkspace.ShowChangesLogDetail =
DoShowChangesLogDetail(CustomGridTable);
}
pgChangesLogDetail.IsAccessible = BaseWorkspace.ShowChangesLogDetail;

// if (BaseWorkspace.ShowChangesLogDetail) {
// pgChangesLogDetail.IsVisible = true;
// } else {
// return;
// }

pgChangesLogDetail.IsVisible = !!BaseWorkspace.ShowChangesLogDetail && pgChangesLogDetail.IsVisible;
if (!BaseWorkspace.ShowChangesLogDetail) {
return;
}
BaseWorkspace.ChangesLogWindow = wndChangesLogDetail.Window;
if (!ParentItemIDName) {
BaseWorkspace.ParentItemIDName = 'ID';
} else {
BaseWorkspace.ParentItemIDName = ParentItemIDName;
}
BaseWorkspace.InitializeChangesLogFlag = false;
}

function PrepareWebInfoDetail(CustomGridTable) {
BaseWorkspace.WebInfoWindow = wndWebInfoDetail.Window;
}

function PrepareGraphsDetail() {
if (!System.GetHasLicense('Graphs')) {
return false;
}
if (!Connector.CurrentUser.GetCanReadTableGroup(GraphTableGroup)) {
return false;
}
var WorkspaceCode = System.ExtractUSICode(Self.USI);
if (pcData.ActivePage.Name == pgGraphs.Name) {
pcData.ActivePage = pgGridData;
}
var GraphsDetailWindow = wndGraphsDetail.Window;
GraphsDetailWindow.Attributes('IsWorkspace') = false;
GraphsDetailWindow.Attributes('WorkspaceCode') = WorkspaceCode;
var GraphsWindow = wndGraphs.Window;
GraphsWindow.Attributes('IsWorkspace') = true;
GraphsWindow.Attributes('WorkspaceCode') = WorkspaceCode;
return true;
}

function PrepareCommonDetails(ParentItemFieldName, DontShowGraphs,
CustomGridTable, ParentItemIDName, DontShowWebAndQueries) {
PrepareChangesLogDetail(ParentItemFieldName, CustomGridTable, ParentItemIDName);
pgWebInfoDetail.IsVisible = !DontShowWebAndQueries;
pgWebInfoDetail.IsAccessible = !DontShowWebAndQueries;
pgQueryDetail.IsVisible = !DontShowWebAndQueries;
pgQueryDetail.IsAccessible = !DontShowWebAndQueries;
if (!!DontShowWebAndQueries) {
PrepareWebInfoDetail(CustomGridTable);
}
var ShowGraphs = !DontShowGraphs;
if (ShowGraphs) {
ShowGraphs = PrepareGraphsDetail();
}
// pgGraphsDetail.IsAccessible = ShowGraphs;
// pgGraphsDetail.IsVisible = ShowGraphs;

if (DontShowGraphs != null) {
pgGraphsDetail.IsVisible = ShowGraphs;
}
pgGraphsDetail.IsAccessible = ShowGraphs;
pgGraphs.IsAccessible = ShowGraphs;
pgGraphs.IsVisible = ShowGraphs;

var CallsDetail = Self.ComponentsByName('pgCallsDetail');
if (CallsDetail) {
var HasCallLicense = System.GetHasLicense('Call');
pgCallsDetail.IsVisible = HasCallLicense && pgCallsDetail.IsVisible;
pgCallsDetail.IsAccessible = HasCallLicense && pgCallsDetail.IsAccessible;
}
BaseWorkspace.DetailsControlSizeOld = pcDetails.Size;
}

function DoShowChangesLogDetail(CustomGridTable) {
if (Assigned(CustomGridTable)) {
BaseWorkspace.GridTable = CustomGridTable;
return true;
}
var ShowChangesLogDetail = false;
try {
try {
BaseWorkspace.GridTable =
BaseWorkspace.GridDataset.SelectQuery.Items(0).FromTable;
ShowChangesLogDetail = BaseWorkspace.GridTable.IsTrackChanges;
} catch(e) {
}
} finally {
return ShowChangesLogDetail;
}
}

function RefreshChangesLogDetail() {
if (!BaseWorkspace.ShowChangesLogDetail) {
return;
}
var ChangesLogWindow = BaseWorkspace.ChangesLogWindow;
var ParentItemID = null;
if (BaseWorkspace.GridDataset.IsActive) {
ParentItemID = BaseWorkspace.GridDataset.
ValAsGUID(BaseWorkspace.ParentItemIDName);
}
if (BaseWorkspace.InitializeChangesLogFlag != true) {
BaseWorkspace.InitializeChangesLogFlag = true;
var IsBuildChangesLogWindow = BuildChangesLogWindow(
BaseWorkspace.GridTable, BaseWorkspace.GridDataset,
BaseWorkspace.ParentItemFieldName, ParentItemID, ChangesLogWindow);
if (!IsBuildChangesLogWindow) {
BaseWorkspace.ShowChangesLogDetail = false;
Log.Write(2, "Ошибка при попытке показать журнал изменений");
}
} else {
var ChangesLogDataset =
BaseWorkspace.ChangesLogWindow.ComponentsByName('dlData').Dataset;
RefreshDetailData(BaseWorkspace.GridDataset,
BaseWorkspace.ParentItemIDName, ChangesLogDataset, 'RecordID');
}
var btnOperations = ChangesLogWindow.ComponentsByName('btnOperations');
btnOperations.IsEnabled = !IsEmptyGUID(ParentItemID);
}

function RefreshGraphsDetail() {
if (BaseWorkspace.InitializeGraphsDetailFlag != true) {
BaseWorkspace.GraphsDetail = wndGraphsDetail.Window;
SetAttribute(BaseWorkspace.GraphsDetail, 'GridDataset',
BaseWorkspace.GridDataset);
BaseWorkspace.InitializeGraphsDetailFlag = true;
BaseWorkspace.GraphsDetail.Prepare();
} else {
BaseWorkspace.GraphsDetail.Notify(Self, MSG_REFRESHDATA, 0);
}
}

function RefreshWebInfoDetail() {
if (BaseWorkspace.InitializeWebInfoFlag != true) {
BaseWorkspace.WebInfoWindow = wndWebInfoDetail.Window;
SetAttribute(BaseWorkspace.WebInfoWindow, 'WorkspaceUSI',
System.ExtractUSICode(Self.USI));
SetAttribute(BaseWorkspace.WebInfoWindow, 'WorkspaceDataset',
BaseWorkspace.GridDataset);
BaseWorkspace.InitializeWebInfoFlag = true;
BaseWorkspace.WebInfoWindow.Prepare();
BaseWorkspace.WebInfoWindow.Notify(Self, MSG_REFRESHDATA, 0);
} else {
BaseWorkspace.WebInfoWindow.Notify(Self, MSG_REFRESHDATA, 0);
}
}

function RefreshQueriesDetail(Page) {
if (!Page.IsVisible) {
return;
}
if (Page.Tag == QueryDetailPageTagValue) {
var ContainerName = 'wnd' + Page.Name;
} else {
var ContainerName = 'wndQueriesDetail';
}
var QueriesContainer = Self.ComponentsByName(ContainerName);
if (!Assigned(QueriesContainer)) {
return;
}
BaseWorkspace.QueriesDetail = QueriesContainer.Window;
if (!Assigned(BaseWorkspace.QueriesDetail)) {
return;
}
if (!Assigned(BaseWorkspace.InitializationQueriesDetail)) {
BaseWorkspace.InitializationQueriesDetail = GetNewDictionary();
}
if (BaseWorkspace.InitializationQueriesDetail(Page.Name) != true) {
if (!Assigned(BaseWorkspace.QueriesDetail)) {
return;
}
SetAttribute(BaseWorkspace.QueriesDetail, 'GridDataset',
BaseWorkspace.GridDataset);
BaseWorkspace.InitializationQueriesDetail(Page.Name) = true;
BaseWorkspace.QueriesDetail.Prepare();
} else {
BaseWorkspace.QueriesDetail.Notify(Self, MSG_REFRESHDATA, 0);
}
}

function RefreshCommonDetails() {
if (pcDetails.ActivePage.Name == pgChangesLogDetail.Name) {
RefreshChangesLogDetail();
} else
if (pcDetails.ActivePage.Name == pgGraphsDetail.Name) {
RefreshGraphsDetail();
} else
if (pcDetails.ActivePage.Name == pgWebInfoDetail.Name) {
RefreshWebInfoDetail();
} else
if ((pcDetails.ActivePage.Name == pgQueryDetail.Name)
|| (pcDetails.ActivePage.Tag == QueryDetailPageTagValue)) {
RefreshQueriesDetail(pcDetails.ActivePage);
}
}

function RefreshDetails() {
if (CanNotRefreshDetail()) {
return false;
} else {
RefreshCommonDetails();
}
return true;
}

function RefreshGraphs() {
if (BaseWorkspace.InitializeGraphsFlag != true) {
BaseWorkspace.Graphs = wndGraphs.Window;
SetAttribute(BaseWorkspace.Graphs, 'GridDataset',
BaseWorkspace.GridDataset);
BaseWorkspace.InitializeGraphsFlag = true;
BaseWorkspace.Graphs.Prepare();
} else {
BaseWorkspace.Graphs.Notify(Self, MSG_REFRESHDATA, 0);
}
}

function CopyFilters() {
if (!Assigned(BaseWorkspace.FiltersCopyBuffer)) {
BaseWorkspace.FiltersCopyBuffer = GetNewXMLStorage();
}
var FiltersCopyBuffer = BaseWorkspace.FiltersCopyBuffer;
GetFilterBuilderXMLDataEx(fbcFilters, FiltersCopyBuffer);
}

function PasteFilters() {
var FiltersCopyBuffer = BaseWorkspace.FiltersCopyBuffer;
if (!Assigned(FiltersCopyBuffer)) {
return;
}
if ((fbcFilters.FiltersBuilder.RootItems.Count != 0) &&
ShowConfirmationDialog("Вы действительно хотите заменить существующий фильтр?")
!= wmrYes) {
return
}
SetFilterBuilderXMLDataEx(fbcFilters, FiltersCopyBuffer);
}

function BeforeFilterWorkspace() {
var GridWindow = wndGridData.Window;
if (!GridWindow) {
return;
}
GridWindow.ScriptControl.CodeObject.grdData.CancelQuickFilter();
}

function SaveDescription() {
var DescriptionDetail = Self.ComponentsByName('wndDescriptionDetail');
if (DescriptionDetail) {
var DataseLink = DescriptionDetail.Window.ComponentsByName('dlData');
if (DataseLink.Dataset.IsActive) {
DataseLink.Dataset.Close();
}
}
}

function ExcludeFromTheGroup() {
var GroupsDataset = BaseWorkspace.GroupsDataset;
var GroupsWindow = BaseWorkspace.GroupsWindow;
if (!Assigned(GroupsDataset)) {
return;
}
if (!Assigned(GroupsWindow)) {
return;
}
if (IsEmptyGUID(GroupsDataset('ParentGroupID'))) {
ShowInformationDialog("Нельзя исключить запись(и) из корневой группы");
return;
}
if (GroupsDataset.ValAsBool('IsFiltered')) {
ShowInformationDialog("Нельзя исключить запись(и) из динамической группы");
return;
}
var DataGrid = BaseWorkspace.GridWindow.Attributes('DataGrid');
var GridDataset = BaseWorkspace.GridDataset;
var SelectedIDs = DataGrid.SelectedIDs;
var GroupID = GroupsDataset('ID');
var ItemInGroupDatasetUSI = GetAttribute(GroupsWindow,
'ItemInGroupDatasetUSI');
var ParentItemFieldName = GetAttribute(GroupsWindow, 'ParentItemFieldName');
if (IsEmptyValue(ItemInGroupDatasetUSI)) {
return;
}
var ItemInGroupDataset = GetSingleItemByCode(ItemInGroupDatasetUSI,
'BaseWorkspace' + ItemInGroupDatasetUSI);
var DeleteRecordCount = 0;
for (var i = 0; i < SelectedIDs.Count; i++) {
EnableDatasetFilters(ItemInGroupDataset, false);
ApplyDatasetFilter(ItemInGroupDataset, 'GroupID', GroupID, true);
ApplyDatasetFilter(ItemInGroupDataset, ParentItemFieldName,
SelectedIDs(i), true);
ItemInGroupDataset.Open();
if (!ItemInGroupDataset.IsEmptyPage) {
if (GetCanDeleteData(ItemInGroupDataset)) {
DeleteRecordCount++;
ItemInGroupDataset.Delete();
}
}
ItemInGroupDataset.Close();
}
ShowInformationDialog(FormatStr("Исключено %1 записей", DeleteRecordCount));
RefreshDataset(GridDataset);
}

function ClearAllWorkspaceFilters() {
var Message = "Действие может занять некоторое время. Вы действительно хотите продолжить?";
if (ShowConfirmationDialog(Message) != wmrYes) {
return;
}
System.BeginProcessing();
LocateToRootGroup(dlGroups.Dataset, BaseWorkspace.GroupParentIDFieldName);
pcData.ActivePage = pgGridData;
var GridWindow = wndGridData.Window;
if (!IsEmptyValue(GridWindow)) {
for (var i = 0; i < GridWindow.ComponentCount; i++) {
var WindowItem = GridWindow.Components(i);
if ((WindowItem.TypeCode == 'DataGridView') &&
!WindowItem.FilterSetCode) {
break;
}
}
var GridData = GridWindow.ComponentsByName('grdData');
GridData.ActiveView = WindowItem;
GridData.CancelQuickFilter();
}
ClearFrameComponents(fmGroupsWindow);
ClearFilters();
System.EndProcessing();
}

function ClearFrameComponents(FrameComponent) {
for (var i = 0; i < FrameComponent.Count; i++) {
var FrameItem = FrameComponent.Items(i);
switch (FrameItem.TypeCode) {
case 'Frame':
case 'FrameGroup':
ClearFrameComponents(FrameItem);
break;
case 'CheckBox':
FrameItem.IsChecked = false;
break;
case 'EnumControl':
FrameItem.Value = System.EmptyValue;
break;
case 'Edit':
FrameItem.Value = '';
break;
default:
if (FrameItem.TypeCode.indexOf('DataControl') != -1) {
FrameItem.DataField.Value = null;
} else {
if (FrameItem.Value) {
FrameItem.Value = null;
}
}
}
}
}

function AddDuplicatesMergeAction() {
if (!BaseWorkspace.GridTable) {
return;
}
if (!BaseWorkspace.GridTable.IsDuplicateSearching) {
return;
}
if (!DuplicateUtils.HasDuplicatesSearchRights) {
return;
}
if (amiActions.Count > 1) {
CreateActionMenuSeparatorItem(amiActions);
}
AddActionMenuItem(amiActions, "Объединить выделенные записи", '',
'amiDuplicatesMergeOnExecute', 'amiDuplicatesMerge');
BaseWorkspace.MergeDuplicatesActionCreated = true;
}

function MergeDuplicates() {
var DataGrid = BaseWorkspace.GridWindow.Attributes('DataGrid');
MergeSelectedDuplicates(Self, DataGrid,
BaseWorkspace.GridDataset.USI);
}

// ----------------------------------------------------------------------------
// Event handlers
// ----------------------------------------------------------------------------

function amiFilterApplyOnExecute(ActionMenuItem) {
ApplyFilters();
}

function amiFilterClearOnExecute(ActionMenuItem) {
ClearFilters();
}

function amiFilterSaveOnExecute(ActionMenuItem) {
SaveFilters();
}

function dlGroupsOnDatasetAfterPositionChange(Dataset) {
if (BaseWorkspace.GroupsWereLocated) {
System.ProcessMessages();
}
PrepareFiltersBuilder(Dataset, true);
}

function dlGroupsOnDatasetAfterOpen(Dataset) {
System.ProcessMessages();
PrepareFiltersBuilder(Dataset, true);
}

function dlGroupsOnDatasetRefreshRecord(Dataset, KeyValue, AddNewRecordOnPage) {
PrepareFiltersBuilder(Dataset, true);
}

function wnd_BaseWorkspaceOnNotify(ScriptableService, Sender, Message, Data) {
if (Message == MSG_ENABLEREFRESHDETAIL) {
if (BaseWorkspace.DisableRefreshDetailCounter > 0) {
BaseWorkspace.DisableRefreshDetailCounter =
BaseWorkspace.DisableRefreshDetailCounter - 1;
if (BaseWorkspace.DisableRefreshDetailCounter == 0) {
Self.ScriptControl.Run('RefreshDetails');
}
}
return;
}
if (Message == MSG_DISABLEREFRESHDETAIL) {
BaseWorkspace.DisableRefreshDetailCounter =
BaseWorkspace.DisableRefreshDetailCounter + 1;
return;
}
if (Message == MSG_QUERYFILTERWINDOW_EXCELMODE_OK) {
var QueryBuilderData = Sender.Attributes('QueryBuilderData');
ShowExcelReport(QueryBuilderData, null, Self);
return;
}
if (Message == MSG_QUERYFILTERWINDOW_WORDMODE_OK) {
var QueryBuilderData = Sender.Attributes('QueryBuilderData');
ShowWordReport(QueryBuilderData, null, Self);
return;
}
if (Message == MSG_SENDEMAIL) {
var Service = Services.GetSingleItemByUSI('scr_MailUtils');
Service.ScriptControl.CodeObject.SendEmailByTemplate(Data);
return;
}
if (Message == MSG_DUPLICATESMERGED) {
RefreshDataset(BaseWorkspace.GridDataset);
BaseWorkspace.GridDataset.Locate('ID', Data);
}
if (Message == MSG_REMOVEPARENTCONTAINERPAGE) {
Self.RemoveComponent(Data);
}
}

function wnd_BaseWorkspaceOnShow(Window) {
if (!BaseWorkspace.WasShowed){
if (BaseWorkspace.OpenGroupDatasetInBaseScript){
OpenGroupsDataset();
}
BaseWorkspace.WasShowed = true;
}
CreateQueriesDetails();
}

function amiReportsOnPrepare(ActionMenuItem) {
if (!BaseWorkspace.ReportsWerePrepared){
BaseWorkspace.ReportsWerePrepared = true;
var ReportMenuCustom = GetNewDictionary();
PrepareReportsMenu(Self, amiReports, ExtractUSICodeEx(Self.USI),
ReportMenuCustom);
BaseWorkspace.ReportMenuCustom = ReportMenuCustom;
amiReportFake.Caption = "Нет отчетов";
}
var RootMenuItem = amiReports;
var SelectQuery = Services.GetNewItemByUSI('sq_ReportCustomTypes');
for (var i = 0; i < RootMenuItem.Count; i++) {
var MenuItem = RootMenuItem.Items(i);
var ReportID = MenuItem.Tag;
var FilterFieldName = BaseWorkspace.ReportMenuCustom(ReportID);
var MenuIsVisible = true;
if (!IsEmptyValue(FilterFieldName)) {
var DataGrid = BaseWorkspace.GridWindow.Attributes('DataGrid');
var Dataset = DataGrid.DatasetLink.Dataset;
var FilterFieldValues = [];
Dataset.DisableEvents();
try {
var ID = Dataset.Values('ID');
for (var j = 0; j < DataGrid.SelectedIDs.Count; j++) {
if (Dataset.Locate('ID', DataGrid.SelectedIDs(j))) {
var FilterFieldValue =
GetFieldValueFromDisabledField(Dataset, FilterFieldName);
FilterFieldValues.push(FilterFieldValue);
}
}
Dataset.Locate('ID', ID);
} finally {
Dataset.EnableEvents();
}
if (FilterFieldValues.length == 0) {
MenuIsVisible = false;
} else {
ApplySelectQueryFilter(SelectQuery, 'ReportID', ReportID, true);
ApplySelectQueryIncludeFilter(SelectQuery, 'ValueIDs', FilterFieldValues, true);
var ReportCustomTypesDataset = SelectQuery.Open();
MenuIsVisible = (!IsDatasetEmpty(ReportCustomTypesDataset));
ReportCustomTypesDataset.Close();
}
}
if (MenuItem.TypeCode != 'ActionMenuSeparator') {
MenuItem.IsVisible = MenuIsVisible;
}
}
var VisibleItemsCount = GetAccessibleReportsCount(amiReports);
amiReportFake.IsVisible = (VisibleItemsCount <= 1);
}

function GetAccessibleReportsCount(RootItem) {
var Result = 0;
for (var i = 0; i < RootItem.Count; i++) {
if (RootItem.Items(i).IsVisible) {
Result++;
}
}
return Result;
}

function SendEmailByTemplateOnExecute(ActionMenuItem) {
var TemplateID = ActionMenuItem.Tag;
var GridDataset = BaseWorkspace.GridDataset;
if (IsEmptyValue(BaseWorkspace.GridWindow)) {
ShowInformationDialog("Из этого раздела нельзя отправлять письма");
return;
}
var DataGrid = BaseWorkspace.GridWindow.Attributes('DataGrid');

var IDs = new Array();
if ((DataGrid) && (DataGrid.DatasetLink.Dataset == GridDataset)) {
var Items = DataGrid.SelectedIDs;
for (var i = 0; i < Items.Count; i++) {
IDs.push(Items(i));
}
} else {
if (!IsDatasetEmpty(GridDataset)) {
var IDField = GridDataset.DataFields.ItemsByName('ID');
if (IDField && IDField.IsEnabled) {
IDs.push(IDField.Value);
}
}
}
if (IDs.length == 0) {
ShowInformationDialog("В основном реестре не выбрано ни одной записи");
return;
}

var MailParams = new Object();
MailParams.TemplateID = TemplateID;
MailParams.IDs = IDs;
if (Self.Script.GetIsMethodExists('SendEmailByTemplateFromWorkspace')) {
if (!SendEmailByTemplateFromWorkspace(TemplateID, MailParams)) {
return;
}
}
var Service = Services.GetSingleItemByUSI('scr_MailUtils');
Service.ScriptControl.CodeObject.SendEmailByTemplate(MailParams.TemplateID,
MailParams);
}

function amiActionsOnPrepare(ActionMenuItem) {
ActionMenuItem.ParentCollection = amMainMenu;
if (!BaseWorkspace.ActionsWerePrepared){
BaseWorkspace.ActionsWerePrepared = true;
BuildActionMenu(Self, amiActions, ExtractUSICodeEx(Self.USI));
AddDuplicatesMergeAction();
var VisibleActionsCount = 0;
for (var i = 0; i < amiActions.Count; i++) {
if (amiActions.Items(i).IsVisible) {
VisibleActionsCount++;
}
}
if (VisibleActionsCount > 1){
amiActions.RemoveItem(amiActionFake);
} else {
amiActionFake.Caption = "Нет действий";
}
} else {
if (BaseWorkspace.MergeDuplicatesActionCreated) {
var Item = amiActions.CoreItemsByKey('amiDuplicatesMerge');
var DataGrid = BaseWorkspace.GridWindow.Attributes('DataGrid');
Item.IsEnabled = (DataGrid.SelectedIDs.Count > 1);
}
}
amiExcludeFromTheGroup.IsEnabled =
!IsDatasetEmpty(BaseWorkspace.GridDataset);
}

function wnd_BaseWorkspaceOnClose(Window) {
}

function pcDataOnChangedActivePage(Pages) {
var GridDataset = BaseWorkspace.GridDataset;
if (!GridDataset) {
return;
}
if (pcData.ActivePage.Name == pgGraphs.Name) {
RefreshGraphs();
pcDetails.IsVisible = false;
} else {
pcDetails.IsVisible = true;
}
}

function SendNotifyToMainWindow(GotoWorkspaceUSI, Sender, Message, Data) {
var MainWindow = Connector.Attributes('MainWindow');
var MainWindowScript = Connector.Attributes('MainWindowScript');
MainWindowScript.NewItemWorkspaceWindowUSI = GotoWorkspaceUSI;
if (Assigned(MainWindow)) {
Sender.Attributes('WorkspaceWindowCode') =
MainWindowScript.NewItemWorkspaceWindowUSI;
MainWindow.Notify(Sender, Message, Data);
}
}

function SendNotifyToDetailWindow(DetailWindow, Sender, Message, Data) {
if (Assigned(DetailWindow)) {
DetailWindow.Notify(Sender, Message, Data);
}
}

function ProcessNotifyMessage(GotoWorkspaceUSI, DetailWindow, Sender,
Message, Data){
if (!!Sender.Attributes('AddNewRecordOnPage')) {
SendNotifyToMainWindow(GotoWorkspaceUSI, Sender, Message, Data);
}
SendNotifyToDetailWindow(DetailWindow, Sender, Message, Data);
}

function pcDetailsOnChangedActivePage(Pages) {
//fmDetail.HeaderCaption = Pages.ActivePage.Caption;
}

function amFiltersOnPrepare(ActionMenu, Control) {
var FilterDataset = fbcFilters.FilterDatasetLink.Dataset;
var IsFiltered = CurrentGroupIsFiltered(FilterDataset);
amiFilterSave.IsEnabled = IsFiltered;
amiFilterPaste.IsEnabled = IsFiltered && Assigned(BaseWorkspace.FiltersCopyBuffer)
}

function amiFilterCopyOnExecute(ActionMenuItem, Sender) {
CopyFilters();
}

function amiFilterPasteOnExecute(ActionMenuItem, Sender) {
PasteFilters();
}

function fmClientOnFrameExpand(FrameSet, FrameName) {
if (FrameName != 'pcDetails') {
return;
}
if (!Self.Script.GetIsMethodExists('RefreshDetails')) {
return;
}
Self.ScriptControl.CodeObject.RefreshDetails();
}

function amiFilterApplyAndSaveOnExecute(ActionMenuItem, Sender) {
ApplyFilters();
SaveFilters();
}

function wnd_BaseWorkspaceOnProfileDeserialize(Window, Node) {
BaseWorkspace.SavedGroupID = Node.GetAttributeAsStr('SavedGroupID', '');
CreateQueriesDetails();
}

function wnd_BaseWorkspaceOnProfileSerialize(Window, Node) {
Node.SetAttributeAsStr('SavedGroupID', dlGroups.Dataset('ID'), '');
SaveDescription();
}

function amiFiltersApplyOnExecute(ActionMenuItem, Sender) {
ApplyFilters();
}

function amiExcludeFromTheGroupOnExecute(ActionMenuItem, Sender) {
ExcludeFromTheGroup();
}

function amiWorkspaceClearOnExecute(ActionMenuItem, Sender) {
ClearAllWorkspaceFilters();
}

function amiDuplicatesMergeOnExecute(ActionMenuItem, Sender) {
MergeDuplicates();
}

Спасибо! проанализирую, сообщу результат.

Сравните свой сервис, и сервис который я прикрепил, (можете использовать araxis merge или аналог),
И еще, пожалуйста, не выгружайте весь сервис в тело письма, сложно читать переписку, просто сохраните его и прикрепите к ответу :) scr_baseworkspace.rar

сорри, на автомате руки сработали...
больше не буду :smile:

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

Вчера ставил эксперименты и, как я понял, Linux мне не светит на клиентских машинах из-за аллес капута с SilverLight?
MoonLight, в качестве поддержки, конечно есть, только польза от него заключается, ИМХО, лишь в факте его существования :smile:

Или я ошибаюсь и есть какие нить способы? А то соблазнительно всех пересадить на квантовый кетцаль, так как если внедрить BPM, то от винды то мне ничего и не надо (хотя как оказалось надо: SilverLight), чего не может дать linux.

Нравится

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

"Шамуилов Александр" написал:Вчера ставил эксперименты и, как я понял, Linux мне не светит на клиентских машинах из-за аллес капута с SilverLight?
MoonLight, в качестве поддержки, конечно есть, только польза от него заключается, ИМХО, лишь в факте его существования :smile:

Браузер какой пробовали? Интересно...
Я такое огорчение поймал на планшете с iOS...

Здравствуйте. Работать будет, кроме того функционала, который требует наличия SilverLight (графическое отображение расписания, отчёты, графики).

"Александр Кудряшов" написал:

Браузер какой пробовали? Интересно...

Я такое огорчение поймал на планшете с iOS...


Там типа много вариантов? :wink:
Лиса да хром, естественно. Нет, как ниже заметили оно работает, но бизнес процессы не показывает и дизайнить не дает напрочь....а что там еще может вылезти.....это уж не знаю....

Как я упоминал выше: "графическое отображение расписания, отчёты, графики" Выдержка из руководства по настройке касательно перечня официально поддерживаемых ОС на клиентском рабочем месте:
Microsoft Windows:
• Windows XP Service Pack 3;
• Windows Vista;
• Windows 7.
Mac OS:
• Mac OS X 10.4 Tiger;
• Mac OS X 10.5 Leopard;
• Mac OS X 10.6 Snow Leopard;
• OS X 10.7 Lion;
• OS X 10.8 Mountain Lion.

В 5.3 и выше графики уже без SL.

Silverlight требуют:

  • Расписание
  • Просмотр отчетов
  • Дизайнер процессов (включая редактирование встроенных процессов в дизайнерах страниц и объектов)

Для запуска и выполнения бизнес-процессов Silverlight не требуется. Такие вот ограничения.

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