|
ЗУП-3. Автоматическое создание регламентированной отчетности. | ☑ | ||
---|---|---|---|---|
0
Антиквар
27.04.18
✎
18:00
|
Всем привет!
Требуется создавать некоторые регламентированные отчеты автоматически. Связано это с большим кол-вом обособленных подразделений, по которым должна быть отдельная форма отчета. Думал проблем особых не вызовет. В ЗУП 2.5 такое уже делал. Но столкнулся с проблемами. Возьмем к примеру отчетность по статистике П4. Есть объект Отчет.РегламентированныйОтчетСтатистикаФормаП4 У этого отчета есть форма ФормаОтчета2018Кв1 У этой формы есть экспортная процедура заполнения отчета и экспортная процедура записи отчета. Всё вроде просто: создаю форму, вызываю по очереди процедуру заполнения, потом процедуру записи. При необходимости форму открываю (если при открытии какие-то нужные переменные или действия выполняются). После записи форму закрываю. Но ежкин кот, 1С это всё реализовала через кучу различных оповещений (Новый ОписаниеОповещения()) и обработчиков ожидания. В результате, если вызывать процедуру заполнения отчета, а за ней процедуру записи отчета, то отчет запишется раньше, чем заполнится :) Как программно отловить этот момент, когда отчет заполнен и его уже можно записать? Если у кого есть опыт или мнение, поделитесь идеями. |
|||
1
piter3
27.04.18
✎
18:03
|
А кто будет отвечать головой за хреновые данные?Или мы это опускаем
|
|||
2
BigShmax
27.04.18
✎
18:09
|
(1) тот кто её подаёт, главбух короче.
|
|||
3
fedoss
27.04.18
✎
18:10
|
Как простой вариант - запустить 1С /РежимОтладки, тогда все будет выполняться без фоновых заданий
|
|||
4
Антиквар
27.04.18
✎
19:47
|
(1) Почему данные хреновые? Я же хочу формировать отчетность стандартным функционалом 1С. Мне только нужно зациклить создание одного отчета. Да и выхода другого нет. Один отчет П4 формируется около 3 минут. Обособленных подразделений около 2 тысяч. Вручную не реально!
(3) Причем тут фоновые задания, не понял? |
|||
5
piter3
27.04.18
✎
20:45
|
(4) При том,что вот у тебя учет идеальный?А отвечать кому?
Фоновые очень даже причем,но у вас слишком экономят на кадрах. И кстати формы забудь как класс |
|||
6
Антиквар
27.04.18
✎
21:08
|
(5) Можешь пояснить?
Учет конечно не идеальный. Но как это связано с автоматическим формированием П4? Если есть ошибки в учете, то и ручное формирование П4 будет с ошибками. Не могу понять, к чему клонишь. Фоновые задания всё-таки причем? Почему забыть формы, в каком контексте это понимать? |
|||
7
piter3
27.04.18
✎
21:11
|
(6) Заполниться фигней,так понятней?Вот,а если ты заполнишь авто то ты будешь отвечать.
В том что тебе надо найти запрос для заполнения,уже не помню,что там в статистике,но вроде ничего сложного. А фоновые тебе нужны,что бы запустить параллельно формирование файлов или чего тебе нужно |
|||
8
piter3
27.04.18
✎
21:14
|
Или ты хочешь заставить своих бухов нажимать кнопки для выгрузки)
|
|||
9
Антиквар
27.04.18
✎
21:32
|
(7) А, понял тебя. Я буду отвечать, если при моем автоматическом заполнении заполнится фигнёй, отличной от фигни при ручном заполнении :)
Запрос для заполнения я не хотел использовать. Я хотел вызывать стандартные процедуры заполнения, чтобы при изменении всех этих запросов фирмой 1С у меня всё работало. Ну т.е. типа вызвать процедуру ЗаполнитьОтчет(), затем процедуру СохранитьОтчет(). И не важно что внутри этих процедур, какой код и какие запросы. И процедуры то эти нашел, только вот отчет сохраняется быстрее чем заполняется, из-за системы оповещений и обработок ожидания. Думал и над тем, чтоб запрос найти по получению всех показателей П4. Нашел несколько версий. Последняя текущая версия самая неудобная, через схему компоновки, не разобрался пока. Я даже подумал забить на формирование отчетности, а сразу запросами получать показатели и формировать файлы. И сделается в 10 раз быстрее, и не хранить в базе ежемесячно 2 тысячи отчетов. Но минус - бухам вообще ничего не посмотреть, не проверить, да и постоянно отслеживать что там 1С могла в этих запросах поменять. |
|||
10
Антиквар
27.04.18
✎
21:35
|
(8) А зачем фоновые задания для выгрузки? Я планировал такую же обработку. Первая обработка формирует все отчеты: создает, заполняет и записывает. Дальше бухи смотрят всё ли так (смотреть навряд ли кто будет, но это уже не мои проблемы).
Когда бухи дали отмашку, запускается вторая обработка, которая выгружает все отчеты. |
|||
11
Gucci76
27.04.18
✎
21:40
|
А если не запускать сохранение пока реквизит какой-то отчета не заполнен
Сделать цикл и в нем проверять ЗначениеЗаполнено() Но надо наверно сделать прерывание цикла при каких либо условиях |
|||
12
Антиквар
27.04.18
✎
21:41
|
Кстати, может кто-нибудь попробовать, сколько по времени формируется П4 по одному обособленному подразделению?
У нас около 3 минут. Это жесть как долго. И дело не в объеме базы, база то новая, только перешли. И не в количестве сотрудников (брал даже маленькое обособленное подразделение, где всего 6 человек). Либо 1С так круто реализовала, либо что-то у нас не так, не знаю правда что может быть не так, с настройками серверов, железом,... Но в 2.5 как-то всё крутилось. Кому не лень, прикиньте пожалуйста ваше время, мне чтоб понимать, штатно это или нет. Просто создать отчет, выбрать обособленное подразделение и нажать Заполнить. Сколько по времени заполнять будет? |
|||
13
Антиквар
27.04.18
✎
21:45
|
(11) Спасибо, как вариант. Подумаю. Но если отчет формируется 3 минуты, я своим циклом не подвешу всё на хрен :)
|
|||
14
piter3
27.04.18
✎
22:00
|
3 минуты,а сколько сотров?Что-то много
|
|||
15
Антиквар
27.04.18
✎
22:16
|
(14) Сотров много, работающих в текущий момент тысяч 15 наверное. Но вот в данном тестируемом обособленном подразделении всего 6 человек.
|
|||
16
Антиквар
28.04.18
✎
11:02
|
ап
|
|||
17
ГдеСобака Зарыта
28.04.18
✎
11:24
|
Теоретически. Стандартные отчеты формируются фоновыми заданиями и возвращают результат в хранилище, адрес которого есть реквизит формы. Нужно запустить формирование и проверять обработчиком ожидания это хранилище, как будет готов результат запускать сохранение.
|
|||
18
ГдеСобака Зарыта
28.04.18
✎
11:34
|
Хотя не, там все иначе.. Но в любом случае формирование идет фоновым заданием. Вот его результат тебе и надо проверить.
|
|||
19
Антиквар
28.04.18
✎
12:35
|
(18) Жесть. Не понимаю как эти фоновые задания тут работают.
Вижу в коде проверку, можно запускать в фоне или нельзя. Если база файловая или чего то там ещё, то нельзя. В итоге если нельзя, то вызывается процедура: ЗаполнитьОтчет(ИДОтчета, ИДРедакцииОтчета, ПараметрыОтчета, Контейнер) А если можно, то вызывается процедура: Процедура ЗаполнитьОтчетВФоне(ПараметрыОтчета, АдресХранилища) Экспорт ЗаполнитьОтчет(ПараметрыОтчета.ИДОтчета, ПараметрыОтчета.ИДРедакцииОтчета, ПараметрыОтчета.ПараметрыОтчета, ПараметрыОтчета.Контейнер); ПоместитьВоВременноеХранилище(ПараметрыОтчета.Контейнер, АдресХранилища); КонецПроцедуры Т.е. в случае фонового задания вызывается та же процедура ЗаполнитьОтчет(), но после неё ещё процедура ПоместитьВоВременноеХранилище() И где тут выполнение в фоне? |
|||
20
piter3
28.04.18
✎
12:43
|
РегламентированныйОтчетСтатистикаФормаП4 нельзя поискать по конфе?
|
|||
21
ГдеСобака Зарыта
28.04.18
✎
13:07
|
(19) Ну вот же у тебя как раз и АдресХранилища. Его и проверяй обработкой ожидания.
|
|||
22
ГдеСобака Зарыта
28.04.18
✎
13:14
|
Даже проще можно. Смотри Процедура Подключаемый_ПроверитьВыполнениеЗадания() в форме отчета.
|
|||
23
fedoss
28.04.18
✎
14:45
|
(19) Не знаю, какая у вас версия ЗУП, у меня в 3.1.6.6
РегламентированныйОтчетСтатистикаФормаП4.ФормаОтчета2018Кв1 Функция ЗаполнитьАвтоНаСервере() ... РезультатВыполнения = ДлительныеОперации.ВыполнитьВФоне("РегламентированнаяОтчетностьПереопределяемый.ЗаполнитьОтчетВФоне", Новый Структура("ИДОтчета, ИДРедакцииОтчета, ПараметрыОтчета, Контейнер", ИДОтчета, ИДРедакцииОтчета, ПараметрыОтчета, Контейнер), ПараметрыВыполненияВФоне); ... Если РезультатВыполнения.ЗаданиеВыполнено Тогда ЗагрузитьПодготовленныеДанные(); КонецЕсли; Там запускается фоновое задание (если база не файловая и не РежимОтладки) Поэтому я и предложил как простой вариант запустить в режиме отладки. Так код выполняется без фонового задания и после вызова процедуры заполнения получается уже заполненный отчет. Да и вызывать даже не надо ничего, у формы есть параметр "СформироватьФормуОтчетаАвтоматически" А если с вызовом руками и фоновым заданием - можно перед вызовом заполнения поставить Модифицированность = Ложь и подключить обработчик ожидания с проверкой. После заполнения Модифицировнность устанавливается в Истина. А ЗаданиеВыполнено не очень хорошо, т.к. после выполнения фонового задания там происходит загрузка данных и расчет. |
|||
24
Антиквар
28.04.18
✎
15:15
|
(23) "Не знаю, какая у вас версия ЗУП, у меня в 3.1.6.6"
У меня 3.1.4.171. Но процедура такая же, и код внутри такой же есть. "Поэтому я и предложил как простой вариант запустить в режиме отладки. Так код выполняется без фонового задания и после вызова процедуры заполнения получается уже заполненный отчет." В том и дело, что не получается. Я все эксперименты делаю на файловой базе сейчас. Рабочая база на SQL, а тестовая пока файловая. Тоже вижу уже проверки, что если база файловая, то запускать не в фоне. Но при этом всё-равно программа не останавливается на процедуре заполнения, идет дальше. Да и если интерактивно в 1С заполнять отчет, то при этом можно запросто нажать Записать или закрыть форму отчета, обработка заполнения не блокирует ничего. Я почему в самом начале и писал про оповещения, что видимо из-за них так. "Да и вызывать даже не надо ничего, у формы есть параметр "СформироватьФормуОтчетаАвтоматически"" Вчера пробовал, тоже не помогло. Причем в ПриСозданииНаСервере() вызывается процедура Инициализация(), в которой есть такой код: Если СтруктураРеквизитовФормы.СформироватьФормуОтчетаАвтоматически Тогда ЗаполнитьАвтоНаСервере(); КонецЕсли; Я записал в параметры формы СформироватьФормуОтчетаАвтоматически = Истина и программно открываю форму. По идее при её открытии она должна и заполниться. Но это не произошло, открылась пустая. Возможно в чем-то не разобрался. "А ЗаданиеВыполнено не очень хорошо, т.к. после выполнения фонового задания там происходит загрузка данных и расчет." Да, это так |
|||
25
fedoss
28.04.18
✎
15:33
|
Я попробовал не на клиент-серверной. С ключем /C РежимОтладки заполнение происходит не в фоне, на время заполнения все блокируется.
А чем не нравится вариант с ОбработчикомОжидания и проверкой модифицированности? |
|||
26
ptiz
28.04.18
✎
15:51
|
(13) В файловой демо-базе отчет формируется больше 2х минут :)
Самая долгая строка: ОбщийМодуль.СтатистикаПерсоналаРасширенный.Модуль 2 081 МакетКомпоновкиДанных = КомпоновщикМакета.Выполнить(СхемаКомпоновки, 134,722673 сек 97,55% |
|||
27
fedoss
28.04.18
✎
16:06
|
Забавно. Оказывается у 1С есть своя функция СформироватьАвтоматическиРеглОтчет, которая запускает заполнение регл. отчета фоновым заданием и записывает его, не дожидаясь завершения :)
|
|||
28
Антиквар
28.04.18
✎
22:16
|
(25) "Я попробовал не на клиент-серверной. С ключем /C РежимОтладки заполнение происходит не в фоне, на время заполнения все блокируется."
Странно, у меня не блокируется. Пробую в файловой базе, причем 1С запускаю из конфигуратора, сразу в режиме отладки запускается. "А чем не нравится вариант с ОбработчикомОжидания и проверкой модифицированности?" Вы пишете: "После заполнения Модифицировнность устанавливается в Истина." Пока не совсем ясно, где находится это "После заполнения". В каком месте кода ставить этот признак. Но идея вроде рабочая. |
|||
29
Антиквар
28.04.18
✎
22:19
|
(27) Ну прямо мой метод :)
|
|||
30
Антиквар
28.04.18
✎
22:24
|
(26) Спасибо за замеры. Теперь хоть понимаю, что он в принципе так долго работает и навряд ли что можно улучшить.
У меня и в локальной файловой базе, и в серверной около 3 минут один отчет. И я так посчитал, около 4 суток будет по всем обособленным формировать :( Думаю надо попробовать выдернуть запрос, который получает все показатели и не создавать никакие отчеты в программе, сразу самому формировать файлы XML. Хотя судя из замеров уважаемого "ptiz" как раз выполнение запроса и занимает почти всё время :( |
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |