Технические вопросы
5.x

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

в карточке регистрации раздела в колонке [Тип записи указан в колонке] для определения типа записи раздела сменил значение. затем почистил редис. после этого стал невозможен вход в систему, падает с ошибкой

Exception Message: Индекс за пределами диапазона. Индекс должен быть положительным числом, а его размер не должен превышать размер коллекции.
Имя параметра: index
Exception Type: System.ArgumentOutOfRangeException
Exception Source: mscorlib

Exception Stack Trace:
   в System.ThrowHelper.ThrowArgumentOutOfRangeException()
   в System.Collections.Generic.List`1.get_Item(Int32 index)
   в System.Collections.ObjectModel.Collection`1.get_Item(Int32 index)
   в Terrasoft.WebApp.MainPageEventsProcessSchema`1.GetAddMenuItemCaption(Guid schemaUId, Guid typeColumnUId, Guid typeId)
   в Terrasoft.WebApp.MainPageEventsProcessSchema`1.GetModuleEdits()
   в Terrasoft.WebApp.MainPageEventsProcessSchema`1.FillAddButtonMenu()
   в Terrasoft.WebApp.MainPageEventsProcessSchema`1.PageLoadCompleteScriptTaskExecute(ProcessExecutingContext context)
   в Terrasoft.Core.Process.ProcessScriptTask.InternalExecute(ProcessExecutingContext context)
   в Terrasoft.Core.Process.ProcessFlowElement.Execute(ProcessExecutingContext context)
   в Terrasoft.Core.Process.ProcessScriptTask.Execute(ProcessExecutingContext context, Func`2 internalExecute)
   в Terrasoft.WebApp.MainPageEventsProcessSchema`1.ProcessQueue(ProcessExecutingContext context)
   в Terrasoft.WebApp.MainPageEventsProcessSchema`1.OnExecuted(Object sender, ProcessActivityAfterEventArgs e)
   в Terrasoft.Core.Process.ProcessFlowElement.OnExecuted(ProcessActivityAfterEventArgs e)
   в Terrasoft.Core.Process.ProcessFlowElement.Execute(ProcessExecutingContext context)
   в Terrasoft.WebApp.MainPageEventsProcessSchema`1.ProcessQueue(ProcessExecutingContext context)
   в Terrasoft.WebApp.MainPageEventsProcessSchema`1.ThrowEvent(ProcessExecutingContext context, String message)
   в Terrasoft.UI.WebControls.PageSchemaUserControl.ThrowEvent(String message)
   в Terrasoft.WebApp.MainPageSchemaUserControl.PageLoadComplete(Object sender, EventArgs e)
   в System.EventHandler.Invoke(Object sender, EventArgs e)
   в System.Web.UI.Page.OnLoadComplete(EventArgs e)
   в Terrasoft.WebApp.Page.OnLoadComplete(EventArgs e)
   в System.Web.UI.Page.ProcessRequestMain(Boolean includeStagesBeforeAsyncPoint, Boolean includeStagesAfterAsyncPoint)

возможно ли каким-то образом откатить изменения?

Нравится

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

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

Если назначит права доступа («Доступ к объектам – Администрируется по колонкам») на объект «Инцидент и запрос на обслуживание», то при регистрации обращения выдает следующую ошибку:

Значение аргумента "columnValueName" не может быть пустым или неопределенным

Не знаете, с чем это связанно?
Это очень срочно.

Заранее спосиба.
С уважением
Гюнель

Нравится

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

Gunel, не смогла воспроизвести ошибку. Как Вы распределили права доступа к колонкам (уточните, пожалуйста, название колонок и уровень доступа)?

Здраствуйте Наталия,

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

1. Войти на раздел "Инциденты"
--- установила "Администрирование: Доступ к объектам" для роли СП Чтение и Изменение

2. Открыт карточку "Инциденты", но не смогли не какие поля поменять
--- установила "Администрирование: Администрируется по колонкам" для всех полей ("Пользователь / Роль" - служба поддержки и "Уровень доступа" - х)

Заранее спосиба,
С уважением,
Гюнель Рустамова

Gunel, Вы установили уровень доступа “Доступ запрещен”. Измените уровень доступа на “Чтение” (иконка в виде глаза).

Большое спосиба за ответь

С уважением,
Гюнель Рустамова

Здраствуйте Наталия,

Я проверила но у меня все еще выдает ошибку.
Не для роли служба поддержки а для роли диспетчер.

С уважением,
Гюнель Рустамова

Гюнель, т.е. для "Поддержки" все ок, а для "Диспетчеров" ошибка?
Ошибка аналогичная (та, которую Вы описали в первом посте)?
На все ли колонки в объекте есть права доступа? Проверьте, скорее всего, на какую то колонку прав нет.
Кстати, есть колонки, которые заполняются автоматически (вроде время реакции и пр). Так вот, если дать доступ только на чтение на эти колонки, то система не сможет установить в них значения при регистрации нового обращения - получим свал.
Вашу задачу лучше было решить не на уровне доступа к колонкам, т.к. этот раздел нужен для того, если нужно ограничить доступ на одну-две-три колонки определенной роли, если Вам нужен запрет на все колонки - используйте доступ к объекту по умолчанию.

Здраствуйте, Дмитрий

Да, для роли диспетчера на все ли колонки в объекте есть права доступа.
Проверяла несколько раз. На все колонки есть права.
Но все равно выдает ошибку.

С уважением,
Гюнель Рустамова

Gunel, вложите, пожалуйста, скриншоты детали [Доступ к колонкам объекта] (доступ на колонки объекта «Инцидент и запрос на обслуживание») для пользователя, под которым возникает ошибка.

Наталя,

Спосиба за сотрудничество.
Отправляю вам скриншоты детали роли "Диспетчер".

С уважением,
Гюнель Рустамова

Gunel, проблема рассматривается в рамках обращения 0164131.
Все рекомендации будут направлены Вам по данному обращению.

Показать все комментарии
dll
wsdl
Технические вопросы
5.x

У меня собственно два вопроса:
1. Как в BPM подгрузить wsdl.
2. Как и где нужно грузить свою dll, что бы в нутри любого процесса можно было сделать using MyDll и спокойно обратиться к ней.

Нравится

1 комментарий
Сортировка
Технические вопросы
Разработка

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

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

ручка
резинка
ножницы
карандаш красный №1
карандаш красный №2
карандаш красный №3
...
карандаш красный №9
карандаш красный №10

и этот пользователь хочет отсортировать продукты по алфавиту, то он получит:

карандаш красный №1
карандаш красный №10

карандаш красный №2
карандаш красный №3
...
карандаш красный №9
ножницы
резинка
ручка

И вот тут на примере карандашей видим проблему:
После номера 1 идёт 10, а не 2 так как сравниваются коды символов стоящих под соответствующими номерами,
Так как поле текстовое, то другой сортировки ожидать и не приходится

Суть вопроса: есть-ли шанс переписать механизмы сортировки, так, чтобы текстовое поле парсилось на наличие цифр, или сортировка идёт в ядре, "куда простым смертным путь заказан"?

Нравится

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

Можно создать в SelectQuery колонку типа "SQL Text" и там написать произвольную формулу или вызов SQL-функции, оперирующие значением другой колонки. Потом создать колонку в Dataset-е. И сортировать по ней.

"Зверев Александр" написал:произвольную формулу или вызов SQL-функции

что-то типа

select cast( 
	substring(YOUR_Field, PATINDEX('%№%', YOUR_Field), 2)
	as int)

"Андросов Дмитрий" написал:что-то типа

Мне кажется, автору темы этого будет недостаточно. Ведь "карандаш красный №1" должен быть ниже, чем "карандаш зелёный №2". Тут надо делить строку на буквы и цифры, цифры дополнять слева нулями до одинаковой длины и соединять обратно.

Всем спасибо за советы! Займусь реализацией, как будет возможность и отпишусь по результатам

"Зверев Александр" написал:
Мне кажется, автору темы этого будет недостаточно. Ведь "карандаш красный №1" должен быть ниже, чем "карандаш зелёный №2". Тут надо делить строку на буквы и цифры, цифры дополнять слева нулями до одинаковой длины и соединять обратно.

да, был невнимателен)
в таком случае лучше поле писать на клиенте (в террасофт, а не в БД) на стадии insert\update, а не выбирать в запросе

брать числа после "№" и дописывать их нулями до одинаковой длины.

Но, это не панацея - что если пользователь напишет номер после "#" или вообще просто так "карандаш 2"? тогда, конечно, можно регэкспами решить, но что, если он напишет карандаш версия 2 зеленый №3? т.е. "версия 2" обрабатывать не надо, а "№3" надо...

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

Показать все комментарии
XRM
значок
Иконка
раздел
Технические вопросы
Разработка

Создал новый раздел, иконку сразу добавлять не стал. Теперь не знаю как добавить, по-старому, как описано тут не получается. У меня XRM 3.4.1.101. Знатоки, подскажите.

Нравится

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

Никита Олегович, добавьте изображение в сервисы il_Main и il_Main16 (по аналогии с существующими разделами, например, Accounts). Название изображения должно соответствовать названию созданного раздела + Normal.

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

На странице редактирования записи есть кнопка, на ней скрипт.
В скрипте получаю значение колонки

supplierId = new Guid(Page.DataSource.ActiveRow.GetColumnValue("SupplierId").ToString());

Если в поле есть значение, все в порядке. А если его очистить, то bpm падает на вызове собственно
Page.DataSource.ActiveRow.GetColumnValue("SupplierId")

Как проверить, что поле заполнено?

Нравится

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

Лучше использовать:

Guid supplierId = Page.DataSource.ActiveRow.GetTypedColumnValue<Guid>("SupplierId");

null.ToString() = свал.

if(Page.DataSource.ActiveRow.GetColumnValue("SupplierId") != null) {
                supplierId = new Guid(Page.DataSource.ActiveRow.GetColumnValue("SupplierId").ToString());
}

А чем это лучше моего варианта?

Кстати, Александр прав, в случае если там ничего нет Guid supplierId получит значение Guid.Empty.
Проверено. :wink:

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

В разделе Документы есть деталь Файлы и ссылки.
В определенный момент, в зависимости от статуса документа мне надо предотвратить изменение/редактирование файлов документа.

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

Что не так?

Нравится

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

Открытие по двойному клику задаётся JS, который возвращает функция GetRegisterTreeGridDblClickScript в BaseGridPage. По умолчанию он равен обработчику кнопки "Изменить".

Чтобы его отключить, можно в функции GetRegisterTreeGridDblClickScript в своей странице написать вначале

return string.Empty;

вместо текущего содержимого.

о как.
THNX, попробую

Вообще помогло. НО!
Есть такое дело:
Если у меня в этом методе условие сработало и скрипты отключились, а потом я выбираю в реестре другую запись, на которой это условие не срабатывает, но все остается по прежнему, даблклик НЕ работает.

Оно понятно почему, содержимое грида перегрузилось, сама страница со скриптами нет.
Вопрос: как пнуть страницу детали, чтобы перегружалась при смене выбора в основном реестре?

Открыть окно по клику в реестре можно и без JS, обычной серверной логикой.

Поподробнее, если не трудно

В BaseGridPage уже есть штатный обработчик сообщения EditButtonClick (и вызывающий его же обрабочик TreeGridDblClick) в виде кусков БП. Они отключены от нажатия кнопки и двойного клика по реестру, поскольку используются JS-обработчики. Но их можно привязать снова.

Показать все комментарии
Dataset
dlDataOnDatasetDataChange(DataField)
обработчик
Технические вопросы
Разработка

Где задаётся обработчик событий элементов карточки редактирования сервиса, в случае, если в свойствах невизуальных компонентов этого сервиса явно не задан Dataset?
Попробовал добавить обработчик dlDataOnDatasetDataChange(DataField) на событие OnDatasetDataChange невизуального компонента dlData - не работает (обработчик не вызывается).

Нравится

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

дело в том, что

function dlDataOnDatasetDataChange(DataField)

вызывается по полю, а чтобы у вас было поле, вам нужен датасет :smile:

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

Алексей, если Вам нужно событие OnDatasetDataChange - то разумеется у Вас должен быть датасет, чтобы сработало это событие.
Если он явно не указан в дизайнере окна, скорее всего он инициализируется на OnPrepare событии окна:

dlData.Dataset = Services.GetNewItemByUSI('ds_Account');

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

Я добавил в обработчик события OnPrepare следующую строку:

dlData.Dataset = Services.GetNewItemByUSI('ds_Offering');

К сожалению, всё осталось по-прежнему, обработчик dlDataOnDatasetDataChange(DataField) на событие OnDatasetDataChange невизуального компонента dlData - не вызывается.

у вас это свойство ведь заполнено?

"Андросов Дмитрий" написал:

Дмитрий,

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


Дмитрий, нет, сначала срабатывают обработчики события DataLink'a, если конечно датасет ему присвоен, и обработчики событий определены.
Затем срабатывают события самого сервиса датасета.
Они - независимы.

Алексей, я так и не понял, у Вас получилось добиться отработки события?

Этой строчкой вы пробуете впихнуть весь датасет в карточку

dlData.Dataset = Services.GetNewItemByUSI('ds_Offering');

Указать датасет невизуально довольно тонкий процесс (это означает вы хотите сделать один грид и одну карточку редактирования для нескольких похожих сущностей, иначе легче указать датасет сразу), посмотрите в качестве примера окна wnd_OfferingDetailEdit и wnd_OfferingsDetailTreeArea и их скрипты.
Эти окна предназначены для продуктов в счетах, документах и договорах. Можно заметить, что там привязка датасета идет не в карточке, а перед открытием карточки, т.е. в гриде.

"Олейник Дмитрий" написал: Алексей, я так и не понял, у Вас получилось добиться отработки события?
Дмитрий, нет, не получилось.

Давайте, я опишу ситуацию поподробнее.

Я создал новую пользовательскую карточку редактирования.
Вот такую: http://www.community.terrasoft.ru/forum/topic/9879#comment-44071
Сейчас мне нужно блокировать/разблокировать соответствующие поля ввода (поля, определяющие размер скидки) в зависимости от выбранного "радиобуттона" (относительное или абсолютное значение скидки).

Формы раздела (гриды, воркспейсы, карточки редактирования), в котором находится новый воркспейс, не имеют явного задания в свойствах невизуальных компонентов Dataset-ов.
Моя новая пользовательская форма (карточка редактирования wnd_SetDiscountInInvoice) также не имеет явной привязки датасета.

Объясните, пожалуйста, как обрабатывать события?
Вариант "поздней" привязки датасета по событию OnPrepare предложенный Дмитрием Олейником (http://www.community.terrasoft.ru/forum/topic/10032#comment-44333) "не прокатил".

а у вас к "радиобуттону" поле датасета привязано? ну так, проверьте на всякий случай .... :lol:

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

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

"Андросов Дмитрий" написал:а у вас к "радиобуттону" поле датасета привязано? ну так, проверьте на всякий случай ....


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

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

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

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


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

Алексей, согласен с Александром - если у Вас в картчоке не используется привязка в данным (нет датасета), зачем использовать событие OnDatasetDataChange?
Используйте событие контролов...

"Алейник Алексей Вадимович" написал:или это ирония?

это ирония

В общем, "радиобатон" (батон? радио? брр) radiobutton нельзя привязать к полю датасета\даталинка, поэтому, что бы вы с ним ни делали, событие dlDataOnDatasetDataChange, как и любые другие события для dlData, не произойдет.

Поэтому воспользуйтесь советом Александра Сазанова:

"Сазанов Александр Владимирович" написал:повесить блокировку/разблокировку полей на события OnClick на радиобатонах

Спасибо всем! Всё замечательно получилось!:twisted:

"Андросов Дмитрий" написал:

В общем, "радиобатон" (батон? радио? брр)


радиобатон

"Андросов Дмитрий" написал:В общем, "радиобатон" (батон? радио? брр)

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

Показать все комментарии
excel
отчет
печатная форма
экспорт
Технические вопросы
5.x

Здравствуйте, меня интересует или есть возможность создавать excel отчеты в BPMOnline 5.4 ?
(Печатные формы и последующую конвертацию в excel не предлагать, в силу того что там изначально нарушено форматирование).
Имееться в виду возможность в скрипте описать файл или какимто другим способом.
Пробывал использовать csv файлы, но в них нельзя применять форматирование и обьеденение строк.

Нравится

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

Здравствуйте, Игорь!
Да, есть возможность сделать такую доработку.
Вам нужно использовать Open XML SDK.
Для использования нужно просто подключить namespace DocumentFormat.OpenXml:

Вот конкретный пример использования:
здесь формируется .xlsx файл с колонками объекта, выбранного в lookup-поле

Page.BaseMessagePanel.Clear();
if (string.IsNullOrEmpty(SchemaName)) {
	Page.BaseMessagePanel.AddMessage(WarrningMessage, UnableSelectObjectMessage, MessageType.Warning, true);
	return true;
}
Page.Response.ClearHeaders();
Page.Response.ClearContent();
string fileName = SchemaName;
var instance = UserConnection.EntitySchemaManager.GetInstanceByUId(SchemaId);
if (instance != null) {
	fileName = instance.Caption.ToString();
}
Page.Response.ContentType = "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet";
Page.Response.AddHeader("Content-Disposition", "attachment; filename=" + fileName + ".xlsx");
 
List<double> columnWidthsList = new List<double>();
using (MemoryStream stream = new MemoryStream()) {
	using(SpreadsheetDocument spreadsheetDocument = SpreadsheetDocument.Create(stream, SpreadsheetDocumentType.Workbook)) {
		// Add a WorkbookPart to the document.
        var workbookpart = spreadsheetDocument.AddWorkbookPart();
        workbookpart.Workbook = new OpenXmlSpreadsheet.Workbook();
 
        // Add a WorksheetPart to the WorkbookPart.
        var worksheetPart = workbookpart.AddNewPart<WorksheetPart>();
        var workbookStylesPart = workbookpart.AddNewPart<WorkbookStylesPart>(); 
		worksheetPart.Worksheet = new OpenXmlSpreadsheet.Worksheet(new OpenXmlSpreadsheet.SheetData());
 
        // Add Sheets to the Workbook.
        OpenXmlSpreadsheet.Sheets sheets = spreadsheetDocument.WorkbookPart.Workbook.AppendChild<OpenXmlSpreadsheet.Sheets>(new OpenXmlSpreadsheet.Sheets());
 
        // Append a new worksheet and associate it with the workbook.
		string relationshipId = spreadsheetDocument.WorkbookPart.GetIdOfPart(worksheetPart);
		string sheetName = fileName;
        OpenXmlSpreadsheet.Sheet sheet = new OpenXmlSpreadsheet.Sheet() {
			Id = relationshipId,
            SheetId = 1, 
			Name = sheetName
        };
        sheets.Append(sheet);
 
        OpenXmlSpreadsheet.Worksheet worksheet = new OpenXmlSpreadsheet.Worksheet();
        OpenXmlSpreadsheet.SheetData sheetData = new OpenXmlSpreadsheet.SheetData();
        OpenXmlSpreadsheet.Row row = new OpenXmlSpreadsheet.Row();
 
		OpenXmlSpreadsheet.Cell currentCell;
		int columnCount = 0;
		var entitySchema = UserConnection.EntitySchemaManager.GetInstanceByName(SchemaName);
		foreach (var column in entitySchema.Columns) {
			if (!column.DefValue.IsSystemValue && !column.Name.Equals("ProcessListeners")) {
				currentCell = new OpenXmlSpreadsheet.Cell();
				currentCell.DataType =  OpenXmlSpreadsheet.CellValues.String;
				if (column.RequirementType == EntitySchemaColumnRequirementType.ApplicationLevel || column.RequirementType == EntitySchemaColumnRequirementType.DBLevel) {
					currentCell.StyleIndex = 3;
				} else {
					currentCell.StyleIndex = 4;
				}
				columnWidthsList.Add(CalculateWidth(column.Caption.Value));
	            currentCell.CellValue = new OpenXmlSpreadsheet.CellValue(column.Caption.Value);
				row.AppendChild(currentCell);
			}
		}
		sheetData.Append(row);
		row = new OpenXmlSpreadsheet.Row();
		for (int i=0;i<columnWidthsList.Count; i++) {
			currentCell = new OpenXmlSpreadsheet.Cell();
			currentCell.DataType =  OpenXmlSpreadsheet.CellValues.String;
			currentCell.StyleIndex = 5;
			row.AppendChild(currentCell);
		}
		sheetData.Append(row);
		//Adding columns and specifeing width
		OpenXmlSpreadsheet.Columns columns = new OpenXmlSpreadsheet.Columns();
		uint j = 1;
		foreach (var w in columnWidthsList) {
			columns.Append(CreateColumnData(j, w));
			j++;
		}
		worksheet.Append(columns);
		//--
        worksheet.Append(sheetData);
 
		workbookStylesPart.Stylesheet = CreateStyleSheet();
        worksheetPart.Worksheet = worksheet;
		spreadsheetDocument.Close();
 
		stream.Seek(0, SeekOrigin.Begin);
		byte[] dataArray = stream.ToArray();
 
		Page.Response.BinaryWrite(dataArray);
		Page.Response.End();
	}
}
return true;

Андрей, большое спасибо !

Андрей, Добрый день!
Пытаюсь реализовать создание Excel отчета по вашему примеру. Не компилируется из-за ошибки с функцией CreateStyleSheet()
Не могли бы Вы привести пример данной функции, т.к. вероятно данная функция добавлена в methods, или ответить, что необходимо написать вместо данной функции.

Код без данной строки

workbookStylesPart.Stylesheet = CreateStyleSheet();

компилируется и отрабатывает(видно в Visual Studio), но файл на сохранение не выдается. Пишет ошибку "Время ожидания выполнения запроса истекло." Может ли быть проблема в данной строке?

Здравствуйте, Эмин!
Этот пример из страницы "ImportSettingsPage". Метод CreateStyleSheet() определен там же. На всякий случай прикладываю исходный код.

Добрый день!
Почти та же проблема, что и у Эмина, только у меня код отрабатывает без ошибок, но в конце файл не выдается на сохранение с ошибкой:
Время ожидания выполнения запроса истекло.
Action: Click
ControlId: PageContainer_btnOk
SubmitAjaxEventConfig: {"config":{"viewStateMode":"include","extraParams":{}}}

            Page.Response.ClearHeaders();
            Page.Response.ClearContent();
            Page.Response.ContentType = "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet";
            Page.Response.AddHeader("Content-Disposition", "attachment; filename=TurnoverReport.xlsx");
 
            using (DB.DBExecutor dbExecutor = UserConnection.EnsureDBConnection())
            {
                using (MemoryStream stream = new MemoryStream())
                {
                    #region openxml
                    using (OpenXmlPackaging.SpreadsheetDocument spreadsheetDocument = OpenXmlPackaging.SpreadsheetDocument.Create(stream, SpreadsheetDocumentType.Workbook, true))
                    {
//...тут все без ошибок
                    }//using (SpreadsheetDocument spreadsheetDocument = SpreadsheetDocument.Create
                    #endregion
 
                    stream.Seek(0, SeekOrigin.Begin);
                    byte[] dataArray = stream.ToArray();
 
                    Page.Response.BinaryWrite(dataArray);
                    Page.Response.End();
 
                } //using (MemoryStream stream = new MemoryStream())
            } //using dbExecutor

версия 5.4
схемы из примера Андрея у меня в конфигурации нет

Здравствуйте, Лариса!
Вам нужно импортировать схему, которую я предоставлял, вызвать

workbookStylesPart.Stylesheet = CreateStyleSheet();

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

Андрей, я вырезала свой очень длинный рабочий код :)

если я сохраняю stream в файл на диск, то получаю корректный отчет, т.е. проблема не в OpenXML, а в отдаче файла на сохранение

если я убираю весь код, связанный с

Page.Response

то ошибок нет

Спасибо за помощь :twisted:

Проблему решила. Если кому-то будет интересно - пишите.

Показать все комментарии
досье
печатная_форма_5.4
Технические вопросы
5.x

Здравствуйте, подскажите пожалуйста в чем может быть причина такой ошибки?

Возникает при нажатии на кнопку Просмотр при создании печатных форм (в данном случае досье)
Скрин ошибки

Нравится

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