Имя: Пароль:
1C
1С v8
ЗУП-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" как раз выполнение запроса и занимает почти всё время :(
Здесь можно обсудить любую тему при этом оставаясь на форуме для 1Сников, который нужен для работы. Ymryn