Переключение на Главную Страницу Страницы: 1 ОтправитьПечать
Горячая тема (более 10 ответов) Выполнить отчет в другой базе (число прочтений - 5271 )
Ярослав
Junior Member
**
Отсутствует


I Love YaBB 2!

Сообщений: 43
Местоположение: Иркутск
Зарегистрирован: 14. Октября 2008
Выполнить отчет в другой базе
27. Ноября 2013 :: 08:18
Печать  
Привет.
Опишу что имеем:
Есть База1 (конфигурация1)
Есть База2 (конфигурация2)
Есть Отчет1, для базы База2 (конфигурации отличаются с База1)
Отчет1 написан на чистом 1С.
В Отчет1 передаются параметры (строки,даты,числа,таблицы_значений в них тоже простые типы)
Из Отчет1 получается таблица_значений (простые типы).

Внимание вопрос: как из База1 запустить Отчет1, чтобы он взял данные из База2 (OLE/не OLE) с параметрами переданными из База1, а также вернул параметры из База2 в База1.

Конечно хороший вариант переписать отчет на чистый SQL и все станет прекрасно, но он долгий.

Спасибо Улыбка
  
Наверх
 
IP записан
 
Z1
God Member
*****
Отсутствует


I Love YaBB 2!

Сообщений: 2906
Местоположение: Москва
Зарегистрирован: 26. Мая 2006
Пол: Мужской
Re: Выполнить отчет в другой базе
Ответ #1 - 27. Ноября 2013 :: 08:43
Печать  
так все  через ole делается например так
1. подготавливаешь параметры в конкретный файл.
2.по OLE вызываешь функцию глобального модуля
другой базы
3.эта функция берет файл и вызывает отчет с параметрами
полученными из файла.
4.резульаты отчета ТЗ запоминаем в другом файле
5.Функция отработала
6. закрываем OLE
7.берем ТЗ из файла
и все файлы за собой удаляем.


  
Наверх
 
IP записан
 
Satans Claws
God Member
*****
Отсутствует


1C++ rocks!

Сообщений: 721
Зарегистрирован: 29. Ноября 2010
Re: Выполнить отчет в другой базе
Ответ #2 - 27. Ноября 2013 :: 09:54
Печать  
*Вспоминает Садовникова с его RiK_Inet.dll, поднятым сеансом 1С в качестве сервера, и перепиныванием данных через сокеты*
  
Наверх
 
IP записан
 
Z1
God Member
*****
Отсутствует


I Love YaBB 2!

Сообщений: 2906
Местоположение: Москва
Зарегистрирован: 26. Мая 2006
Пол: Мужской
Re: Выполнить отчет в другой базе
Ответ #3 - 27. Ноября 2013 :: 10:20
Печать  
(0) Придумал еще способ даже без OLE
1 Первая база создает файл с параметрами.
2. Первая база запускает вторую базу 1с со специальной командной строкой или со специальным параметром.
3.Вторая база при открытии понимает что нужно выполнить отчет
берет параметры отчета из файла
4.формирует отчет
5.записывает результаты отчета в другой файл.
6.закрывает базу 2.
7. Первая база берет результаты отчета из файла.
  
Наверх
 
IP записан
 
Ярослав
Junior Member
**
Отсутствует


I Love YaBB 2!

Сообщений: 43
Местоположение: Иркутск
Зарегистрирован: 14. Октября 2008
Re: Выполнить отчет в другой базе
Ответ #4 - 27. Ноября 2013 :: 10:28
Печать  
Спасибо за внимание Улыбка
Нашел такой способ:
Берем ненужную (количество сколько вам надо) глобальную переменную в базе2. У меня ГлВесы и ГлДП
Далее
     
Код
Выбрать все
Отчет1= БазаПрошлогоПериода.ExecuteBatch("глВесы = СоздатьОбъект(""СписокЗначений"");");
	Сообщить(Отчет1);
	Отчет2= БазаПрошлогоПериода.ExecuteBatch("глВесы.ДобавитьЗначение(""ЖоЖоБа"");");
	Сообщить(Отчет2);
	Отчет3= БазаПрошлогоПериода.ExecuteBatch("глДП = СоздатьОбъект(""ТаблицаЗначений"");");
	Сообщить(Отчет3);
	Отчет4= БазаПрошлогоПериода.ExecuteBatch("глДП.ВставитьКолонку(""ЖоЖоБа"");");
	Сообщить(Отчет4);
	Отчет5= БазаПрошлогоПериода.ExecuteBatch("глДП.НоваяСтрока();");
	Сообщить(Отчет5);
	Отчет6= БазаПрошлогоПериода.ExecuteBatch("глДП.ЖоЖоБа = 12;");
	Сообщить(Отчет6);
	Отчет7= БазаПрошлогоПериода.ExecuteBatch("глВесы.ДобавитьЗначение(глДП);");
	Сообщить(Отчет7);

	Отчет = ранзитнойСхемы_ПоступлениеТМЦ.ert"")"); 



Теперь форма получает наши параметры.
Однако получить результат в виде ТЗ не смог.
Завтра буду решать или результат загонять в dbf, или буду переписывать на прямые запросы.
Если будут новые решения/предложения, то буду рад Улыбка
  
Наверх
 
IP записан
 
Z1
God Member
*****
Отсутствует


I Love YaBB 2!

Сообщений: 2906
Местоположение: Москва
Зарегистрирован: 26. Мая 2006
Пол: Мужской
Re: Выполнить отчет в другой базе
Ответ #5 - 27. Ноября 2013 :: 10:43
Печать  
Цитата:
Теперь форма получает наши параметры.
Однако получить результат в виде ТЗ не смог.

ЗначениеВФайл

Код
Выбрать все
ТЗ = СоздатьОбъект("ТаблицаЗНачений");
// заполняешь ТЗ
ЗначениеВФайл(ТЗ,ИмяФайла,1);
// третий параметр 1 внешний формат объектов
 

  
Наверх
 
IP записан
 
Bosma
YaBB Newbies
*
Отсутствует


1C++ rocks!

Сообщений: 10
Зарегистрирован: 16. Января 2012
Re: Выполнить отчет в другой базе
Ответ #6 - 27. Ноября 2013 :: 13:55
Печать  
может так:

     
Код
Выбрать все
	Отчет = ровкаБУТранзитнойСхемы_ПоступлениеТМЦ.ert"")"); 



ну и в отчете должен быть возврат параметра перед закрытием (Форма.Параметр=.......)
Тогда в "ГлВесы" будет передано возвращаемое значение
Только оно будет передано для базу "БазаПрошлогоПериода"
  
Наверх
 
IP записан
 
Ярослав
Junior Member
**
Отсутствует


I Love YaBB 2!

Сообщений: 43
Местоположение: Иркутск
Зарегистрирован: 14. Октября 2008
Re: Выполнить отчет в другой базе
Ответ #7 - 28. Ноября 2013 :: 01:55
Печать  
Bosma писал(а) 27. Ноября 2013 :: 13:55:
может так:

     
Код
Выбрать все
	Отчет = ровкаБУТранзитнойСхемы_ПоступлениеТМЦ.ert"")"); 



ну и в отчете должен быть возврат параметра перед закрытием (Форма.Параметр=.......)
Тогда в "ГлВесы" будет передано возвращаемое значение
Только оно будет передано для базу "БазаПрошлогоПериода"


Не хочет так работать
  
Наверх
 
IP записан
 
Satans Claws
God Member
*****
Отсутствует


1C++ rocks!

Сообщений: 721
Зарегистрирован: 29. Ноября 2010
Re: Выполнить отчет в другой базе
Ответ #8 - 28. Ноября 2013 :: 02:43
Печать  
Открывать форму МОДАЛЬНО в оле-сессии, пожалуй, не самая хорошая идея - слишком уже глючно 1Ска работает с модальными окнами

Внимание, вопрос - а что мешает в самом отчете записать данные в такую же глобально-экспортную переменную?



Ну и что мешает в базе 2 написать глобально-экспортную функцию, типо такой?
Функция олеВыполнитьОтчет(ИмяОтчета, Параметры) Экспорт

В которой уже реализовать функционал вызова нужного отчета с необходимыми параметрами
  
Наверх
 
IP записан
 
Bosma
YaBB Newbies
*
Отсутствует


1C++ rocks!

Сообщений: 10
Зарегистрирован: 16. Января 2012
Re: Выполнить отчет в другой базе
Ответ #9 - 28. Ноября 2013 :: 04:57
Печать  
я так понял автор не хочет менять конфигурации
  
Наверх
 
IP записан
 
Ярослав
Junior Member
**
Отсутствует


I Love YaBB 2!

Сообщений: 43
Местоположение: Иркутск
Зарегистрирован: 14. Октября 2008
Re: Выполнить отчет в другой базе
Ответ #10 - 29. Ноября 2013 :: 00:21
Печать  
Цитата:
Внимание, вопрос - а что мешает в самом отчете записать данные в такую же глобально-экспортную переменную?


Ничего, только данные не появляются, если их получить из База1 Печаль
Во всяком случае если я из База1 передаю в ОЛЕ База2 список значений, в отчете добавляю туда значение, то потом в База1 я не вижу это значение
  
Наверх
 
IP записан
 
Salimbek
God Member
*****
Отсутствует



Сообщений: 862
Зарегистрирован: 06. Июня 2006
Пол: Мужской
Re: Выполнить отчет в другой базе
Ответ #11 - 29. Ноября 2013 :: 14:17
Печать  
Список значений - это не простой тип. Передавать между базами можешь только Числа, Строки и Даты, Так что если хочешь Список, то передавай его через "ЗначениеВСтроку". Разумеется в этот Список во второй базе добавлять можно только такие же простые типы данных.
  
Наверх
ICQ  
IP записан
 
Satans Claws
God Member
*****
Отсутствует


1C++ rocks!

Сообщений: 721
Зарегистрирован: 29. Ноября 2010
Re: Выполнить отчет в другой базе
Ответ #12 - 02. Декабря 2013 :: 02:32
Печать  
Salimbek писал(а) 29. Ноября 2013 :: 14:17:
Список значений - это не простой тип. Передавать между базами можешь только Числа, Строки и Даты, Так что если хочешь Список, то передавай его через "ЗначениеВСтроку". Разумеется в этот Список во второй базе добавлять можно только такие же простые типы данных.


Не совсем так.
Список значений между базами передавать можно - только вторая база на ТипЗначенияСтр() никогда не ответит "СписокЗначений" (а, соответственно, в тех методах, где ожидается СписокЗначений, он тоже не прокатит).
Но получив список значений из другой базы, ничего не мешает сказать
Для й = 1 по сзТам.РазмерСписка() Цикл
     Представление = "";
     Значение = сзТам.ПолучитьЗначение(й, Представление);
КонецЦикла;

Ах, ну и да, в догонку
На сколько я помню, кошерно работает и такая конструкция:
сзТам = OLE77.CreateObject("СписокЗначений");
причем, если потом сказать
OLE77.ФункцияГлобальногоМодуля(сзТам);
то в ФункцииГлобальногоМодуля переданный сзТам будет "родным" объектом (т.е. ТипЗначенияСтр(сзТам) будет "СписокЗначений")
  
Наверх
 
IP записан
 
Переключение на Главную Страницу Страницы: 1
ОтправитьПечать