Доброго дня!
Подскажите пожалуйста, стоит задача сделать кнопку для импорта из excel файла в деталь раздела
Я вроде нашел пример, но пока что ничего не получается. Не могу понять в чем проблема, поскольку проходит все без ошибок, но позиции не импортируются.

function importQuote()
{

        var FileName = GetNewValue();
        if (!(System.OpenDialog(FileName, '*', EmptyStr, EmptyStr, EmptyStr))) {
                return;
        }
       
        var ExelApp = new ActiveXObject("Excel.Application");
        var WorkBook = ExelApp.Workbooks.Open(FileName.Value);
        var Sheet = WorkBook.ActiveSheet;
       
        var startRow = 2;
        var currentRow = startRow;
        var rate = Sheet.Cells(2, 12).Value;
       
        var OfferingInContractDS =  GetSingleItemByCode('ds_OfferingInOrderX',  'OfferingInOrderX');
        EnableDatasetFilters(OfferingInContractDS,  false);
        OfferingInContractDS.Open();

        var offeringsNotFound = 0;
        try {
                while(Sheet.Cells(currentRow, 12).Value != null)
                {
                        OfferingInContractDS.Append();
                        var num = Sheet.Cells(currentRow, 12).Value;
                        OfferingInContractDS('Name') = num;
                        var partNumber = Sheet.Cells(currentRow, 12).Value;
                        OfferingInContractDS('Description') = partNumber;
                       
                        OfferingInContractDS.Post();                                                   
                        currentRow++;
                }
        } finally {
                OfferingInContractDS.Close();    
        }
        dlData.Dataset.Close();
        dlData.Dataset.Open();
        WorkBook.Close();
       
        ShowWarningDialog('Загружено: ' + (currentRow - startRow));
}

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

Нравится

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

Может, у Вас просто Excel «не хочет» работать по ActiveX?
Если пройти пошагово в отладчике, то на какой строке виснет?

Я немного подправил скрипт и теперь вылетает ошибка:
"Ошибка выполнения метода 'btnImportOnClick'. Ошибка сохранения записи. Оригинальное сообщение об ошибке: The statement has been terminated.
Cannot insert the value NULL into column 'SpecificationID', table 'TSXRM3.dbo.tbl_OfferingInOrderX'; column does not allow nulls. INSERT fails «Call Stack»"
Хотя я вроде в эту колонку ничего не импортирую

import_test.xlsx

function importQuote()
{
 
	var FileName = GetNewValue();
	if (!(System.OpenDialog(FileName, '*', EmptyStr, EmptyStr, EmptyStr))) {
		return;
	}
 
	var ExelApp = new ActiveXObject("Excel.Application");
	var WorkBook = ExelApp.Workbooks.Open(FileName.Value);
	var Sheet = WorkBook.ActiveSheet;
 
	var startRow = 12;
	var currentRow = startRow;
	var rate = Sheet.Cells(12, 2).Value;
 
	var OfferingInContractDS =  GetSingleItemByCode('ds_OfferingInOrderX',  'OfferingInOrderX');
	EnableDatasetFilters(OfferingInContractDS,  false);
	OfferingInContractDS.Open();
 
	var offeringsNotFound = 0;
	try {
		while(Sheet.Cells(currentRow, 2).Value != null)
		{
			OfferingInContractDS.Append();
			var num = Sheet.Cells(currentRow, 2).Value;
			OfferingInContractDS('Name') = num;
			var partNumber = Sheet.Cells(currentRow, 3).Value;
			OfferingInContractDS('Description') = partNumber; 
 
			OfferingInContractDS.Post();							
			currentRow++;
		}
	} finally {
		OfferingInContractDS.Close();    
	}
	dlData.Dataset.Close();
	dlData.Dataset.Open();
	WorkBook.Close();
 
	ShowWarningDialog('Загружено: ' + (currentRow - startRow));
}

"Родненок Дмитрий Павлович" написал:Хотя я вроде в эту колонку ничего не импортирую

В том и дело. Вы не заполняете значением обязательное поле.

Понял, спасибо!
Теперь все импортирует!
Есть еще маленький вопрос:
У меня имеется поле с номером, который является автоинкрементом и храниться в системных настройках.
Каким образом я могу проставлять на все импортируемые файлы этот номер +1 и записывать последнее значение в системные настройки?Чтобы каждая позиция имела уникальный номер
И может быть сможете подсказать, как реализовать вложенность при импорте, поскольку деталь древовидная

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

Доброго дня!
Столкнулся со следующей задачей:
При изменении значения поля необходимо установить свойство "обязательно для заполнения" других полей. С этим я справился.
Также мне необходимо при активации чек-бокса установить свойство "только для чтения" для других полей

case ('OfferingInOrderID'):
if ((Name == 'OfferingInOrderID') && (Value == '{42D3DE40-55D1-46F6-B5A5-AFB1EAAE181E}'))      
{
Dataset.DataFields.ItemsByName('DateOfPlacing').IsRequired = true;
Dataset.DataFields.ItemsByName('PlaningDateOfDelivery').IsRequired = true;
}
else
{
Dataset.DataFields.ItemsByName('DateOfPlacing').IsRequired = false;
Dataset.DataFields.ItemsByName('PlaningDateOfDelivery').IsRequired = false;                    
}
break;

Это на обязательность заполнения.
Функция SelfOnDatasetDataChange
Подскажите пожалуйста, как реализовать свойство "только для чтения" для этих же полей?
Пробовал и "IsVisible" и "IsEnabled" - безрезультатно
//case ('OnStock'):
//if  ((Name == 'OnStock') && (Value == 1)) //На складе
//{
//Dataset.DataFields.ItemByName('DateOfPlacing').IsEnabled = false;
//Dataset.DataFields.ItemByName('PlaningDateOfDelivery').IsEnabled = false;
//}
//else
//{
//Dataset.DataFields.ItemByName('DateOfPlacing').IsEnabled = true;
//Dataset.DataFields.ItemByName('PlaningDateOfDelivery').IsEnabled = true;
//}
//break;

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

Нравится

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

Дмитрий, Вы можете менять свойство «IsEnabled» не у поля датасета, а у контрола:

edtDateOfPlacing.IsEnabled = true;

Учтите только, что делать это можно в скрипте карточки на событии «DataChange», но не скрипте датасета.

Также см. подробнее тут.

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

Версия 3.3.2.120
Пропали "операции" на некоторых договорах. Те, что удалось обнаружить (не сходился баланс) - были одной датой, 18.01.2016. Обнаружили в сентябре.
Ежемесячно делается сверка, поэтому возможная проблема возникла недавно.

Некоторое время назад была перезагрузка сервера по электропитанию. После восстановления электропитания Oracle запустился сам, никаких дополнительных действий не производилось.

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

В резервной копии платежи видим. Поиск по номеру ничего не дает (была надежда, что кто-то перевесил его на другого абонента).

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

Нравится

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

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

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

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

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

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

Алла, спасибо за ответ!

А не скажете, где почитать про "логгирование записей"?

См. тут на стр. 147.

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

Добрый день, форумчане.

Задача: сделать деталь "Продукты в продаже" в виде иерархии. За основу решил взять деталь "Структура организации" из раздела "Контрагенты".

Создал свой объект SuOpportunityProductInterest. В качестве родителя указал объект "Продукт в продаже ( Opportunity )". В него
добавил справочное поле SuParent, где в качестве справочника указал SuOpportunityProductInterest.

Создал свою деталь на основе объекта SuOpportunityProductInterest.

На странице детали SuOpportunityProductDetailV2 написал следующий код:

define("SuOpportunityProductDetailV2", [/*"terrasoft"*/], function(/*Terrasoft*/) {
        return {
                entitySchemaName: "SuOpportunityProductInterest",
                details: /**SCHEMA_DETAILS*/{}/**SCHEMA_DETAILS*/,
                        methods: {
                        /**
                                 * Открывает страницу добавления детали
                                 * @protected
                                 * @overridden
                                 * @param {String} editPageUId Значение колонки типа
                                 * @param {Boolean} keepParentId (optional) Не удалять из DefaultValues элемент с ключем Parent
                                 */

                                addRecord: function(editPageUId, keepParentId) {
                                        if (!keepParentId) {
                                                var defaultValues = this.get("DefaultValues");
                                                var result = this.Ext.Array.filter(defaultValues, function(item) {
                                                        return (item.name !== "SuParent");
                                                }, this);
                                                this.set("DefaultValues", result);
                                        }
                                        this.callParent(editPageUId);
                                },
                               
                                /**
                                 *Получает колонки, которые всегда выбираются запросом
                                 *@protected
                                 *@overridden
                                 *@return {Object} Возвращает колонки, которые всегда выбираются запросом
                                 */

                                getGridDataColumns: function() {
                                        var gridDataColumns = this.callParent(arguments);
                                        if (!gridDataColumns.SuParent) {
                                                gridDataColumns.SuParent = {
                                                        path: "SuParent"
                                                };
                                        }
                                        return gridDataColumns;
                                },
                       
                               
                                prepareResponseCollection: function(collection) {
                                        collection.each(function(item) {
                                                var parent = item.get("SuParent");
                                                var parentId = parent && parent.value;
                                                if (parentId) {
                                                        item.set("SuParentId", parentId);
                                                }
                                                Terrasoft.each(item.columns, function(column) {
                                                        this.addColumnLink(item, column);
                                                        this.applyColumnDefaults(column);
                                                }, this);
                                        }, this);
                                },

                               
                                getHideQuickFilterButton: function() {
                                        return false;
                                },
                               
                                getShowQuickFilterButton: function() {
                                        return false;
                                },
                               
                                updateDetail: function(config) {
                                        config.reloadAll = true;
                                        this.callParent([config]);

                                },

                               
                                getAddChildElementButtonEnabled: function() {
                                        return !this.Ext.isEmpty(this.getSelectedItems());
                                },
                               
                                addChildElementRecord: function() {
                                        var selectedItems = this.getSelectedItems();
                                        if (this.Ext.isEmpty(selectedItems)) {
                                                return;
                                        }
                                        var parentId = selectedItems[0];
                                        var defaultValues = this.get("DefaultValues");
                                        var result = this.Ext.Array.filter(defaultValues, function(item) {
                                                return (item.name !== "SuParent");
                                        }, this);
                                        result.push({
                                                        name: "SuParent",
                                                        value: parentId
                                                });
                                        this.set("DefaultValues", result);
                                        this.addRecord(null, true);
                                },
                               
                                clearSelection: function() {
                                        this.set("activeRow", null);
                                        this.set("selectedRows", null);
                                },

                               
                                onDeleteAccept: function() {
                                        var selectedRows = this.getSelectedItems();
                                        var batch = this.Ext.create("Terrasoft.BatchQuery");
                                        Terrasoft.each(selectedRows, function(recordId) {
                                                this.deleteItem(recordId, batch, this);
                                        }, this);
                                        if (batch.queries.length > 0) {
                                                batch.execute(this.onDeleted, this);
                                        }
                                },

                               
                                onDeleted: function(response) {
                                        if (response && response.success) {
                                                this.clearSelection();
                                        } else {
                                                this.showConfirmationDialog(
                                                        this.get("Resources.Strings.OnDeleteError"));
                                        }
                                },

                               
                                deleteItem: function(recordId, batch, scope) {
                                        var grid = scope.getGridData();
                                        var toDelete = new Terrasoft.Collection();
                                        grid.each(function(item) {
                                                var parent = item.get("SuParent");
                                                if (parent && parent.value === recordId) {
                                                        toDelete.add(item);
                                                }
                                        }, grid);

                                        Terrasoft.each(toDelete.getItems(), function(item) {
                                                this.deleteItem(item.get("Id"), batch, this);
                                        }, scope);
                                        if (grid.find(recordId)) {
                                                var selfDelete = grid.get(recordId);
                                                grid.remove(selfDelete);
                                                var query = this.Ext.create("Terrasoft.DeleteQuery", {
                                                        rootSchema: scope.entitySchema
                                                });
                                                var filter = Terrasoft.createColumnFilterWithParameter(
                                                        Terrasoft.ComparisonType.EQUAL, "Id", recordId);
                                                query.filters.addItem(filter);
                                                batch.add(query);
                                        }
                                }
                               
                },
                diff: /**SCHEMA_DIFF*/[
                                {
                                   "operation": "merge",
                                   "name": "DataGrid",
                                   "values": {
                                          "type": "listed",
               
                                                  //включает иерархичность реестра детали
                                      "hierarchical": true,
                                      "hierarchicalColumnName": "SuParent"
                                                }                          
                                },
                                {
                                        "operation": "merge",
                                        "name": "AddRecordButton",
                                        "values": {
                                                visible: false
                                        }
                                },
                                {
                                        "operation": "insert",
                                        "name": "AddRecord",
                                        "parentName": "Detail",
                                        "propertyName": "tools",
                                        "index": 1,
                                        "values": {
                                                itemType: Terrasoft.ViewItemType.BUTTON,
                                                menu: [],
                                                "imageConfig": {"bindTo": "Resources.Images.AddButtonImage"},
                                        //      "caption": {"bindTo": "Resources.Strings.AddButtonCaption"},
                                                "visible": {"bindTo": "getToolsVisible"}
                                        }
                                },
                                {
                                        "operation": "insert",
                                        "name": "AddParentRecordButton",
                                        "parentName": "AddRecord",
                                        "propertyName": "menu",
                                        "values": {
                                                "caption": {"bindTo": "Resources.Strings.AddRootElementButtonCaption"},
                                                "click": {"bindTo": "addRecord"}
                                        }
                                },
                                {
                                        "operation": "insert",
                                        "name": "AddChildElementButton",
                                        "parentName": "AddRecord",
                                        "propertyName": "menu",
                                        "values": {
                                                "caption": {"bindTo": "Resources.Strings.AddChildElementButtonCaption"},
                                                "click": {"bindTo": "addChildElementRecord"},
                                                "enabled": {"bindTo": "getAddChildElementButtonEnabled"}
                                        }
                                },
                                {
                                        "operation": "remove",
                                        "name": "FiltersContainer"
                                }
                ]/**SCHEMA_DIFF*/
       
        };
});

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

В чем может быть проблема? Заранее благодарен

Нравится

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

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

Решил проверить в админке, запускаю сервис, такая ошибка(в логе отображается):

(E)     Невозможно редактировать сервис 'Opportunities\Details\Offerings\wnd_OfferingInOpportunityDetailEdit'. Window 'wnd_OfferingInOpportunityDetailEdit'. Компонент с именем 'edtQuantity' уже существует «Call Stack»

Удаление кеша - не помогло.
После нескольких попыток открыть решил проверить на других базах, сначала на рабочей, а потом на бекапе(самый ранний) - ошибка не пропала. Решил перезалить сервис с другой бд(другого клиента), при загрузке появляется ошибка(картинка выше)....
Получилось удалить сервес, но залить новый(рабочий), с другой бд не получилось - ошибка.

Нравится

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

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

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

Укажите какой продукт используете (CRM, XRM, Sales ...), а также прикрепите файл сервиса (сервис окна и сервис скрипта) который вызывает данную проблему.

XRM, при выгрузке сервиса выбивает ошибка

(E)     Невозможно редактировать сервис 'Opportunities\Details\Offerings\wnd_OfferingInOpportunityDetailEdit'. Window 'wnd_OfferingInOpportunityDetailEdit'. Компонент с именем 'edtQuantity' уже существует «Call Stack»

Прикрепил сервисы для продукта Terrasoft XRM версии 3.4.130

Хочу обратить внимание, что окно wnd_OfferingInOpportunityDetailEdit наследуется от окна wnd_OfferingDetailEdit.

Возможно в окне wnd_OfferingInOpportunityDetailEdit был удален компонент edtQuantity, а затем добавлен, что привело к изменению ID компонента и появлению проблемы с окном редактирования.

"Терещук Павел" написал:Возможно в окне wnd_OfferingInOpportunityDetailEdit был удален компонент edtQuantity, а затем добавлен, что привело к изменению ID компонента и появлению проблемы с окном редактирования.

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

В архиве присутствует два сервиса окна, загрузите их оба.
Сначала откройте сервис окна wnd_OfferingDetailEdit, затем сервис окна wnd_OfferingInOpportunityDetailEdit

"Терещук Павел" написал:Сначала откройте сервис окна wnd_OfferingDetailEdit, затем сервис окна wnd_OfferingInOpportunityDetailEdit

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

Сохраните свои сервисы wnd_OfferingDetailEdit, src_OfferingDetailEdit. После чего загрузите мои прикрепленные сервисы. Если после этого проблема исчезнет, значить проблема находится в сервисе wnd_OfferingDetailEdit.

Может в сервисе wnd_OfferingDetailEdit изменился идентификатор компонента, и по этой причине окно сервиса _OfferingDetailEdit не открывается.

Ооо, проблема решена, изменил местоположение поля edtQuantity(переместил на старое место в блок итогов), на старое место и сервис wnd_OfferingInOpportunityDetailEdit начал работать без ошибок

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

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

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

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

Заранее благодарю за ответы!

С уважением,
Александр

Нравится

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

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

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

Благодарю!
Получилось!

Спасибо.

Нам вдвойне приятно получать от клиентов такой фидбек!

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

Как узнать какая версия IE используется в данном компоненте?
И как обновить ее на более новую ?

Нравится

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

есть сервис selectquery, в нем несколько запросов обедненных UNION ALL, в каждом запросе есть обычные поля и поля итогов(например в одном ) итогома сумма и количество продуктов детали продукты в счете за текущий месяц а в другом тот же запрос только для раздела склада.
Оно выводит сначала список продуктов которые нужно для счета а потом для склада, вот сокращенный код:

SELECT
        [OfferingID],
        ([SoldCount]),
        (a),
        [Name]
FROM
        (SELECT
        [tbl_OfferingInInvoice].[OfferingID] AS [OfferingID],
        COUNT(CAST([tbl_OfferingInInvoice].[ID] AS VARCHAR(38))) AS [SoldCount],
        SUM([tbl_OfferingInInvoice].[BasicAmount]) AS a,
        [tbl_Offering].[Name] AS [Name]
----
UNION ALL
SELECT
        [tbl_OfferingInMovement].[OfferingID] AS [OfferingID],
        COUNT(CAST([tbl_OfferingInMovement].[ID] AS VARCHAR(38))) AS [SoldCount],
        SUM([tbl_OfferingInMovement].[BasicAmount]) AS а,
        [tbl_Offering].[Name] AS [Name]
------) AS [U]
        GROUP BY
        u.[OfferingID],
        u.[Name]

для решение проблемы нужно писать так:
SELECT
        [OfferingID],
        count([SoldCount]),
        Sum(a),
        [Name]
FROM
        (SELECT
        [tbl_OfferingInInvoice].[OfferingID] AS [OfferingID],
        COUNT(CAST([tbl_OfferingInInvoice].[ID] AS VARCHAR(38))) AS [SoldCount],
        SUM([tbl_OfferingInInvoice].[BasicAmount]) AS a,
        [tbl_Offering].[Name] AS [Name]
----
UNION ALL
SELECT
        [tbl_OfferingInMovement].[OfferingID] AS [OfferingID],
        COUNT(CAST([tbl_OfferingInMovement].[ID] AS VARCHAR(38))) AS [SoldCount],
        SUM([tbl_OfferingInMovement].[BasicAmount]) AS а,
        [tbl_Offering].[Name] AS [Name]
------) AS [U]
        GROUP BY
        u.[OfferingID],
        u.[Name]

Но добавить итоги не получается(((. Это можно решить?

Нравится

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

К сожалению не понятен Ваш вопрос, можете конкретизировать его.
А также выполните sql запрос на БД, для получения результата.

Рекомендую ознакомится со статьей Использование хранимых функций в запросе

"Терещук Павел" написал:К сожалению не понятен Ваш вопрос, можете конкретизировать его.

Нужно превратить это

SELECT
        [OfferingID],
        ([SoldCount]),
        (a),
        [Name]
FROM
        (SELECT
.....

в это

SELECT
        [OfferingID],
        count([SoldCount]),
        Sum(a),
        [Name]
FROM
        (
....

"Терещук Павел" написал:А также выполните sql запрос на БД, для получения результата.

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

Создаете запрос, в свойстве колонки Summary Type (Итог) выберите необходимую агрегирующую функцию:

"Терещук Павел" написал:Создаете запрос, в свойстве колонки Summary Type (Итог) выберите необходимую агрегирующую функцию:

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

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

Только начал изучать платформу, но не нашел информации по проблеме. Суть задачи: есть два поля: чекбокс и поле справочника. Нужно при установке галочки чекбокса устанавливать одно значение из справочника, при снятии второе. Проблема в том, как привязать чекбокс ко второму полю и как устанавливать значение поля из справочника.

Нравится

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

Возьмите за пример событие dlDataOnDatasetDataChange для поля AccountID, источника данных dlData, окна редактирования wnd_ContactEdit. В событии происходит вызов функции FillInformationBySelectedItem - которая заполняет поля по определенному правилу (фильтру).

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

Здравствуйте! Я в террасофте совсем новичок, только начинаю изучать. Версия ТС - 3.4.0.38. По форуму искала, вроде подходящего решения не нашла, либо не поняла что это "оно". Подскажите пожалуйста!
Была поставлена задача - по расписанию формировать файл с отчетом для Excel (есть аналог для работы пользователя в FR), выкладывать его в сеть и отправлять группе лиц.
Вроде как все решила через SQL, правда экселевский файл сформировала через spread xls на xml.
Несущественная проблема - при открытии на некоторых компьютерах ругается на несоответствие формата, с этим можно жить, но вот на телефонах этот файл не открывается в приложениях, но очень нужно.
В итоге встал вопрос о другом формате.. Возможно ли как то через sql или сам террасофт выполнить по расписанию формирование файла в формате xlsx или pdf (редактируемый)? Либо конвертацию сделать, может что-то вроде - открыть файл в sql через sp_OACreate 'Excel.Application', и сохранить его в xlsx..

Нравится

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

С помощью Terrasoft, также можно выполнить такую задачу, для этого необходимо на сервер создать задачу (Task Scheduler), которая будет запускаться по времени и вызывать Terrasoft командой TSClient.exe /wnd=wnd_ExportRep.

Где в окне wnd_ExportRep будет прописана логика экспорта.
Обратите внимание на сервисы scr_MSExcelLibrary, scr_MSExcelLibraryConsts, а также на сервис scr_UserReportCommon, в особенности на функцию GetExcelObject - которая возвращает Com объект на Excel.

Также можно изучить работу сервиса scr_ImportExcelWizardUtils, который автоматически создает отчеты в Excel, на основании его работы можете создать свой экспорт.

Хороший вариант! Спасибо! Правда мне очень много стоит изучить для реализации подобного..
А клиент терры будет открыватся на сервере или только процесс висеть? Если есть возможность подсказать подобные примеры решения буду очень признательна.

Пробовала запускать excel на террасофте через var ExcelApp = new ActiveXObject("Excel.Application");
но система выругалась на меня и клиент вылетел..

Можете взять мой пример запуска коннектора и создание Excel файла.
Алгоритм следующий:
1. Создайте файле с расширением js
2. Пропишите в нем следующий код:

function WSLog(LogText) {
	WScript.stdout.WriteLine(LogText);
}
 
function GetExcelObject() {
	var Excel = new ActiveXObject('Excel.Application');
	var Excel_wb = Excel.Workbooks.Add();
	Excel.Sheets(1).Name = "Данные";
	var SheetsCount = Excel.Sheets.Count;
	for (var i = 2; i <= SheetsCount; i++) {
		Excel.Sheets(2).Delete();
	}
	Excel.Visible = false;
	return Excel;
}
 
function Main() {
	var args = WScript.arguments;
	var ConfigurationName = "TS_3.4.1.113_XRM_SD_SoftKey_ENU_Tereshchuk";
	var AuthenticationMode = 1; //1 - DatabaseServer, 0 - Windows
	var UserName = "Supervisor";
	var UserPassword = "";
	var ExcelFileName = 'C:\\Temp\\TestExcel.xlsx';
	WSLog("Start!");
	var Connector =  new ActiveXObject('TSObjectLibrary.Connector');
	var Config;
	if (AuthenticationMode) {
		Config = Connector.OpenConfigurationByName(ConfigurationName, AuthenticationMode, UserName, UserPassword);
	} else {
		Config = Connector.OpenConfigurationByName(ConfigurationName, AuthenticationMode);
	}
	var Excel = GetExcelObject();
	Excel.Sheets(1).SaveAs(ExcelFileName);
	Excel.Visible = true;
	Connector.Logoff();
	WSLog("Finish!");
}
 
Main();

3. Создайте файл с расширением bat и пропишите в нем код:
%WinDir%/SysWOW64/cscript.exe /d D:\Projects\JS\RunTS.js

4. Запустите bat файл

Исходники: js.zip

Спасибо!
Так как задача была горящей, а 'Excel.Application' наотрез отказывается работать, временно решила через excelcnv.exe. Там правда очень много нюансов, за счет чего код получился совсем извращенным, но главное рабочим.. позже вернусь к приведению в нормальный вид ) попробую все-таки решить через террасофт по #1 предложенному ответу.

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