Вопрос

Добрый день, при попытке слияния двух контаков, если у проигравшего есть заказ, то процесс дедупликации падает с ошибкой: 

System.Data.SqlClient.SqlException (0x80131904): Конфликт инструкции DELETE с ограничением REFERENCE "FKZt10BIrUNMXjPYmQeSNwKs8aI". 
Конфликт произошел в базе данных "ClarinsInstall", таблица "dbo.Order", column 'ContactId'.

При отладке не увидела ContactId, среди ключей таблицы Order, по которым идет перепривязка данных (есть только CreatedById и OwnerId),
подскажите, с чем это может быть вызвано?

У меня такой же вопрос

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

Это как раз и значит наличие записи в Order, ссылающееся полем ContactId на сливаемый контакт. Проверьте Order в дизайнере объектов, там должно быть такое справочное поле. А если нет, то было и его удалили в объекте, но по какой-то причине осталось в базе (возможно, объект не скомпилировали). В таком случае, если есть возможность, подключитесь к БД, найдите эту запись и замените значение ContactId на null.

Зверев Александр пишет:
Проверьте Order в дизайнере объектов, там должно быть такое справочное поле. А если нет, то было и его удалили в объекте, но по какой-то причине осталось в базе (возможно, объект не скомпилировали).

Если проблема, действительно, в этом, то нужно не выполнять обновление конкретной записи в Order, а определиться с необходимостью наличия поля Contact в Order и в зависимости от принятого решения либо добавить в entity schema Order данное поле и скомпилировать схему, если его нет, либо удалить из таблицы в базе данных, если оно не нужно.

Иначе проблема может воспроизвестись при следующем слиянии дублей.

Кстати, не уверен, что повторное добавление поля в объект пройдёт успешно без последствий. У колонки в базе прописывается GUID в Extended Properties, он будет уже другим.

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

Добрый день!

Столкнулись со свойством "Объект доступен на портале как раздел" в объекте в блоке "Поведение" и никак не получается разобраться с "подкапотной" частью: зачем это свойство нужно? Что происходит при его простановке в объекте?

Буду очень благодарна за помощь!

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

У меня такой же вопрос

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

Татьяна, добрый день.

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

 

Мотков Илья, Спасибо большое!

При добавлении раздела в РМ "Портал" этот признак не проставляется (в том числе и при добавлении в справочник объектов, доступных пользователям портала), но поле все равно в дизайнере объекта открыто для редактирования. Это на 7.14, по крайней мере. Смысл от него тогда не особо понятен.

Тогда будем ждать обновленную документацию в академии.

Еще раз спасибо :)

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

Создаю http соединение.

Получаю куки от /ServiceModel/AuthService.svc/Login

Вынимаю BPMCSRF

Создаю два заголовка: "BPMCSRF" и "Content-Type", "application/json;charset=utf-8"

Отправляю запрос к  /0/rest/KmAccountIntegrationService/AccountImportRU

Получаю ответ  401. Что делаю не так?

У меня такой же вопрос

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

Возможно, кроме BPMCSRF забыли передать обычную авторизационную куку. Примеры кода для авторизации есть тут и в соседних статьях, но они не на 1С.

Можно сравнить нормально проходящую авторизацию и обращение к веб-сервису при помощи браузера с неудачной попыткой из 1С при помощи Fiddler, поверить, в чём отличие.

Спасибо за ответ. Обычная авторизационная кука целиком передается через Json в теле запроса или в заголовке Cookie строкой или иначе?

Я обычно не парюсь, и все, что получаю от авторизации использую в последующих запросах

ServicePointManager.ServerCertificateValidationCallback = (s, cert, chain, ssl) => true;
var req = WebRequest.Create(string.Format("{0}/0/rest/{1}/{2}", url, service, metod)) as HttpWebRequest;
req.CookieContainer = AuthCookie;
req.Method = "POST";
req.ContentType = "application/json";
 
CookieCollection cookieCollection = AuthCookie.GetCookies(new Uri(url));
string csrfToken = cookieCollection["BPMCSRF"].Value;
req.Headers.Add("BPMCSRF", csrfToken);

На практике там обычно 4 параметра, все кидаем через заголовки.

Варфоломеев Данила, 

Отправляю запрос

Ответ

 

 

Смущает «Authorization: Basic» в запросе на скриншоте. Ведь «Basic» и «Forms (Cookies)» — это два разных способа аутентификации. И если залогиниться в систему в браузере и посылать запросы к OData, такого заголовка нет.

Взлетел

Спасибо, очень помогли

Так в чём разница, в капсе у BPMCSRF?

Приходящие куки парсить и загонять строкой в заголовок Cookie. Еще отдельно BPMCSRF заголовок добавить, капс не важен

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

Добрый день!

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

Спасибо!

У меня такой же вопрос

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

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

На самом деле речь идет об одной странице браузера. Имеется ввиду основная закладка "Данные о продаже" и соседняя - "Продукты". Ввожу скидку/наценку по продаже и хочу передать эту информацию в деталь для пересчета, но пока не переключишься на закладку "Продукты" сообщение не передается. Видимо это и правильно, но хотелось бы чтобы данные пересчитались, не зависимо от того активировали вкладку или нет. Может есть какое то более правильное решение?

Если деталь ещё не загружена, то можно внести изменения в данных на уровне её объекта и при загрузке они уже будут учтены. Иногда наоборот, удобно, что деталь ещё не загружена. Например, добавили к сущности задачу через миникарточку, переключились на нужную вкладку, она загрузилась  и задача на ней появилась. А если вкладка уже загружена, то нет, нужно заново открывать всю запись.

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

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

В том то и дело что я еще не знаю как можно это сделать. 

Что мешает в схеме одной детали писать данные в ESQ объекта другой детали? Данные попадут в базу и при открытии первый раз второй детали оттуда подтянутся. А если нужно, чтобы и не при первом открытии данные были, можете скомбинировать с Вашей изначальной логикой.

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

Соседняя деталь загружается не принудительно, а в момент перехода в неё. Если хотите переделать стандартную логику инициализации деталей, смотрите на DefaultTabName и работу с ним в BasePageV2.

Спасибо, Александр!

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

Добрый день!
Есть настроенная страница редактирования продукта. Где то вычитал (уже не найду) что она транслируется на деталь с реестром. Так ли это на самом деле или все надо дублировать в схеме детали? Если да, то в моем случае на странице запрещенные для редактирование поля в детали доступны для редактирования. При выборе справочного поля изменялись зависимые поля, в реестре нет. 

У меня такой же вопрос

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

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

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

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

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

Страница карточки (например, AccountPageV2) и детали (например, AccountRelationshipDetailV2) задаются в разных схемах со своей логикой и связаны с разными объектами и их таблицами в базе.

Александр, в моем случае это OpportunityProductPageV2 и OpportunityProductDetailV2. 

Это не меняет сути.

Подскажите, пожалуйста, Александр, где прописана логика расчета стоимости продукта для детали OpportunityProductDetailV2. Я в схеме детали не вижу методов расчета суммы. Они есть в схеме страницы детали OpportunityProductPageV2. Я считал что метод расчета колонок берется из страницы детали.

Вероятно, во встроенном БП объекта OpportunityProductInterest в скрипте CalckOpportunityAmountAfterSevedScriptTask и вызываемой им функции CalckOpportunityAmount.

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

recalculateAmount: function() {
	var price = this.get("Price");
	var quantity = this.get("Quantity");
	if (price && quantity) {
		this.set("Amount", price * quantity);
	}
}

 

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

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

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

См. тут.

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

Привет,

Столкнулся с проблемой:

Версия: 7.13.4.638_SalesEnterprise_Marketing

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

У меня такой же вопрос

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

Добрый день!

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

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

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

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

 

Столкнулся с проблемой. 

1) На форме обращения дублируется поле "Сервисный договор", несмотря на то, что в конструкторе раздела отображается только одно 

2) Порядок полей на форме не соответствует порядку полей в конструкторе

Бизнес-правила отключил. 

Конфигурацию перекомпилировал полностью. 

Скрины вложением

Помогите понять в чём проблема ? 

 

У меня такой же вопрос

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

Это может быть из-за того, что расположение полей задано в схеме кодом, слишком сложным для разбора мастером разделов. Откройте схему CasePageV2 и поищите упоминания этого поля в пакете Custom с Вашими изменениями и в других пакетах.

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

Предлагаете его переопределить?

Когда Вы меняете в мастере, оно и так переопределяется, в пакете Custom создаётся CasePageV2 с новым порядком полей. Но, видимо, в одном из пакетов выше по иерархии описано иначе и конфликтует.

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

Добрый день!

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

Спасибо!

У меня такой же вопрос

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

Здравствуйте! На Маркетплейс есть решение которое определяет запущенные процессы по объекту - https://marketplace.terrasoft.ru/app/processes-log-view-bpmonline

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

Добрый день! Наследуюсь от объекта Activity, далее наследуюсь уже от своей Активности .

Затем, добавляю в базовую Активность поля, которые автоматически появляются в остальных объектах. Но, чтобы можно было использовать эти поля, необходимо  делать публикацию каждого наследуемого объекта. 

Вопрос: есть ли возможность избежать такой последовательной публикации объектов?

У меня такой же вопрос

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

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

Сидоров Александр В.,

Спасибо!

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

Добрый день ! BPM'online v 7.13.4.638. Необходимо программно отобразить карточку входящего/исходящего звонка пользователя. Известны номер А (исходящий), номер B (входящий), тип звонка (IN/OUT). Нашел в пакете CTIBase 7.8.0 метод CallPageV2 (схеме отображения карточки звонка). Как увидеть внешнюю форму, которую реализует этот метод, и вызвать метод программно из приложения (API) ?

У меня такой же вопрос

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

CallPageV2 — это не метод, а страница карточки звонка. Если Вы собираетесь открывать её в БП и знаете Id записи об этом звонке, то для этого предусмотрен элемент процесса «Открыть страницу редактирования» с возможностью передать туда параметры. С его же помощью можно и открыть карточку новой записи с нужными значениями в полях.

chapter_process_designer_edit_page.png  

Элемент «Открыть страницу редактирования» содержит список возможных для редактирования страниц, среди которых нет карточки звонка. Это происходит потому, что страница звонка является системным объектом, и в результате не проходит фильтрацию данного элемента. То есть, на уровне БД в таблице SysModule у объекта с Code = «Call» колонка IsSystem = true. Если убрать признак IsSystem, то страница звонка начнет отображаться в списке страниц элемента, однако не рекомендуется этого делать, так как это может быть чревато другими непредсказуемыми последствиями в системе.

Войдите или зарегистрируйтесь, чтобы комментировать