Вопрос

Добрый день, коллеги. Необходимо чтобы в разделе была сгенерирована деталь с полями (описание, тип оплаты, сумма,  файл (фото_чека.jpg/png/pdf)).

В разделе есть деталь "Файл и ссылка объекта Продажи". Добавляю колонки тип оплаты, сумма. Затем замещаю схему FileDetailV2 и добавляю в него код для того, чтобы была возможность настроить колонки для детали. Настраиваю колонки и они показываются на странице, но заполнить добавленные поля (тип оплаты, сумма) не получается потому что на карточке редактирования их нет (там только стандартные поля Название и описание).

Вопрос: как добавить созданные поля в карточку?

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

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

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

Григорий Чех,

Не подскажите, как создать эту карточку?

Артём Иванов Иванович,

в мастере раздела создается новая страница редактирования на первой странице

Натали Вишня,

Это очевидно не то, что мне нужно.

Добавить нужные колонки и отобразить их получилось:

Но какую страницу заместить, чтобы добавить в эту карточку необходимые колонки (сумма) 

Похоже на LinkPageV2. Точно проверить можно, нажав в браузере «Inspect» и посмотрев в HTML-коде.

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

Добрый день!

Добавил на кастомную страницу базовую деталь FileDetailV2 из пакета UIv2.

При инициализации детали падает ошибка: 

user: Supervisor/7f3b869f-34f3-4f20-ab4d-7480a5fdf647
 file: undefined
 line: undefined
 column: undefined
 message: Cannot read property 'initDropzoneEvents' of undefined 
 date: Fri Apr 20 2018 10:17:45 GMT+0400 (RTZ 3 (зима))
 moduleId: CardModuleV2_fa04f9ca-d9d9-4c1e-bae9-ef23c8b24925_FinApplicationPage_detail_FileDetailV2snIntegrationLogFile
 moduleName: DetailModuleV2

При этом вручную добавить файлы на деталь невозможно.

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

Подскажите, в чем может быть проблема?

 

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

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

Дмитрий, добрый день! 

Попробуйте передобавить деталь согласно SDK - https://academy.terrasoft.ru/documents/technic-sdk/7-12/dobavlenie-deta…

Либо как во вложении https://www.dropbox.com/s/uhruk6kh04y0zjr/%D0%94%D0%BE%D0%B1%D0%B0%D0%B2%D0%BB%D0%B5%D0%BD%D0%B8%D0%B5%20%D0%B4%D0%B5%D1%82%D0%B0%D0%BB%D0%B8%20%D1%84%D0%B0%D0%B9%D0%BB%D1%8B%20%D0%B8%20%D1%81%D1%81%D1%8B%D0%BB%D0%BA%D0%B8.docx?dl=0

Также в версии 7.12.1 появится возможность добавить деталь "Файлы и ссылки" пользовательскими средствами.

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

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

Вроде этот функционал уже был в terrasoft 3.x и bpmonline 5.x.

Обсуждение
1 комментарий

Здравствуйте, Игорь

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

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

Возможно ли расположить кнопку напротив каждой строки детали? Например кнопку "Удалить".

Примерно так:

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

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

И "Редактировать"!

Не знаю как с кнопками в конце, но в схеме разделов можно подсмотреть код и реализовать такой вариант:

Чисто теоретически можно забиндаться к добавлению записи в грид и вставлять свой контейнер с кнопкой на то место что вам требуется. Ну и конечно придётся поиграться со стилями. Что-то подобное мы уже пытались делать. Одно могу сказать что к добавлению элемента в DOM мы уже имели опыт биндинга и выполнения своей логики, а так же создания произвольных HTML элементов на странице.

А то что посоветовал Данила можно подсмотреть в странице локального поиска дублей, например. Вот как то так: 

{
	id: "duplicateGrid",
	className: "Terrasoft.Grid",
	type: "tiled",
	primaryColumnName: "Id",
	activeRow: {bindTo: "activeRow"},
	columnsConfig: [columnsConfig],
	collection: {bindTo: "gridData"},
	activeRowAction: {bindTo: "onActiveRowAction"},
	activeRowActions: [
		{
			className: "Terrasoft.Button",
			style: Terrasoft.controls.ButtonEnums.style.BLUE,
			caption: resources.localizableStrings.IsNotDuplicateCaption,
			tag: "IsNotDuplicate",
			visible: {bindTo: "getGridButtonIsNotDuplicateVisible"}
		},
		{
			className: "Terrasoft.Button",
			style: Terrasoft.controls.ButtonEnums.style.BLUE,
			caption: resources.localizableStrings.IsDuplicateCaption,
			tag: "IsDuplicate",
			visible: {bindTo: "getGridButtonIsDuplicateVisible"}
		}
	]
}

 

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

Итак попытка добавить данную деталь в раздел Активности не увенчалась полным успехом.

Добавление происходило через мастер мобильного приложения.

Так же автоматом создало 3 схемы и замещающий манифест в текущем пакете.

При попытке добавить файл мы наблюдаем следующее, возможность добавить файл полностью отсутствует!!!

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

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

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

Вобщем коллеги, обращаюсь за помощью к вам.

Думаю не мне одному интересно как с этим справиться.

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

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

Михаил, здравствуйте!

Данная деталь является специфической, так как добавление и хранение данных отличается от других деталей. Поэтому нужно на уровне кода добавлять данную деталь. Инструкция давненько лежит на SDK и которая не раз была направлена пользователям системы - https://academy.terrasoft.ru/documents/technic-sdk/7-11/mobilnoe-priloz…

Цитата на Академии:

"Деталь "Файлы и ссылки" доступна во всех разделах bpm'online (см. "Файлы и примечания") и в разделе [Продажи] ([Opportunities]) мобильного приложения" - это ответ на Ваш вопрос по поводу раздела "Продажи".

Удалите через мастер эту деталь и выполните согласно инструкции:

- До 7.11.2 - https://academy.terrasoft.ru/documents/technic-sdk/7-11/dobavlenie-deta…

- 7.11.2 и выше - https://academy.terrasoft.ru/documents/technic-sdk/7-11/dobavlenie-deta…

Примечение. Манифест проще всего создать через мастер (создается автоматически при сохранении текущих настроек).

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

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

 

Хорошего дня!

 

Добрый день! 

В версии bpm'online 7.11.3 добавлена возможность добавить деталь "Файлы и ссылки" в любой раздел мобильного приложения (если для аналогичного раздела деталь существует в основном интерфейсе) через мастер мобильного приложения.

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

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

Добрый день. Подскажите, пожалуйста. Создала новую страницу активности

1. В детали "Участники активности" не знаю что выбрать в колонке детали и колонке объекта. Пробовала разные варианты - не получается.

2. Во всех активностях есть вкладка "Файлы и примечания". Что выбрать в детали "Файлы и ссылки Активности"?

и как добавить пункт "Примечания"?

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

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

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

1) я обычно делаю таким образом:

2) Добавление детали . Примечание ,кажется это группа полей "Примечание"+ текстовое поле,у которого скрыт заголовок. Или же надо посмотреть, как кодом прописать добавление примечания на страницу.

Пример со страницы активности(ActivityPageV2, пакет UIv2).  Для текстового поля "Примечания". Обратите внимание  на controlConfig и images. 

{
                    "operation": "insert",
                    "parentName": "ActivityNotesControlGroup",
                    "propertyName": "items",
                    "name": "Notes",
                    "values": {
                        "contentType": Terrasoft.ContentType.RICH_TEXT,
                        "layout": {"column": 0, "row": 0, "colSpan": 24},
                        "labelConfig": {
                            "visible": false
                        },
                        "controlConfig": {
                            "imageLoaded": {
                                "bindTo": "insertImagesToNotes"
                            },
                            "images": {
                                "bindTo": "NotesImagesCollection"
                            }
                        }
                    }
                }

 

Матвеева Светлана,

Спасибо, попробую!

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

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

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

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

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

1. Вам необходимо знать Id обращения, файлы которого вам нужно скопировать в Лид.
2. Не рекомендую реализовывать такие действия в том же БП где вы пытаетесь создать Лид, так как Лид до конца не создается (скорее всего), но как только закончит действие БП по созданию Лида, можно сделать второй БП который будет стартовать по сигналу Создания записи в таблице Лид (так же можно будет их отсеять от обычных Лидов любым вашим уникальным значением).
3. В этом втором БП который будет ловить сигнал создания Лида, вам необходимо добавить буквально один элемент "Добавить данные". В поле "В какой объект добавить данные" указать "Файл и ссылка лида", в поле "Какой режим добавления данных" выбрать "Добавить результат выборки", в поле "Выборка по объекту" указать "Файл и ссылка обращения" (например, возможно у вас будет другая таблица с хранимыми файлами, если вы не используете стоковую для обращений) и указать условие выборки (то есть фильтр по Id, где Id это идентификатор вашего обращения). Затем необходимо указать список полей которые нужно скопировать, в этих полях будут доступны данные по типу "Результат выборки. Версия" и так далее.

Приложу скриншоты одного такого работающего элемента.
Если возникнут вопросы можете писать в ЛС.

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

"Владимир Соколов" написал:

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


Но возможно у Лида будут сторонние файлы, которые не должны быть в обращении.
Так что визуальная подмена деталей тут будет неуместна, на мой взгляд.

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

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

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

Добрый день!

Сталкивался ли кто-нибудь в миграции данных с TS 3.X на bpm'online 7.x с вопросом переносов файлов? Удалось это реализовать в более-менее автоматическом режиме?

Спасибо

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

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

Здравствуйте.
Файлы и в той и в той системе хранятся в виде больших бинарных объектов. Процесс переноса не автоматизировали. Каждый случай рассматривается отдельно. Здесь можно абстрагироваться от продукта, в принципе. Есть две базы данных, содержащие некие сущности, которые нужно перенести. Возможно, в некоторой степени, поможет автоматизировать процесс утилита bdForge или аналогичная.

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

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

Как я понимаю, в 3.X все файлы хранились в tbl_Files, а в bpm'online есть таблица File на каждую сущность (например, ContactFile).
А при этом есть еще таблица File. Что в ней записано?

В таблице, File bpm'online 7.x, не хранится ни какой информации (это наследие от bpm'online 5.x). Для Контактов файлы хранятся в таблице ContactFile, для Контрагентов в таблице AccountFile и т.д.

Пример простого переноса файлов из детали Файлы раздела Контакты (TS) в раздел Контакты ( bpm'online 7.x):

DECLARE @SupervisorBPMID UNIQUEIDENTIFIER = '410006E1-CA4E-4502-A9EC-E54D922D2C00';
DECLARE @SupervisorTSID UNIQUEIDENTIFIER = 'FFC4AABA-4882-41FC-8AC0-FC54D6DCFE93';
 
INSERT INTO [BPMonline_760_SalesOmnichannel_DemoInternal_Tereshchuk].[dbo].[ContactFile]
	([ContactId]
      ,[ProcessListeners]
      ,[Id]
      ,[CreatedOn]
      ,[CreatedById]
      ,[ModifiedOn]
      ,[ModifiedById]
      ,[Name]
      ,[Notes]
      --,[LockedById]
      --,[LockedOn]
      ,[Data]
      ,[TypeId]
      ,[Version]
      ,[Size]) 
SELECT 
	@SupervisorBPMID, 
	0, 
	NEWID(), 
	[CreatedOn], 
	@SupervisorBPMID/*CreatedByID*/, 
	[ModifiedOn], 
	@SupervisorBPMID/*ModifiedByID*/,
	[Link],
	ISNULL([Description], ''), 
	[FileData],
	case [ItemTypeID] 
		when '{39A5B367-4A7A-473E-8F74-26977CB6DB67}' then '529BC2F8-0EE0-DF11-971B-001D60E938C6'	-- Файл -> Файл
		when '{94A8A85B-7EAF-405C-900A-58DC0301EDC2}' then '539BC2F8-0EE0-DF11-971B-001D60E938C6'	-- Ссылка -> Ссылка
		when '{6D180D71-36C5-4278-8224-505B06559FD5}' then null										-- URL -> 
		when '{B48F1491-1460-4A18-A4A3-B13FD6EE5624}' then '549BC2F8-0EE0-DF11-971B-001D60E938C6'	-- Ссылка на папку -> Ссылка на объект
	end, 
	[Revision],
	[FileSize] 
FROM [TS_3.4.0.130_XRM_SD_Softkey_RUS].[dbo].[tbl_Files] WHERE [ID] IN (SELECT [FileID] FROM tbl_FileInContact WHERE [ContactID] = @SupervisorTSID)

Важно!
1. Идентификаторы пользователей Контактов TS, должны совпадать с идентификаторами пользователей Контактов bpm'online 7.x (в моем примере идентификаторы Supervisor не совпадают, и по этой причине привожу явно)
2. Любой импорт лучше выполнять через шлюзовые таблицы
3. В TS есть перечисление enm_FileTypes, а в bpm'online 7.x это таблица FileType, в запросе необходимо явно приводить типы (в моем примере это сделано через case)

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

И еще вопрос про опыт. Если перенос делать через Excel, то можно ли сохранить ID записей, чтобы использовать их для связывания?
А то однофамильцы, к которым надо привязать средства связи встречаются сплошь и рядом

Да, можно. Для этого необходимо вывести поле ID в раздел

Может быть, можно еще и связывать объекты (например, адрес с котнтактов) не по Имени-Фамилии контакта, а по его ID?

Да, можно. Для этого необходимо вывести поле ID записи и ID контакта в раздел

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

Задача:
Экспорт отчета FastReport в деталь Файлы в формате PDF для выделенных записей в реестре
Решение
1. В ShowSelectedRecordsReport добавляем SetAttribute(ReportPreviewer,'GridDatasetIDs',GridDatasetIDs);

function ShowSelectedRecordsReport(ReportCode, FilteredDatasetCode,
        GridDatasetIDs, FilterForm) {
        var Report = Services.GetNewItemByUSI(ReportCode);
        var ReportPreviewer = Services.GetNewItemByUSI('wnd_BaseFastReportPreview');
        var ReportPreviewerComponent = ReportPreviewer.Attributes('ReportPreviewer');
        var ReportDataset = Services.GetNewItemByUSI(FilteredDatasetCode);
        SetAttribute(ReportPreviewer, 'Report', Report);       
        var Select = GetSelectQueryPrimarySelect(ReportDataset.SelectQuery);
        var Filters = Select.Filters;
        Filter = GetSelectQueryFilterByCode(ReportDataset.SelectQuery, 'IDs');
        if (!Assigned(Filter)) {
            Filter = Filters.CreateIncludeFilter();
            Filter.Code = 'IDs';
            Filters.Add(Filter);
                Filter.TestExpression =
                        Filter.CreateFieldFilterExpression();
                Filter.TestExpression.TableAlias =
                        Select.FromTableAlias;
                Filter.TestExpression.Field =
                        Select.FromTable.Fields.ItemsByName('ID');
        }
        var Enabled = (GridDatasetIDs.length > 0);
        ApplyDatasetIncludeFilter(ReportDataset, 'IDs', GridDatasetIDs, Enabled);              
        if (Assigned(FilterForm)) {
                SetAttribute(ReportPreviewer, 'FilterForm', FilterForm);
                SetAttribute(ReportPreviewer, 'ShowFilterForm', true);
        }
       

        SetAttribute(ReportPreviewer,'GridDatasetIDs',GridDatasetIDs);

       
        ReportPreviewer.Build();
        ReportPreviewer.Prepare();  
        ReportPreviewerComponent.DatasetByUSI(FilteredDatasetCode) = ReportDataset;
}

2. В wnd_BaseFastReportPreviewScript дописываем

function  wnd_BaseFastReportPreviewOnClose(Window) {
         if (Window.ComponentsByName('frpMain').Report.Caption == 'Коммерческое предложение') {
          var GridDatasetIDs = GetAttribute(Window, 'GridDatasetIDs');
         var frpMain =  Window.ComponentsByName('frpMain');//ReportPreviewer.ComponentsByName('frpMain')           ;
                var TempFileName = System.CreateObject('TSObjectLibrary.Value');
                var FileNameStr = frpMain.Report.Caption;
                var Extension = '.pdf';
                TempFileName.Value = GetTemporaryFileName(FileNameStr + Extension, true);
                frpMain.Export(retPDF, TempFileName, false);
               
                for (var i=0 ; iGridDatasetIDs.length; i++)
                {
                  var ID = Connector.GenGUID();
                  var Dataset = Services.GetNewItemByUSI('ds_Files');
                  var DataFieldName = 'FileData';
                               //пишем файл в базу...
                               Dataset.Append();
                               Dataset.Values('ID') = ID;
                               //тип - файл
                               Dataset.Values('ItemTypeID') = '{39A5B367-4A7A-473E-8F74-26977CB6DB67}';
                               Dataset.Values('Link') = FileNameStr+ Extension;
                               Dataset.Values('Revision') = 1;
                               var FileSize = GetFileSize(TempFileName.Value);
                               if (FileSize > 0)
                               {
                                    Dataset.Values('FileSize') = FileSize;
                               }
                               SaveFileToDataset(TempFileName.Value, Dataset, DataFieldName);
                               Dataset.Post();
                               var FileID = ID;
                                               //получили Documents, теперь формируем полное имя сервиса insert query
//                                           IsertQueryLinkUSI = IsertQueryLinkUSI + 'Invoice'//Temp[1].substring(0, count);
                                               //и получаем экземпляр данного сервиса
                                               var InsertQuery = Services.GetNewItemByUSI('iq_FileInOffering');
                                               //заполняем параметры запроса        
                                               var ColumnsValues = InsertQuery.ColumnsValues;
                                               ColumnsValues.Items(1).Value = FileID;
                                               ColumnsValues.Items(2).Value = GridDatasetIDs[i];
                                               var IDs = Connector.GenGUID();
                                               ColumnsValues.Items(0).Value = IDs;
                                               //выполняем
                                               InsertQuery.Execute();
                             
                }
        }
       
        frpMain.Cancel();
}

Комментарий:
Мы делаем экспорт на событии закрытия пред просмотра отчета, так необходимо делать так как на OnShow, отчет еще не успевает сформироваться.
В данном примере в экспорт в деталь будет только для отчета с названием 'Коммерческое предложение' в деталь продукты (iq_FileInOffering) , если нужно выгружать все отчеты, уберите проверку.
Аналогичный код можно кинуть в ShowSelectedRecordsReport, в конце функции, но будет беда когда к отчету прикручено окно фильтрации, а отчет то не сформировался, и писать нечего, поэтому решено писать на событии закрытия предпросмотра.

Пожелание по улучшению:
1.Сделать универсальную подстановку InsertQuery, в духе того как это сделано тут Прикрепить отчет на деталь "Файлы" сразу после генерации Word отчета
2.Проверку делать не по Window.ComponentsByName('frpMain').Report.Caption а по USI

Поделиться

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

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

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

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

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

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

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

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