Переключение на Главную Страницу Страницы: [1]  ОтправитьПечать
Очень популярная тема (более 25 ответов) Свертка базы (число прочтений - 9727 )
Nick
God Member
*****
Отсутствует



Сообщений: 1599
Местоположение: г.Новокузнецк
Зарегистрирован: 21. Февраля 2007
Пол: Мужской
Свертка базы
10. Апреля 2007 :: 05:12
Печать  
Такой вопрос: кто-нибудь делал свертку базы средствами 1С++?
  
Наверх
ICQ  
IP записан
 
trdm
1c++ power user
qt1l developer
1c++ moderator
Отсутствует



Сообщений: 2344
Местоположение: г. Ростов-на-Дону
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Свертка базы
Ответ #1 - 10. Апреля 2007 :: 13:53
Печать  
Nick писал(а) 10. Апреля 2007 :: 05:12:
Такой вопрос: кто-нибудь делал свертку базы средствами 1С++?

Если добывать итоговые данные, это не проблема.
А все остальное, наверное лучше 1С попыхтит...
  
Наверх
IP записан
 
Nick
God Member
*****
Отсутствует



Сообщений: 1599
Местоположение: г.Новокузнецк
Зарегистрирован: 21. Февраля 2007
Пол: Мужской
Re: Свертка базы
Ответ #2 - 11. Апреля 2007 :: 02:57
Печать  
А как насчет удаления истории периодических реквизитов? по идее можно одним запросом удалить по заданную дату или я ошибаюсб?
  
Наверх
ICQ  
IP записан
 
Quan
1c++ donor
1c++ power user
Отсутствует


I'm old, bald and ugly.

Сообщений: 273
Местоположение: Новосибирск -- Москва
Зарегистрирован: 20. Мая 2006
Пол: Мужской
Re: Свертка базы
Ответ #3 - 11. Апреля 2007 :: 09:05
Печать  
Nick писал(а) 11. Апреля 2007 :: 02:57:
А как насчет удаления истории периодических реквизитов? по идее можно одним запросом удалить по заданную дату или я ошибаюсб?


delete from _1sconst where date < cast('20070101' as datetime)

Только поаккуратнее нужно с этим: на самом деле сначала нужно перенести на первую сохраняемую дату последние ранее назначенные значения реквизитов. Скрипт с ходу не нашёл, а заново писать лениво.

ага, вот что-то похожее. Но просьба подходить с осторожностью и использовать исключительно как справочный образец, т.к. выдрано из древней обработки, а рабочая она или тестовая - звиняйте, уже не вспомню

insert into _1sconst
           |(id, objid, date, value, docid, time, actno,lineno_,tvalue)
           |select ta.id0 as id, ta.objid0 as objid, cast('20031231' as datetime), tb.value, tb.docid, tb.time, tb.actno, tb.lineno_, tb.tvalue from
           |(select t0.id as id0, t0.objid as objid0, (select top 1 ref.row_id from
           |_1sconst as ref
           |where
           |ref.id = t0.id
           |AND
           |ref.date < '20040101'
           |AND
           |ref.objid = t0.objid
           |Order by ref.date desc, ref.time desc, ref.docid desc, ref.row_id desc) rowid
           |from (select distinct id,objid from _1sconst where
           |id in (select id from "+ИмяВрТаб+")
           |AND
           |date < '20040101')
           |as t0
           |) ta
           |left join
           |(select row_id, date, value, docid, time, actno, lineno_,tvalue from _1sconst) tb
           |on ta.rowid= tb.row_id
  

А для тех, кто не хотел учить SQL, господь сотворил курсоры
Наверх
 
IP записан
 
Quan
1c++ donor
1c++ power user
Отсутствует


I'm old, bald and ugly.

Сообщений: 273
Местоположение: Новосибирск -- Москва
Зарегистрирован: 20. Мая 2006
Пол: Мужской
Re: Свертка базы
Ответ #4 - 11. Апреля 2007 :: 09:16
Печать  
trdm писал(а) 10. Апреля 2007 :: 13:53:
Nick писал(а) 10. Апреля 2007 :: 05:12:
Такой вопрос: кто-нибудь делал свертку базы средствами 1С++?

Если добывать итоговые данные, это не проблема.
А все остальное, наверное лучше 1С попыхтит...

Не факт.
Хорошо показала себя следующая последовательность:
1. Вываливаю бух. и опер. остатки на дату "обрезания" в специализированные доки ввода нач. остатков (рекомендуется кромсать по 10тыс строк)
2. Прямым запросом чикаю все движения регистров, а также все промежуточные итоги, за закрываемый период.
3. Средствами 1С делаю выбратьдокументы за требуемый период, цикл получитьдокумент()=1 и док.удалить.
Юмор в том, что документы, не имеющие движений, удаляются со свистом, а проводок у меня почти нет. Если проводок дохрена, имеет смысл подкорректировать алгоритм.
Прямое удаление доков (а) лениво писать (б) у меня бывают весьма хитрые ПриОтменеПроведения.
4. Прямым запросом чищу все бух.итоги за удаляемый период.
5. Пересчет регистров и бух остатков средствами 1С
6. Провожу ранее подготовленные доки ввода нач.остатков датой обрезания минус 1.
  

А для тех, кто не хотел учить SQL, господь сотворил курсоры
Наверх
 
IP записан
 
Nick
God Member
*****
Отсутствует



Сообщений: 1599
Местоположение: г.Новокузнецк
Зарегистрирован: 21. Февраля 2007
Пол: Мужской
Re: Свертка базы
Ответ #5 - 11. Апреля 2007 :: 09:25
Печать  
И проводки можно пожалуй тоже удалить средствами SQL а потом перерасчет итогов сделать, только конечно с начало операцию ввода остатков сделать.
А вот можно что - нибудь такое с регистрами проделать?
  
Наверх
ICQ  
IP записан
 
Nick
God Member
*****
Отсутствует



Сообщений: 1599
Местоположение: г.Новокузнецк
Зарегистрирован: 21. Февраля 2007
Пол: Мужской
Re: Свертка базы
Ответ #6 - 11. Апреля 2007 :: 09:27
Печать  
Nick писал(а) 11. Апреля 2007 :: 09:25:
И проводки можно пожалуй тоже удалить средствами SQL а потом перерасчет итогов сделать, только конечно с начало операцию ввода остатков сделать.
А вот можно что - нибудь такое с регистрами проделать?

Пока писал вопрос устарел Улыбка смотри выше
  
Наверх
ICQ  
IP записан
 
Quan
1c++ donor
1c++ power user
Отсутствует


I'm old, bald and ugly.

Сообщений: 273
Местоположение: Новосибирск -- Москва
Зарегистрирован: 20. Мая 2006
Пол: Мужской
Re: Свертка базы
Ответ #7 - 11. Апреля 2007 :: 09:33
Печать  
Nick писал(а) 11. Апреля 2007 :: 09:25:
И проводки можно пожалуй тоже удалить средствами SQL а потом перерасчет итогов сделать, только конечно с начало операцию ввода остатков сделать.
А вот можно что - нибудь такое с регистрами проделать?


Разумеется, можно. Просто я не стал заморачиваться, т.к. у меня их очень мало, в основном всё на регистрах. А регистры я как раз напрямую и чикал - см.выше повнимательнее

Примерно так:
delete from rg12345 where period<={d '1945-12-01'}

delete from ra12345 where date_time_iddoc<'19451231z'

Потому как ежели чикать регистры путём удаления доков, то каждый раз будут пересчитываться промежуточные итоги, а это ОЧЕНЬ долго

  

А для тех, кто не хотел учить SQL, господь сотворил курсоры
Наверх
 
IP записан
 
Nick
God Member
*****
Отсутствует



Сообщений: 1599
Местоположение: г.Новокузнецк
Зарегистрирован: 21. Февраля 2007
Пол: Мужской
Re: Свертка базы
Ответ #8 - 11. Апреля 2007 :: 09:33
Печать  
Quan писал(а) 11. Апреля 2007 :: 09:16:
trdm писал(а) 10. Апреля 2007 :: 13:53:
Nick писал(а) 10. Апреля 2007 :: 05:12:
Такой вопрос: кто-нибудь делал свертку базы средствами 1С++?

Если добывать итоговые данные, это не проблема.
А все остальное, наверное лучше 1С попыхтит...

Не факт.
Хорошо показала себя следующая последовательность:
1. Вываливаю бух. и опер. остатки на дату "обрезания" в специализированные доки ввода нач. остатков (рекомендуется кромсать по 10тыс строк)
2. Прямым запросом чикаю все движения регистров, а также все промежуточные итоги, за закрываемый период.
3. Средствами 1С делаю выбратьдокументы за требуемый период, цикл получитьдокумент()=1 и док.удалить.
Юмор в том, что документы, не имеющие движений, удаляются со свистом, а проводок у меня почти нет. Если проводок дохрена, имеет смысл подкорректировать алгоритм.
Прямое удаление доков (а) лениво писать (б) у меня бывают весьма хитрые ПриОтменеПроведения.
4. Прямым запросом чищу все бух.итоги за удаляемый период.
5. Пересчет регистров и бух остатков средствами 1С
6. Провожу ранее подготовленные доки ввода нач.остатков датой обрезания минус 1.


А документы по вводу остатков регистров делал для каждого регистра разные или один универсальный документ? С какой - нибудь хитрой табличной частью?
  
Наверх
ICQ  
IP записан
 
Quan
1c++ donor
1c++ power user
Отсутствует


I'm old, bald and ugly.

Сообщений: 273
Местоположение: Новосибирск -- Москва
Зарегистрирован: 20. Мая 2006
Пол: Мужской
Re: Свертка базы
Ответ #9 - 11. Апреля 2007 :: 10:07
Печать  
Nick писал(а) 11. Апреля 2007 :: 09:33:
А документы по вводу остатков регистров делал для каждого регистра разные или один универсальный документ? С какой - нибудь хитрой табличной частью?


Документ один, в заголовке - имя регистра, в табличной части - поля неопределённого типа (Измерения) и числовые (ресурсы). При проведении - через если-иначеесли анализ имени регистра, присвоение соответствующих величин, и выполнение движений.
  

А для тех, кто не хотел учить SQL, господь сотворил курсоры
Наверх
 
IP записан
 
dnp
Senior Member
****
Отсутствует


.

Сообщений: 479
Зарегистрирован: 26. Мая 2006
Пол: Мужской
Re: Свертка базы
Ответ #10 - 11. Апреля 2007 :: 14:56
Печать  
кстати, если поставить ТА на дату "начала времён" (т.е. до первого документа в БД), то при удалении доков ни какие итоги по регам не пересчитываются. Чем я раньше доблестно и пользовался. (Весьма хитрое ПриОтменеПроведения() не встречалось, может и упереться).

ЗЫ: DBF tested.
  
Наверх
ICQ  
IP записан
 
dnp
Senior Member
****
Отсутствует


.

Сообщений: 479
Зарегистрирован: 26. Мая 2006
Пол: Мужской
Re: Свертка базы
Ответ #11 - 11. Апреля 2007 :: 15:11
Печать  
Вариант-вопрос:

Что-то последнее время достало рисовать спец.доки с развесистой ТЧ, сделал док вообще без ТЧ. И шапка пустая. Док берет для себя данные из текстового файла, который я формирую обормоткой. Файл зарезервлен на сменный носитель. Вносит остатки нужным регам.
Перепроведение\Отмена  документа программно запрещены.

Пока живет (громкое слово "живет"; пользуюсь раз в год.. если правильно помню.)

Из минусов, заметных мне :

1) Поправить пару строчек или цифр - фигу, хотя это от лени написать редактор файла.
2) Страааашно  Круглые глаза   .... было. Но это, наверное, стереотипы.

Файлы с данными назвал RE*.DBF, чтобы архивировались за одно с БД. В * привязка ко внутр. ИДу документа (т.е. жму "Записать", а потом уже вызываю "Фиксатор остатков". Но это частность)) )

Ага, вопрос-то задать хотел Улыбка
Нормально же придумал? Или так-себе?
  
Наверх
ICQ  
IP записан
 
Quan
1c++ donor
1c++ power user
Отсутствует


I'm old, bald and ugly.

Сообщений: 273
Местоположение: Новосибирск -- Москва
Зарегистрирован: 20. Мая 2006
Пол: Мужской
Re: Свертка базы
Ответ #12 - 12. Апреля 2007 :: 06:21
Печать  
dnp писал(а) 11. Апреля 2007 :: 15:11:
Ага, вопрос-то задать хотел Улыбка
Нормально же придумал? Или так-себе?


гм.... работоспособно, но ИМХО некрасиво. Всё-таки самодостаточные данные должны жить в базе (опять же имхо).
Если уж так хочется хранить текстовые исходники разнородных даннык, то может стОит создать в шапке единственный реквизит неопределённой длины?
  

А для тех, кто не хотел учить SQL, господь сотворил курсоры
Наверх
 
IP записан
 
dnp
Senior Member
****
Отсутствует


.

Сообщений: 479
Зарегистрирован: 26. Мая 2006
Пол: Мужской
Re: Свертка базы
Ответ #13 - 12. Апреля 2007 :: 07:17
Печать  
Quan писал(а) 12. Апреля 2007 :: 06:21:
работоспособно, но ИМХО некрасиво

Вообще-то согласен.

Просто, после пары раз судорожных переделок структурированных доков ввода остатков, решил забить на красоту.

А про безразмерную строку - честно, просто пожалел 1SCONST.DBF забивать парой сотен килобайт данных, нужных один раз.

Выраженного желания хранения текстовых исходников данных, конечно, не было. Ибо там такие исходники, что человек их все равно не прочитает, все агрегатные объекты в виде ЗначениеВстрокуВнутр(...).

В ДБФ-ной базе безразмерная строка на сколько ёмкая? Не глюканет?
  
Наверх
ICQ  
IP записан
 
Quan
1c++ donor
1c++ power user
Отсутствует


I'm old, bald and ugly.

Сообщений: 273
Местоположение: Новосибирск -- Москва
Зарегистрирован: 20. Мая 2006
Пол: Мужской
Re: Свертка базы
Ответ #14 - 12. Апреля 2007 :: 07:19
Печать  
dnp писал(а) 12. Апреля 2007 :: 07:17:
А про безразмерную строку - честно, просто пожалел 1SCONST.DBF забивать парой сотен килобайт данных, нужных один раз.

Выраженного желания хранения текстовых исходников данных, конечно, не было. Ибо там такие исходники, что человек их все равно не прочитает, все агрегатные объекты в виде ЗначениеВстрокуВнутр(...).

В ДБФ-ной базе безразмерная строка на сколько ёмкая? Не глюканет?


Сорри, постоянно забываю про существование ДБФ. Там, возможно, Ваше решение подходит лучше.
  

А для тех, кто не хотел учить SQL, господь сотворил курсоры
Наверх
 
IP записан
 
Nick
God Member
*****
Отсутствует



Сообщений: 1599
Местоположение: г.Новокузнецк
Зарегистрирован: 21. Февраля 2007
Пол: Мужской
Re: Свертка базы
Ответ #15 - 12. Апреля 2007 :: 07:25
Печать  
dnp писал(а) 12. Апреля 2007 :: 07:17:
Quan писал(а) 12. Апреля 2007 :: 06:21:
работоспособно, но ИМХО некрасиво

Вообще-то согласен.

Просто, после пары раз судорожных переделок структурированных доков ввода остатков, решил забить на красоту.

А про безразмерную строку - честно, просто пожалел 1SCONST.DBF забивать парой сотен килобайт данных, нужных один раз.

Выраженного желания хранения текстовых исходников данных, конечно, не было. Ибо там такие исходники, что человек их все равно не прочитает, все агрегатные объекты в виде ЗначениеВстрокуВнутр(...).

В ДБФ-ной базе безразмерная строка на сколько ёмкая? Не глюканет?


А разве длинные строки тоже в 1SCONST хранятся?
  
Наверх
ICQ  
IP записан
 
dnp
Senior Member
****
Отсутствует


.

Сообщений: 479
Зарегистрирован: 26. Мая 2006
Пол: Мужской
Re: Свертка базы
Ответ #16 - 12. Апреля 2007 :: 07:56
Печать  
Nick писал(а) 12. Апреля 2007 :: 07:25:
А разве длинные строки тоже в 1SCONST хранятся?

ОЙ!  Смущённый
Действительно.
Это слегка меняет дело.
В пользу хранения в БД.
  
Наверх
ICQ  
IP записан
 
Quan
1c++ donor
1c++ power user
Отсутствует


I'm old, bald and ugly.

Сообщений: 273
Местоположение: Новосибирск -- Москва
Зарегистрирован: 20. Мая 2006
Пол: Мужской
Re: Свертка базы
Ответ #17 - 12. Апреля 2007 :: 08:12
Печать  
Nick писал(а) 12. Апреля 2007 :: 07:25:
А разве длинные строки тоже в 1SCONST хранятся?


Была когда-то такая хрень, но в v.7.7 ликвидирована как класс
  

А для тех, кто не хотел учить SQL, господь сотворил курсоры
Наверх
 
IP записан
 
Nick
God Member
*****
Отсутствует



Сообщений: 1599
Местоположение: г.Новокузнецк
Зарегистрирован: 21. Февраля 2007
Пол: Мужской
Re: Свертка базы
Ответ #18 - 13. Апреля 2007 :: 07:44
Печать  
Вопрос: как в модуле проведение сделать движение по регистру используя его идентификатор?
  
Наверх
ICQ  
IP записан
 
Nick
God Member
*****
Отсутствует



Сообщений: 1599
Местоположение: г.Новокузнецк
Зарегистрирован: 21. Февраля 2007
Пол: Мужской
Re: Свертка базы
Ответ #19 - 13. Апреля 2007 :: 10:15
Печать  
Вопрос:
1. Как получить имя таблицы которая содержит движения по регистру?
2. Можно программно пересчитать оперативные итоги?
  
Наверх
ICQ  
IP записан
 
Quan
1c++ donor
1c++ power user
Отсутствует


I'm old, bald and ugly.

Сообщений: 273
Местоположение: Новосибирск -- Москва
Зарегистрирован: 20. Мая 2006
Пол: Мужской
Re: Свертка базы
Ответ #20 - 13. Апреля 2007 :: 11:34
Печать  
Nick писал(а) 13. Апреля 2007 :: 07:44:
Вопрос: как в модуле проведение сделать движение по регистру используя его идентификатор?


Если ИмяРегистра="..." Тогда
хххххххххх
ИначеЕсли ИмяРегистра="..." Тогда
ууууууууу
.......................


Nick писал(а) 13. Апреля 2007 :: 10:15:
Вопрос:
1. Как получить имя таблицы которая содержит движения по регистру?
2. Можно программно пересчитать оперативные итоги?


1. select sum ($Регистр.ОгрызкиЯблок.КоличествоКосточек) from $Регистр.ОгрызкиЯблок
2. Можно, где-то даже выкладывалась соотв. обработка. Я предпочитаю штатные средства 1С. Их, кстати, можно вызывать "программно", запуская конфигуратор с нужными ключиками.
  

А для тех, кто не хотел учить SQL, господь сотворил курсоры
Наверх
 
IP записан
 
Вадимко
God Member
*****
Отсутствует


Нам бы чего про ОдноЦэ...

Сообщений: 1048
Местоположение: Минск
Зарегистрирован: 24. Мая 2006
Пол: Мужской
Re: Свертка базы
Ответ #21 - 14. Апреля 2007 :: 21:33
Печать  
Регистр.ПолучитьАтрибут("Идентификатор")

  

Кампутер, кофе и сигареты - это очень плохо для моего здоровья...
Наверх
IP записан
 
Nick
God Member
*****
Отсутствует



Сообщений: 1599
Местоположение: г.Новокузнецк
Зарегистрирован: 21. Февраля 2007
Пол: Мужской
Re: Свертка базы
Ответ #22 - 16. Апреля 2007 :: 02:22
Печать  
Nick писал(а) 13. Апреля 2007 :: 10:15:
Вопрос:
1. Как получить имя таблицы которая содержит движения по регистру?

             Рег=СокрЛП(ИмяРегистра);
            МДВ = СоздатьОбъект("MetaDataWork");
        Сообщить(МДВ.ИмяТаблицыДвижений(Рег));
        Сообщить(МДВ.ИмяТаблицыИтогов(Рег));
  
Наверх
ICQ  
IP записан
 
Nick
God Member
*****
Отсутствует



Сообщений: 1599
Местоположение: г.Новокузнецк
Зарегистрирован: 21. Февраля 2007
Пол: Мужской
Re: Свертка базы
Ответ #23 - 16. Апреля 2007 :: 04:43
Печать  
Вопрос:
На сколько реально увеличится производительность 1С под SQL если обрезать все пред идущие года
в базе?
  
Наверх
ICQ  
IP записан
 
Salimbek
God Member
*****
Отсутствует



Сообщений: 862
Зарегистрирован: 06. Июня 2006
Пол: Мужской
Re: Свертка базы
Ответ #24 - 16. Апреля 2007 :: 06:47
Печать  
Quan писал(а) 11. Апреля 2007 :: 09:05:
delete from _1sconst where date < cast('20070101' as datetime)

Только поаккуратнее нужно с этим...

Полностью согласен, так как в этой таблице хранятся и значения констант, с датой "< cast('20070101' as datetime)", которые будут удалены этой командой. Поэтому при удаленни надо проверять поле date, но СКЛ-базы под рукой нет, поэтому точное значение сказать не могу. Типа такого:
delete from _1sconst where date < cast('20070101' as datetime) and date > cast('19000101' as datetime)

Цитата:
Вопрос: как в модуле проведение сделать движение по регистру используя его идентификатор?

Если ИмяРегистра="..." Тогда
хххххххххх
ИначеЕсли ИмяРегистра="..." Тогда
ууууууууу

Нашел такую реализацию:
Код
Выбрать все
	Для N=1 По Метаданные.Регистр() Цикл
		ПромРегистр=Метаданные.Регистр(N);
		Если ПромРегистр.ТипРегистра="Обороты" Тогда
			Продолжить;
		КонецЕсли;
		ПромРегистр="Регистр."+СокрЛП(ПромРегистр.Идентификатор);
		Рег=СоздатьОбъект(ПромРегистр);
		Если ДатаКонцаПериода<ПолучитьДатуТА() Тогда
			Рег.ВременныйРасчет();
			РассчитатьРегистрыПо(ДатаКонцаПериода);
		КонецЕсли;
		ЗаполнитьТаблицу(Докум,Рег);<-- Тут создание дока "ПереносОстатков" по этому регистру
		Рег=0;
	КонецЦикла; 

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



Сообщений: 1599
Местоположение: г.Новокузнецк
Зарегистрирован: 21. Февраля 2007
Пол: Мужской
Re: Свертка базы
Ответ #25 - 16. Апреля 2007 :: 06:52
Печать  
Quan писал(а) 11. Апреля 2007 :: 09:05:
delete from _1sconst where date < cast('20070101' as datetime)

Только поаккуратнее нужно с этим: на самом деле сначала нужно перенести на первую сохраняемую дату последние ранее назначенные значения реквизитов. Скрипт с ходу не нашёл, а заново писать лениво.


Пожалуй вот так будет правильнее всего Улыбка :
delete from _1sconst where (date < cast('20070101' )) and (OBJID <> '     0   ')
  
Наверх
ICQ  
IP записан
 
Quan
1c++ donor
1c++ power user
Отсутствует


I'm old, bald and ugly.

Сообщений: 273
Местоположение: Новосибирск -- Москва
Зарегистрирован: 20. Мая 2006
Пол: Мужской
Re: Свертка базы
Ответ #26 - 18. Апреля 2007 :: 12:14
Печать  
Nick писал(а) 16. Апреля 2007 :: 04:43:
Вопрос:
На сколько реально увеличится производительность 1С под SQL если обрезать все пред идущие года
в базе?

Незначительно.
Если, конечно, нет привычки постоянно перепроводить документы 10-летней давности
  

А для тех, кто не хотел учить SQL, господь сотворил курсоры
Наверх
 
IP записан
 
Переключение на Главную Страницу Страницы: [1] 
ОтправитьПечать