Как можно открыть справочник с кнопки на отдельно взятой странице, не из меню ?
пытался открыть вот так:
var wnd = Services.GetNewItemByUSI('wnd_BranchesGridArea');
wnd.Prepare();
wnd.ShowModal();
так нельзя, окно открывается, но данных нет в нем и ошибки лезут.

Нравится

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

Вашу задачу можно решить несколькими способами:
1. Свой вариант

	var wndContactsGridArea =  Services.GetNewItemByUSI('wnd_ContactGridArea');
	wndContactsGridArea.Prepare();
	var Dataset = wndContactsGridArea.ComponentsByName('dlData').Dataset;
	RefreshDataset(Dataset);
	wndContactsGridArea.ShowModal();

Результат:

2. Стандартный вариант

	var Dataset = Services.GetNewItemByUSI('ds_Contact');
    var SelectDataWindow = GetSingleItemByCode('wnd_SelectData', 'Contacts');
	SetAttribute(SelectDataWindow, 'Dataset', Dataset);
	SetAttribute(SelectDataWindow, 'DisplayFieldNames', 'Name;AccountID;ContactTypeID');
	SetAttribute(SelectDataWindow, 'SearchFieldNames', 'Name;AccountID');
	SetAttribute(SelectDataWindow, 'KeyFieldName', 'ID');
	SetAttribute(SelectDataWindow, 'SearchFieldName', 'Name');
	SetAttribute(SelectDataWindow, 'NotifyObject', Self);
	SetAttribute(SelectDataWindow, 'IsReadOnly', true);
	SelectDataWindow.Prepare();
	SelectDataWindow.Show();

Результат:

3. Использовать функцию ShowSelectDataWindow из сервиса scr_WindowUtils
4. Свой вариант решения. Где создается свое окно выбора, со своей логикой работы.

спасибо!

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

Как можно открыть справочник с кнопки на отдельно взятой странице, не из меню ?
пытался открыть вот так:
var wnd = Services.GetNewItemByUSI('wnd_BranchesGridArea');
wnd.Prepare();
wnd.ShowModal();
так нельзя, окно открывается, но данных нет в нем и ошибки лезут.

Нравится

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

Ответ на Ваш вопрос предоставлен в подобном вопросе Открыть справочник на отдельной странице

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

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

При выборе контрагента в поле [Клиент] хотелось бы, чтобы поле [Реквизиты клиента] заполнялось автоматически, если у контрагента один реквизит. Возможно ли это сделать?

Заранее благодарю за помощь.

Нравится

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

Настолько частая задача, что хотелось бы, чтобы её в коробку добавили.

Так как же эта задача решается не из коробки?

Спасибо за Ваш комментарий. Пожелание на доработку в базовой конфигурации системы отправлено соответствующей команде разработки продукта.

ставим attributes

"CustomerBillingInfo": {
	dependencies: [
		{
				columns: ["Account"],
				methodName: "setCustomerBillingInfo"
		}
	]
}

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

	   /**
             * Установка BillingInfo по условию: 1) Если у контрагента всего один BillingInfo то
             *									 2) Вставляем его объект в BillingInfo
             *                                   3) Если больше - ищем по умолчанию
            */
			setCustomerBillingInfo: function() {
                var account = this.get("Account");
				if (account) {
					var esq = Ext.create("Terrasoft.EntitySchemaQuery", {
						rootSchemaName: "AccountBillingInfo"
					});
                    esq.addColumn("Id");
                    esq.addColumn("Name");
                    esq.addColumn("UsrDefault");
					esq.filters.add("AccountFilter", this.Terrasoft.createColumnFilterWithParameter(
						this.Terrasoft.ComparisonType.EQUAL, "Account", account.value));
					esq.getEntityCollection(function(response) {
						if (response && response.success) {
							var collection = response.collection;
							if (collection && collection.getCount() > 0) {
                               var items = collection.getItems();
                               if (items.length === 1) {
                                   var item = items[0];
                                   this.set("CustomerBillingInfo", {value: item.get("Id"), displayValue: item.get("Name")});
                               }
                               else {
                                   items.forEach(function(item) {
                                       if (item.get("UsrDefault")) {
                                           this.set("CustomerBillingInfo", {value: item.get("Id"), 
                                               displayValue: item.get("Name")});
                                           return;
                                       }
                                   }, this);
                               }
							}
						}
					}, this);
				}
			}

Владимир, благодарю! Я был на правильном пути, но мне не хватало вот этой строчки кода:

this.set("CustomerBillingInfo", 
    {value: item.get("Id"), displayValue: item.get("Name")});
Показать все комментарии

Добрый день!
Нужно создать справочник с страницей редактирования.

Был создан скрытый раздел, и добавлен справочник. Но возникает проблема, при попытке открыть справочник открывает:

как видите в адресной строке пишет: LookupSectionModule/ilayDocReportsSection
и не отображаются записи справочника.
Но после нажатия Вид -> Настроить колонки(или Настроить итоги) и возврата с страницы настройки назад:

и в адресной строке теперь пишет: SectionModuleV2/ilayDocReportsSection

Смотрел в базе как зарегистрирован аналогичный справочник "Библиотека блоков контента" не нашел отличий.
:

эти темы смотрел:
https://community.terrasoft.ru/forum/topic/16288
https://community.terrasoft.ru/forum/topic/13139

Нравится

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

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

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

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

"Мотков Илья" написал:

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

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

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

Добрый день, Илья!

Дело в том что как раз через мастер и был создан раздел, и "страницой реестра" была указана секция созданного мастером раздела.

И проблема в том, что при открытии наполнения справочника сначала открывается LookupSectionModule/ilayDocReportsSection, а после открытия страницы настройки колонок открывается уже SectionModuleV2/ilayDocReportsSection.

Здравствуйте,
Отличный вопрос. Виной всему вот этот метод:

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

getProfileKey: function() {
   var currentTabName = this.getActiveViewName();
   var schemaName = this.name;
   return schemaName + this.entitySchemaName + "GridSettings" + currentTabName;
}

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

Добрый день, Максим!
Большое спасибо за ответ!

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

Для реализации данного функционала, необходимо:

1. Создать справочник:



В результате, создадутся сервисы в ветке Accounts\Dictionaries\SubFields\

2. Проверить, создалось ли поле в таблице tbl_SubFields (Accounts\Dictionaries\SubFields\tbl_SubFields):

3. В сервисе запроса sq_SubFields (Accounts\Dictionaries\SubFields\sq_SubFields) добавить параметр:

4. Добавить фильтр сравнения:

5. Проверить, создалось ли поле в сервисе датасета ds_SubFields (Accounts\Dictionaries\SubFields\ds_SubFields):

6. Проверить, создалась ли карточка редактирования wnd_SubFieldsEdit (Accounts\Dictionaries\SubFields\wnd_SubFieldsEdit) и поле «Отрасль» в ней:

7. Добавить поле в сервис таблицы tbl_Account (Accounts\General\Main Grid\tbl_Account):

8. Добавить связь:

9. Добавить колонку в сервис запроса sq_Account (Accounts\General\Main Grid\sq_Account):

10. Присоединить таблицу к запросу:

11. Добавить колонку:

12. Создать поле в сервисе датасета ds_Account (Accounts\General\Main Grid\ds_Account):

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

14. Перейти на вкладку события и создать обработчик OnPrepareSelectWindow (дважды кликнув по пустому полю, в результате чего в нем появится запись edtSubFieldOnPrepareSelectWindow):

15. Добавить в созданный обработчик следующий код:

        var Dataset = dlData.Dataset;
        var LookupDataset = LookupDataControl.DataField.LookupDataset;
        var AccountFieldID = GetDatasetFieldValue(Dataset, 'FieldID');
        ApplyDatasetFilter(LookupDataset, 'FieldID', AccountFieldID, true);

В результате:

16. Сохранить изменения и перезапустить Terrasoft.

17. Заполнить справочник «Подотрасли».

В результате:

Источник: БЗ

Нравится

Поделиться

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

Нашла куда более адекватный вариант решения от Наташи Бондарь:

Для того, чтобы при выборе одного значения справочника, ограничивалось содержимое другого справочника необходимо:
1. Создать обработчик события OnPrepareSelectWindow поля-справочника, содержимое которого нужно ограничить:

2. В теле функции обработки события осуществлять фильтрацию записей справочника посредством вызова функции function ApplyDatasetFilter(Dataset, FilterName, ParamValue, Enabled). Обращаем Ваше внимание, в сервисе выборки данных (sq_xxx) справочника, значения которого нужно ограничить, обязательно должен присутствовать фильтр сравнения и параметр.
Реализацию подобной функциональности Вы можете посмотреть во многих карточках редактирования системы, например, для базовых полей «Страна», «Регион» карточек [Контакт], [Контрагент].

Ответ на 2 вопрос:
Для того, чтобы при заполнении одного поля, другое поле заполнялось автоматически необходимо:
В функции OnDatasetDataChange набора данных (датасета) делать проверку по полю. Если изменяется содержимое поля «Контакт», осуществлять фильтрация записей датасета контактов (ds_Contact) по текущему контакту (фильтрация выполняется посредством функции function ApplyDatasetFilter(Dataset, FilterName, ParamValue, Enabled)). После фильтрации получать значение подразделения контакта и присваивать его полю «Подразделение» датасета карточки редактирования.

var Dataset = dlData.Dataset;
            if (DataField.Name == 'ContactID' ) {
                        var DatasetContacts = Services.GetNewItemByUSI('ds_Contact');
                        ApplyDatasetFilter(DatasetContacts, 'ID', DataField.Value, true);
                        DatasetContacts.Open();
                        var Podrazdelenie = DatasetContacts('Podrazdelenie');
                        Dataset('Podrazdelenie') = Podrazdelenie;
                        DatasetContacts.Close();
            }
Показать все комментарии

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

Столкнулся с проблемой при добавлении нового поля в справочник "Типы виз".
Через клиента администратора добавил поле IsUrgent в таблицу tbl_Vises. Затем добавил это поле в датасет ds_Vises. затем в wnd_VisesDictionaryGridArea в грид добавил колонку для поля isUrgent.
Теперь, при редактировании справочника виз - в гриде колонка добавилась, а в модальной форме редактирования/добавление - нет.
Извиняюсь, если глупый вопрос, я второй день работаю со скриптами в CRM.

PS: версия 3.3.2.143

Нравится

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

В сервисе ds_Vises для поля IsUrgent проставьте значение в поле "Поле для отображения" (если я Вас правильно понял)

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

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

"Кулак Олег" написал:лучше создайте свое окно редактирования и используйте его.

Олег, ткните плиз носом в ссылку, как создавать "свои" окна редактирования?

P.S.модераторам - можно увеличить максимальынй размер закачиваемых скриншотов? А то в 600х600 трудно уместить нормальное окно в хорошем качестве.

CSharper, к сожалению, не смог найти ничего конкретного. Может тут: http://community.terrasoft.ru/forum/topic/786. что-то близкое.

Олег, спасибо большое за ссылку, постараюсь разобраться.

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

Почему остальные не отображаются в меню
например "E-mail" или другие.
Буду рад комментариям!

Нравится

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

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



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

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

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

Здравствуйте. Создал справочник подобный "Группы контрагентов", добавил таб просмотра и добавления записей по нему в wnd_AccountWorkspace. Нужно чтобы по нажатию кнопки "добавить" открывалась форма поиска записей из справочника.

Выполнение кода:

function btnAddOnClick(Control) {
var Window = Self;
AddGridAreaData(Self, Self, BaseGridArea);
}

function AddGridAreaData(NotifyObject, Window, BaseGridArea, AdditionalAttributes) {
if (!Assigned(NotifyObject)) {
NotifyObject = Window;
}
BaseGridArea.NotifyObject = NotifyObject;
if (!GetCanInsertTableGroup(BaseGridArea.GridDataset)) {
return;
}
CheckAttributes(NotifyObject, 'EditWindowUSI');
var Attributes = GetAddDataAttributes(Window, BaseGridArea);
if (Assigned(AdditionalAttributes)) {
CopyAttributes(AdditionalAttributes, Attributes);
}
if (IsAttributeExists(Window, 'EditWindowDatasetUSI')) {
Attributes('DatasetUSI') = Window.Attributes('EditWindowDatasetUSI');
}
Attributes('WorkspaceDataset') = BaseGridArea.WorkspaceDataset;
ShowEditWindowEx(BaseGridArea.EditWindowUSI, Attributes,
BaseGridArea.AddDataDefaultValues);
}

Приводит к ошибке:

'EditWindowUSI' значение атрибута не определено

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

Нравится

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

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

При выполнении кода происходит проверка атрибута CheckAttributes(NotifyObject, 'EditWindowUSI'). Скорее всего ошибка появляется из-за того, что система не находит значения атрибута 'EditWindowUSI'. Как правило, данный атрибут прописывается в функции OnPrepare в GridArea.
Например, SetAttribute(Window, 'EditWindowUSI', 'wnd_AccountIndustryEdit').

Terrasoft Support Team

Добрый день. Попробовал решить проблему следующим образом: создал форму на базе шаблона wnd_BaseGridArea, по клику на Добавить выполняется:

function btnAddOnClick(Control) {
AddData(Control);
}

function AddData(Control) {
if (!BaseGridArea.WorkspaceMode) {
var Dataset = Services.GetNewItemByUSI('ds_EnterPoints');
ShowSelectDataWindowSimple(Dataset, 'Name;Description', Self,
false, 'SelectData');
} else {
scr_BaseGridArea.btnAddOnClick(Control);
}
}

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

Таблица содержит стандартные поля: ID, CreatedOn, CreatedByID, ModifiedOn, ModifiedByID, Name, Description. Группа родительской таблицы - Контрагенты. В датасете отмечены: Генерировать запрос на вставку, обновление, удаление и Справочник.

При попытке добавить запись ошибки:

'RecordID' значение атрибута не определено
'AddNewRecordOnPage' значение атрибута не определено

Подскажите, пожалуйста, что неправильно делаю.

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

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

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

В случае если Вы реализуете в карточке контрагента функционал подобный детали [Группы], то можем порекомендовать Вам обработчике события OnNotify окна нужной детали вызывать функцию, в которой реализована вставку в таблицу. Например, для детали [Группы] это реализовано в скрипте scr_GroupsGridArea в функциях: function wnd_GroupsGridAreaOnNotify -> function GetSelectGroupResult(Sender, Message)

Terrasoft Support Team

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

The statement has been terminated.
Violation of PRIMARY KEY constraint 'PServiceID'. Cannot insert duplicate key in object 'tbl_Service'.

Как правильно добавлять и сохранять?

Добрый день,
скажыте пожалуйста как Вы создали окно?
и как пробуете оздать скрипт

Окно делал не я. Попробую выяснить. Скрипт делал в Администраторе через RMB клик по папке с модулем -> Новый -> Script. Второй вариант - свойство формы Script выставил в (Nil), и из дизайнера создавал новый обработчик события, при этом мне предлагалось создать новый скрипт для формы.

и каким способом Вы воспользовались?

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

если можна вышлите на суппорт измененые Вами сервисы
так навскидку решыть Вашу проблему не выходит

Здравствуйте. Не получаеться, не только сохранить изменения в скрипте, но и сохранить изменения вообще в любом новом элемента проекта. Написал в тех. поддержку:

>>
Здравствуйте. В администраторе не могу сохранить новые скрипты и workflow diagram. Добавляю через пункт меню новый, вношу изменения, пытаюсь сохранить и возникает ошибка:

The statement has been terminated.
Violation of PRIMARY KEY constraint 'PServiceID'. Cannot insert duplicate key in object 'tbl_Service'.
Помогите, пожалуйста, разобраться. Спасибо.
>>

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

в идеале ето конешно полный бекап Вашей базы

ошыбка
"Violation of PRIMARY KEY constraint 'PServiceID'. Cannot insert duplicate key in object 'tbl_Service'."
ето сообщение базы данных
посмотрите в профайлере на каком именно скрипте
падает ошыбка

Вы можете подключиться ко мне через TeamViewer, как это делали раньше?

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

Я задавал эти же вопросы по почте, писал на 'support@tscrm.com'; 'support@terrasoft.ru'; 'E.Guk@tscrm.com'. Скажите пожалуйста, она доставлена?

если у Вас бесплатный сервис то ответ прийдет в течении 5 рабочих дней
попробуйте позвонить на support

Доброго дня!

"Матвеев Сергей" написал:Таблица содержит стандартные поля: ID, CreatedOn, CreatedByID, ModifiedOn, ModifiedByID, Name, Description. Группа родительской таблицы - Контрагенты. В датасете отмечены: Генерировать запрос на вставку, обновление, удаление и Справочник.

При попытке добавить запись ошибки:

'RecordID' значение атрибута не определено
'AddNewRecordOnPage' значение атрибута не определено

Тут дело в том, что после закрытия окно wnd_SelectData шлет сообщение своему NotifyObject, который передавался ей в атрибутах. Если не перекрывать стандартную логику, то будет описанная Вами ошибка. Соответственно, для корректной реализации нужно перекрыть обработчик события OnNotify у окна реестра, куда добавляется запись.
Можно сделать примерно так:

if (Sender.Attributes('IsAccountsGroupSelectData') && Message == MSG_OK) {
	var AccountGroupID = Sender.Attributes('KeyValue'); // Это для одной записи
	var AccountGroupIDsArray = Sender.Attributes('KeyValues'); // Это для нескольких выделенных записей
	// тут уже можно реализовывать логику
	}

Плюс ко всему, при вызове окна я бы еще сделал так:

function AddData(Control) {
    if (!BaseGridArea.WorkspaceMode) {
         var Dataset = Services.GetNewItemByUSI('ds_EnterPoints');
         var SelectData = ShowSelectDataWindowSimple(Dataset, 'Name;Description', Self,
             false, 'SelectData');
         SelectData.Attributes('IsAccountsGroupSelectData') = true; //Это на случай, если используется несколько окон SelectData с разными целями, а сообщения шлют одному окну. Так можно определить какое именно окно прислало сообщение
    } else {
         scr_BaseGridArea.btnAddOnClick(Control);
    }
}

Добрый день.
Спасибо за помощь. Вызываеться форма поиска по нужному справочнику. Осталась проблема с сохранением выбранной записи.

"support" написал:В случае если Вы реализуете в карточке контрагента функционал подобный детали [Группы], то можем порекомендовать Вам обработчике события OnNotify окна нужной детали вызывать функцию, в которой реализована вставку в таблицу. Например, для детали [Группы] это реализовано в скрипте scr_GroupsGridArea в функциях: function wnd_GroupsGridAreaOnNotify -> function GetSelectGroupResult(Sender, Message)

Попытался сделать сохранение по аналогии с Группами, возникла проблемма (внутри функции GetSelectGroupResult):

>> Ошибка выполнения метода 'wnd_EnterPointsGridAreaOnNotify'. "GroupsGridArea.GroupDataset.USI" - есть null или не является объектом

и далее ошибка на методе Dataset.Open(); после присвоения var Dataset = GroupsGridArea.GridAreaGroupDataset;

>>Ошибка выполнения метода 'wnd_EnterPointsGridAreaOnNotify'. "undefined" - есть null или не является объектом

Датасет инициализируеться точно так же как в Группах (function InitializeGlobalVariables(), function InitializeDataset())

Подскажите, пожалуйста, в чем ошибка? И как при сохранении записи "привязать" ее к выбранному контрагенту (по полю AccountID)?

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

Вам не нужно пользоваться функцией GetSelectGroupResult
Вам нужно создать похожую функцыю для своих нужд
обэкт GroupsGridArea при вызове фн GetSelectGroupResult из вашего скрипта несуществует
если я правильно Вас понял Вам нужна функцыя такого типа

function GetSelectResult(Dataset, // куда вставляем
						 ParentItemID,  // к чему привязываем
						 ParentItemName, //  имя поля связи
						 Sender, // стандартные
						 Message) { // переменные
	var OurID = GetSelectDataResultKeyValue(Sender, Message);//получаем выбраный ID
	if (OurID == null) {
		return;
	}
	Dataset.Append();
	Dataset.Values('ID') = Connector.GenGUID();
	Dataset.Values(ParentItemName) = ParentItemID;
	Dataset.Values('OurFieldName') = OurID;//вставляем в наше поле полученое значения
	Dataset.Post();
}
Показать все комментарии