Добрый день, возникла необходимость создания лукапа для выбора колонки из указанного справочника. Выбор справочника удалось организовать. Выбор колонки - открывается модальное окно выбора колонки их справочника, но после закрытия(выбора колонки) модального кона в консоли ошибка и атрибут не пуст, но на странице не отображается выбранное значение:
user: Администратор 1/7143f917-c81d-4f98-a35b-94ccb205a576
file: undefined
line: undefined
column: undefined
message: Несуществующий или пустой аргумент
date: Mon Apr 17 2017 12:45:01 GMT+0300 (RTZ 2 (зима))
moduleId: ext-window
moduleName: undefined

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



Нравится

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

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

Сложно сказать, что именно вызывает ошибку без возможности точно воспроизвести Ваш код. Вам стоит провести отладку:

1) Установить значение SeparatedJsFiles в true во внутреннем Web.config (это отключит минификацию для all-combined.js).
2) Посмотреть где именно возникает ошибка и что является её причиной.

Более подробно о SeparatedJsFiles, Вы можете почитать по следующей ссылке: https://academy.terrasoft.ru/documents/technic-sdk/7-7-0/razvernut-pril…

Решил проблему:
мешал метод getLinkUrl из базовых модулей. его переопределил в getLinkUrl: function(columnName) {return {};},

Просто видимо оно ищет ссылку на сущность. но тут нет id.

"Мотков Илья" написал:Установить значение SeparatedJsFiles в true во внутреннем Web.config

Я правильно понимаю, что в 7.7 такой возможности не предоставлено? Или я не там ищу?

Такая возможность есть. Данная строка может отсутствовать, если её нет - необходимо добавить. Более подробно, Вы можете почитать в SDK

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

Вот уже версия 7.10 - поддержка отписалась что в этом релизе будет решен баг с "Данными"
7.9.1 - 7.9.2 не работал тип "Первичная установка", приходилось у всех данных просто "Установку" выставлять, как впрочем делал и мастер встроенный :)

Но ситуация с данными стала еще туманнее:
Вот я веду разработку на конфигурации "A" - а тестирую, в т.ч. и установку на идентичной конфигурации "B"
Если я создал данные например своих зарегистрированных "Справочников" (Lookup)
Тип установки: "Первичная установка" или "Просто установка"
Установил эти данные впервые - все встало норм.
Потом я на конфигурации A добавляю в данные еще один справочник например, фиксирую изменения - конфигурацию B обновляем, изменения видны и применяются - объект данных требует установки, даже внутри в "Привязанных данных" список данных корректен.
Но ничего по факту не ставится... вот то что было при первой установке данных - все изменения дальнейшие не применяются.
Пункт принудительной установки на объекте данных в конфигураторе - заблокирован.
А самое занятное что если ты удалишь все данные из установленного пакета и запросишь обновления из репозитория - то "Изменений не обнаружено" (не смотря на то что ты все данные поудалял)

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

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

Нравится

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

Блин... у меня даже через "Обновление существующих" ничего не выходит...


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

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

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

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

Полезная инфа по теме:

Существует три типа привязки данных к пакету:
«Первичная установка» - при первой установке пакета данные, которые привязаны к пакету, будут добавлены в соответствующие таблицы. Работает только если пакет устанавливается с помощью WorkspaceConsole.
«Установка» - при установке уже существующего пакета записи, которые уже существуют, будут обновлены данными, которые поставляются с пакетом. Если записей нет, то они буду добавлены в соответствующие таблицы из данных, привязанных к пакету.
«Обновление существующих» - при установке уже существующего пакета записи, которые, уже есть в таблице, будут обновлены данными из пакета. Данный тип установки сработает только с ForceUpdate (признак "Обязательно для заполнения").

П.С. Более детально по привязки данных к пакету описано в статье
https://academy.terrasoft.ru/documents/technic-sdkmp/7-9/privyazka-dann…

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

Доброго времени суток Всем!
Итак начну с описания задачи.
В разделе Контрагенты есть действие (Сменить ответственного), которое доступно при множественном выборе. Как только мы выбираем несколько контрагентов и кликаем на данное действие, то открывается лукап со списком контактов, которых можно указать новым ответственным, по выбранным контрагентам.
Необходимо сделать рассылку писем как новому ответственному так и старым, о том что ответственные сменились.
Письмо для нового ответственного готово, как и процесс его отправки.
Вопрос в том, может кто знает как лучше сделать, как реализовать отправку писем старым ответственным? Дело в том что каждому из них должно приходить письмо в формате:
"ФИО Автора действия> передал контрагента - Наименование контрагента> другому сотруднику".

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

Нравится

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

Пример реализации Вы можете посмотреть в продукте customer center (service enterprise), процесс SendEmailToCaseContactProcess (Отправка email сообщения контакту обращения), элемент SendMailScriptTask (Отправить письмо). Там используется метод SendMail, так же вот были примеры реализации собственного:
http://www.community.terrasoft.ua/forum/topic/24964
В любом случае, используется шарпный SmtpClient.

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

Изза того что у нас клиентский код не асинхронный, нужно использовать chain.
И есть задача сделать следующую логику

methonMain: function() {
Terrasoft.chain(
                                        var value = this.method1();
                                        if (value != null )
                                        {
                                                value2 = this.method2();
                                        }
                                        else {
                                                value2 = this.method3()
                                        }
);
},
method1: function() {
        //код обращение в БД
        return value;
},
method2: function() {
        //код обращение в БД
        return value2;
},
method2: function() {
        //код обращение в БД
        return value2;
},

Правильно ли будет отрабатывать chain мою логику ?

Нравится

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

Не правильно. Чейн должен реализовывать переход к след. методу.

Правильно:

obj = {a: 2, b: 3}

Terrasoft.chain(
function(next) {
console.log(this.a);
next();
}, function(next){
console.log(this.b)
next();
}, function(){
console.log("end");
}, obj
);

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

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

Пытался сделать автонумерацию для объекта Листинг, как описано здесь (на стороне клиента), но ничего не срабатывает (все работает как обычно и ничего не меняется).
После добавления указанного кода из статьи появилось сообщение об ошибке JavaScript, код добавил только вот здесь

Замещающая страница и объект (экспорт) во вложении

Помогите разобраться, не пойму что не так?
Заранее благодарен!

Нравится

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

Павел, а Вас не смущает, что Вы используете SDK для версии 7.9?

Для версии 7.7 - https://academy.terrasoft.ru/documents/technic-sdk/7-7-0/kak-dobavit-av…

"Мотков Илья" написал:Павел, а Вас не смущает, что Вы используете SDK для версии 7.9?

Спасибо! :)

Илья, когда я обновлюсь до версии 7.9, то все, что сделано для версии 7.7 придется переделывать?

Павел, в 7.7 автонумерацию нужно было добавлять на стороне клиента И сервера, в 7.9 же она добавлется ИЛИ на клиенте, ИЛИ на сервере. То есть Вам просто нужно будет либо удалить событийный подпроцесс из объекта, либо код из замещающей клиентской схемы. Обязательно оставьте хотя бы одно.)

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

Павел, в 7.7 автонумерацию нужно было добавлять на стороне клиента И сервера, в 7.9 же она добавлется ИЛИ на клиенте, ИЛИ на сервере. То есть Вам просто нужно будет либо удалить событийный подпроцесс из объекта, либо код из замещающей клиентской схемы. Обязательно оставьте хотя бы одно.)

Спасибо! Буду разбираться

Попробовал все сделать как для версии 7.7.

Возникли ошибки после публикации объекта Listing, в котором создавал процесс обработки события Перед добавлением записи http://prntscr.com/f0fmpo

Вроде все сделал как описано, создал системные переменные, поле UsrCode для объекта, куда должно записываться значение номера. Сначала сделал его цифровым (Integer), вышла ошибка после публикации объекта. Потом все переделал, сделав его строкой (String), но все равно ошибка (в скрине выше).

Что я не так делаю, подскажите? Схемы во вложении

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

Следует типизировать значение колонки в условном потоке - в условии указать значение “string.IsNullOrEmpty(Entity.GetTypedColumnValue("Code"))”
(вместо “string.IsNullOrEmpty(Entity.GetTypedColumnValue("Code"))”)

"Зарицкий Олег" написал:Следует типизировать значение колонки в условном потоке - в условии указать значение “string.IsNullOrEmpty(Entity.GetTypedColumnValue("Code"))”
(вместо “string.IsNullOrEmpty(Entity.GetTypedColumnValue("Code"))”)("Code"))

Олег, Вы указали одинаковые строки

см. вложение
gettypedcolumnvalue.txt

"Зарицкий Олег" написал:

см. вложение

gettypedcolumnvalue.txt

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

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

В своем пакете (само собой между Custom и ***SoftKey_RUS)
создаю замещающую схему для детали используемой в карточке Активностей
"EntityConnectionsDetailV2"
Моя цель замещение объявленного в родителе метода appendTip
Задача проверка поступающих аргументов и некоторая их модификация в определенных случаях, после чего - вызов родителя с модифицированными аргументами.

define("EntityConnectionsDetailV2", [],
        function() {
                return {
                        attributes: {},
                        messages: {},
                        mixins: {},
                        methods: {
                                "appendTip": function(itemConfig) {
                                        //my Logick here
                                        this.callParent(MyCustomedAruments);
                                }
                        },
                        diff: /**SCHEMA_DIFF*/[]/**SCHEMA_DIFF*/
                };
        });

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

точка останова в 1 - срабатывает на инструкции "define"
точки останова 2,3 - не срабатывают никогда.
в то время как точка останова в родительском методе - принимает исполнение.

Не все методы/схемы можно замещать ?
В чем может быть проблема ?

Нравится

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

Полная перегенерация исходных кодов и компиляция конфигурации, сброс Redis - эффекта не дают.

ВНИМАНИЕ!
Для решения проблемы надо было зайти в замещающую схему - поменять в LocalizableString - Caption и сохранить схему.

(После чего собственно можно вернуть Caption в исходное состояние и ВУАЛЯ - замещающая схема начинает работать как положено)

Это какой-то баг... причем очень не приятный... отнял у 3-х разработчиков в суммарном эквиваленте 5-6 часов.
Смотрели на код как "бараны" и не могли даже предположить, что может быть не так... и решив проверить по принципу: Так ну ладно, код не замещается, а как на счет ресурсов - и фактически методом тыка получаем искомое решение.

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

Да, на тестовом сервере №2 не проявилось, но туда схема "приехала" из пакета, а вот на проблемной она создавалась...
Ну вообщем есть тут немного мистики.

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

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

Стоит задача автоматической подстановки в шаблон email сообщения подписи с фотографией Ответственного (Отправитель). Фото берется из карточки контакта.
Данный элемент необходим в середине шаблона, соответственно, настройка подписи из 7.10 не подходит. Кто-нибудь сталкивался с подобной задачей? В какую сторону смотреть?

Нравится

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

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

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

Если очень надо - предлагаю "костыль".
Шаблон письма - тело письма (Активности с типом Email) это валидный HTML
Так что вы можете формировать его на лету в JavaScript, получая картинку контакта - сериализуя ее в Base64 строку и вставляя в тело письма тег с искомым изображением.

о том как в JS получить Base64 строку из картинки или прям тега на странице - см. вот здесь

Да, спасибо. Задача была именно в решении пользовательскими методами) За идею спасибо.

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

Добрый день.

Есть раздел, который администрируется по записям.

Каким образом я могу добавить в Page записи такого раздела деталь [Права доступа]?

Поделитесь решением у кого был подобный опыт реализации.

Нравится

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

Приветствую!:smile:

Права хранятся в таблице Sys[Object]Right ([Object] - объект раздела). Задача:

  1. создать в системе объект (с признаком представление в БД), которое будет повторять таблицу Sys[Object]Right.
  2. На основании созданного объекта можно создать деталь.
  3. Далее представление необходимо создать в БД. Название представления должно совпадать с названием объекта

Общая схема такая.

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

Илья, здравствуйте!

Редактировать данные в представлении нет возможности, т.к по сути это просто выборка из другой таблицы. Но вот если добавить на представление триггеры instead of [insert, delete, update], то такая возможность появляется.:smile:

"Демьяник Алексей" написал:Но вот если добавить на представление триггеры instead of [insert, delete, update], то такая возможность появляется.

А каким образом можно, например из клиентского кода вызывать эти триггеры ?
ESQ - запросом во "вьюху" ?

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

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

Это очень облегчило бы жизнь пользователям и администраторам bpm'online.

Алла, это плохая затея.

Настройка прав работает через webservice. Записи на детали загружаются через ESQ. Настройка прав реализована через действие на странице редактирования.

Пока как временное решение, чтобы видеть какие права розданы на запись может и подойти

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

Добрый день.

Есть раздел, который администрируется по записям.

Каким образом я могу добавить в Page записи такого раздела деталь [Права доступа]?

Поделитесь решением у кого был подобный опыт реализации.

Нравится

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

Очень много оверхеда по коду можно было бы избежать имея возможность передавать аргументы в методы обработчики зависимостей аттрибута.
Например у вас есть 10-ть полей отражающих сущность стоимости "без НДС" и соответвующие им поля "с НДС", вместо того чтобы писать 10-ть методов обработчиков, можно было бы написать один, но передавать в него целевые поля или их имена.
Я пролез по исходникам и нашел занятное поле конфигурационного объекта "argument

                        "SomeFiledwithVAT": {
                                "dependencies": [
                                        {
                                                "columns": ["SomeFiledwithoutVAT"],
                                                "methodName": "VAT_calculate",
                                                "argument": "SomeValue"
                                        }
                                ]
                        }

Таким образом в первый аргумент при вызове метода обработчика попадает "SomeValue"

Далее вопроса два:

1) Как передавать множественные аргументы ? (предусмотрено ли нечто такое ?)
Я естественно проверил "arguments"

                        "SomeFiledwithVAT": {
                                "dependencies": [
                                        {
                                                "columns": ["SomeFiledwithoutVAT"],
                                                "methodName": "VAT_calculate",
                                                "arguments": [null, 1, "SomeText"]
                                        }
                                ]
                        }

но меня ждало фиаско...
тем не менее можно в сам "argument" передавать массив, просто обогатив логику метода сплитом - добиться необходимого.
Хотя кончено это не так эстетично, как если бы можно было
"arguments": [null, 1, "SomeText"]

но тут возникает второй вопрос:

2) Уж больно редко сей аттрибут используется в исходных кодах, есть предположение, что это "костыль" и его могут в любой момент убрать.
Т.е. использовать его при разработке своей логики - авантюризм,
кто ни будь знает это часть нормального долгоживущего функционала или это "костыль" ?

Нравится

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

в метод-обработчик передается
1) то, что в кофинге в свойстве argument
2) название измененной колонки




эта штука там уже с незапамятных времен и вряд ли куда-то денется

"Андросов Дмитрий" написал:

https://learn.javascript.ru/arguments-pseudoarray


Зачем вы меня отправляете читать про псевдомассив arguments ? :biggrin:
В данном случае arguments, я по аналогии с argument - это атрибут анонимного объекта - элемента массива dependencies
атрибуты объекта вольны называться как хочется, хоть ключевыми словами.

var x = {
	var: "var keyword",
	arguments: "pseudo array",
	function: "function keyword"
}
//любуемся
console.log(x)

Псевдомассив аргументов при вызове метода обработчика собирается следующим образом:
первый аргумент: значение атрибута "argument" установленное в dependencies объекте.
второй аргумент: Имя аттрибута текущей модели (поля) по которому сработала зависимость.

Вот вопрос касался как раз "argument"

"Севостьянов Илья Сергеевич" написал:Вот вопрос касался как раз "argument"

arguments нет, как вы могли уже увидеть по исходникам.
Используйте argument, передавая туда массив или объект, и учите ваш метод работать с этим первым аргументом, разбирая его на нужные вам значения.
Логика зависимостей вряд ли поменяется в ближайшее время.

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