Вопрос

Здравствуйте! Подскажите, пожалуйста, как добавить JS событие при сохранении контрагента/контакта?
Вот кусок кода на странцие:

methods: {
fir: function()
{
if (this.get("UsrKey").checked)
{
this.set("UsrLoyaltyOfContact", "Лояльно");
}
else
{
this.set("UsrLoyaltyOfContact", "Не определено");
}
}

}

UsrKey - Boolen Checkbox, UsrLoyaltyOfContact - Справочник.

Не могу разобраться, куда подвесить событие?

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

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

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

Что-то похожее ранее обсуждалось здесь.

Вам необходимо переопределить метод onSaved в секции methods схемы страницы редактирования

                        // Переопределение базового метода Terrasoft.BasePageV2.OnSaved.
			// Выполняет постобработку сохранения записи
			onSaved: function(response, config) {
				// Вызов родительской реализации.
				this.callParent(arguments);
                                //Вызов Вашего метода
                                fir();
			}
Войдите или зарегистрируйтесь, чтобы комментировать
Вопрос

Подскажите, пожалуйста, есть ли в bpm'online возможность импорта контрагентов не только единовременно из Excel, но и через регулярную загрузку из стороннего источника?

Например, у нашей компании развернута на web учетная система. По обращению к определенному URL я могу отдавать xml (json или файл любого другого формата - хоть тот же Excel) содержащий полный список контрагентов компании на данный момент (или только список контрагентов, зарегистрированных в системе с момента последнего обращения). Вопрос - может ли bpm'online регулярно обращаться по указанному URL к данному файлу с выгрузкой и записывать данные из него в справочник контрагентов?

И если может - то какие настройки необходимо сделать в системе для реализации подобного рода импорта данных?

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

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

Здравствуйте, Константин!

Вы можете реализовать вызов вебсервиса и парсинг полученного ответа в bpm'online, используя элемент "Задание-сценарий" в бизнес процессе. Более подробно об интеграциях читайте по этой ссылке.
Процесс, средствами QUARTZ Вы можете запускать периодически, используя метод ScheduleMinutelyProcessJob.

Здравствуйте, Константин!

Вы можете реализовать вызов вебсервиса и парсинг полученного ответа в bpm'online, используя элемент "Задание-сценарий" в бизнес процессе. Более подробно об интеграциях читайте по этой ссылке.
Процесс, средствами QUARTZ Вы можете запускать периодически, используя метод ScheduleMinutelyProcessJob.

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

Добрый день!
Возникла такая необходимость: реализовать возможность добавления второго ответственного контрагенту. Никто не сталкивался с таким?
Sales 7.5

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

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

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

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

Спасибо!

Судя по всему, необходимо добавить деталь "Ответственные" (а вдруг потом будет 3 ответственных). И реализовать раздачу прав доступа в бизнес-процессе.
Но это будет совсем нестандартное решение

"Арменчу Артём Александрович" написал:

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

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

Спасибо!

С уважением, Арменчу Артём.


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

Александр, здравствуйте!

Это было обходное решение.
Как я уже писал ранее, к сожалению, дублирование и удаление данного поля не представляется возможным.

Спасибо!

А в чем собственно сложность то? Сделайте новое поле, назовите Owner2 повесьте на список доступных значений фильтр типа Контакт.Контрагент = Наша компания, заполнение по умолчанию через объект. Доступ на основе поля как предлагал Владимир реализовать в БП...

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

Добрый день,
в документации об очередях сказано:

"В параметрах очереди нужно выбрать объект, на основании которого она будет формироваться.
Например, для настройки параметров обработки обращений, в поле [Тип очереди] необходимо
выбрать “Обращение”, а для обработки неподтвержденных контактов — “Контакт”. В поле
[Процесс] указывается бизнес-процесс, который запускается в момент, когда оператор берет в
работу тот или иной элемент очереди."

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

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

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

Добрый день, Маргарита!

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

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

а какие Процессы подключаются к таким очередям?

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

Маргарита, Все зависит от Ваших целей.

В коробочной версии продукта bpm'online ITIL transitions предусмотрен процесс обработки обращений из очереди.

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

Спасибо, Елена

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

И снова здравствуйте!

Третий день мучаюсь с экспортом контрагентов в 1C. Сам контрагент, включая название передаётся легко, но загвоздка в его деталях - адресах, ИНН и КПП.

Адреса берутся из набора данных ТС "Адреса контрагента", а ИНН и КПП - из "Платежные реквизиты" но экспортируются в самого контрагента. То есть, это, вроде, подчинённые детали, а вроде и нет.

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

Кто-нибудь решал эту проблему?

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

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

С ИНН и КПП разобрался программно, а также с произвольной строкой адреса. Теперь осталось только передавать детали адреса - Страну, Город, Улицу и т.д.

Лично у меня экспорт контрагентов всё одной настройкой...
Вот кусок с адресами. Событие OnAfterRecordExport:

//удалить  все адреса и средства связи	
	var ci1C = Param.Obj1C.РегистрыСведений.КонтактнаяИнформация.СоздатьНаборЗаписей(); 
	ci1C.Отбор.Объект.Установить(Select1C.Ссылка);
	//[не регистрируем изменения на стороне 1с	
	ci1C.ОбменДанными.Получатели.АвтоЗаполнение = false;
	//]
	ci1C.Записать(); 	
	//Адреса
	var AccountID = Dataset('ID');	
	var ds = Services.GetNewItemByUSI('ds_AccountAddress');
	ApplyDatasetFilter(ds, 'AccountID', AccountID, true);
	ds.Open();
	while(!ds.IsEOF) {
		var ci1CMain = Param.Obj1C.РегистрыСведений.КонтактнаяИнформация.СоздатьНаборЗаписей();
		var ci1C = ci1CMain.Добавить();
		ci1C.Объект = Select1C.Ссылка;
		var met=Param.Obj1C.Метаданные.Перечисления.Найти("ТипыКонтактнойИнформации");
		var meta=met.ЗначенияПеречисления.Найти('Адрес');
		var metalink = Param.Obj1C.Перечисления.ТипыКонтактнойИнформации[meta.Имя];
		ci1C.Тип = metalink;
		var AdrTypeID = ds('KLADRAddressTypeID');
		var AdrTypeUID1C = GetDatasetFieldValueByID('ds_AddressType',
			AdrTypeID, 'UID1C');
		var AddressType1CLink;
		if(!IsEmptyValue(AdrTypeUID1C)) {
			AddressType1CLink = GetObjectLinkByUID(
					Param.Obj1C.Справочники.ВидыКонтактнойИнформации, AdrTypeUID1C, Param);	
			ci1C.Вид = !AddressType1CLink.Пустая() ? AddressType1CLink : null;
			ci1C.Представление = ds('KLADRAddress');
			ci1C.Поле1 = ds('KLADRAddressZIP');
			ci1C.Поле2 = ds('KLADRAddressSubject');
			ci1C.Поле3 = ds('KLADRAddressRegion');
			ci1C.Поле4 = ds('KLADRAddressDistrictCenter');
			ci1C.Поле5 = ds('KLADRAddressCity');
			ci1C.Поле6 = ds('KLADRAddressStreet');
			ci1C.Поле7 = ds('KLADRAddressHouse');
			ci1C.Поле8 = ds('KLADRAddressCase');
			ci1C.Поле9 = ds('KLADRAddressFlat');
			//[не регистрируем изменения на стороне 1с	
			ci1CMain.ОбменДанными.Получатели.АвтоЗаполнение = false;
			//]						
			ci1CMain.Записать(false); 
		}		
		ds.GotoNext();
	}
	ds.Close();

По поводу заполнения справочных реквизитов...
Получаете ID страны из детали адреса, далее по этому ID получаете значение в поле UID1C, и далее получаете ссылку на страну в 1с, и кладете её в реквизит...
Примерно так:

var Invoice1C = Param.Obj1C.Документы.Счет;
var InvoiceUID1C = GetDatasetFieldValueByID('ds_Opportunity', 
	dlData.Dataset('ID'), 'UID1C');
InvoiceUID1C = CreateGUID1C(InvoiceUID1C, Param.Obj1C);
var Link1C = Invoice1C.GetRef(InvoiceUID1C);
function CreateGUID1C(UID1C, Obj1C) {
	if(UID1C == null) {
		return '';
	}
	UID1C = UID1C.replace('{', '');
	UID1C = UID1C.replace('}', '');
	UID1C = Obj1C.NewObject('УникальныйИдентификатор', UID1C);
	return UID1C;
}

> Лично у меня экспорт контрагентов всё одной настройкой...

Да, этот ваш код мне сильно помог, хоть он и не подходит для 1С 8.3, так как "РегистрыСведений.КонтактнаяИнформация" больше не существует, они переехали в справочники.

> Получаете ID страны из детали адреса, далее по этому ID получаете значение в поле UID1C, и далее получаете ссылку на страну в 1с, и кладете её в реквизит...

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

ОК. Если что будет конкретного: кидайте ваш код или скрины.

Попробовал, не то чтобы получилось. Работает всё так:

Берём объект:

var Contragent = Select1C.Ссылка.ПолучитьОбъект();

Получаем его ID, идём по списку адресов, добавляя каждый:

var AccountID = Dataset('ID');
 
var ds = Services.GetNewItemByUSI('ds_AccountAddress');
ApplyDatasetFilter(ds, 'AccountID', AccountID, true);
ds.Open();
 
while(!ds.IsEOF) {
      AddAddress(Param, Contragent, ds);
      ds.GotoNext();
}
ds.Close();

Функция AddAddress:

	var newAddress= Contragent.КонтактнаяИнформация.Добавить() ;
	newAddress.Тип = Param.Obj1C.Перечисления.ТипыКонтактнойИнформации.Адрес;
 
	switch(Dataset('AddressTypeID'))
	{
		//Добавляем вид адреса
	}
 
       //Из комментария выше
	var Contragent1C = Param.Obj1C.Справочники.СтраныМира;
	var CountryUID1C = GetDatasetFieldValueByID('ds_Country', Dataset('CountryID'), 'UID1C');
	CountryUID1C = CreateGUID1C(CountryUID1C, Param.Obj1C);
	newAddress.Страна = Contragent1C.GetRef(CountryUID1C); 
 
	Contragent.Записать(false);

При этом поле Страна отображается верно. Однако, при обзоре в клиенте 1С, поле не заполнено.

Как-то так пока.

После записи выполните запрос в 1с и посмотрите что в этом поле. Если ничего - значит не записалось. Возможно срабатывают какие то проверки "перед записью" на стороне 1с?

Имеется ввиду запрос к БД 1С? Я, честно говоря, не в курсе, как это сделать с файловой версией 1С.

Забавно, но при попытке импорта импортируется именно то значение, что было экспортировано. Однако, в самом клиенте оно не меняется.

Посмотрите в 1С Администраторе - быть может в коде формы есть какая-то логика...

В функции РазместитьКонтактнуюИнформацию() логика загрузки простая:

ТаблицаРазмещенияКИ	= УправлениеКонтактнойИнформациейБП.ПолучитьПустуюТаблицуРазмещенияКонтактнойИнформации();
 
УправлениеКонтактнойИнформациейБП.ДобавитьОписаниеРазмещенияКонтактнойИнформации(ТаблицаРазмещенияКИ, Справочники.ВидыКонтактнойИнформации.ЮрАдресКонтрагента, Элементы.ЮрАдресКонтрагента.ПутьКДанным);

Ничего подозрительного пока не заметил.

Ну смотрите, предлагаю сделать так: зайдите в 1с и в меню "Операции" выберите "Обработка". Найдите там "КОнсоль запросов" либо "Консоль отчетов" (если нет - установите), и после записи через ТС выполните в обработке запрос к БД (думаю для файловой БД они тоже работают):

Выбрать ВашРеквизит Из Справочник.ВашСправочник.ВашаТаблЧасть
Где Ссылка.Наименование = "МойКонтрагент"

Если реквизит будет заполнен - значит запись проходит, если нет - значит нет :)

Если проходит - смотрите логику на карточке или в модуле объекта (чтото его при открытии чистит).
Если не проходит (но устанавливает корректно) - значит смотрите события модуля ПередЗаписью - что-то там его чистит.
Если не проходит (и не устанавливается) - скорее всего попутаны типы данных для реквизита.

пс: выполнение 1с-ного кода через COM (Террасофт) также можно отлаживать - погуглите.

Та-да! Всё дело в поле "ЗначенияПолей" (sic!), которое содержит... значения полей! То есть, значения всех остальных полей, у которых есть и свои собственные значения, только в xml формате. Я уже попробовал просто вбить скопированный и подправленный xml, всё загружается. Подробнее инфу можно найти тут: http://forum.aeroion.ru/topic779.html

Спасибо, Дмитрий. Без консоли запросов я бы ещё долго бился бы об это.

Ого! Это что-то новое :)

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

Добрый день.
Подскажите как в рассылках выводить полное название контрагента в Emaile

Сейчас туда выводится поле для для отображения. Т.е. Контрагент
скриншот
http://clip2net.com/s/72izzh

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

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

Здравствуйте, Константин Игоревич!

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

1) В запросе для макросов, который используется в шаблоне сообщения рассылки, вытянуть колонку "Полное название":

http://i59.fastpic.ru/big/2014/0318/a7/608eae23a23da4fb6a01b5a22084ada7.png

2) Отредактировать шаблон сообщения и вытащить появившийся макрос "Полное название" в тело письма, после чего сохранить шаблон сообщения.

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

Мне в теле письма не надо выводить. Мне надо выводить в адресе отправки.
Адрес для рассылки как я понял формируется в функции

function GetEmailFromDatasetFields(EmailField, ContactNameField) {
	var EmailAddress = EmailField.DisplayValue;
	if (IsEmptyStr(EmailAddress)) {
		return EmptyStr;
	}
	var ContactName = ContactNameField.DisplayValue;
	if (!IsEmptyStr(ContactName)) {
    		EmailAddress = ContactName + '<' + EmailAddress + '>';
   	}
	return EmailAddress;
}

Как для контактов так и для контрагентов. Скрипт scr_MailCommon

Константин Игоревич, для того, чтобы это реализовать, необходимо:

1) В сервисе sq_AccountCommunicationInMassMail создать колонку OfficialAccountName и заполнить ее следующим образом:

1

2) В сервисе ds_AccountCommunicationI

 

nMassMail создать колонку OfficialAccountName и заполнить ее следующим образом:

2

3) В сервисе wnd_MassMailGridAreaScript добавить переменную и подставить ее в качестве параметра функции:

3

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

Для некоторых клиентов карточки стали неактивны. Свойство IsEnabled для элементов, которые нельзя корректировать = true. Попытался сравнить записи, поля в которых доступны для редактирования, удаления и те, в которых недоступны. Особых различий не нашел. Сравнил свойства однотипных элементов из редактируемой и нередактируемой карточки. Отличается только свойство Color.
Что это может быть?
Карточка в прикрепленном файле.
Как ее хотя бы сделать активной, если нельзя сказать, почему она стала неактивной?

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

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

Если бы дело в IsEnabled, то и названия были бы серые. А так получается что поля только для чтения. Скорее всего, что-то не так с правами, посмотрите различия на детали "Доступ".

Да, скорее всего нет доступа на конкретные поля. Т.е. не контрол задизейблен,а поле датасета.

Господа, всем доброго времени суток!
Возникает вопрос, а как снять запрет на поле набора данных, если в настройках ds на поле отключена галка "Только для чтения".
А у самого набора данных все опции включены ("Редактирование", "Добавление", "Удаление" и т.д.)

Добрый день.

Тут, скорее всего, проблема в правах доступа. Проверьте:

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

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

А пользователь - Supervisor (если не ошибаюсь он вообще полный доступ иметь должен)

Если он админ - да.

Программно также можно... В функции OnPrepare Скрипта нужного Вам окна необходимо добавить проверку:

if(Connector.CurrentUser.UserContactID == 'ID какого либо контакта') {
      edtMyField.IsEnabled = false;
} else {
      edtMyField.IsEnabled = true;
}
Войдите или зарегистрируйтесь, чтобы комментировать
Вопрос

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

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

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

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

Нет, к сожалению базовая логика такого не предусматривает. Дело в том, что элемент БП может быть вообще не связан с контрагентом (к примеру вопрос пользователю).

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

Восстановил из *.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).
Каким образом это можно исправить?

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

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

Проблему решил сам, хватило лишь выполнить запрос

sp_change_users_login 'auto_fix', 'fkeys'

возможно кому-то поможет

Либо может еще отработать скрипт:
sp_change_users_login 'Update_one', 'fkeys', 'fkeys'

Арсений Белецкий
Техническая поддержка Terrasoft

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

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

1. В нужном разделе выбрать деталь Web

2. Нажать на значок линзы:

/system/files/1_62.png

3. В открывшемся окне выбрать текущий раздел и нажать на кнопку «Добавить»:

/system/files/2_41.png

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

http://maps.yandex.ua/?text=#Address#

где Address – имя поля в наборе данных (Dataset текущего раздела).

/system/files/3_23.png

Поделиться

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