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

Может ли кто-нибудь подсказать, есть ли возможность указать явный порядок пунктов меню Печать в карточке редактирования сущности (например, Заказа)? Когда пунктов меню становится много, сложно найти нужный.

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

Нравится

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

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

Такая возможность есть. Вам необходимо переопределить PrintReportUtilities, либо переопределить отдельные его методы на странице редактирования/в разделе нужного объекта.

Алексей, спасибо за ответ! Не могли бы вы привести пример? Или хотя бы ссылку на документацию по методам PrintReportUtilites?

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

Могу ответить точечно, но не по всему миксину:smile:

Рекомендую посмотреть тему http://www.community.terrasoft.ru/blogs/15581

Алексей, премного благодарен!

Для тех, у кого возникнет такая необходимость, привожу код функции.

initSectionPrintForms: function(callback, scope) {
	var reportsEsq = this.getModulePrintFormsESQ();
	reportsEsq.filters.addItem(Terrasoft.createColumnFilterWithParameter(Terrasoft.ComparisonType.EQUAL,
			"ShowInSection", true));
	reportsEsq.getEntityCollection(function(result) {
 
		if (result.success && !result.collection.isEmpty()) {
			// Коллекция пунктов меню
			var printFormsMenuCollection = result.collection;
 
			/* Тут можно анализировать свои «условия» и удалять те или иные элементы printFormsMenuCollection */
			printFormsMenuCollection.collection.items = printFormsMenuCollection.collection.items.sort(
				function(item1, item2) {
					if (item1.values.Caption > item2.values.Caption) {
						return 1;
					}
					if (item1.values.Caption < item2.values.Caption) {
						return -1;
					}
					return 0;
				});
 
			this.preparePrintFormsMenuCollection(printFormsMenuCollection);
			printFormsMenuCollection.each(function(item) {
				item.set("Click", {bindTo: "generateSectionPrintForm"});
			}, this);
			var printMenuItems = this.preparePrintButtonCollection(this.moduleSectionPrintFormsCollectionName);
			printMenuItems.loadAll(printFormsMenuCollection);
			this.set(this.moduleSectionPrintFormsCollectionName, printMenuItems);
			this.getSectionPrintButtonVisible();
		}
 
		if (callback) {
			callback.call(scope || this);
		}
	}, this);
}

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

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

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

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

Здравствуйте, почему вы говорите о том, как ведет себя сортировка в карточке, и после обновления карточки. Если пишите метод «initSectionPrintForms». Так еще и речь заходит за написание этого кода в схеме секции.
Дело в том что, я было подумал что вы столкнулись с разницей работы кода в комбинированном режиме (когда слева видна часть секции, либо она спрятана за стрелочкой), и чистом режиме карточки (в который как раз можно попасть по F5).
Но метод initCardPrintForms, (CardPrint!) написанный в схеме страницы, отрабатывает как в комбинированном режиме, так и в чистом режиме карточки.
Вот к примеру чуть подправив ваш метод сортировки, написал его в initCardPrintForms, и в обоих режимах карточки, обратная сортировка работает:
Изначальный код метода брать необходимо из "PrintReportUtilities" т.к. от версии к версии он может разнится.

define("OpportunityPageV2", ["OpportunityPageV2Resources", "GeneralDetails", "StorageUtilities"],
function(resources, GeneralDetails, StorageUtilities) {
	return {
		entitySchemaName: "Opportunity",
		details: /**SCHEMA_DETAILS*/{}/**SCHEMA_DETAILS*/,
		diff: /**SCHEMA_DIFF*/[
		]/**SCHEMA_DIFF*/,
		attributes: {},
		methods: {
			initCardPrintForms: function(callback, scope) {
				var reportsEsq = this.getModulePrintFormsESQ();
				var entitySchemaName = this.getEntitySchemaName();
				reportsEsq.filters.addItem(Terrasoft.createColumnFilterWithParameter(Terrasoft.ComparisonType.EQUAL,
					"ShowInCard", true));
				StorageUtilities.GetESQResultByKey({
					esq: reportsEsq,
					key: "ShowInCard_PrintForm_" + entitySchemaName,
					callback: function(result) {
						if (this.destroyed) {
							return;
						}
						if (result.success && !result.collection.isEmpty()) {
							var printFormsMenuCollection = result.collection;
 
							printFormsMenuCollection.collection.items = printFormsMenuCollection.collection.items.sort(
								function(item1, item2) {
									if (item1.values.Caption > item2.values.Caption) {
										return -1;
									}
									if (item1.values.Caption < item2.values.Caption) {
										return 1;
									}
									return 0;
								}
							);
 
							this.preparePrintFormsMenuCollection(printFormsMenuCollection);
							printFormsMenuCollection.each(function(item) {
								item.set("Click", {bindTo: "generateCardPrintForm"});
							}, this);
							var printMenuItems = this.preparePrintButtonCollection(this.moduleCardPrintFormsCollectionName);
							printMenuItems.loadAll(printFormsMenuCollection);
							this.set(this.moduleCardPrintFormsCollectionName, printMenuItems);
							this.getCardPrintButtonVisible();
						}
						if (callback) {
							callback.call(scope || this);
						}
					},
					scope: this
				});
			}
		},
		rules: {},
		userCode: {}
	};
});

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

Максим, прошу прощения за двусмысленность. Я привел код initSectionPrintForms секции, но вел речь о методе initCardPrintForms.

Ваш код я попробовал, результат тот же. Может, причина в различиях версии продукта (у нас BMP'Online Sales 7.7.0.2293)?

Скажите, а где я могу посмотреть код PrintReportUtilities?

Как ни странно, но в схеме PrintReportUtilities. :smile:

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

Всем спасибо за помощь! Решил проблему добавлением логики сортировки нужной колонки при составлении запроса к базе, переопределив метод getModulePrintFormsESQ() в OrderPageV2:

/**
 * Возвращает клиентский запрос для получения печатных форм.
 */
getModulePrintFormsESQ: function() {
	var esq = Ext.create("Terrasoft.EntitySchemaQuery", {
		rootSchema: SysModuleReport,
		isDistinct: true,
		rowViewModelClassName: "Terrasoft.BasePrintFormViewModel"
	});
	esq.addColumn(SysModuleReport.primaryColumnName);
	var captionColumn = esq.addColumn("Caption", "NonLocalizedCaption");
 
	// Устанавливает порядок сортировки колонки
	captionColumn.orderPosition = 0;
	captionColumn.orderDirection = Terrasoft.OrderDirection.ASC;
	...
	return esq;
}

То же самое сделал в методе getModulePrintFormsESQ() в OrderSectionV2 для раздела.

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

Добрый день, коллеги!

Возникает ошибка при попытке вывода из bpm'online 7.5 раздел "Договор" печатной формы MS Word.
При формировании печатных форм все работает корректно, но после добавления табличных данных из детали "продукты в договоре" возникает следующая ошибка:

Сервер обнаружил ошибку при обработке запроса. Сообщение об исключении: "Ссылка на объект не указывает на экземпляр объекта.". Дополнительные сведения см. в журналах сервера. Трассировка стека исключений:
в Terrasoft.Configuration.ReportService.ReportHelper.GetReportFile(String key)
в Terrasoft.Configuration.ReportService.ReportService.GetReportFile(String key)
в SyncInvokeGetReportFile(Object , Object[] , Object[] )
в System.ServiceModel.Dispatcher.SyncMethodInvoker.Invoke(Object instance, Object[] inputs, Object[]& outputs) в System.ServiceModel.Dispatcher.DispatchOperationRuntime.InvokeBegin(MessageRpc& rpc)
в System.ServiceModel.Dispatcher.ImmutableDispatchRuntime.ProcessMessage5(MessageRpc& rpc)
в System.ServiceModel.Dispatcher.ImmutableDispatchRuntime.ProcessMessage31(MessageRpc& rpc)
в System.ServiceModel.Dispatcher.MessageRpc.Process(Boolean isOperationContextSet)

возможно на данную ошибку повлияли проблемы при установке 760_Terrasoft.Setup.Desktop.MSWordReportDesigner_RUS, который не до конца проинсталлировался, но работает.

Нравится

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

Добрый день, Андрей.

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

Илья,

я создал несколько печатных форм MS Word, при этом использовал поля из раздела "Документы", все работает корректно, печатные формы формируются из раздела "Договоры".
Затем понадобилось добавить в печатные формы данные из детали "Продукты". Настроил поля, добавил в шаблон печатной формы, сохранил. Ошибка возникает при попытке сформировать печатную форму, нажатием кнопки "печать" и выбором наименования печ. формы при нахождении в разделе "Договоры".

И еще одна особенность - как только я удаляю в шаблоне поля из детали (табличное представление данных) все работает, ошибки нет.

Формы создавал "с нуля".

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

После удаления всех шаблонных форм получилось, пока вопрос снимаю, спасибо!

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

Коллеги, добрый день!

Система 7,6

Есть задача при нажатии кнопки на формирование печатной формы в карточке выполнять дополнительную логику JavaScript.

Каким образом это реализовать. Где, в какой функции осуществляется вызов веб сервиса для формирования печатных форм и как ее переопределить?

Спасибо!

Нравится

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

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

При нажатии на кнопку "Печать" вызывается метод CreateReport схемы ReportService.

Какую задачу Вы пытаетесь реализовать?

Алексей,

в карточке Договор при нажатии на кнопку формирования печатной формы договора "Печать" - "Договор" нужно отправлять данные договора в АБС (интеграция), условно говоря, вызывать хранимую процедуру. Ну, одним словом, нужно переопределить функцию, которая вызывается при нажатии на данную кнопку

Тогда решением будет переопределение метода CreateReport схемы ReportService.
Один из параметров метода - Id печатной формы.

Если в метод пришел Id печатной формы Договора, тогда:
1) Формируем печатную форму
2) Вызываем хранимую процедуру

Иначе:
1) Формируем печатную форму.

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