Добрый день!

 

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

 

 

Спасибо заранее,

Айгуль

Нравится

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

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



Пожалуйста воспользуйтесь статтьей https://academy.creatio.com/docs/user/customization_tools/print_ready_r…

Pavlo Sokil,

Спасибо огромное!

 

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

Добрый день!

 

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

Для различия указываем в номере или АМ, или БМ вручную.

Вопрос: есть ли возможность как-то автоматически нумеровать по порядковому номеру следующего договора в зависимости от компании, которая заключает договор?

Прикрепленные файлы

Нравится

2 комментария
Лучший ответ

Добрый день!

В вашем случае можно использовать дополнение Numerator for Creatio, либо реализовать логику самому: например, через бизнес-процесс с сигналом [Создание договора], который будет изменять номер в зависимости от компании

Добрый день!

В вашем случае можно использовать дополнение Numerator for Creatio, либо реализовать логику самому: например, через бизнес-процесс с сигналом [Создание договора], который будет изменять номер в зависимости от компании

Добрый день.

 

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

 

Вам нужно переопределить метод:

	onEntityInitialized: function() {
		if ((this.isAddMode() && this.Ext.isEmpty(this.get("Number"))) || this.isCopyMode()) {
			this.getIncrementCode(function(response) {
				this.set("Number", response);
			});
		}
		this.callParent(arguments);
	}

Внутри функции getIncrementCode нужно добавить обработку условия от какой компании заключается договор и в зависимости от компании добавлять нужную приставку:

this.set("Number", response + "/" + postfix);

 

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

Добрый день!

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

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

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

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

Объект - ContractVisa,

Метод- GetNotificationInfo

Ошибка: При формировании визы по договору получаем значение contract.AccountName и contract.ContactName.

Но если для объекта Account и/или Contact изменить поле для отображения то при получении значения contract.AccountName (contract.ContactName) получаем ошибку Undefined.

Нравится

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

В объекте Contract нет отдельного поля AccountName. Это автоматически созданное поле для первичного поля отображения контрагента:

{
  "UId": "b1b39ef5-5550-41b4-9ad9-77f60c847d89",
  "Name": "Account",
  "CreatedInSchemaUId": "897be3e4-0333-467d-88e2-b7a945c0d810",
  "ModifiedInSchemaUId": "897be3e4-0333-467d-88e2-b7a945c0d810",
  "CreatedInPackageId": "1401a881-7126-4c81-86f8-4e9e355b0669",
  "DataValueTypeUId": "b295071f-7ea9-4e62-8d1a-919bf3732ff2",
  "ReferenceSchemaUId": "25d7c1ab-1de0-4501-b402-02e0e5a72d6e",
  "RequirementType": 1,
  "IsIndexed": true,
  "ColumnValueName": "AccountId",
  "DisplayColumnValueName": "AccountName"
},

Соответственно, при изменении первичного поля в настройках объекта Account поле в Contract тоже изменит название. С ContactName всё аналогично.

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

 

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

Отсутствует возможность установить связь Договора с Продажей. Что является странным, т.к. в стандартном процессе есть стадия "Контрактация". Т.е. стадия процесса есть, а связи с ключевым объектом стадии нет.Заказ сформировать из Продажи можно, Договор на основании Заказа - тоже можно. Но многие компании формируют с клиентом рамочный договор, т.е. исполняется 1 процесс продаж, заключается 1 договор, а вот заказов может быть неограниченное число. Такую модель отношений стандартной схемой не реализовать.

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

Добрый день, Наталья!

В базовой конфигурации системы действительно отсутствует деталь в продаже для связи с договором. Обходным решением может быть создание собственной детали используя наш мастер. Что же касается внесения данной функциональности в базовую логику работы системы, то по данному вопросу уже есть зарегистрированная проблема на команду разработки продукта с целью реализации в последующих релизах. Номер проблемы 989.

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

Добрый день!

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

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

Нравится

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

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

Юлия, спасибо! Буду пробовать.

Николай, необходимо сделать следующее:
- Добавить аттрибут Client с колонками Contact, Account (можно посмотреть в InvoicePageV2)
- В diff добавить поле Клиент и скрыть поля Account и Contact
- Настроить правила фильтрации (несколько полей в договорах вроде по Account фильтруются)

Еще раз спасибо за информацию - все получилось.
Но, столкнулся с одним нюансом. При выборе в поле Client записи из таблицы Contact, у которой в свою очередь проинициализировано поле Account, происходит заполнение поля Account в договоре, но согласно нашей бизнес-логике, такого не должно происходить.
Как я понимаю, это "дело рук" одного из унаследованных бизнес-правил. В связи с этим вопрос - как правильно отключать унаследованные бизнес-правила?
Пока вышел из ситуации переопределением данного бизнес-правила:

"Contact": {
  "FiltrationContactByAccount": {
    "ruleType": BusinessRuleModule.enums.RuleType.FILTRATION,
    "autocomplete": false,
    "autoClean": false,
    "baseAttributePatch": "Account",
    "comparisonType": this.Terrasoft.ComparisonType.EQUAL,
    "type": BusinessRuleModule.enums.ValueType.ATTRIBUTE,
    "attribute": "Account"
  }
}

Здравствуйте, Николай!

Вам необходимо заместить базовое правило его переопределением.

Хм... оказалось, не все так просто...
При вводе текста непосредственно в данное поле, происходит поиск по контрагентам и контактам - тут все ОК. Но, при попытке открыть окно выбора (при нажатии кнопки с лупой) на экране появляется пустое окно без контролов, а в консоле браузера наблюдается следующее сообщение об ошибке:

message: Cannot read property 'split' of undefined 
 date: Tue Dec 15 2015 23: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 15 2015 23:53:11 GMT+1000 (VLAT)
 moduleId: SectionModuleV2_ContractSectionV2_CardModuleV2_chain00000000-0000-0000-0000-000000000000_LookupPage
 moduleName: LookupPage

Я так понимаю, где-то нужно указать правильный LookupPage. Вопрос - где?

Проверил данный способ как на Документах, так и на Договорах. Опишу по пунктам действия:

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

2. Убедился что в объекте есть колонки как "Контакт" так и "Контрагент".

3. Добавил зависимость на бизнес правила:

define('ContractPageV2', ['ContractPageV2Resources', 'GeneralDetails', "BusinessRuleModule"],
function(resources, GeneralDetails, BusinessRuleModule) {

4. Добавил атрибут:

attributes: {
   "Client": {
	"caption": "TestClient",
	"dataValueType": this.Terrasoft.DataValueType.LOOKUP,
	"multiLookupColumns": ["Contact", "Account"],
	"isRequired": false
   }
},

5. Вывел поле на форму:

diff: /**SCHEMA_DIFF*/[
	{
		"operation": "insert",
		"parentName": "Header",
		"propertyName": "items",
		"name": "Client",
		"values": {
			"layout": {"column": 0, "row": 3, "colSpan": 12},
			"controlConfig": {
				"enableLeftIcon": true,
				"leftIconConfig": {"bindTo": "getMultiLookupIconConfig"}
			}
		}
	}
]/**SCHEMA_DIFF*/,

6. Добавил правило:

rules: {
	"Contact": {
		"FiltrationContactByAccount": {
			"ruleType": BusinessRuleModule.enums.RuleType.FILTRATION,
			"autocomplete": false,
			"autoClean": false,
			"baseAttributePatch": "Account",
			"comparisonType": this.Terrasoft.ComparisonType.EQUAL,
			"type": BusinessRuleModule.enums.ValueType.ATTRIBUTE,
			"attribute": "Account"
		}
	}
},

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);
  }
}
Показать все комментарии

Доброго времени суток!
Собственно, задача состоит в следующем. Определенный тип договоров создается с обязательным полем, в котором указывается родительский договор. К одному родительскому договору могут прикреплены любое количество подчиненных договоров. Нужно: при прикреплении файла на деталь Файлы в подчиненных договорах, создавать такие же в родительском, т.е. на детали Файлы родительского договора должны быть все файлы всех подчиненных договоров. (естественно без дублей самих файлов в базе).
Как вариант решения - отслеживать добавление записей в разгрузочную таблицу tbl_FileInContract, и добавлять запись с ID родительского договора и ID файла. Правильный ли будет этот подход и каким образом его можно реализовать?

Нравится

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

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

Алгоритм абсолютно правильный. Вам следует добавить свою функцию в function ProcessAfterAddOperations(AddedFileIDsArray) в скрипте scr_FilesDetailGridArea

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

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

Для того чтобы добавить действие «Создать документ на основании договора» в раздел [Договоры] необходимо придерживаться следующего алгоритма:
1. Запустить Terrasoft Administrator.
2. Открыть сервис wnd_ContractsWorkspace. Перейти на закладку «Невизуальные», выделить компонент amiActions. Добавить новый ActionMenuItem:
o1

Заполнить свойства следующим образом:
o2

Сохранить изменения.
3. Перейти на закладку «События». Для добавленного компонента amiDocumentByContract создать обработчик события OnExecute:
o4

В теле функции обработки события прописать код:

FUNCTION amiDocumentByContractOnExecute(ActionMenuItem, Sender) {
         var ContractIDs = BaseWorkspace.Grid.SelectedIDs;
            var Count = ContractIDs.Count;
            IF (!Count||IsDatasetEmpty(dlContracts.Dataset)) {
                        ShowWarningDialog(GridNotContainsAnyRecords);
                        RETURN;
            }
            IF (Count > 1) {
                        var Message = FormatStr(GridContainsSomeRecords, Count);
                        IF (ShowConfirmationDialog(Message) == mrYes) {
                                   CreateDocumentByContract(ContractIDs);
                        }
            } else {
                        CreateDocumentByContract(ContractIDs);
            }
}

В этом же скрипте (wnd_ContractsWorkspaceScript) реализовать функцию FUNCTION CreateDocumentByContract(ContractIDs)

FUNCTION CreateDocumentByContract(ContractIDs) {
            var ContractDataset = dlContracts.Dataset;
            FOR (var i=0; iContractIDs.Count; i++) {
                        var Dataset = Services.GetSingleItemByUSI(ContractDataset.USI);
                        var ContractID = ContractIDs.Items(i);
                        ApplyDatasetIDFilter(Dataset, ContractID, true);
                        Dataset.DisableEvents();
                        Dataset.Open();
                        var DefaultValues = GetNewDictionary();
                        var NamedArray = GetDatasetFieldsValuesNamedArray(Dataset, new Array(
                                   'OwnerID', 'ContactID', 'CampaignID', 'OpportunityID',                            
                                   /* MODULE PROJECTS */ 'ProjectID'/* ENDMODULE PROJECTS */));
                        AddNamedArrayToDictionary(NamedArray, DefaultValues);
                        var InvoiceDate = GetFieldValueFromDisabledField(Dataset, 'StartDate');
                        var ContractID = GetFieldValueFromDisabledField(Dataset, 'ID');
                        Dataset.Close();
                        Dataset.EnableEvents();
                        DefaultValues.ADD('ContractID', ContractID);
                        DefaultValues.ADD('InvoiceDate', InvoiceDate);
                        var Attributes = GetNewDictionary();
                        Attributes('IsCreatedByContractID') = ContractID;
                        CreateNewWindowEdit(Self, 'wnd_DocumentEdit', DefaultValues, Attributes);
                       
            }
}

Таким образом скрипт будет иметь вид:
o5

4. Сохранить все внесенные изменения. Перезапустить приложение Terrasoft. Проверить работу функционала.

Перед внесением изменений в конфигурацию настоятельно рекомендуем создать резервную копию БД.

Нравится

Поделиться

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

Здравствуйте. Как создавать автоматически договора?. Спасибо.

Нравится

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

Запись в разделе [Договоры]?
Для этого есть много способов. В какой момент необходимо создавать?

У меня версия Sales. Я в ней не нахожу раздел договоры.

Terrasoft Sales не содержит данный функционал.

Если функционал договоров, критичен есть два пути:
1) Расширять конфигурацию до Terrasoft CRM;
2) Дорабатывать указанный функционал на имеющейся конфигурации.

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

Возникла такая проблема при попытке выбора "проект/стадия/работа" в счете, договоре, операции возникает исключение: "несоответствие типа".
Версия: 3.3.2.116 XRM Professional Services + обновления сервисов для интеграции с 1С (131010)

Нравится

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

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

// wnd_ProjectDictionaryScript
 
function InitializeGridButtons() {
	var ProjectsfrmButtons = Projects.Window.ComponentsByName('frmButtons');
	ProjectsfrmButtons.IsVisible = Self.Attributes('ShowEditButtons'); // в этой стороке

Self.Attributes('ShowEditButtons') значение дебаггером посмотрите наверняка undefined или null попадает

Замените эту строчку на такую:

ProjectsfrmButtons.IsVisible = !!Self.Attributes('ShowEditButtons');
Показать все комментарии