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

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

Результат на скриншоте. Описание реализации в прикрепленном файле.

111

Нравится

Поделиться

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

Мы подобный функционал реализовали через добавленный столбец под названием "Последний раз" в таблицу Контактов и Контрагентов. В скрипт редактирования Задачи добавили функцию "вносить в поля Последний раз прикрепленного Контакта и Контрагента текущую дату при сохранении Задачи".

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

Интересное решение, благодарю :)

"Переведенцев" написал:. В скрипт редактирования Задачи добавили функцию "вносить в поля Последний раз прикрепленного Контакта и Контрагента текущую дату при сохранении Задачи".

Не могли бы вы выложить пример вашей реализации.

Заранее благодарен.

"Владимир С." написал:
Переведенцев пишет:

. В скрипт редактирования Задачи добавили функцию "вносить в поля Последний раз прикрепленного Контакта и Контрагента текущую дату при сохранении Задачи".

Не могли бы вы выложить пример вашей реализации.

Заранее благодарен.

Выкладываю пример реализации во вложении.

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

Нужно импортировать контрагентов и платежные реквизиты из 1С. Структура данных в 1С и TS очень различается, что затрудняет импорт. Сейчас контрагенты импортируются так, как показано на приложенных скриншотах. Хотелось бы чтобы в платежных реквизитах не было отдельной записи с инн, кпп, окпо, а эти данные указывались в каждой записи с банком и р/с. Как такое можно реализовать? То есть главный вопрос тут, как получить доступ, при импорте подчиненной детали, к родительским данным?

Нравится

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

Очень жду Вашего ответа

Удалите настройку "инн, кпп, окпо".
В скрипте настройки "р/с", в событии BeforeRecordImport
добавьте что-то на подобии:

Dataset('INN') = Select1C.QueryLink.Владелец.ИНН;

Спасибо, помогло.

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

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

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

Нравится

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

Данная тема уже подымалась на комьюнити. Насколько я знаю готовых решений нет. Вам следует посмотреть реализации алгоритмов "нечеткого поиска" на других интернет ресурсах, например на SQL.ru

Наверное, не совсем правильно описал проблему.
Хочу получить в списке дублей такие же результаты, как если в Настройках пользователя -> Общие -> Быстрый фильтр, фильтра типа like имеет значение "Включает" или по умолчанию).
И при сохранении КА выполнялась проверка существование подобных записей по типу:

WHERE (Name LIKE N'%' + @name + N'%')

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

Спасибо.

McCoy, привожу пример реализации поиска дублей по like. К сожалению, из-за ограничения во времени пример доработан не полностью: дубли находит, но некорректно отображает их количество в реестре родительской детали (всегда равно 1). Но думаю, для примера пока будет достаточно и этого.

Для реализации необходимой Вам функциональности нужно следующее:

1. По аналогии с функцией AddDetailFilter скрипта scr_SubjectDuplicates, необходимо создать свою функцию, использующую Like-фильтр, и использовать её вместо AddDetailFilter в скриптах поиска дублей:

function AddDetailFilterLike(Select, Dataset, DataFieldName) {
	var DataField = Dataset.DataFields.ItemsByName(DataFieldName);
	var Filters = Select.Filters;
	var CompareFilter = AddLikeFieldFilter(Select, DataFieldName, DataFieldName, ltContain, Filters);
}

2. По аналогии с функцией AddCountCompareFilter скрипта scr_DuplicatesUtils создать свою функцию и использовать её вместо вышеуказанной:

function AddCountCompareFilterLike(ExpressionFilters, ParentFromTable, 
	ParentFromTableAlias, SelectFromTable, SelectFromTableAlias, 
	CheckFieldName) {
	var TestField = ParentFromTable.Fields.ItemsByName(CheckFieldName);
	var ValueField = SelectFromTable.Fields.ItemsByName(CheckFieldName);
	var CompareFilter = ExpressionFilters.CreateLikeFilter();
	CompareFilter.Code = GenNewKeyValueFromCollection(ExpressionFilters, 'LikeFilter');
	ExpressionFilters.Add(CompareFilter);
	CompareFilter.TestExpression = AddFieldExpression(ExpressionFilters, 
		CompareFilter, TestField, SelectFromTableAlias);
	CompareFilter.LikeType = ltContain;
	CompareFilter.ValueExpression = AddFieldExpression(ExpressionFilters, 
		CompareFilter, ValueField, ParentFromTableAlias);
	return CompareFilter;
}

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

Олег Лабьяк,
разработчик,
3-я линия Службы поддержки Terrasoft.

Спасибо!

Пожалуйста :).

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

Олег Лабьяк,
разработчик,
3-я линия Службы поддержки Terrasoft.

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

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

Terrasoft CRM X25 3.1.0.16
Спасибо!

Нравится

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

Посмотрите фильтры TaskFilter и TaskFilters в sq_Account и сделайте по аналогии.

Получилось. Большое спасибо :)

Всегда пожалуйста.

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

Добрый день.

Каким образом нужно собрать фильтр на детали Контрагенты, чтобы он выбирал только тех КА, у которых есть задачи указанного типа и состояния?

Указал Задача:Тип И Задача:Состояние. Без группировок.
Такой фильтр не работает по двум условиям, возвращает тех КА у которых есть задачи указанного типа, но состояние не обязательно соответствует выбранному.

Помогите пожалуйста разобраться. Спасибо!

Нравится

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

Если между фильтрами стоит И, то работает все правильно. Возможно вы хотели другого. Этим фильтром отбираются контрагенты у котрых есть ХОТЯ БЫ ОДНА задача с таким типом и состоянием. Какие бы не были остальные задачи, они на результат выборки не повлияют. Возможно Вам нужно было отобрать тех, у кого все задачи имеют такой тип и состояние?

Когда захожу в задачи КА вижу там одну задачу типа Отправить ком. пред., но ее состояние не "в работе"...

если я не ошибаюсь, Вы реализовали каждое из условий фильтром в отдельной ветке в условии WHERE, таким образом фактически между этими двумя фильтрами стоит ИЛИ, чтобы было И нужно задать оба условия в одном фильтре

Точно, у Вас там ИЛИ получается.

Когда нажимаю Добавить связанный элемент (что для Задача:Тип) конструктор предлагает выбрать еще один Тип (и все), еси я хочу указать состояние, этот фильтр переноситься в отдельную строку. И получаеться то что на картинке.

Я просто два раза по плюсику щелкнул и нормально добавилось через И. Там в меню, кажется, есть пункт Объединить

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

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

Зачем?
Нажал на +, вибрал фильтр Задача:Тип и нажал еще раз на + (тот которий в той же ветке рисуется). Выбрал Задача:Состояние.
У меня без всяких изменений пошел запрос с таким фильтром

WHERE((EXISTS 
	(SELECT
		[tbl_Task].[ID] AS [ID]
	FROM
		[dbo].[tbl_Task] AS [tbl_Task]
	WHERE([tbl_Task].[AccountID] = [tbl_Account].[ID] AND
		(([tbl_Task].[StatusID] IN (@P1)) AND
		([tbl_Task].[TypeID] IN (@P2)))))))

Вы смотрите в более поздней версии, наверное, в 3.3, поскольку у McCoy возник такой вопрос, я проверила в 3.1.1 и 3.2.1, там два exists фильтра

Да, действительно я смотрел в 3.3.
Но мне почемуто казалось что 3.1 я когда-то делал то же самое и все работало.
P.S. Если сделать так как на скриншоте, то в 3.3 пойдет два запроса.

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

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

Буквально два дня назад у одного и только одного пользователя в системе переставли открываться сервисы Задачи, Контрагенты и Контакты.

При попытке открыть эту закладку появляется сообщение об ошибке:

Ошибка открытия источника данных "ds_Account"
Оригинальное сообщение об ошибке: Dynamic SQL Error
SQL error code=-204
Table unknown
vw_Account
At line 14, column 15
can't format message 13:796 -- message file C:\Program Files\Terrasoft CRM X25\firebird.msg not fount
Error Code: 249

Аналогично для источников ds_Contacts и ds_Task.

Пробовал в администрировании сбрасывать и заново устанавливать права доступа, ситуация не меняется. Остальные сервисы работают нормально. То есть открываем Проекты, там все показывает, кроме Клиента и Контакта.

Нравится

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

Может попробовать забрать и снова раздать права на эти разделы.

Здравствуйте, Алексей!
Для решения возникшей у Вас проблемы могу посоветовать зайти в TSAdmin.exe, открыть таблицу, например, tbl_Account и пересохранить ее (для этого добавьте в название таблицы например пробел, потом уберите его и сохраните таблицу). Таблица пересохранится, что в результате приведет к пересозданию View-представления vw_Account на сервере.
Аналогичные действия выполните для таблиц tbl_Contacts и tbl_Task.
После этого перезапустите рабочее приложение Terrasoft CRM и протестируйте работосопосбность системы.

Также советую скопировать файл Firebird.msg из папки Firebird (с серверной машины) на клиенскую машину. Таким образом, на клиентской машине должны быть два файла fbclient.dll и Firebird.msg.

Желаю удачи!

Мельникова Екатерина

При попытке пересохранить tbl_Account получил вот это сообщение об ошибке.

violation of FOREIGN KEY constraint "PCONTACT_ID" on table "tbl_Contact"
Foreign key reference target does not exist
violation of FOREIGN KEY constraint ""
Error Code: 146
ALTER TABLE "tbl_Account" ADD CONSTRAINT "FAccountPrimaryContactID2"
FOREIGN KEY ("PrimaryContactID") REFERENCES "tbl_Contact" ("ID")

Проверил отношения, все заполнено верно. Поле ID в tbl_Contact присутствует. Странно...

При пересохранении tbl_Task получил вот это сообщение:

violation of FOREIGN KEY constraint "PCONTACTGROUP_ID" on table "tbl_ContactGroup"
Foreign key reference target does not exist
violation of FOREIGN KEY constraint ""
Error Code: 146
ALTER TABLE "tbl_Task" ADD CONSTRAINT "FTaskOwnerGroupID"
FOREIGN KEY ("OwnerGroupID") REFERENCES "tbl_ContactGroup" ("ID")

Тоже все проверил, все должно быть в норме.

tbl_Contact пересохраняется нормально. И кстати, этот сервис у пользователя заработал еще до того, как е его пере сохранил.

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

Горелов Виталий
Компания Лабитек

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

После исправления ошибок в ссылках, таблицы пересохранились нормально. Но система ведется себя странно. Пользователь входит, сообщений об ошибках нет, но все датасеты пустые и наверху в заголовке окна террасофта, где пишется в скобках ФИО контакта - Террасофт 3.1 - Террасофт (Иванов Иван Иванович) - теперь в скобках пишет "Null".
То есть теперь заголовок окна выглядит так:

Террасофт 3.1 - Террасофт (Null)

Права проверил, стоят все какие есть на все сервисы.
Пришлось ставить галочку "Администратор" пользователю. Тогда все заработало нормально.

:-) Террасофт 3.1 - Террасофт (Null)
значит пользователь не имеет прав доступа на строку своего контакта (в разделе Администрирование , пользователь создается с привязкой к определённому контакту) , дайте ему права на чтение этой строки

Так в том-то и дело, что в Администрировании в Террасофт у пользователя стоят все галочки на группе таблиц Контакты. И конкретно на этот контакт в Детали "Доступ" указанному пользователю разрешено Запись и Чтение.

"Барабанов Алексей Александрович" написал:Так в том-то и дело, что в Администрировании ...

Если всё настроено правильно , то найти ошибку можно только отслеживая по профайлеру , запросы к БД , а потом отрабатывать их непосредственно на базе.

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

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

Нравится

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

Не совсем понятна ситуация. Объясните, пожалуйста подробнее.

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

Здравствуйте, Дмитрий!

Рекомендую воспользоваться действием [Создать контакт].

[IMG]http://pic.ipicture.ru/uploads/090409/Dz0rjohX0y.jpg[/IMG]

Данное меню можно вызвать нажатие правой кнопкой мышки или из меню действий.

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

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

Terrasoft Support Team

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