В 7.7 появилась как воздух необходимая возможность выбирать в счетах в поле "Клиент" как записи из раздела "Контрагенты", так и из раздела "Контакты". Но вот, в договорах такой возможности нет.
Можно ли данный функционал по аналогии с Контактами реализовать и в Договорах? И если да, то в какую сторону копать, чтобы понять, как это реализовано?
Добрый день, Николай! По структуре данных всё осталось как и раньше: в объекте находятся оба поля: и Контрагент, и Контакт. А вот на странице используется специальный контрол. Вся логика прописана в схеме страницы. Можете взять за пример счет или заказ и скопировать в любую нужную вам сущность.
Николай, необходимо сделать следующее:
- Добавить аттрибут Client с колонками Contact, Account (можно посмотреть в InvoicePageV2)
- В diff добавить поле Клиент и скрыть поля Account и Contact
- Настроить правила фильтрации (несколько полей в договорах вроде по Account фильтруются)
Еще раз спасибо за информацию - все получилось.
Но, столкнулся с одним нюансом. При выборе в поле Client записи из таблицы Contact, у которой в свою очередь проинициализировано поле Account, происходит заполнение поля Account в договоре, но согласно нашей бизнес-логике, такого не должно происходить.
Как я понимаю, это "дело рук" одного из унаследованных бизнес-правил. В связи с этим вопрос - как правильно отключать унаследованные бизнес-правила?
Пока вышел из ситуации переопределением данного бизнес-правила:
Хм... оказалось, не все так просто...
При вводе текста непосредственно в данное поле, происходит поиск по контрагентам и контактам - тут все ОК. Но, при попытке открыть окно выбора (при нажатии кнопки с лупой) на экране появляется пустое окно без контролов, а в консоле браузера наблюдается следующее сообщение об ошибке:
message: Cannot read property 'split' of undefined
date: Tue Dec 15201523:53:11 GMT+1000(VLAT)
moduleId: SectionModuleV2_ContractSectionV2_CardModuleV2_chain00000000-0000-0000-0000-000000000000_LookupPage
moduleName: LookupPage
Я так понимаю, где-то нужно указать правильный LookupPage. Вопрос - где?
Хм... оказалось, не все так просто...
При вводе текста непосредственно в данное поле, происходит поиск по контрагентам и контактам - тут все ОК. Но, при попытке открыть окно выбора (при нажатии кнопки с лупой) на экране появляется пустое окно без контролов, а в консоле браузера наблюдается следующее сообщение об ошибке:
message: Cannot read property 'split' of undefined
date: Tue Dec 15201523:53:11 GMT+1000(VLAT)
moduleId: SectionModuleV2_ContractSectionV2_CardModuleV2_chain00000000-0000-0000-0000-000000000000_LookupPage
moduleName: LookupPage
Я так понимаю, где-то нужно указать правильный LookupPage. Вопрос - где?
Проверил данный способ как на Документах, так и на Договорах. Опишу по пунктам действия:
1. Мастером раздела добавил любое существующее поле, что бы система создала замещающую схему страницы. Что не обязательно, если у вас уже есть в пользовательском пакете замещающая схема для страницы.
2. Убедился что в объекте есть колонки как "Контакт" так и "Контрагент".
7. В расчет не беру того факта что поле "Контрагент" по умолчанию обязательное к заполнению в договоре, но отключить это условие, не должно составить проблем, если то позволяет ваша бизнес логика.
Как итог, все работает:
Возможно причина ошибки в дополнительных действиях. Логика же добавления мультиполя верна.
Версия: 7.7.0.2161
Полный код схемы: https://jsfiddle.net/4x35pknd/
Причину ошибки удалось установить совместными усилиями с техподдержкой.
Дело оказалось в том, что пакете SalesContracts переопределен метод loadVocabulary, из-за этой подмены, карточка не открывалась. Нужно было вернуть методу исходный вид из карточки BasePageV2 и проблема ушла.
На всякий случай, вдруг кому-то еще пригодится, вот этот фрагмент кода:
methods:{
loadVocabulary: function(args, columnName){
var multiLookupColumns =this.getMultiLookupColumns(columnName);
var config =(Ext.isEmpty(multiLookupColumns))?this.getLookupPageConfig(args, columnName):this.getMultiLookupPageConfig(args, columnName);this.openLookup(config, this.onLookupResult, this);}}
"В параметрах очереди нужно выбрать объект, на основании которого она будет формироваться.
Например, для настройки параметров обработки обращений, в поле [Тип очереди] необходимо
выбрать “Обращение”, а для обработки неподтвержденных контактов — “Контакт”. В поле
[Процесс] указывается бизнес-процесс, который запускается в момент, когда оператор берет в
работу тот или иной элемент очереди."
Приведите пожалуйста наглядные примеры того, как могут быть использованы очереди Контактов и Контрагентов.
Очереди Контактов Вы можете использовать в случае, когда Вы хотите провести опрос удовлетворенности среди клиентов, которые воспользовались Вашими услугами в текущем месяце.
Очереди Контрагентов могут использоваться в случаях, когда Вы приглашаете партнеров или клиентов на мероприятие.
В коробочной версии продукта bpm'online ITIL transitions предусмотрен процесс обработки обращений из очереди.
Вы можете самостоятельно настроить процесс для приглашения участников мероприятия. К примеру, такой процесс может включать вопрос пользователю "планирует ли клиент участвовать в мероприятии?" с вариантами ответа "Да", "Нет", "Еще не определился, перезвонить позже" и с соответствующими действиями при выборе каждого из ответов.
Как добавить ответственного менеджера при создании контакта? Захожу в список ответственных лиц, но к сожалению в списке кроме моего контакта никого нет.
Помогите разобраться пожалуйста.
В списке ответственных сотрудников будут отображаться контакты существующих пользователей системы. Для того, чтоб в списке появились другие ответственные менеджеры, необходимо создать для них новых пользователей системы.
bpm'online sales enterprise версия 7.6.0.
А как создать новых пользователей системы? Нужно просто добавить контакт?
Или для этого нужна другая система?
Дмитрий, для создания нового пользователя, необходимо создать контакт с типом "сотрудник" и контрагентом Вашей компании. После чего в разделе "пользователи системы" дизайнера страниц создать нового пользователя, задав ему логин и пароль.
Дмитрий, для создания нового пользователя, необходимо создать контакт с типом "сотрудник" и контрагентом Вашей компании. После чего в разделе "пользователи системы" дизайнера страниц создать нового пользователя, задав ему логин и пароль.
Подскажите пожалуйста. В данной версии я не могу изменять тип продукта? Допустим у меня интернет магазин и в продаже из типовых продуктов имеются крупная, мелкая бытовая техника и т.д. А в в списке имеется только антивирусы и продукты связанные только с компьютерным обеспечением. Есть ли возможность добавить туда продукты другого типа?
Спасибо за Ваше обращение. Мы зарегистрировали его в Службе технической поддержки и назначили специалиста, который сможет Вас компетентно проконсультировать по данному вопросу
Илья, для решения задачи Вам необходимо на PageLoadComplete прописать логику:
- проверить, что создается новая запись и заполнено поле [Контрагент].
- если условие выполняется, фильтровать объект "Контрагент" по полю [Контрагент], считывать значение нужных полей объекта, затем записывать их в поля карточки контакта.
Всем добрый день! Появился такой вопрос. Есть 2 аналогично реализованных функционала контрагент -> Деталь "История" и контакт -> Деталь "История". Но работают они по разному, скажу больше деталь контакта не работает. По логике не должны отображаться кнопки добавить, копировать, изменить и удалить, так как данные в sql запросе просто вытягиваются из всех возможных мест (задачи, воздействия и т.д.), но на деле кнопки подтягиваются, но при нажатии на "добавить" вылетает не обработанное исключение. Причём всё это отлично работает с контрагентами. Может кто сталкивался с данной проблемой. Буду рад любой помощи. Заранее спасибо!!
Спасибо за Ваше обращение. Мы зарегистрировали его в Службе технической поддержки и назначили специалиста, который сможет Вас компетентно проконсультировать по данному вопросу.
Неплохо было бы указать точную версию террасофта.
Не знаю помогла ли вам на этот момент техподдержка, но так как окно унаследовано от стандартного грида, то в нем есть кнопки. Чтобы эти кнопки не отображались, окну надо присвоить свойство
HideButtonsFrame (его можно присвоить на onPrepare самого грида или на RefreshDetails воркспейса контактов)
SetAttribute(Window, 'HideButtonsFrame', true);
Тогда кнопки отображаться не будут.
Но вон у вас на втором скрине дебаггер вылез. Открыли visual studio и она покажет в какой строчке именно ошибка, а там может быть все что угодно и надо уже смотреть, так что если это не поможет и сами не разберетесь, тогда к техпому.
Не знаю помогла ли вам на этот момент техподдержка, но так как окно унаследовано от стандартного грида, то в нем есть кнопки. Чтобы эти кнопки не отображались, окну надо присвоить свойство
HideButtonsFrame (его можно присвоить на onPrepare самого грида или на RefreshDetails воркспейса контактов)
SetAttribute(Window, 'HideButtonsFrame', true);
Тогда кнопки отображаться не будут.
Но вон у вас на втором скрине дебаггер вылез. Открыли visual studio и она покажет в какой строчке именно ошибка, а там может быть все что угодно и надо уже смотреть, так что если это не поможет и сами не разберетесь, тогда к техпому.
3.4.1.145 - версия Террасофта.
По поводу кнопок: не понятно как должно быть точно, ведь в детали контрагента кнопок нет, а ошибка валится при нажатии на кнопку, хотя к кнопке даже edit window не привязан
Для того, что бы реализовать необходимую раздачу прав доступа на запись Контакта, Вам необходимо воспользоваться разделом [Права доступа по умолчанию].
В этом разделе:
1. Выбираете группу Все пользователи
2. Отмечаете раздел [Контакты]
3. Указываете в детали [Доступ] группу Все пользователи - чтение
Во как это должно выглядеть:
Данная раздача прав доступа позволяет автору получить максимальные права доступа на свою запись (прописано в скриптах по умолчанию), Всем пользователям только на чтение, а Администратор и так имеет все права доступа, на него раздавать не обязательно :wink:
Хочу заметить, что данная настройка будет применяться только на новые записи.
Прошу настроить и проверять!
Хорошего дня!
С уважением,
Белецкий Арсений
Группа компаний Terrasoft
"Соляник Алексей" написал:Обошел программно, так оказалось удобнее
Алексей, возможно программно и удобнее в некоторых случаях, но такой подход чреват проблемами. Вы это реализовали в самой карточке? А что если у вас "Контакт" редактируется из разных мест и необязательно через карточку: кастомные запросы update, интеграции на уровне СУБД (хранимки) и т.п.? Правильно логику, которую вы описали, организовывать через существующие права на уровне СУБД, как показал Арсений. Так как это и в карточке будет работать и во всех местах где идет работа с данными Контакта.
Здравствуйте! При внесении каких-либо изменений в контрагенте или контакте, в частности, при добавлении(изменении) комментария на детали «Описание» хотелось бы настроить автоматическое отправление ответственному за этого контрагента или контакта уведомления об этом. Уведомление желательно как внутреннее, так и внешнее - на почту. Можно ли это сделать? И какой порядок действий, если можно?
Добрый день, Александр!
Необхрдимо привязать обработчик на событие OnDatasetAfterPost невизуального элемента dlData d сервисе Common\Details\Description\wnd_Description
Для этого откройте указанный сервис, перейдите к его невизуальным элементам, сфокусируйтесь на dlData. Ниже выберите закладку "События", найдите и встаньте на OnDatasetAfterPost. Оно по умолчанию не задано. Встаньте в поле Значение события (Value) и сделайте двойной клик. В результате этого действия Вы перейдете в сервису Common\Details\Description\wnd_DescriptionScript в котором каретка курсора уже будет стоять в новом обработчикие события:
function dlDataOnDatasetAfterPost(Dataset){//TODO}
Здесь реализуйте логику отправки уведомления сообщения.
Например: если нужно отправлять оповещения только в случае изменения описания добавьте условие:
var ParentWindow = Self.ParentContainer.ParentWindow;if(ExtractUSICodeEx(ParentWindow.USI)=="wnd_AccountsWorkspace"){//TODO}
Получить ID Контрагента и Ответственного можно из датасета
var AccountDataset = ParentWindow.ComponentsByName('dlAccounts').Dataset;
Отправить сообщение ответсвенному можно воспользовавшись базовой функцией SendEmail(Params) из сервиса Common\Library\scr_MailUtils (не забудьте его подключить к wnd_DescriptionScript).
Пример использования SendEmail:
SendEmail({Address:'support@tscrm.com',
Subject:"Запрос в службу поддержки Terrasoft",
BodyFormat:1, Body:"Hello!"});
Создать напоминание можно следующим образом:
var RemindingDataset = GetSingleItemByCode('ds_Reminding');
RemindingDataset.Append();
RemindingDataset.ValAsGUID('ID')= Connector.GenGUID();
RemindingDataset.Values('SubjectID')= AccountDataset.ValAsGUID('ID');
RemindingDataset.Values('SubjectTypeID')= rst_Account;// берется из Common\Dictionaries\Reminding\enm_RemindingSubjectType
RemindingDataset.Values('Description')='Напоминание по Контрагенту.'
RemindingDataset.Values('RemindTime')=new Date().getVarDate();
RemindingDataset.Values('ContactID')= Connector.CurrentUser.ContactID;
RemindingDataset.Post();
RemindingDataset.Close();
Восстановил из *.bak-файла базу данных. Развернул на другой машине - все работает, кроме разделов Контакты и Контрагенты. При попытке сохранить dataset вылетает обшибка 'list index out of bounds (0)'
Продукт Terrasoft Sales, версия 3.4.0.53
База данных бекапилась на MS SQL 2005. Восстанавливали и на 2005 и на 2008 - результат одинаковый.
Все остальное работает. Ошибка выскакивает в момент сохранения в скрипте:
function SaveChanges(BaseDBEdit, Window){ var AddNewRecordOnPage =(BaseDBEdit.Dataset.State== dstInsert);
Window.Attributes('IsAppend')=(BaseDBEdit.Dataset.State== dstInsert);
Window.Attributes('RecordID')= BaseDBEdit.RecordID; var PostResult = BaseDBEdit.Dataset.Post();
Window.Attributes('AddNewRecordOnPage')= (AddNewRecordOnPage && PostResult >0); var Result =((PostResult ==1)||(BaseDBEdit.RecordAlreadySaved)); return Result; }
на строке var PostResult = BaseDBEdit.Dataset.Post();выкидывает сразу в исключение
catch(e){
System.MessageDialog(e.message, mdtError, mdbOK,0);
Result =false; }
return Result;
функции SaveChangesWithCheck(Window, BaseDBEdit, DoNotSendNotify).
Каким образом это можно исправить?
Возникла следующая ошибка при сохранении записи в разделе "Контакты". причем как при редактировании/создании новой, так и просто после открытия карточки и нажатия кнопки "ок". "An inussicient number of arguments were supplied for the procedure or function dbo.fn_ContactLDS"
Вот скриншот:
судя из сообщения (некорректное количество аргументов передано в функцию или процедуру fn_ContactLDS), я думала, что закралась ошибка в эту функцию на уровне SQL-- но количество параметров совпадает, сравнивала с такой же функцией на другой базе 3,4 -- все такое же (разве что -- количество полей, так как в эту базу раньше вносились пользовательские поля).
кеш чистился, обновлялись бинарники с версии 3,4,0,50 до 3,4,0,113 -- не помогло (выскакивает и там, и там).
Александр, спасибо за ссылку. я тоже думала, что проблема связана с поиском дублей и полями в таблице Контакт. Правда, не понимаю, почему она всплыла только сейчас. К тому же поля добавлялись средствами Террасофта, а не Скьюеля.
Не подскажете, как выяснить эти поля (если ошибка, конечно, в этом). Потому что я посчитала поля в таблице тбл_Контакт -- и в ТС, и в скьюеле, и в этой функции их 48, то есть одинаковое количество...
"Ольга Прилипко" написал: К тому же поля добавлялись средствами Террасофта, а не Скьюеля
Проблема ещё в том, что при удалении из ТС в БД они не удаляются.
Если количество одинаковое, можно просто сравнить попарно скрипт таблицы по Ctrl+P в TSAdmin и реальный скрипт создания таблицы, который показывает MS SQL Studio. Для этого можно отсортировать в двух колонках по алфавиту в Excel или специальную программу для merge.
"Зверев Александр" написал:Проблема ещё в том, что при удалении из ТС в БД они не удаляются.
Если все правильно настроено и таблица валидная, поля нормально удаляются.
Нужно также обратить внимание на то, что в этих хранимых нет BLOB-полей, т.е. если в вашей таблице в конфигурации есть поля Description, Photo их не будет в ХП. Таким образом полей в ХП должно быть на 2 меньше.
"Лучкив Александр" написал:Нужно также обратить внимание на то, что в этих хранимых нет BLOB-полей, т.е. если в вашей таблице в конфигурации есть поля Description, Photo их не будет в ХП. Таким образом полей в ХП должно быть на 2 меньше.
Да, так и есть. нет поля "описание" и "фото". все остальное -- одинаковое. Типы полей тоже идентичны.
Кажется, я уже решила проблему. Сначала решила отключить поиск дублей при сохранении записи контакта: Файл -- Настройки -- Правила поиска дублей -- Контакт -- сняты все галочки в колонке "при сохранении записи" (до этого они стояли везде, кроме поля "ФИО"). Проверила -- ошибка не выскакивала. Потом -- а вдруг? -- снова зашла в эти настройки и вернула все, как было. Перезапустила ТС. Потестила. Ошибки больше нет... Возможно, эти действия и исправили проблему (перезаписалась эта функция).
"Зверев Александр" написал:Интересно было бы сравнить старую и новую fn_ContactLDS
да, мне и самой уже интересно.. но я не сохранила(
остался только открытым вопрос -- что привело к этой ошибке? Хотя, наверное, я сама на него и ответила -- какой-то сбой, что-то не так перезаписалось... а при обновлении настроек все стало на места.