|
Изменение схемы компоновки данных в форме отчета | ☑ | ||
---|---|---|---|---|
0
NikePopov
04.04.14
✎
15:14
|
Доброго всем времени суток!
Конфигурация: Бухгалтерия государственного учреждения, редакция 2.0 Зайду издалека для отсекания, тех методов обхода данной ситуации, которые не соответствуют задаче. Задача: Разработать консольку отчетов, обработок, списков справочников(с требуемыми отборами) и много много чего ещё. Для чего написал внешнюю обработку с кучей нужных форм. При этом снимать с поддержки конфигурацию строжайше запрещено. Всё шло отлично до тех пор пока не начал делать отчеты на СКД. Предыстория: У меня в обработке есть страничка ссылок на отчеты. Они все вызывают одну единственную функцию. Имя элемента формы совпадает с именем макета схемы компоновки данных запускаемой обработки. В макете по соседству с схемами СКД лежит в виде двоичных данных файл "ВнешнийОтчет.erf" - файл пустого отчета. Данный файл в себе не содержит схем СКД, реквизитов, макетов. Она совершенно пустой и создан для того, чтобы создать внешний отчет с произвольной(назначаемой в коде) схемой компоновкой данных. Собственно вопрос: Я НаКлиенте: - вызываю серверную функцию, которая подключит внешний отчет из двоичных нанных макета - Открываю форму отчета(форма в обработке отсутствует, чтобы вызывалась стандартная форма отчета БГУ) - Присваиваю схему компоновки данных данной обработки в форму отчета(полученную на прошлом шаге) На третьем шаге - огромный затык... Состоит он в тем, что СКД и ОтчетОбъект существуют только на сервере, а работать с формой я могу только на клиенте. Код: &НаСервере Функция ПодключитьВнешнююОбработку(ИмяСхемыКомпановкиДанных) АдресВоВременномХранилище = ПоместитьВоВременноеХранилище(ОбработкаОбъект().ПолучитьМакет("ПустойОтчет")); ИмяОтчета = ВнешниеОтчеты.Подключить(АдресВоВременномХранилище, ИмяСхемыКомпановкиДанных, Ложь); Возврат ИмяОтчета; КонецФункции // ПодключитьВнешнююОбработку() &НаКлиенте Процедура ОткрытьОтчетПоИмени(ИмяСхемыКомпановкиДанных) ИмяОтчета = ПодключитьВнешнююОбработку(ИмяСхемыКомпановкиДанных); ФормаОтчета = ПолучитьФорму("ВнешнийОтчет." + ИмяОтчета + ".Форма"); ФормаОтчета.Открыть(); КонецПроцедуры // ОткрытьОтчетПоИмени() Варианты, которые я знаю, но плохие: 1. Хранить в макетах не СКД, а сами отчеты - для администрирования не удобно 2. Сделать не одну обработку, а много - обновление обработки представляет перезапись одного элемента справочника "Дополнительные отчеты и обработки" 3. Снять конфигурацию с поддержки и хранить макеты там - По установке задачи нельзя снимать конфигурацию с поддержки Варианты, которые я не знаю как реализовать: 1. Открыть форму отчета с параметрами.На примере справочника, параметры: Форма.Открыть(новый Структура("Ключ", СсылкаНаЭлементСправочника)); 2. КопироватьДанныеФормы: НаСервере: НовыйОтчет = ВнешниеОтчеты.Создать(ИмяОтчета); НовыйОтчет.СхемаКомпоновкиДанных = ОбработкаОбъект().ПолучитьМакет(ИмяСхемыКомпановкиДанных); ЗначениеВРеквизитФормы(НовыйОтчет, "Отчет"); // Выдает ошибку "Неверное значение параметра 2" НаКлиенте: КопироватьДанныеФормы(Отчет, ФормаОтчета.Отчет); |
|||
1
NikePopov
04.04.14
✎
15:26
|
Ап
|
|||
2
NikePopov
04.04.14
✎
15:54
|
Ап, плиз! Может у кого-нибудь есть хоть направление мыслей..
|
|||
3
Franchiser
гуру
04.04.14
✎
15:58
|
почему нельзя включить возможность изменения без снятия конфигурации с поддержки?
|
|||
4
NikePopov
04.04.14
✎
16:03
|
Вопрос не в "снятии с поддержки" - это я неправильно выразился. Речь идет о том, что нельзя изменять конфигурацию. Так стоит задача.
Если бы задача так не стояла, я бы сделал множество отчетов и вставил бы их в конфигурацию. Постановку задачи тоже менять нельзя.. В случае, если реализация указанными методами невозможна - реаизую через отчёты в макетахю |
|||
5
NikePopov
04.04.14
✎
16:14
|
Могло бы помочь, если кто-то знал, какого типа надо создавать реквизит формы, чтобы в него процедурой "ЗначениеВРеквизитФормы" засунуть объек типа "ВнешняяОбработка".
|
|||
6
NikePopov
04.04.14
✎
16:17
|
ЗначениеВРеквизитФормы(НовыйОтчет, "Отчет"); // Выдает ошибку "Неверное значение параметра 2"
Я проверял при типах реквизита "Отчет": - Произвольный - ОтчетОбъект |
|||
7
NikePopov
04.04.14
✎
16:19
|
(5) Точнее "ВнешнийОтчет"
|
|||
8
Franchiser
гуру
04.04.14
✎
16:45
|
"Отчет" - это называние реквизита на форме. Ты его создал?
|
|||
9
DmitrO
04.04.14
✎
16:45
|
думаю сделать можно.. только это будет не форма отчета..
я так и не понял, для отчета нужна "стандартная форма отчета БГУ" или ты согласен на собственную форму? |
|||
10
NikePopov
04.04.14
✎
16:55
|
(8) Отчет - это реквизит формы, использую его как посредник. В него я могу в функциях &НаСервере установить отчет с нужной мне СКД, а затем полуклиентским методом "КопироватьДанныеФормы" могу перенести в форму, где его требуется использовать
(9) Я хотел оставить стандартную форму(она очень функциональна и удобна, да и приемственность интерфейса хотелось бы обеспечить - чтобы все отчеты выглядели одинаково) на случай всяческих изменений.. Для примера - появится функция сохранения данных в новый(какой-нибудь) формат или новые кнопки редактирования, а в моих отчётах не появятся, если я эту форму перенесу к себе в обработку.. Это конечно не очень приятно, но приемлемо. В задании таких подробностей нет. В целом, это допустимо. |
|||
11
Franchiser
гуру
04.04.14
✎
17:00
|
Сделай у него тип "отчетОбхект" передай на сервер, там преобразуй в объект прикладного типа, потом все установи, потом преобразуй обратно.
|
|||
12
Franchiser
гуру
04.04.14
✎
17:01
|
даже может без преобразования можно
|
|||
13
NikePopov
04.04.14
✎
17:03
|
(11) Не понял. У меня 2 процедуры. Одна &НаКлиенте(ОткрытьОтчетПоИмени), другая &НаСервере(ПодключитьВнешнююОбработку)
я пробовал установить данный реквизит(типа "ОтчетОбъект"): ЗначениеВРеквизитФормы(НовыйОтчет, "Отчет") Но результатом было мне "не верно указанный параметр 2" |
|||
14
Franchiser
гуру
04.04.14
✎
17:05
|
Я предлагаю не весь НовыйОтчет туда пихать а частями... ты можешь КомпоновщикНастроекМакета например передать еще что то.
|
|||
15
NikePopov
04.04.14
✎
17:09
|
(14) а как мне получить КомпоновщикНастроекМакета из СхемаКомпоновкиДанных. Да и разные это вещи, мне казалось. Хотя могу ошибаться.
Кстати, ОтчетОбъект = РеквизитФормыВЗначение("Отчет"); Если тип "ОтчетОбъект" выдает ошибку: {Форма.Форма.Форма(66)}: Ошибка при вызове метода контекста (РеквизитФормыВЗначение) ОтчетОбъект = РеквизитФормыВЗначение("Отчет"); по причине: Тип не определен '00000000-0000-0000-0000-000000000000' что собственно понятно |
|||
16
DmitrO
04.04.14
✎
17:12
|
тут похоже суть в том что у внешнего отчета схему нельзя заменить..
|
|||
17
Franchiser
гуру
04.04.14
✎
17:12
|
обращайся к нему на сервере просто Отчет. Зачем преобразовывать.
|
|||
18
Franchiser
гуру
04.04.14
✎
17:13
|
про КомпоновщикНастроекМакета я для примера сказал, если ты его уже получил на сервере.
|
|||
19
DmitrO
04.04.14
✎
17:13
|
а кстати, у встроенного отчета схему заменить можно..
|
|||
20
Franchiser
гуру
04.04.14
✎
17:13
|
преобразовывать надо только то что в скобках стоит в реквизитах.
|
|||
21
NikePopov
04.04.14
✎
17:14
|
(16) Да, я вот с этим собственно пол дня и бьюсь..
(17) Что именно у него менять? Свойства "СхемаКомпоновкиДанных" у реквизита формы нет. |
|||
22
DmitrO
04.04.14
✎
17:15
|
(19)+ только это надо делать в серверном методе формы (общей в конфе), которую тебе изменять нельзя по условиям задачи..
|
|||
23
Franchiser
гуру
04.04.14
✎
17:15
|
СхемаКомпоновкиДанных - это тип макета, сделай отчету твоему макет с нужным типом и меняй потом в объекте нужный макет.
|
|||
24
NikePopov
04.04.14
✎
17:22
|
(22) Это и есть проблема. Склоняюсь к тому, что скопирую в обработку форму отчета.
(23) Всё равно не могу понять, как мне заполнить свойства отчет(Компоновщика настроек) исходя из СКД? |
|||
25
Franchiser
гуру
04.04.14
✎
17:26
|
Об = реквизитформывзначение("Объект");
Об.получитьмакет("Макет"); // тут как-то подменить макет значениевреквизитформы(Об, "Объект"); |
|||
26
NikePopov
04.04.14
✎
17:33
|
(25) Это хорошо, если меняем форму отчета...
Сейчас я ещё не решился на её изменение. Если форму отчёта надо будет менять - тогда всё понятно. Вопрос собственно как в форме ОБРАБОТКИ(извиняюсь за CAPS), есть реквизит "Обработка"(основной реквизит формы) и Отчет(НЕ основной реквизит формы тип "ОтчетОбъект"). сейчас я слему легко получу при помощи метода СхемаКомпановкиДанных = РеквизитФормыВЗначение("Обработка").ПолучитьМакет(ИмяСхемыКомпановкиДанных); Теперь вопрос, куда его пихать? &НаСервере - он бесполезен, так как там нет формы, куда мне его надо установить. &НаКлиенте - он недоступен. Там нельзя вызвать функцию "РеквизитФормыВЗначение("Обработка")" Передать с сервера на клиент тоже возможности нет.. |
|||
27
NikePopov
04.04.14
✎
17:36
|
Вот такой вот я привереда...
|
|||
28
Franchiser
гуру
04.04.14
✎
17:36
|
Вот собственно и вопрос, что будет если написать:
СхемаКомпановкиДанных = НоваяСхемаКомпонвкиИзВнешнегоОтчета; возможно потом Обработка уже будет новый макет. тогда потом пихать ЗначениеВРеквизитФормы(обработка,"обработка") |
|||
29
Franchiser
гуру
04.04.14
✎
17:40
|
Кстати почему ты написал "&НаСервере нет формы"?
|
|||
30
Franchiser
гуру
04.04.14
✎
17:41
|
форма есть и на сервере и на клиенте
|
|||
31
NikePopov
04.04.14
✎
17:45
|
(30)
&НаСервере Функция ПодключитьВнешнююОбработку(ИмяСхемыКомпановкиДанных) АдресВоВременномХранилище = ПоместитьВоВременноеХранилище(ОбработкаОбъект().ПолучитьМакет("ПустойОтчет")); ИмяОтчета = ВнешниеОтчеты.Подключить(АдресВоВременномХранилище, ИмяСхемыКомпановкиДанных, Ложь); Возврат ИмяОтчета; КонецФункции // ПодключитьВнешнююОбработку() &НаКлиенте Процедура ОткрытьОтчетПоИмени(ИмяСхемыКомпановкиДанных) ИмяОтчета = ПодключитьВнешнююОбработку(ИмяСхемыКомпановкиДанных); ФормаОтчета = ПолучитьФорму("ВнешнийОтчет." + ИмяОтчета + ".Форма"); ФормаОтчета.Открыть(); КонецПроцедуры // ОткрытьОтчетПоИмени() Как мне передать на сервер значение переменной "ФормаОтчета", если это реально, тогда и вопросов нет. Я её объекты буду менять и никаких проблем. |
|||
32
Franchiser
гуру
04.04.14
✎
17:47
|
Просто пиши в процедуре на сервере ФормаОтчета
|
|||
33
Franchiser
гуру
04.04.14
✎
17:48
|
если она является реквизитом твоей формы
|
|||
34
Franchiser
гуру
04.04.14
✎
17:50
|
ты не правильно понял, форма твоей обработки есть на сервере и на клиенте, внешний отчет есть только на сервере.
|
|||
35
NikePopov
04.04.14
✎
17:58
|
(34) Речь идет не о моей обработке, где я сейчас пишу код. Передавать мне надо другую форму, полученную методом ПолучитьФорму("ВнешнийОтчет." + ИмяОтчета + ".Форма").
У моей формы есть &НаСервере(имеется ввиду - на сервере с КОНТЕКСТОМ, но с контекстом этой формы, а не другой). |
|||
36
Franchiser
гуру
04.04.14
✎
18:04
|
ну я понял, я думал сделать как то чтобы из внешней формы на сервере все параметры коппировались в твою запускаемую форму, и тогда бы ты смог обращаться к запускаемой форме.
|
|||
37
Classic
04.04.14
✎
18:32
|
В чем проблема работать с формой на сервере?
|
|||
38
DmitrO
04.04.14
✎
18:42
|
(37) со своей формой (той из которой идет контекстный вызов) - да, не проблема.. а с другой - это для 1С проблема )
|
|||
39
NikePopov
07.04.14
✎
09:00
|
В целом, я думаю, что все возможные варианты мы обсудили. С грустью я копирую форму себе в отчет и использую ее, дополнив процедуру "ПриСозданииНаСервере".
Всем спасибо за помощь! Хорошего всем дня! |
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |