Имя: Пароль:
1C
1С v8
Изменение схемы компоновки данных в форме отчета
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
В целом, я думаю, что все возможные варианты мы обсудили. С грустью я копирую форму себе в отчет и использую ее, дополнив процедуру "ПриСозданииНаСервере".

Всем спасибо за помощь! Хорошего всем дня!
Компьютер — устройство, разработанное для ускорения и автоматизации человеческих ошибок.