День добрый!

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

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

Нравится

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

Здравствуйте Иван,
На сколько я понимаю "Описание" имается в виду деталь на группе контрагентов
Описание хранится в в виде поля (с типом большой бинарный объект BLOB) в таблице tbl_Account

SQL запрос будет выглядеть следующим образом

select * from tbl_Account
where Description is not NULL
Order by ModifiedOn
Показать все комментарии

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

Нравится

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

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

Присваивается номер следующим кодом:
SetItemSystemNumber('Account', Dataset, 'AccountNumber');

Значит, последний номер подтягивается из системных настроек. Проверьте, пожалуйста, какие разрешения для таблицы tbl_SystemSetting на уровне СУБД. Для группы "Все пользователи" на эту таблицу должен быть полный доступ: разрешено чтение, редактирование, вставка и удаление.

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

Этим доступом можно управлять средствами СУБД, которая установлена у Вас на сервере. Если это MS SQL Server, необходимо открыть Enterprise Manager или SQL Server Management Studio (в зависимости от версии MS SQL), найти нужную базу и таблицу в ней, и посмотреть разрешения (Permissions) для этой таблицы в её свойствах. Для других СУБД, таких как Oracle или Firebird, тоже существуют свои инструменты для управления доступом на таблицы. Более подробно на этот вопрос сможет ответить системный администратор Вашей компании. Либо обратитесь в Службу технической поддержки нашей компании, и наши специалисты помогут Вам в телефонном режиме или вышлют необходимые инструкции.

Олег права стоят полные.:sad:

Тогда необходимо анализировать функционал установления номеров контрагента. Прошу Вас направить письменный запрос на адрес Службы поддержки Terrasoft: support@tscrm.com . В теле письма укажите, что запрос связан с данной темой на комьюнити и предоставьте параметры удалённого доступа.

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

Добрый день помогите пожалуйста, возникла проблемка при удалении контрагента. Все существующие связи контрагента были удалены. При удалении самого контрагента возникает такая вот ошибка: "Ошибка удаления записи. Недопустимое имя объекта "dbo.Name". Я так подозреваю, что это ошибка в тригере, вот только не могу найти где это.

Нравится

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

Проверьте текст триггера [dbo].[tr_tbl_Account_ID]. Скорее всего, в нём.

Да именно там мы искали. Вроде как нашли текст ошибки, а вот что вместо неё должно быть не можем понять. Текст тригера прикреплён с подчеркнутыми предполагаемыми проблемными местами. Помогите разобраться!

Попробуйте заменить текст

,(select [Name].[tbl_Country]
from [dbo].[Name] as [Name]
where [Name].[ID] = [D].[CountryID])
as [CountryName]

на такой:

,(select [tbl_Country].[Name]
from [dbo].[tbl_Country] as [tbl_Country]
where [tbl_Country].[ID] = [D].[CountryID])
as [CountryName]

Большое спасибо Олег, всё получилось.

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

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

Нравится

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

Добрый день, Сергей.
Странная ошибка. Выполняли ли с этим разделом какие-либо изменения в настройках? Например, изменяли состав полей или внешних ключей?
Попробуйте с помощью Profiler получить запрос "DELETE FROM ...", который выполняет попытку удаления, выполните отдельно в Management Studio, если не получится - текст ошибки будет более понятный. Если ничего не помогает - советую обратиться в службу поддержки.

Сергей, проверьте триггер tr_tbl_Account_ID в той части, где происходит запись значения Communication2TypeName в таблицу логов tbl_AccountLog. Мне встречались случаи, когда вместо корректного запроса

(select [tbl_CommunicationType].[Name]
      from [dbo].[tbl_CommunicationType] as [tbl_CommunicationType]
      where  [tbl_CommunicationType].[ID] = [D].[Communication2TypeID])
    as [Communication2TypeName]

триггер содержал что-то типа

(select [Communication2TypeName].[ID]
      from [dbo].[Communication2TypeName] as [tbl_CommunicationType]
      ...

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

Уважаемый Олег, выполнили все как Вы написали, ошибка пропала но появилась новая :
Ошибка удаления записи. Оригинальное сообщение: Ошибка при преобразовании строки символов в тип uniqueidentifier

Сергей, Вы заменили только ту часть, которая касалась Communication2TypeName? Посмотрите на аналогичные участки, которые соответствуют Communication1Type, Communication3Type, Communication4Type. Для Communication2Type должно быть точно так же, как и для них, кроме соответствующего индекса.

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

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

Олег большое спасибо, всё получилось, просто допустили орфографическую ошибку при записи в тригер:sad:

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

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

в разделе Документы в закладках Подчиненный/Родительский документ при добавлении нового документа необходимо в карточке выбора документа отобразить колонку "Контрагент".

Как это сделать?

Нравится

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

В скрипте wnd_DocumentInDocumentGridAreaScript есть функция AddDocument(), внутри нее вызывается AddData(), первым параметром которой и передаются отображаемые поля. Вам нужно указать 'Title;AccountID'.

Спасибо, Ольга!
Небольшая поправочка: указать AccountID нужно уже внутри AddData(), а именно вот здесь:

function AddData(DisplayFieldName, SubjectFieldName, SelectDataDatasetUSI) {
var DisplayFieldNames =
		FormatStr('%1;OwnerID;AccountID', DisplayFieldName);
	var SearchFieldNames =
		FormatStr('%1;OwnerID;AccountID', DisplayFieldName);
...

www.informicus.ru

В этом случае колонка появится и в окнах выбора подчиненных/ родительских счетов и договоров, а Вы спрашивали про документы.

Ну это лишним не будет.
А при добавлении AccountID в параметр у меня ошибки вылетали.

www.informicus.ru

Прошу прощения, не учла, что SearchFieldName в AddData() нужно по-другому вычислять.

var SearchFieldName = DisplayFieldNames.substr(0, DisplayFieldNames.indexOf(';'));

Да-да, оно.спасибо!

www.informicus.ru

"Раловец Ольга" написал:В этом случае колонка появится и в окнах выбора подчиненных/ родительских счетов и договоров, а Вы спрашивали про документы

Полностью согласен! Лучше добавить по-отдельности поля в AddDocument, AddInvoice и AddContract - так при изменении каких либо полей можно легко изменять параметр для каждого дока:smile:
Спасибо за вопрос и ответ:twisted:

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

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

Самый распостранённый вариант импорта из MS Excel "Импорт контактов и контрагентов и их средств связи в один этап".
При данной настройке существует привязка контакта к контрагенту и наоборот без дублей при условии, что в файле импорта у контрагента один контакт.

Прикрепила полную инструкцию. Возможно, кому пригодится.

Удачной работы!

Нравится

Поделиться

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

Спасибо большое, пригодилось :)

Татьяна, день добрый. Делал всё по Вашей инструкции. И чёто ошибок много. Подскажите, в чём дело. Лог приложил.

Заур, здравствуйте!
Ошибка в журнале импорта у Вас одна: Syntax error converting from a character string to uniqueidentifier

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

Судя по инструкции, то ошибку Вы допустили именно для контакта, необходимо перетягивать поле Контрагент.Основной контакт и Контакт.ФИО.

Сообщите, пожалуйста, удалось ли решить вопрос.

о! Что-то получилось. Добавились контакты. Сейчас продолжу наполнять информацию, если возникнут вопросы - сразу отпишусь.

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

Если руками вбить контрагента, а потом пытаться его редактировать, то выдаёт такую ошибку:

[09.09.01 17.43.32.315] (E) Ошибка выполнения метода 'wnd_AccountEditOnPrepare'. Ошибка открытия источника данных "ds_Account".
Оригинальное сообщение об ошибке: Invalid column name 'Info'.
Invalid column name 'AverageSalary' «Call Stack»

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

Пожалуйста, уточните, какие сообщения Вы получаете в лог-файле при настройке импорта из Excel?

Для решения описанной Вами проблемы с добавлением контрагента, нам понадобятся следующие сервисы: sq_Account, ds_Account, tbl_Account, wnd_AccountEdit

Пожалуйста, выгрузите данные сервисы и направьте их на support@tscrm.com с описанием возникшей ситуации.

а как их выгружать не подскажите? или это есть в мануале?

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

Настроила поля в "Настройке импорта" так, как указано в инструкции. Но при импорте 1 контрагента, создается 2 контрагента с одинаковым именем. Карточка одного контрагента полностью заполнена контактами, карточка второго - совершенно пуста. Причем в карточке контакта отображается именно второй контрагент, у которого кроме названия ничего нет. Где может быть ошибка? и как с этим бороться?

Надежда, однозначно ошибка - в настройках.
Если можете, выложите файл импорта (можно с 2-3 записями)и выгрузите настройки импорта (в дизайнере настроек меню Файл - Выгрузить настройки в файл), попытаемся выяснить в чем проблема.

Посмотрите, там в ключевом поле (Название) скорее всего есть отличия. Где-то лишний пробел. Или его не хватает.

"Underscore a.k.a. _" написал:Посмотрите, там в ключевом поле (Название) скорее всего есть отличия. Где-то лишний пробел. Или его не хватает.

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

"Татьяна Адамчук" написал: нужно смотреть лог импорта

Да, не помешало бы.

Вот мои файл импорта и настройки импорта.

Хелп! очень нужна ваша помощь! файл импорта и настройки импорта выложила. В чем проблема, почему данные выгружаются некорректно?

Надежда, здравствуйте!

Загрузила Ваши настройки, но проблема не воспроизвелась.
Данные проимпортировались корректно и без дублей (проверяла на версии 3.3.1).

Если у Вас другая - напишите, пожалуйста.

Здравствуйте, Татьяна!
Моя версия 3.2.0.11. Дубли создаются и в контрагентах и в контактах.

Надежда, добрый день!

Загрузила настройки на версии 3.2.0. Для решения попробуйте в Terrasoft Administrator загрузить два сервиса, которые прикрепила к сообщению (в дереве сервисов в контекстном меню выбрать "Загрузить из файла").
Далее перезапустите приложение, установите в свойствах интеграции опцию "Обновлять существующие записи".
ПРоблема воспроизводиться не должна.
+ сделала донастройку Вашего импорта, чтобы типы средств связи проставлялись по умолчанию и для контакта и для контрагента (настройку прикрепила, можете использовать).

Сообщите, пожалуйста, результаты!

Загрузились только файлы из архива "services". Файл из архива "Community" загружаться отказывается (пишет: "невозможно определить тип сервиса по коду").

Надежда, файл Community.xml-это настройки импорта.
Загружать нужно в приложении, в дизайнере настроек через меню Файл-Загрузить настройки из файла.

После загрузки сервисов в Администраторе, при нажатии на кнопочку "Изменить настройки интеграции", вылазит лог с ошибкой: Ошибка выполнения метода 'wnd_DataflowTuningOnPrepare'. 'Plugin' - определение отсутствует «Call Stack».
После попытки присоединить файл Community.xml в настройках импорта, выходит следующая ошибка: Ошибка выполнения метода 'amiLoadSettingsFromFileOnExecute'. 'Plugin' - определение отсутствует «Call Stack».

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

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

Надежда, скорее всего, ошибка связана с тем, что Вы закрыли шаблон настройки импорта (Excel) при открытии записи интеграции.
Надежда, попробуйте закрыть приложение, посмотреть, чтобы в "Диспетчере задач" не висел процесс TSCRM.EXE, EXCEL.EXE, почистить кэш.
Для этого выберите Пуск-Выполнить-%appdata%\Terrasoft CRM\3.2.0\
Удалите папку Cache.
Далее запустите Terrasoft и попробуйте открыть настройки импорта.

Сообщите, пожалуйста, результаты.

Татьяна! настройки импорта теперь открываются.
проблема теперь в другом: при импорте списка из более чем 20 контрагентов, импортируется корректно только первая двадцатка. По остальным контрагентам: создается контрагент, но без дополнительной информации, создается контакт с полной информацией по нему (кроме должности и адреса). Лог прикладываю.

Надежда, добрый день!

А Вы слычайно не в демку импортируете данные?
Необходимо проанализировать Ваш файл импорта, т.к. в логе написано, что первые записи уже ранее были проимпортированы, а сейчас обновлены,после записи Уралтехимпекс возникла ошибка, проверьте, чтобы у Вас первичные поля не были пустыми, а именно Название и ФИО.

вопрос простой, но очень важный. в каком виде должен быть фал в экселе (т.е. какие графы, столбцы) с контактами/клиентами чтобы можно было их одномоментно импортировать в БД Террасофт :-) можете прикрепить образец файла? и вообще возможно ли это? из экселя или ворда. что то я не понял. нет желания вбивать все руками :-)

Импорт данных производится только из файлов MS Excel. Четких рамок файла нет, одно лишь условие, что данные должны быть по колонкам, например, колонки: ФИО, Телефон, Адрес, Отрасль и т.д. Прикрепила небольшой примерчик к письму.

Название колонок, их количество я составляю сам? Потом аналогичные колонки формирую в террасофте (названия, количество) и одним кликом смогу импортровать в БД террасофта? Очень принципиальный для нас вопрос. Поэтому заранее извиняюсь за "тупость" :-)

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

"Дементьев Юрий Валерьевич" написал:Потом аналогичные колонки формирую в террасофте (названия, количество) и одним кликом смогу импортровать в БД террасофта?

Немного не так, у Вас есть файл импорта с Вашими данными разбитыми по колонкам, Вы в системе в дизайнере настраиваете соответсвия методом перетягивания колонок (поле Название к колонке с названием, код к коду и т.д.), а потом через кнопку "Выполнить" данные переносятся в соответсвенные поля.
Можете поппробовтаь настроить импорта на демо-версии, тогда для Вас этот процесс станет более прозрачным.

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

Здравствуйте, Юрий!
Если хотите настраивать импорт из Excel, то панель Вам не нужна, необходимо только запустить файл TSMSOfficeLibraryConfigurator.exe из папки Bin диреткории где установлен Terrasoft, выбрать продукт Excel в списке - Ок (Применить). После этого можете настраивать импорт в Terrasoft в разделе [Интеграции].

Удачи!

Здравствуйте, Татьяна!

Интересует следующий вопрос: есть ли возможность избежать добавления записей в справочники при импорте?
Например, колонка "Тип" для контрагента. В терасофте этот справочник уже заполнен. А при импорте данных дублируются записи. Нельзя ли сделать так, что бы при импорте записи брались из справочника?

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

www.informicus.ru

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

Если в справочнике типов существуют записи с одинаковыми названиями, как и в файле импорта, то Вам необходимо в свойствах интеграции (импорта) включить опцию "Обновлять существующие записи", при этом дублей точно не будет.
Если у Вас версия 3.2.0.-3.2.1, то рекомендую еще загрузить сервисы, которые прикреплены к сообщению.

Приятной работы!

Спасибо!

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

www.informicus.ru

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

Понятно, спасибо за оперативные ответы!!!

www.informicus.ru

Всегда пожалуйста!:)

Еще одна странность. Очень часто замечал, что те поля, которые заполнены в "значения по умолчанию", так и не заполняются в базе данных.
Иногда бывает, но часто приходится с этим долго биться.

"Владимир Соколов" написал:Очень часто замечал, что те поля, которые заполнены в "значения по умолчанию", так и не заполняются в базе данных.
Иногда бывает, но часто приходится с этим долго биться.

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

"Раловец Ольга" написал:У Вас были примеры не заполнения значений по умолчанию при других условиях?

При других условиях - не было. Но все равно, мне кажется это немного нелогично.

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

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

Тогда получается, что выходом будет добавление в Excel'e еще одной колонки, в которую вписать это значение по умолчанию. И тогда это значение успешно проимпортируется даже для существующих записей.
Просто, лишнее движение.

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

"Владимир Соколов" написал:Как альтернативу, можно было бы рассмотреть признак в "значении по умолчанию" - "применять для существующих записей". Хотя, не знаю, насколько актуально

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

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

"Татьяна Адамчук" написал:всегда нужно делать резервную копию

ну, это аксиома. я вообще на резервной копии создаю импорт, а потом уже переношу на живую. :)

"Владимир Соколов" написал:я вообще на резервной копии создаю импорт, а потом уже переношу на живую. :)

Аналогично...

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

На шаблоне не всегда можно увидеть все возможные нюансы. Например, файл импорта содержит несколько тысяч записей, пролистав первую сотню, я решаю, что первичный ключ = контакт + контрагент, импортирую, вижу, что записей у меня меньше, оказывается, что нужно добавить еще адрес к проверке уникальности, конечно, можно было это предвидеть, но все же.
А если база оракловая, переподнимать бэкап каждый раз, когда что-то не получилось? :) Я тоже делаю импорт не на рабочей базе, но удалять записи проще, по-моему.

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

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

спасибо, я уже розобралась

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

Сейчас в деталях контрагента на вкладке "Контакты" выдаётся список контактов, у которых в поле "Место работы" указан выбранный контрагент. Это значит, что каждый контакт привязан только к одному контрагенту. Однако не всегда контактное лицо по какой-либо компании является её сотрудником.
Например: небольшие конторы часто пользуются услугами аутсорсинговых IT-компаний, поэтому контактом по техническим вопросам будет являться человек из такой обслуживающей компании. При этом он может являться контактом сразу для нескольких организаций. Можно решить задачу с помощью взаимосвязей, но это не совсем логично, поскольку пользователи системы будут искать контакты именно во вкладке "контакты" и будут правы.
Задача решается стандартными средствами CRM (заведение дополнительной таблицы соответствия контакта и контрагента, редактирование соответствующих вкладок деталей), но возможно есть смысл ввести этот функционал в стандартный конфиг.

Нравится

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

Добрый день Семен.
Для решения описанных Вами задач в Terrasoft CRM предусмотрена деталь "Карьера"

1.2.2.5. Деталь [Карьера]
Для каждого контакта можно вести историю продвижения по служебной
лестнице (как в рамках одной компании, так и при переходе из одной
компании в другую).
На этой детали последовательно фиксируется информация обо всех местах
работы контакта (Рис. 1.22).

Рис. 1.22 – Деталь [Карьера]

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


Рис. 1.23 – Карточка записи о карьере

Признак [Текущая] позволяет отметить компанию, в которой выбранный
контакт работает в текущее время (их может быть несколько). Признак
[Основная] отмечается в случае, если указанное место работы является
основным (основным может быть только одно место работы). В этом
случае, информация о данном контрагенте отражается в карточке
контакта.
Если в карточке контакта изменить значение хотя бы одного из полей
[Департамент], [Должность], [Полное название должности] и сохранить эти
изменения (нажатием на кнопку [ОК] карточки), на деталь [Карьера]
автоматически добавится новая запись о месте работы контактного лица (с
отметкой в поле [Основная] карточки). Запись о прошлом основном месте
работы контакта при этом будет отображаться только на детали (без
отметки в поле [Основная] карточки).

Спасибо, это мне в голову не пришло, т.к. контакт формально не является сотрудником организации. Можно ввести специальную должность в справочнике для "внешних" контактов и проблема решена.

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

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

 

Если Вам необходимо реализовать возможность отправки E-mail контрагенту через действие "Отправить E-mail", то Вы можете воспользоваться следующим алгоритмом (пример реализации для версии Terrasoft CRM 3.3):

 

1. В скрипте scr_MailUtils реализовать функцию получения e-mail адреса текущего контрагента:

 

 

function GetCurrentAccountEmailAddress(AccountDataset) {

 

         var AccountEMailAddress = '';

 

         var Email = GetEmailCommunicationTypeID();

 

         for (var i = 1; i = 4; i++) {

 

                   var CommunicationTypeName = FormatStr('Communication%1TypeID', i);

 

                   var CommunicationType = GetFieldValueFromDisabledField(AccountDataset,

 

                            CommunicationTypeName);

 

                   if (CommunicationType == Email) {

 

                            var CommunicationName = FormatStr('Communication%1', i)

 

                            AccountEMailAddress = GetFieldValueFromDisabledField(AccountDataset,

 

                                      CommunicationName);

 

                            continue;

 

                   }

 

         }

 

         var AccountName = GetFieldValueFromDisabledField(AccountDataset, 'Name');

 

         if (IsEmptyStr(AccountEMailAddress)) {

 

                   Dataset = GetAccountCommunicationDataset(Email);

 

                   ApplyDatasetFilter(Dataset, 'AccountID',

 

                            AccountDataset.Values('ID'), true);

 

                   Dataset.Open();

 

                   try {

 

                            AccountEMailAddress = Dataset.ValAsStr('Number');

 

                   } finally {

 

                            Dataset.Close();

 

                   }

 

         }

 

         if (!IsEmptyStr(AccountEMailAddress)) {

 

                   if (!IsEmptyStr(AccountName)) {

 

                            AccountEMailAddress = AccountName + '' + AccountEMailAddress + '>';

 

                   }

 

         } else {

 

                   AccountEMailAddress = '';

 

         }

 

         return AccountEMailAddress;

 

}

 

 

 

function GetAccountCommunicationDataset(EmailTypeID) {

 

         if (!Assigned(MailUtilsScript.AccountCommunicationDataset)) {

 

                   var Dataset = Services.GetNewItemByUSI('ds_AccountCommunication');

 

                   MailUtilsScript.AccountCommunicationDataset = Dataset;

 

                   ApplyDatasetFilter(Dataset, 'CommunicationTypeID', EmailTypeID, true);

 

         }

 

         return MailUtilsScript.AccountCommunicationDataset;

 

}

 

2. Далее в скрипте scr_AccountsWorkspace реализовать функцию отправки сообщения :

 

 

 

function SendMailWithoutTemplate() {

 

    var Dataset = Services.GetNewItemByUSI('ds_Account');

 

         EnableDatasetFilters(Dataset, false);

 

         Dataset.FetchRecordsCount = -1;

 

         var IDs = GetArrayByCollection(BaseWorkspace.Grid.SelectedIDs);

 

    var KeyDataFieldName = Dataset.KeyDataField.Name;

 

         var AccountEMailAddress = '';

 

         for (var i = 0; i IDs.length; i++){

 

                   Dataset.Close();

 

                   ApplyDatasetFilter(Dataset, 'ID', IDs[i], true);

 

                   Dataset.Open();

 

                   var SingleAccountEMailAddress = GetCurrentAccountEmailAddress(Dataset);

 

                   AccountEMailAddress += IsEmptyValue(SingleAccountEMailAddress) ? '' :

 

                       (IsEmptyValue(AccountEMailAddress) ? '' : ';') +

 

                            SingleAccountEMailAddress;

 

         }

 

         CreateEmptyMessage(AccountEMailAddress);

 

         Dataset.Close();

 

}

 

 

3. В окне wnd_AccountsWorkspace добавить на закладке невизуальных компонентов одно действие, например, amiSendEmail и на событие OnExecute прописать вызов функции:

 

SendMailWithoutTemplate();

 

 

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

 

Полная инструкция со скриншотами прикреплена.

Приятной работы! 

Нравится

Поделиться

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

Значительно ли будет отличатся реализация данного функционала в Terrasoft CRM 3.2?

Олег, данные функции работают и в Terrasoft CRM 3.2, т.е. реализация отправки e-mail в данной версии аналогична.

P.S. Не забудьте присоединять скрипт scr_MailUtils в scr_AccountsWorkspace.

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

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

--обновляет средсва связей и адреса контактов по их контрагентам.
--Детали адреса и средства связей контактов наполняются по их контрагентам, при этом старые записи остаются
-- если старые записи не нужны убрать/закомментировать строчку помеченную /*!!!*/
declare @NeedOldDetailRecords int
set @NeedOldDetailRecords = 0
set @NeedOldDetailRecords = 1   /*!!!*/


print 'Update tbl_Contact'
update t1
set     t1.Communication1=t2.Communication1,
    t1.Communication2=t2.Communication2,
    t1.Communication3=t2.Communication3,
    t1.Communication4=t2.Communication4,
    t1.Communication1TypeID=t2.Communication1TypeID,
    t1.Communication2TypeID=t2.Communication2TypeID,
    t1.Communication3TypeID=t2.Communication3TypeID,
    t1.Communication4TypeID=t2.Communication4TypeID,
    t1.TerritoryID    =t2.TerritoryID,
    t1.AddressTypeID =t2.AddressTypeID,
    t1.CountryID =t2.CountryID,
    t1.StateID =t2.StateID,
    t1.CityID =t2.CityID,
    t1.ZIP =t2.ZIP,
    t1.Address =t2.Address
from tbl_Contact t1, tbl_Account t2
where t1.AccountID is not null
and t2.id=t1.AccountID

if @NeedOldDetailRecords = 1
begin
    print 'update tbl_ContactCommunication'
    update tbl_ContactCommunication
    set position = null
    where exists(select * from tbl_Contact t2 where tbl_ContactCommunication.ContactID=t2.ID and t2.AccountID is not null)
   
    print 'update tbl_ContactAddress'
    update tbl_ContactAddress
    set IsPrimary = null
    where exists(select * from tbl_Contact t2 where tbl_ContactAddress.ContactID=t2.ID and t2.AccountID is not null)
end
if @NeedOldDetailRecords = 0
begin
    print 'delete from tbl_ContactAddress'
    delete tbl_ContactAddress
    from tbl_ContactAddress t1
    where exists(select * from tbl_Contact t2 where t1.ContactID=t2.ID and t2.AccountID is not null)
   
    print 'delete from tbl_ContactCommunication'
    delete tbl_ContactCommunication
    from tbl_ContactCommunication t1
    where exists(select * from tbl_Contact t2 where t1.ContactID=t2.ID and t2.AccountID is not null)
end

print 'Insert into tbl_ContactAddress'
insert into tbl_ContactAddress(id,ContactID,AddressTypeid,Address,CityID,StateID, Zip, CountryID, IsPrimary, TerritoryID)
select newid(), t1.id, t3.AddressTypeid, t3.Address, t3.CityID, t3.StateID, t3.Zip, t3.CountryID, t3.IsPrimary, t3.TerritoryID
from tbl_Contact t1, tbl_Account t2, tbl_AccountAddress t3
where t1.accountid is not null
and t1.accountid=t2.id
and t2.id=t3.accountid

print 'Insert into tbl_ContactCommunication'
insert into tbl_ContactCommunication(id,ContactID,Number,CommunicationTypeID,Position,Digits)
select newid(), t1.id, t3.Number, t3.CommunicationTypeID, t3.Position, t3.Digits
from tbl_Contact t1, tbl_Account t2, tbl_AccountCommunication t3
where t1.accountid is not null
and t1.accountid=t2.id
and t2.id=t3.accountid

С уважением,
Коваленко Ирина

Нравится

Поделиться

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

Можно ли, чтобы при создании бизнес-процесса в названии бизнес-процесса (по умолчанию Sale) делалась например приписка с контрагентом, например Sale (КОМПАНИЯ) вместо просто Sale, либо как добавить столбец контрагенты в списоке отображения бизнес-процессов? Имеется ввиду название контрагента с которым связана задача

Нравится

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

Наверное, вопрос из той же сферы:
Насколько я понял, в бизнес-процессах можно использовать параметры, в которые вводить нужную информацию. Хотелось бы узнать, каким образом ее вводить и как ее использовать (например, в фильтрах)?

Добрый день.

Спасибо за Ваш вопрос.

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

1) Открыть серсис sq_WorkflowItem, к таблице tbl_WorkflowItem присоединить (JOIN) таблицу tbl_Task по параметру tbl_Task.WorkflowItemID=tbl_WorkflowItem.ID. В запросе на выборку добавить поле из tbl_Task, которое необходимо отображать в реестре записей. Сохранить изменения в сервисе.

2) Открыть ds_WorkflowItem и добавить там необходимое поле из перечня полей добавленых в sq_WorkflowItem. Сохранить изменения в сервисе.

3) Добавить в wnd_WorkflowItemsGridArea колонку Контрагент. Сохранить изменения в сервисе.

Касательно использования параметров, во вложеном файле есть пример передачи параметров между процессами и подпроцессами.

Элемент “Подпроцесс” позволяет запустить некоторый процесс внутри другого, причём процесс, являющийся подпроцессом, в другом процессе представлен как его элемент.

Дело в том, что вызов процесса осуществляется методом StartWorkflow объекта WorkflowEngine, который, в свою очередь, является атрибутом системного объекта Connector (как Вы могли заметить это в коде функции WFStartByID). Другими словами, вызов процесса/подпроцесса осуществляется средствами ядра системы.

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

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

select tbl_Account.Name from tbl_Account
 
left outer join tbl_Task on tbl_Task.AccountID = tbl_Account.ID
 
left outer join tbl_WorkflowItem on tbl_WorkflowItem.ID = tbl_Task.WorkflowItemID
 
left outer join tbl_Workflow on tbl_Workflow.ID = tbl_WorkflowItem.WorkflowID
 
where tbl_Workflow.ID = '{172E75BF-2A11-41EF-98F7-F0AB9BBC7BDA}'

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

select tbl_Account.Name from tbl_Account
 
left outer join tbl_Task on tbl_Task.AccountID = tbl_Account.ID
 
left outer join tbl_WorkflowItem on tbl_WorkflowItem.ID = tbl_Task.WorkflowItemID
 
left outer join tbl_Workflow on tbl_Workflow.ID = tbl_WorkflowItem.WorkflowID
 
left outer join tbl_WorkflowItem ParentItem on ParentItem.ID = tbl_Workflow.ParentSubProcessItemID
 
left outer join tbl_Workflow Parent on Parent.ID = ParentItem.WorkflowID
 
where Parent.ID = '{172E75BF-2A11-41EF-98F7-F0AB9BBC7BDA}'

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

Необходимо создать сервис (сервисы) SQL-запроса на выборку в системе Terrasoft.
По созданным запросам создать датасеты для хранения значений.
Определить событие, в результате которого параметры из родительского процесса будут подставляться в подпроцесс (например, во время события dlDataOnDatasetAfterPost даталинка задачи).

В обработчике события вставить условия проверки (например, является ли задача элементом процесса, происходит ли создание новой задачи или редактирование существующей – if (Dataset.State == dstInsert), и т.д.). Также необходимо создать переменные для ранее созданных датасетов. Вызвать ранее созданный датасет можно, например, так:

var ParentWFTaskDataset = Services.GetNewItemByUSI(<Код датасета>);
 
ParentWFTaskDataset.Open();

Работа с датасетами дальше идет по аналогии с другими обработчиками, в зависимости от конкретной цели. Например:

Dataset.Values(‘AccountID’) = ParentWFTaskDataset.Values(‘AccountID’);

Будем рады ответить на все Ваши вопросы.

Terrasoft Support Team

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