Добрый день,

Давно уже не программировал на BPM, поэтому возникло несколько вопросов:
1) Где посмотреть как создать деталь файлы и примечания для своего раздела?
2) Стоит задача - прочитать файл excel. Т.е. прикрепляем файл на деталь, потом при изменении статуса считываем этот файл (можно и просто сделать поле для файла и считывать при загрузке, не суть):
Задача минимум - вытащить значение из определенной ячейки, например С10.
Задача максимум - прошерстить полностью файл (например, в ячейках B10:B12 лежат параметры (могут в разнобой) и значения лежат в ячейках С)
Т.е.
Файл 1:
parameter1 40
parameter2 30
parameter3 20
А может быть файл 2:
parameter3 20
parameter1 40
parameter2 30
Как это сделать, где посмотреть?
3) Можно ли (вообще теоретически) сделать представление календаря на детале (пример на скриншоте)? Почитав форум я понял, что документации нет даже, чтобы сделать календарь для своего нового раздела, и надо просто брать и методом проб и ошибок делать. Но также интересует вопрос про календарь в детале: представление календаря может встать на деталь (сталкивался кто-то с этим?) или же календарь исключетельно для раздела и даже и не пытайся вставить его в деталь, не получится?

Нравится

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

Доброго времени суток, при создании своего раздела так же в пакете создается объект (допустим), раздел MyModule, то объект будет MyModuleFile.
Вам необходимо зарегистрировать деталь в таблице SysDetails.
В колонку DetailSchemaUId необходимо заинсертить UId схемы FileDetailV2 (если не ошибаюсь).
В колонку EntitySchemaUId необходимо указать UId объекта MyModuleFile (у вас будет другое название).
Ну про Caption думаю вы догадаетесь)
А потом через мастер можете добавить деталь на страницу.

По поводу Примечаний это не деталь, а строка с неограниченной длинной только со стилями)
Прикреплю два документа, там более подробные инструкции что, куда и как)

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

В API текущего приложения, не входит каких либо инструментов для упрощенной работы с элементами организационной структуры:
"Функциональные роли", "Организационные юниты", "Пользователи" (само по себе)
Уже обсуждалось вот в этой теме
Там же я выложил первые наработки, миксин-модуля с некоторыми методами решающими классические "юзкейсы".
С тех пор его пришлось существенно доработать и расширить функционал, по этому выложу его в этой отдельной теме для тех кому может понадобиться.
Во вложении (ZIP-архив) вы найдете исчерпывающую документацию в виде HTML-страницы.
Модуль реализован в виде "миксина", т.е. без каких либо трудностей подключайте в любой схеме и пользуйтесь на здоровье :) так же в конце темы есть исходный код, а так-же Уже готовая к импорту схема в виде MD-файла.
Краткое описание:
getRelAU ([id], callback, [contactModeFlag], [scope]);
Получить информацию об административных юнитах связанных с пользователем, по его идентификатору Id или Id связанного с ним контакта, или для текущего пользователя если опустить первый аргумент.
(элементы "Организационной структуры", "Функциональные роли", "Организации", "Роли руководителей" (если он в них входит)) в виде структурированного объекта с дополнительной информацией (н/п о родительских OU/FU) будут переданы в callback вызов.
checkUserInAU (AUname, [AUtype], [UserId], callback, [scope])
Проверить принадлежит ли текущий пользователь (или произвольный по его Id) к конкретному административному юниту по его имени (элементу "Организационной структуры", "Функциональные роли", "Организации").
В целях оптимизации предусмотрен поиск только по конкретным типам Орг.юнитов. Результат передается в виде булева примитива в callback-функцию
getUsersFromRole (RoleId, [getManagerFlag], callback, [scope])
Получить всех пользователей непосредственно входящих в целевые орг.юнит или функциональную роль, в том числе руководителей (пользователей из специалищированного связанного орг.юнита).
Коллекция пользователей будет передана в callback-функцию

Исходный код:

define("UserUtilsMixin", ["UserUtilsMixinResources"],
        function(resources) {
                Ext.define("Terrasoft.configuration.mixins.UserUtilsMixin", {
                        "alternateClassName": "Terrasoft.UserUtilsMixin",
                        "getRelAU": function(UserId, callback, UseContactIdFlag, scope) {
                                var serviceScope;
                                if (callback === undefined) {
                                        callback = UserId;
                                        UserId = Terrasoft.core.enums.SysValue.CURRENT_USER.value;
                                }
                                if (typeof callback === "object") {
                                        scope = callback;
                                        callback = UserId;
                                        UserId = Terrasoft.core.enums.SysValue.CURRENT_USER.value;
                                }
                                if (typeof UseContactIdFlag === "object") {
                                        scope = UseContactIdFlag;
                                        UseContactIdFlag = false;
                                }
                                if (typeof scope !== "object") {
                                        scope = this;
                                } else if (scope.scope) {
                                        serviceScope = scope;
                                        scope = scope.scope;
                                }
                                function mainLogick(UserId, callback) {
                                        var esq = Ext.create("Terrasoft.EntitySchemaQuery", {
                                                rootSchemaName: "SysUserInRole"
                                        });
                                        var filter = this.scope.Terrasoft.createColumnFilterWithParameter(
                                                this.scope.Terrasoft.ComparisonType.EQUAL,
                                                "SysUser",
                                                UserId
                                        );
                                        esq.filters.addItem(filter);
                                        esq.addColumn("SysRole");
                                        esq.addColumn("[SysAdminUnit:Id:SysRole].Name", "AuName");
                                        esq.addColumn("[SysAdminUnit:Id:SysRole].ParentRole", "Parent");
                                        esq.addColumn("[SysAdminUnit:Id:SysRole].[SysAdminUnitType:Value:SysAdminUnitTypeValue].Name", "AuType");
                                        esq.getEntityCollection(
                                                function(response) {
                                                        if (response && response.success) {
                                                                var resultObject = {
                                                                        FuncRoles: [],
                                                                        OrgUnits: [],
                                                                        Organizations: [],
                                                                        Managers: [],
                                                                        Teams: []
                                                                };
                                                                response.collection.each(function(item) {
                                                                        var wrapObj = {
                                                                                name: item.values.AuName,
                                                                                id: item.values.SysRole.value,
                                                                                parentAU: item.values.Parent
                                                                        };
                                                                        var type = item.values.AuType;
                                                                        if (type === "Division") {
                                                                                resultObject.OrgUnits.push(wrapObj);
                                                                        } else if (type === "Функциональная роль") {
                                                                                resultObject.FuncRoles.push(wrapObj);
                                                                        } else if (type === "Organization") {
                                                                                resultObject.Organizations.push(wrapObj);
                                                                        } else if (type ===  "Manager") {
                                                                                resultObject.Managers.push(wrapObj);
                                                                        } else if (type ===  "Team") {
                                                                                resultObject.Teams.push(wrapObj);
                                                                        }
                                                                });
                                                                if (serviceScope) {
                                                                        this.callback.call(serviceScope, resultObject);
                                                                } else {
                                                                        this.callback.call(scope, resultObject);
                                                                }
                                                        }
                                                },
                                                {callback: callback, scope: this.scope}
                                        );
                                }
                                var wrapOfMainLogick = mainLogick.bind({scope: scope, callback: callback});
                                if (UseContactIdFlag) {
                                        var esq = Ext.create("Terrasoft.EntitySchemaQuery", {
                                                rootSchemaName: "SysAdminUnit"
                                        });
                                        var filter = this.Terrasoft.createColumnFilterWithParameter(
                                                this.Terrasoft.ComparisonType.EQUAL,
                                                "Contact.Id",
                                                UserId
                                        );
                                        esq.filters.addItem(filter);
                                        esq.getEntityCollection(
                                                function(response) {
                                                        if (response.collection.getCount() !== 1) {
                                                                this.scope.log("(getRelAU) Target Contact is not associated with User", Terrasoft.LogMessageType.ERROR);
                                                        } else {
                                                                this.mainLogick(response.collection.getByIndex(0).values.Id, this.callback);
                                                        }
                                                },
                                                {
                                                        scope: scope,
                                                        mainLogick: wrapOfMainLogick,
                                                        callback: callback
                                                }
                                        );
                                } else {
                                        wrapOfMainLogick(UserId, callback);
                                }
                        },
                        "checkUserInAU": function(AUname, AUtype, UserId, callback, scope) {
                                if (typeof AUtype === "function" && UserId === undefined) {
                                        callback = AUtype;
                                        AUtype = "ALL";
                                        if (typeof UserId === "object") {
                                                scope = UserId;
                                        }
                                        UserId = Terrasoft.core.enums.SysValue.CURRENT_USER.value;
                                }
                                if (typeof UserId === "function") {
                                        if (typeof callback === "object") {
                                                scope = callback;
                                        }
                                        callback = UserId;
                                        UserId = Terrasoft.core.enums.SysValue.CURRENT_USER.value;
                                }
                                if (typeof UserId !== "object") {
                                        scope = this;
                                }
                                this.getRelAU(UserId, function(result) {
                                        var CompareResult = false;
                                        switch (this.AUtype) {
                                                case "OU":
                                                        for (var OU in result.OrgUnits) {
                                                                if (this.AUname === result.OrgUnits[OU].name) {
                                                                        CompareResult = true;
                                                                }
                                                        }
                                                        break;
                                                case "FR":
                                                        for (var FU in result.FuncRoles) {
                                                                if (this.AUname === result.FuncRoles[FU].name) {
                                                                        CompareResult = true;
                                                                }
                                                        }
                                                        break;
                                                case "ORG":
                                                        for (var orgIndex in result.Organizations) {
                                                                if (this.AUname === result.Organizations[orgIndex].name) {
                                                                        CompareResult = true;
                                                                }
                                                        }
                                                        break;
                                                default:
                                                        for (var each in result) {
                                                                for (var subarray in result[each]) {
                                                                        if (this.AUname === result[each][subarray].name) {
                                                                                CompareResult = true;
                                                                        }
                                                                }
                                                        }
                                                        break;
                                        }
                                        this.callback.call(this.scope, CompareResult);
                                }, {
                                        scope: scope,
                                        AUtype: AUtype,
                                        AUname: AUname,
                                        callback: callback
                                });
                        },
                        "getUsersFromRole": function(RoleId, getManager, callback, scope) {
                                var getManagerFlag = false, filter = Terrasoft.createFilterGroup(), esq;
                                if (typeof getManager === "function") {
                                        callback = getManager;
                                        if (typeof callback === "object") {
                                                scope = callback;
                                        }
                                } else {
                                        getManagerFlag = getManager;
                                }
                                if (typeof scope !== "object") {
                                        scope = this;
                                }
                                if (getManagerFlag) {
                                        filter.logicalOperation = Terrasoft.LogicalOperatorType.AND;
                                        esq = Ext.create("Terrasoft.EntitySchemaQuery", {
                                                rootSchemaName: "SysAdminUnit"
                                        });
                                        filter.addItem(
                                                this.Terrasoft.createColumnFilterWithParameter(
                                                        this.Terrasoft.ComparisonType.EQUAL,
                                                        "ParentRole",
                                                        RoleId
                                                )
                                        );
                                        filter.addItem(
                                                this.Terrasoft.createColumnFilterWithParameter(
                                                        this.Terrasoft.ComparisonType.EQUAL,
                                                        "SysAdminUnitTypeValue",
                                                        2
                                                )
                                        );
                                        esq.addColumn("Name");
                                } else {
                                        esq = Ext.create("Terrasoft.EntitySchemaQuery", {
                                                rootSchemaName: "SysUserInRole"
                                        });
                                        filter.addItem(
                                                this.Terrasoft.createColumnFilterWithParameter(
                                                        this.Terrasoft.ComparisonType.EQUAL,
                                                        "SysRole",
                                                        RoleId
                                                )
                                        );
                                        esq.addColumn("[SysAdminUnit:Id:SysUser].Name", "UserName");
                                        esq.addColumn("[SysAdminUnit:Id:SysUser].Id", "UserId");
                                        esq.addColumn("[SysAdminUnit:Id:SysUser].Contact", "Contact");
                                }
                                esq.filters.addItem(filter);
                                esq.getEntityCollection(
                                        function(response) {
                                                var cleanArray = [];
                                                if (this.getManagerFlag) {
                                                        this.scope.getUsersFromRole(
                                                                response.collection.getByIndex(0).values.Id,
                                                                this.callback,
                                                                this.scope
                                                        );
                                                } else {
                                                        response.collection.each(function(elem) {
                                                                elem.values.Id = elem.values.UserId;
                                                                delete elem.values.UserId;
                                                                cleanArray.push(elem.values);
                                                        });
                                                        this.callback.call(this.scope, cleanArray);
                                                }
                                        }, {
                                                scope: scope,
                                                callback: callback,
                                                getManagerFlag: getManagerFlag
                                        }
                                );
                        }
                });
        });

Нравится

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

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

Полезная информация, спасибо.

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

примеры для вызова getRelAU

//Получаем результирующий объект для текущего пользователя
this.getRelAU(
         function(result) {
                console.log(result);
         }
);
//Тот же вызов, но с явным определением контекста для callback-функции
this.getRelAU(
         function(result) {
                console.log(result);
         }
, context);
//Получаем результирующий объект для пользователя с id "9D3B1042-9E88-499F-B13F-3E7F7F3FAD7D"
this.getRelAU(
    "9D3B1042-9E88-499F-B13F-3E7F7F3FAD7D",
   function(result) {
        console.log(result);
    }
);
//Тот же вызов, но с явным определением контекста для callback-функции
this.getRelAU(
    "9D3B1042-9E88-499F-B13F-3E7F7F3FAD7D",
    function(result) {
        console.log(result);
    }
, context);
//Получаем результирующий объект для пользователя связанного с контактом id которого "E7D525FB-88EE-4947-94CC-D013E85D2F79"
this.getRelAU(
    "E7D525FB-88EE-4947-94CC-D013E85D2F79",
    function(result) {
        console.log(result);
    },
    true
 );
//Тот же вызов, но с явным определением контекста для callback-функции
this.getRelAU(
    "E7D525FB-88EE-4947-94CC-D013E85D2F79",
    function(result) {
        console.log(result);
    },
    true,
    context
);

в схему корректно не выгружается кириллица, а поскольку в SysAdminUnitType одна только "Функциональная роль" названа кириллицей.
То после импорта схемы посмотрите в исходник, там где "кракозебры" замените на "Функциональная роль"
Будет время, обновлю MD-корректный

                      

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

Севостьянов Илья Сергеевич,

подскажите, пожалуйста, что за UserUtilsMixinResources передается в зависимости? его нужно создать отдельно?

define("UserUtilsMixin", ["UserUtilsMixinResources"]

 

создала у себя миксин, но без этого UserUtilsMixinResources, а также изменив названия миксина в 3 местах. когда его подключаю в своем клиентском модуле, выходит ошибка.

Есть какие-то особенности при этого подключении миксина?

UserUtilsMixinResources, это имя модуля + Resources стандартная мнемоника для объявления ресурсов в зависимостях для схем.

в 3-х местах это в каких ?

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

Всем доброго времени суток.

Версия 7.9 sales.

Задача примерно такая: существует поле (колонка) на странице, и кнопка, вызывающая бизнес-процесс, в который отправляется значение из этого поля.

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

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

Возможно ли это сделать?

Нравится

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

Да, в вашем БП вызывайте сигнал и передавайте в него значение.

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

Получите и обработайте значение из БП, после чего вызовите стандартное системное окно сообщения вот таким вот способом:

Terrasoft.utils.showMessage({
	caption: "Ваше сообщение",
	buttons: ["ok"],
	defaultButton: 0
});

Илья, это понятно :)

Можно даже при помощи скрипта вызвать стандартное модальное окно :) this.showInformationDialog

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

"Смородинов Денис" написал:Там вопрос именно в том, можно ли отобразить это всё именно в виде синенького блока у поля, как при стандартной валидации.

Я не сразу понял о чем идет речь.
Если вас интересует именно визуализация процесса, а не имитация механизма валидации, то можете поступить вот так...
Для примера в карточке контакта, в методе onEntityInitialized, или прям в консоли отладки выполните код:

var targetElements = Ext.select("[id*=AccountNameTextEdit-validation]");
targetElements.setStyle({"visibility": "visible"});
targetElements.setHTML("Мое сообщение");

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

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

То есть по сути - обращение к элементу на уровне DOM и подстановка туда напрямую своего текста.
Я просто думал, может есть какие-нибудь bpm-овские методы для вызова этого элемента.

"Смородинов Денис" написал:Я просто думал, может есть какие-нибудь bpm-овские методы для вызова этого элемента.

Они однозначно есть. Для этого надо подебажить asyncValidate метод из BasePageV2
Истина где-то там рядом (с)

Лично я запнулся на вызове this.validate
это дело отправляет тебя к "праотцам" :lol: в all-combined.js
С минифицированным кодом ядра.
Даже в Pretty Print режиме это практически нечитаемо.


вот где-то здесь - творится "магия" :)

Но так же, капитан очевидность подсказывает, что в ткущем контексте (объекте this)
есть аттрибуты ValidationConfig и ValidationInfo

Я "игрался" устанавливая false в соотв аттрибуте ValidationInfo принудительно на this.validate это не оказывает эффекта.
Но возможно ключ к решению вашего кейса штатными средствами - манипуляция с этими объектами, например найти пример объекта добавляемого в ValidationConfig, возможно туда можно добавить некий конфигурационный объект.

Илья, большое спасибо за настолько подробный разбор темы! Прямо даже неожиданно :)

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

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

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

!

Нравится

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

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

За стили отображения мини карточки контакта отвечают стили, описанные в модулях ContactMiniPageCSS и BaseMiniPageCSS. Вам необходимо создать свой модуль с css стилями по аналогии с ContactMiniPageCSS и добавить его в зависимости к замещающей схеме ContactMiniPage.

При замещении css стилей Вам необходимо смотреть в сторону добавления стилей height и overflow-y к селектору MiniPageContentContainer.

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

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

Нравится

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

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

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

"Shevchenko Andrey" написал:

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

Настройки колонок находятся в SysProfileData.

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


Спасибо

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

Не работает :)
Через "Данные" настройки колонок не переносятся, по крайней мере в версиях до 7.10.
В таблице SysProfileData 2 колонки с бинарными данными, в конечном итоге на целевой системе - записи создадутся - но значения этих колонок окажутся пустыми, что делает бесполезным само мероприятие.
Мы переносим настройки колонок SQL-скриптами.
Порядок действий такой, используем по-возможности какой ни будь толковый инструмент для работы с SQL например Jetbrains DataGrip
1) Открываем на просмотр таблицу SySprofileData, отсортируем записи по колонке ModifedOn
2) Идем в необходимый реестр/карточку/деталь, или открываем необходимый справочник/поиск, настраиваем колонки, выполняем действия "Сохранить" (Если кастомите под конкретного пользователя), или "Сохранить для всех".
3) Снова смотрим в таблицу, там появится 2-3 новые записи.
4) Дампим данные (DataGrip умеет прям в виде INSERT записей формировать).
5) Составляем SQL-скрипт:
В ваших INSERT обратите внимание на значения в колонке Key
Перед вставкой проверяйте наличие других записей с таким Key и удаляйте их если они есть.
Т.к. если в этой таблице будет несколько записей с одинаковым соотношением Key - ContactId
то применяться будут более старые значения.

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

Необходимо построить строку запроса ESQ, для присоединения колонки:
Таблицы:
Contact
SysAdminUnit
SysAdminUnitInRole

Корневая (текущая схема): Contact

Необходимо присоединить схему "SysAdminUnit" по полю "Contact"
Вопросов нет:

esq.addColumn("[SysAdminUnit:Contact].Id", "AdminUnitId")

В результате в поле ответа "AdminUnitId" будет содержаться соответствующее значение Id из "SysAdminUnit"

Так...
А теперь мы хотим немного усложнить, и использовать полученный Id для присоединения еще одной таблицы SysAdminUnitInRole по полу "SysAdminUnit"
пробуем:

esq.addColumn("[SysAdminUnit:Contact].[SysAdminUnitInRole:SysAdminUnit].Id", "AdminUnitInRoleId")

Но и такая конструкция уже не работает...

Здесь какая-то проблема с колонкой Id так как если для связи все время использовать разные поля - то такая конструкция работает нормально, например если бы мы привязывали "AdminUnitId" у которого нужный нам для дальнейшей связи Id содержался бы в некоем кастомном поле, н/п "TargetId"
, а в конечной таблице SysAdminUnitInRole нам нужен был бы не Id а скажем какое ни будь другое поле, н/п "CustomFiled"
тогда:

esq.addColumn("[SysAdminUnit:Contact"].[SysAdminUnitInRole:SysAdminUnit:TargetId].CustomFiled", "AdminUnitInRoleId")

то такой запрос бы сработал...

Как решать на этапе присоединения колонок эти проблемы с тем что нужно использовать постоянно колонку Id которая в каждой присоединяемой схеме своя ?

Нравится

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

Все понятно... Это не я дурак, это лыжи не едут.
SysAdminUnitInRole оказалась ОСОБЕННОЙ таблицей, в нее нельзя делать напрямую ESQ запросы, как и в некоторые другие таблицы системы, даже от лица Supervisor, обсуждалось в этой теме форума

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

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

Нравится

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

Добрый день!

Документация по РФС будет доступна в течение 3-х недель на сайте Академии в разделе SDK
https://academy.terrasoft.ru/documents/technic-sdk/7-10/dokumentaciya-p…

Здравствуйте
Статьи по разработке в файловой системе для версии 7.10 пока что пишутся. Ориентировочно будут опубликованы через 2-3 недели.
Но можно попробовать использовать существующую (правда уже устаревшую) статью
https://academy.terrasoft.ru/documents/technic-sdk/7-10/rabota-s-server…
Подход аналогичный, правда поменялись названия кнопок, работа с SVN, механизм и правила выгрузки схем и ресурсов.
P.S. Постараемся опубликовать новую документацию по РФС как можно быстрее

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

//---------------
Раньше мы использовали для каждого разработчика отдельные рабочие пространства. И исходный код выгружали по пути "...\%WORKSPACE%\JScode" для клиентских схем и "...\%WORKSPACE%\Src" для CompilerSources. Соответственно каждый работал со своей конфигурацией обособленно и через SVN всё сливалось воедино.

Здавствуйте
Несколько конфигураций слить в разные папки, увы, никак не получится. Приложение может работать только с одним конфигурационным проектом Terrasoft.Configuration и только с пространством по-умолчанию (Default).

На текущий момент мы не рекомендуем использовать разработку в разных рабочих пространствах. Для каждого разработчика нужна своя среда разработки (развернутое приложение + база данных) и разработка должна вестись только в пространстве Default (Конфигурация 0)
https://academy.terrasoft.ru/documents/technic-sdk/7-10/osnovnye-pravil…

Понял. Спасибо за оперативный ответ.

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

Добрый день. bpm'online версии 7.10
Подскажите такой момент: во время отладки недоступны некоторые переменные. Visual Studio пишет:
Cannot obtain value of the local variable or argument because it is not available at this instruction pointer, possibly because it has been optimized away.
(Не удается получить значение локальной переменной или аргумента, так как оно недоступно по указателю инструкции, возможно, вследствие оптимизации.)

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

Нравится

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

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

Данная ошибка будет исправлена в ближайшее время. В качестве обходного решения рекомендуем вам отаттачиться от процесса и приаттачиться снова.

Спасибо, будем ждать.

Добрый день.
Подскажите в версии 7.10.1 исправлена ли ошибка?

Добрый день, Евгений!

К сожалению, это плавающая ошибка, исправлений пока нет. Решается повторной компиляцией приложения ПОСЛЕ аттача к процессу IIS. После выполнения Компилировать все в Конфигурации доступ к переменным есть. Однако рекомендуем переходить на работу с файловой системой : https://academy.terrasoft.ru/documents/technic-sdk/7-10/razrabotka-v-fa…
, так как примерно к концу года от данного функционала откажутся.

Добрый день.

система у меня настроена на работу в файловой системе.

Евгений, по данной ошибке при отладке в ФС отдел R&D работает, однако пока что нет точного кейса, в 7.10.1 не исправлено. Варианты исправления те же - зааттачиться заново либо же компилировать проект непосредственно Visual Studio, а не WorkspaceConsole.

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

Добрый день.
Кейс, хотим сделать копию системы, без привязки к svn.

Понимаю что можно вытащить через WorkspaceConsole, но предполагаю, что настройки полей, системные настройки не все перенесутся.

Конечно есть вариант, сделать копию бд...и WorkspaceConsole перетащить пакеты. Что скажете?

Поделитесь опытом пож-та.
Спасибо

Нравится

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

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

Есть два варианта:
1) Перенос БД (в случае, если на продакшн среде нет данных)
2) Выгрузить пакет через WorkspaceConsole. В таком случае необходимо предварительно выполнить привязку данных к пакету по данным, которые должны быть перенесены. Из того, что назвали вы, необходимо привязать данные объектов:

  • SysProfileData (Настройки колонок в разделах)
  • SysSettings (Системные настройки)
  • SysSettingsValue (Значение системных настроек)
1) Перенос БД (в случае, если на продакшн среде нет данных)

Т.е. нет необходимости привязки к SVN ?

А где хранятся рабочие места?

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

Привязка к SVN не требуется. Рабочие места хранятся в объекте SysWorkplace, разделы в рабочих местах - в объекте SysModuleInWorkplace.

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

Коллеги, добрый день!

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

Данное уведомление появляется при попытке привязать данные на новом локальном стенде. Уже и перекомпилировал, и обновлял БД. Что это за объект администрирования?)
Скрин: https://yadi.sk/i/o6CEkWqU3GjtQA

Нравится

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

Проблема в следующем:
Здесь храниться дата изменения объекта
SELECT *
FROM [SysSchema]
WHERE UId = '84F44B9A-4BC3-4CBF-A1A8-CEC02C1C029C'

А здесь дата когда изменения были приняты
SELECT *
FROM [SysSchemaSource]
WHERE SysSchemaId = '1E9FA34C-B906-48E7-BC1A-241190FFBD6C'

Посмотрев на объекты, изменения были применены а вот с датами косяк.
Дата изменения в моей базе указана была: '2017-07-05 18:37:55.000'

Изменив дату последнего изменения на дату из таблицы SysSchemaSource у меня ошибка ушла
update SysSchema
SET ModifiedOn = '2017-04-04 11:31:40.877'
WHERE UId = '84F44B9A-4BC3-4CBF-A1A8-CEC02C1C029C'

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

Выполните операцияю [Обновить для требующих обновления]

"Терещук Павел" написал:Здравствуйте!

Выполните операцияю [Обновить для требующих обновления]

Павел, это первое, что пришло в голову - но нет, не помогает.

Найдите последний измененный [Объект администрирования]

Пересохраните, опубликуйте, после чего выполните операцию [Обновить для выбранных]

Объект администрирования - системный. К нему доступа нет.
добавьте sql сценарий и впишите в него запрос:

update SysSchema
SET ModifiedOn = (SELECT top 1 ModifiedOn
FROM [SysSchemaSource]
WHERE SysSchemaId = '1E9FA34C-B906-48E7-BC1A-241190FFBD6C')
WHERE UId = '84F44B9A-4BC3-4CBF-A1A8-CEC02C1C029C'

И собственно выполните затем сценарий

"Сурмачевский Евгений Александрович" написал:Объект администрирования - системный. К нему доступа нет.
добавьте sql сценарий и впишите в него запрос:

update SysSchema
SET ModifiedOn = (SELECT top 1 ModifiedOn
FROM [SysSchemaSource]
WHERE SysSchemaId = '1E9FA34C-B906-48E7-BC1A-241190FFBD6C')
WHERE UId = '84F44B9A-4BC3-4CBF-A1A8-CEC02C1C029C'

И собственно выполните затем сценарий

Евгений, спасибо помогло!

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