Вот такая ошибка, зайти нельзя, бекапа пакетов нет, там дохрена разных разработок. Последнее что делал - успешная компиляция - создал 2 новых сервиса ReportHelper ReportService - копиии базовых с приставкой к именам. Компиляция была успешна, я не проверяя отошол н немного, после прихода оказалось что база выдает вот такое и изменить конфигурацию уже нельзя. Я надеюсь на вашу поддержку и что ктото стыкался с данной проблемой....Изображение удалено.

Нравится

5 комментариев
Лучший ответ

Если не выгружены исходники, то можно попробовать обнулить AssemblyData в базе, предварительно сделав бэкап. Тогда должно сразу при логине пустить в конфигурацию.

 

update SysWorkspace
set AssemblyData = null
where Id='07BA2497-D09B-40EF-92D3-D56F01D426FA' -- Id вашей конфигурации

 

Добрый день, попробуйте зайди в конфигурацию, дописав в конце адреса /dev и откомпилировать.

Данные никакие не устанавливали?

Схемы исходного кода добавляли без публикации (только сохранение) ?

Судя по адресу, сайт у вас локально, попробуйте почитать логи, дам может быть более подробная ошибка. C:\Windows\Temp\BPMonline

0/dev  - не помогло, таже ошибка, соответственно зайти и скомпилировать не могу....

нет не устанавливали

последнее что добавлял я - было успешно скомпилировано

сейчас логи посмотрю

2018-10-30 09:33:16,476 [BPMonlineQuartzScheduler_Worker-5] ERROR SBORKI-TS\Developer Terrasoft.Core.Scheduler.ProcessJobStub SafeSendRequest - System.Net.WebException: Удаленный сервер возвратил ошибку: (500) Внутренняя ошибка сервера.

   в System.Net.HttpWebRequest.GetResponse()

   в Terrasoft.Core.Scheduler.ProcessJobStub.SafeSendRequest(HttpWebRequest request)

 

Наиболее вероятная ошибка, сейчас постоянно пишет в логах

Судя по всему, после создания клонов ReportHelper и ReportService у вас в системе 2 класса с одинаковым именем в одном пространстве имен. Если у вас подключена VisualStudio и включен режим разработки в файловой системе, можно исправить название классов оттуда, не заходя в конфигурацию.

Если не выгружены исходники, то можно попробовать обнулить AssemblyData в базе, предварительно сделав бэкап. Тогда должно сразу при логине пустить в конфигурацию.

 

update SysWorkspace
set AssemblyData = null
where Id='07BA2497-D09B-40EF-92D3-D56F01D426FA' -- Id вашей конфигурации

 

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

В карточке сотрудника нужно вместо поля Photo из контакта отображать другое поле.

Каким образом можно это реализовать, если в карточке сотрудника метод init() реализован таким образом:

                init: function() {

                    this.primaryImageColumnName = "ContactPhoto";

                    this.on("change:OrgStructureUnit", this.onChangedOrgStructureUnit, this);

                    this.callParent(arguments);

                },

То есть мне нужно, чтобы в моей карточке сотрудника в init были 2-я и 3-я строчки, а первая нет.

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

Можно ли вообще каким-то образом указать, чтобы в моем методе вызывались 2-я и 3-я строчки, именно из тех карточек, из которых нужно, а не из непосредственного родителя?

Нравится

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

А если через правила сделать фото невидимым?

Григорий Чех,

Допустим, и что дальше?

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

В init

this.callParent(arguments);

this.set(this.primaryImageColumnName, null);

Григорий Чех,

Не уверенна, что так заработает, но можно попробовать.

Григорий Чех,

Хотелось бы по данному вопросу услышать комментарий службы поддержки!

Можно попробовать заместить модуль, в котором описана данная логика 

init: function() {

       this.primaryImageColumnName = "ContactPhoto";                                               this.on("change:OrgStructureUnit",this.onChangedOrgStructureUnit, this);

       this.callParent(arguments);

    }

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

Колодяжный Владислав Эдуардович,

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

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

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

Мне нужно было бы всего-то переопределить эту функцию и все.

 

но смысл тогда в базовых разделах, особенно, таком, как сотрудники.

Смысл, внезапно, в ведении информации о сотрудниках.

Весь вопрос в том, что метод реализован некорректно

Метод реализован корректно. Фото выводится.

По поводу обнуления после вызова this.callParent(arguments), то в странице SysProcessUserTaskPage есть такое обнуление:

onImageChange: function(image) {
    if (!image) {
        this.set(this.primaryImageColumnName, null);
        return;
    }

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

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

Смысл, внезапно, в ведении информации о сотрудниках.

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

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

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

Метод реализован корректно. Фото выводится.

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

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

Но доработанную логику нужно тестировать.

Да, теперь мне придется, чтобы доработать свою логику, "забить" костыль devil

Я немного в шоке. Вместо пары строк кода вы развели вайн на пару страниц.

init: function(callback, scope) {
	//сначала вызовутся родительские init-методы
	this.callParent([function() {
		debugger;
		//тут можно занулить this.primaryImageColumnName
		callback.call(scope);
	}, this]);
}

Зверев Александр,

Это всё замечательно, но вот ситуация: я захотел заместить в одной схеме ViewModel. Модули (внезапно!) с 7.13 замещать нельзя. Ну ок, делаем свой через extend. Лезем в схему, а там прямо в init зашита сторчка а-ля:

this.viewModelName = '123'; this.callParent(arguments);

Ну клёво теперь. И как в таком случае менять что-либо? (принимая во внимание, что 95% пользователей не знают о коде выше). Делать сначала callParent, а потом простановку своего viewModelName — бред. Привет асинхронность, непонятно какое присвоение выполнится первее. Таймауты/деферы - костыль. Так-то вынести всю кастомную логику из init  в отдельную функцию - правильнее будет. 

PS. Пользуясь случаем - какой гений догадался запретить перегруз модулей?

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

Варфоломеев Данила пишет:

Так-то вынести всю кастомную логику из init  в отдельную функцию - правильнее будет

Так вот об этом же и речь, что нужно не только реализовать "шоб работало", но и так, чтобы потом с этим другие могли работать! 

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

В 3.Х и 5.Х не было разграничений по пакетам, весь код доступен для изменений, но там и нет автоматизации обновления конфигурации на новые версии.

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

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



После прочтения документации вижу так:

  1. настроить необходимое в разделе [Лиды] в CRM
  2. сформировать ссылку в письме с нужными параметрами
  3. на сайте проверять параметры в ссылке

  4. при необходимости ставить куку - флаг первого посещения
  5. если посещение первое, то динамически создавать и программно сабмитить форму

Если кто то уже решал такую задачу более просто, опишите процесс концептуально (или подтвердите верность моего видения :), расскажите, какие подводные камни могут быть?

Нравится

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

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

http://адрес_сайта.com/0/ServiceModel/GeneratedObjectWebFormService.svc/SaveWebFormObjectData

Клиентская логика — в общедоступных скриптах:

https://webtracking-v01.bpmonline.com/JS/track-cookies.js
https://webtracking-v01.bpmonline.com/JS/create-object.js

Серверная — в схеме GeneratedObjectWebFormService.

Другой вариант — писать полностью свой сервис с нужной функциональностью, доступный извне без авторизации.

Спрашивали - отвечаем.

Если в ссылке будет передан параметр bpmContactEmail="email@email.email", этот код зарегистрирует лида и привяжет к контакту с почтовым ящиком email@email.email. Ловушка для лида должна быть настроена в разделе [Лендинги].

/*Форма авторегистрации по ссылке из Email*/
					var configAutoReg = {
						fields: {
							"Email": ".bpm-contact-email" // Email посетителя
						},
					    landingId: "00000000-0000-0000-0000-000000000000", // ID лендинга, смотреть в шаге 2 настройки лендинга
					    serviceUrl: "http://CRM_SITE_DNS_NAME/0/ServiceModel/GeneratedWebFormService.svc/SaveWebFormLeadData",
						redirectUrl: ""
					};
					function createLeadFromAutoReg() {
						landing.createObjectFromLanding(configAutoReg)
					};
 
					//функция позволяет выполнять действие (регистрацию лида) один раз
					//взята тут https://developer.mozilla.org/ru/docs/Web/API/Document/cookie#Example_5_Do_something_only_once_%E2%80%93_a_general_library
					function executeOnce () {
						var argc = arguments.length, bImplGlob = typeof arguments[argc - 1] === "string";
						if (bImplGlob) { argc++; }
						if (argc < 3) { throw new TypeError("executeOnce - not enough arguments"); }
						var fExec = arguments[0], sKey = arguments[argc - 2];
						if (typeof fExec !== "function") { throw new TypeError("executeOnce - first argument must be a function"); }
						if (!sKey || /^(?:expires|max\-age|path|domain|secure)$/i.test(sKey)) { throw new TypeError("executeOnce - invalid identifier"); }
						if (decodeURIComponent(document.cookie.replace(new RegExp("(?:(?:^|.*;)\\s*" + encodeURIComponent(sKey).replace(/[\-\.\+\*]/g, "\\$&") + "\\s*\\=\\s*([^;]*).*$)|^.*$"), "$1")) === "1") { return false; }
						fExec.apply(argc > 3 ? arguments[1] : null, argc > 4 ? Array.prototype.slice.call(arguments, 2, argc - 2) : []);
						document.cookie = encodeURIComponent(sKey) + "=1; expires=Fri, 31 Dec 9999 23:59:59 GMT" + (bImplGlob || !arguments[argc - 1] ? "; path=/" : "");
						return true;
					};
 
					// функция возвращает значение указанного парметра из ссылки
					function getSearchParams(k){
						var p={};
						location.search.replace(/[?&]+([^=&]+)=([^&]*)/gi,function(s,k,v){p[k]=v})
						return k?p[k]:p;
					};
 
					jQuery(document).ready(function() {
						var bpmContactEmail = getSearchParams("bpmContactEmail");
						if (bpmContactEmail && bpmContactEmail !== "[") {
 
							executeOnce(function() {
								landing.initLanding(configAutoReg);								
								var $form = $("<form />", { style: "display: none;", onSubmit: "createLeadFromAutoReg(); return false" });
								$form.append($("<input />", { class: "bpm-contact-email" , name: "bpmContactEmail", value: bpmContactEmail}));
								$form.appendTo("body").submit().remove();
							},
							"bpmLeadFromEmail");
 
						}
					});

 

Зверев Александр,

да не, все проще оказалось, в bpm все настройки только стандартные, а на сайте легкая доработка :)

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

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

Добрый день!



Столкнулся с проблемой: письма видят только те люди, кто участвуют в процессе ее обработки. Но обработкой писем занимаются 10% от всех пользователей. Поэтому надо настроить права на чтение через БП. 



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



Стандартный процесс "Переоткрытие по входящему письму..." не запускается (обработка писем идет вручную), поэтому не предлагать это решение.



Заранее спасибо за помощь.

Нравится

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

Попробуйте создать БП  с стартовым сигналом создание активности с типом Email (те в сигнале объект активность,а в фильтрах тип=Email)

Права нужно менять этого же объекта те по созданию активности с типом email (входящего) вы из стартового сигнала вычитываете id созданной записи и на нее раздаете права!

В последних версиях появилась настройка, дающая права на письма определённым ролям 

Владимир Соколов,

Это с какой версии и где? Может есть такое, а я не знаю



Григорий Чех,

К сожалению, БП просто не запускается с таким стартовым сигналом

Быстров Сергей,

1) Как  вы получаете письма? У вас своя какая то интеграция с почтовой системой?

2) Выложите принскрины вашего БП с параметрами стартового сигнала

Григорий Чех,

Ошибка оказалась банальней некуда - был выключен БП. Включил и все заработало. Права на письма раздаются. Спасибо за помощь.



Вообще не подумал, что БП может быть выключен 

Может кто подсказать, если я хочу стартовать БП не с добавления активности (что сейчас и работает), а с нажатия кнопки "Обработать" (на скриншоте) - http://prntscr.com/lc5pf7

Итог:



Стартовый сигнал: Активность; фильтр: "Тип"=почта, "Нуждается в обработке"=нет



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

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

Возникла задача в Select сравнивать ID с коллекцией.

Коллекция находится другим запросом Select. Сейчас выглядит все так-то так:

var userConnection = Get<UserConnection>("UserConnection");
var group = Get<string>("GroupID");
 
var selectID = ((Select)Select(userConnection)
   .Column("SysAdminUnitId")
   .From("SysAdminUnitInRole")
   .Where("SysAdminUnitRoleId").IsEqual(Column.Const(group))).ExecuteScalar<string>();
 
var select = ((Select)(new Select(userConnection)
   .Column(Func.Count("Id"))
   .From("SysUserInRole")
   .Where("SysRoleId").IsEqual(Column.Parameter(new Guid("3DAFC997-65E9-47E4-9434-F036077D66F4")))
   .And("SysUserId").In((selectID)))).ExecuteScalar<int>();
 
Set("BossInGroup", select);  
 
return true;

И если у меня 1 параметр, все отрабатывает как задумано. Стоит вопрос - как переделать первый Select и добавить его во второй?



Буду признателен за помощь.

Нравится

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

Вот так (без ExecuteScalar во внутреннем Select):

new Delete(UserConnection).From("ActivityParticipant")
	.Where("ParticipantId").IsEqual(Column.Parameter(Entity.ParticipantId))
	.And("Id").IsNotEqual(Column.Parameter(Entity.Id))
	.And("ActivityId").In(
new Select(UserConnection)
	.Column("ActivityId")
.From("ActivityParticipant")
.Where("ParticipantId").IsEqual(Column.Parameter(Entity.ParticipantId)))
.Execute(dbExecutor);

 

var userConnection = Get&lt;UserConnection&gt;("UserConnection");
var group = Get&lt;string&gt;("GroupID");
 
var select = ((Select)(new Select(userConnection)
   .Column(Func.Count("Id"))
   .From("SysUserInRole")
   .Where("SysRoleId").IsEqual(Column.Parameter(new Guid("3DAFC997-65E9-47E4-9434-F036077D66F4")))
   .And("SysUserId").In(new Select(userConnection)
   .Column("SysAdminUnitId")
   .From("SysAdminUnitInRole")
   .Where("SysAdminUnitRoleId").IsEqual(Column.Const(group))))).ExecuteScalar&lt;int&gt;();
 
Set("BossInGroup", select);  
 
return true;

Спасибо, все получилось.

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

Как можно создать печатную форму по объекту детали? При выборе объекта доступны только разделы

В результате нужно вывести печать в меню действий детали

Изображение удалено.

Нравится

2 комментария
Лучший ответ

Григорий Чех,

Я так понимаю, что весь вопрос в том и состоит, чтобы сделать отчет стандартными средствами.

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

Коробочный механизм позволяет выбрать только разделы. Выможете свой вариант печати добавить в меню действия раздела (не печати) или вывести отдельную кнопку

Григорий Чех,

Я так понимаю, что весь вопрос в том и состоит, чтобы сделать отчет стандартными средствами.

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

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

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

Изображение удалено.

Нравится

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

Для решения проблемы попробуйте актуализировать роли.

Если актуализация ролей не решит проблему, попробуйте ещё очистить Redis.

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

Ефанов Иван Александрович пишет:

Скажите, а дело может быть в лицензиях?

Думаю, что дело не в лицензиях.

Проверьте ещё настройку прав доступа к объекту SysDashboard на локальной версии и на тестовом сервере.

Права на операции с объектом SysDashboard отличаются, но даже после того как выставил всем ролям право на добавление, кнопка добавить так и не стала активной.

А теперь повторите действия из первого комментария Аллы.

Так и сделал сразу, не помогло к сожалению(

А если открыть пункт «Настроить права доступа», который на Вашем скриншоте не заблокирован, и настроить там?

Ефанов Иван Александрович,

Попробуйте скомпилировать все в конфигурации.

Алла Савельева пишет:

Ефанов Иван Александрович,

Попробуйте скомпилировать все в конфигурации.

Тоже не повлияло никак. Пункт Настроить права доступа вызывает настройки прав к конкретному графику, там все ок.

Если есть два сервера и на одном работает, а на другом — нет, нужно искать отличия. Например, посмотреть SQL-запросы в профайлере в момент открытия режима итогов раздела.

Судя по коду, доступность пунктов меню стандартно реализована в схеме DashboardBuilder и действительно связана с правами на «итог» (SysDashboard). То есть либо в той системе доработаны скрипты этой схемы (но тогда непонятно, почему именно на базе разработки нормально), либо всё же дело в правах.

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

 

Мы такое решали с поддержкой. Решили исправительным запросом на ТОЙ стороне вроде.

Дмитрий Степанов пишет:

Мы такое решали с поддержкой. Решили исправительным запросом на ТОЙ стороне вроде.

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

Если лицензии read only, все кнопки заблокируются.

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

Колодяжный Владислав Эдуардович пишет:

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

Измененных схем нет, да и если бы они были, то через свн прилетели бы и на среду разработки. 

Если бы их не было и права одинаковые, то работало бы тоже одинаково. Ищите разницу либо в правах, либо в логике.

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

Добрый день!

Подскажите, пожалуйста, можно ли сделать так чтобы значение справочного поля равнялось значению атрибута. Чтобы вопрос не казался странным, расскажу откуда растут корни. В атрибуте храниться значение Id продукта, который подбирается сложным, составным фильтром. Это значение надо передать в справочное поле продукта (привязанное к детали страницы), которое будет скрыто. Почему сделано так, потому что не смог реализовать комплексный фильтр к справочному полю детали (не нашел подходящего примера).

Нравится

7 комментариев
Лучший ответ

А что мешает например при загрузке загрузить в справочник ваше значение атрибута и настроить чтоб при изменении атрибута менялось значения справочника или вам что-то другое нужно?  Обмен данными между страничкой и деталью можно через подписку на события реализовать.Таким событием может стать например изменение атрибута(виртуальной колонки)

Можете более подробно описать Вашу задачу (со скриншотами интерфейса пользователя), что и куда Вы хотите передавать?

Да. Вот моя страница подбора продукта.

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

Руслан Хасанов пишет:

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

Если Вам нужно сохранить нужный продукт в деталь, то сделать это можно либо с помощью бизнес-процесса, либо с помощью классов InsertQuery для клиентской или серверной части приложения bpm'online.

На самом деле хотелось бы просто передать значение Id продукта на клиентской схеме. Вариант прямого сохранения в объект детали используя запрос не удобен тем что:

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

2. Второе происходит из первого - надо проверять есть ли такой Id в детали, если да то йпдейт. 

3. Надо переопределить кнопку сохранения

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

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

А что мешает например при загрузке загрузить в справочник ваше значение атрибута и настроить чтоб при изменении атрибута менялось значения справочника или вам что-то другое нужно?  Обмен данными между страничкой и деталью можно через подписку на события реализовать.Таким событием может стать например изменение атрибута(виртуальной колонки)

Да, Григорий, мне так и надо сделать, чтобы в значение справочника устанавливалось значение атрибута. Мешает недостаток опыта, я не могу найти пример кода как это сделать. Если есть возможность, приведите, пожалуйста, пример. Спасибо огромное!

Нашел ветку в которой обсуждалась данная тема https://community.terrasoft.ru/questions/znacenie-v-pole-spravocnik

Вот решение для этого вопроса: 

this.loadLookupDisplayValue("Type", constants.ContractType.Standard);

Большое спасибо Сергею за подсказку.

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

Делаю запрос к БД из элемента "Задание-сценарий":

 

var userConnection = Get<UserConnection>("UserConnection");
var group = Get<string>("ProcessSchemaParameter1");
 
string selectID = ((Select)new Select(userConnection)
   .Column("t1", "SysAdminUnitId")
   .From("SysAdminUnitInRole").As("t1")
   .Join(JoinType.Inner, "SysAdminUnitInRole").As("t2")
   .On("t2", "SysAdminUnitInRole").IsEqual("3DAFC997-65E9-47E4-9434-F036077D66F4")
   .And("t1","SysAdminUnitId").IsEqual("t2","SysAdminUnitId")
   .Where("t1", "SysAdminUnitRoleId").IsEqual(group)).ExecuteScalar<string>();
string contact = ((Select)new Select(userConnection)
	.Column("ContactId")
	.From("SysAdminUnit")
	.Where("Id").IsEqual(selectID)).ExecuteScalar<string>();
 
Set("ProcessSchemaParameter1", contact); 
 
return true;

И тут появилось 2 момента:

1) как записать в параметр процесса результат (не текстом, а полноценным id)

2) при использовании такого кода выдает ошибки:

Invalid column name '3DAFC997-65E9-47E4-9434-F036077D66F4'

Invalid column name 'a7e3d18a-0f2d-444d-be2b-cd625dc3c097'

Invalid column name 'SysAdminUnitInRole'

Нравится

2 комментария
Лучший ответ

Ошибки у Вас возникают из-за того, что некорректно построен запрос с помощью класса Select.

1. Invalid column name '3DAFC997-65E9-47E4-9434-F036077D66F4'

IsEqual("3DAFC997-65E9-47E4-9434-F036077D66F4") замените на 
IsEqual(Column.Parameter(new Guid("3DAFC997-65E9-47E4-9434-F036077D66F4")))

2. Invalid column name 'a7e3d18a-0f2d-444d-be2b-cd625dc3c097'

IsEqual(group) на
IsEqual(Column.Const(group))

Аналогично и с IsEqual(selectID)

3. Invalid column name 'SysAdminUnitInRole'

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

Относительно первого вопроса: по-моему, Вы неправильно получаете нужные Вам значения. Как это делать можно посмотреть в таких постах: https://community.terrasoft.ru/articles/bpmonline-kak-opredelit-avlaetsa-li-tekusii-polzovatel-administratorom и https://community.terrasoft.ru/questions/pravilnoe-ispolzovanie-dbexecutor

Также хочу обратить Ваше внимание, что получить нужные значение можно с помощью класса EntitySchemaQuery. Более подробно можно почитать здесь.

Ошибки у Вас возникают из-за того, что некорректно построен запрос с помощью класса Select.

1. Invalid column name '3DAFC997-65E9-47E4-9434-F036077D66F4'

IsEqual("3DAFC997-65E9-47E4-9434-F036077D66F4") замените на 
IsEqual(Column.Parameter(new Guid("3DAFC997-65E9-47E4-9434-F036077D66F4")))

2. Invalid column name 'a7e3d18a-0f2d-444d-be2b-cd625dc3c097'

IsEqual(group) на
IsEqual(Column.Const(group))

Аналогично и с IsEqual(selectID)

3. Invalid column name 'SysAdminUnitInRole'

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

Относительно первого вопроса: по-моему, Вы неправильно получаете нужные Вам значения. Как это делать можно посмотреть в таких постах: https://community.terrasoft.ru/articles/bpmonline-kak-opredelit-avlaetsa-li-tekusii-polzovatel-administratorom и https://community.terrasoft.ru/questions/pravilnoe-ispolzovanie-dbexecutor

Также хочу обратить Ваше внимание, что получить нужные значение можно с помощью класса EntitySchemaQuery. Более подробно можно почитать здесь.

Алла Савельева,

Спасибо за помощь, это помогло мне решить проблему

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

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

На странице Обращений есть удобный способ подстановки в текст письма изображения - непосредственно из буфера обмена.

Изображение удалено.

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

Изображение удалено.

Нравится

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

Стандартно такой возможности нет. Разве что делать свою доработку. Можно вставить только картинку, уже опубликованную на каком-то сайте, если скопировать текст с картинкой из браузера. Аналогично и с лентой, см. обсуждение.

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