gifts2017

Свертка базы SQL + Альтернативный контроль удаления помеченных

Опубликовал Александр Тарасенков (tarasenkov) в раздел Обработки - Свертка базы

Свертка базы 1с 8.1, 8.2 (может использовать прямые запросы к MSSQL, PostgreSQL). Сворачивает документы, регистры накопления, сведений, бухгалтерии (но не регистры расчета). Универсальна, подойдет к любой конфигурации. Включает в себя нестандартный быстрый контроль удаления помеченных объектов и удаление помеченных объектов прямыми запросами. Поставляется с исходными кодами.

Обработка "Свертка базы SQL" позволяет:

1. а) Свернуть данные по регистрам (накопления, сведений, бухгалтерии) на определенную дату.
При этом создаются документы "Ввод остатков свертка базы SQL" с начальными остатками, документы до этой даты помечаются на удаление, движения регистров, итоги и агрегаты до этой даты удаляются. При пометке на удаление документов и удалении движений, итогов, агрегатов регистров могут использоваться прямые запросы к SQL серверу (для ускорения процесса).

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

* Данные по регистрам расчета данной обработкой не сворачиваются!

* Таблицы Регистрации изменений для регистров (по планам обмена) могут быть либо полностью очищены при свертке либо незатронуты вообще (флаг на закладке Описание).

* Для выполнения свертки в базу необходимо добавить документ "Ввод остатков свертка базы SQL" и сделать его регистратором всех регистров накопления, сведений, бухгалтерии, он поставляется в .cf файле вместе с обработкой.
(При объединении с .cf файлом отключите все флажки кроме Документов)
Данный документ позволит ввести остатки по регистрам накопления, сведений и бухгалтерии на дату свертки. Если такой документ в базе отсутствует, обработкой можно будет воспользоваться для удаления помеченных объектов и/или для дефрагментации индексов, пересчета статистики.

* Перед запуском свертки важно указать какие документы и регистры нельзя сворачивать!
Например, документы, к которым есть запросы с ключевым словом "Первые" не рекомендуется сворачивать.

* Перед запуском свертки на рабочей базе - протестируйте на копии, сверьте остатки.

2. Удалить с контролем целостности все помеченные объекты. Предоставляется возможность выбора:

- стандартный 1с контроль целостности с удалением помеченных объектов - самый длительный вариант, возможно падение 1с из-за нехватки памяти;

- альтернативный контроль целостности со стандартным 1с удалением объектов - контроль очень быстрый (особенно под 8.2, в том числе в режиме совместимости с 8.1), а удаление по 1000 объектов в транзакции, что быстрее нежели первый вариант;

- альтернативный контроль целостности с удалением прямыми запросами к SQL серверу,
пакетами по 50000 строк - самый быстрый вариант (внимание, при этом не будут вызваны события связанные с удалением объектов - ПередУдалением, ПриУдалении и т.п., и в планах обмена не будут отражаться операции удаления).

3. Просмотреть какие объекты стали причной запрета удаления при альтернативном контроле целостности,
какие поля и/или движения этих объектов стали причиной запрета, с возможностью открыть эти объекты по ссылке.

4. Усечь файлы базы данных SQL после массовых удалений (прямые запросы к SQL серверу).

5. Перестроить либо дефрагментировать индексы (в зависимости от степени фрагментации),
пересчитать статистику, сбросить кэш плана запросов для данной базы (прямые запросы к SQL серверу).
Имеется возможность перестроить индексы в то время как с базой работают пользователи (MSSQL 2005 и выше).

Основные цели свертки:
- Уменьшение размера информационной базы. 
- Увеличение скорости резервного копирования информационной базы и регламентных операций - пересчет статистики, индексов. 
- Возможно некоторое увеличение скорости работы базы, например за счет того, что таблицы и индексы лучше смогут помещаться в оперативной памяти, и уменьшится количество обрабатываемых SQL сервером строк при соединениях таблиц в запросах, для случаев когда SQL сервер не может использовать индексы.

* В настоящее время поддерживаются как файловые так и SQL базы, но прямые запросы доступны только для баз MSSQL, PostgreSQL. Без прямых запросов такие части обработки как пометка документов на удаление, удаление записей регистров и итогов, активизация документов остатков, удаление помеченных объектов будут выполняться значительно дольше. Создание документов ввода остатков, альтернативный контроль удаления помеченных объектов выполняются достаточно быстро и не зависят от прямых запросов.

* Для выполнения прямых запросов понадобятся драйвера ODBC для соответствующего сервера баз данных.
Для MSSQL они обычно входят в поставку. Для PostgreSQL их можно найти тут: http://www.postgresql.org/ftp/odbc/versions/msi/

* Поддерживаются 1с 8.1, 8.2 (в режиме совместимости 8.1), 8.2 (без режима совместимости). Управляемые формы не используются.

* Автору не удалось потестировать обработку на свертке агрегатов регистров оборотов, в регистрации изменений (для планов обмена) операции, выполняемые прямыми запросами, не регистрируются.

Подробнее смотрите в описании самой обработки (по F1).

=============================================

Обработка разбита на этапы, можно использовать ее для всех операций скопом, а можно, например, ограничиться
только сверткой или только удалением помеченных объектов с контролем целостности и/или дефрагментацией
индексов и пересчетом статистики.

Допускается свертка по одному/нескольким регистрам за один раз, на случай когда свертка по всем регистрам
длится очень долго, для этого все остальные регистры необходимо занести в перечень несворачиваемых.

=============================================

Обновление от 2013-04-08 23:59 мск. Версия 1.2.12

* Исправлены обнаруженные ошибки
**при свертке прямыми запросами обороты по регистрам бухгалтерии за день свертки не разворачивались по субконто. 

Обновление от 2013-03-21 20:00 мск. Версия 1.2.11

* Исправлены обнаруженные ошибки
**при альтернативном контроле целостности возникала ошибка с прерыванием обработки в том случае если в конфигурации имелись планы счетов с не пустым видом субконто и максимальным количеством видов субконто = 0. 
**при вводе остатков по регистру бухгалтерии без корреспонденции, или с планом счетов, у которого не задан вид субконто или максимальное количество видов субконто = 0 возникала ошибка с прерыванием обработки.

Обновление от 2013-03-12 14:00 мск. Версия 1.2.10

* Исправлены обнаруженные ошибки:
**при альтернативном контроле целостности в некоторых случаях допускалось удаление помеченных объектов на которые имелись ссылки. Для исправления обработки СверткаБазыSQL требуется заменить в модуле формы процедуру "внОбработатьНепомеченные" на её исправленную версию: https://dl.dropbox.com/u/49134062/Procedure_ProcessNotMarked.zip

Обновление от 2013-03-05 15:00 мск. Версия 1.2.9

* Исправлены обнаруженные ошибки:
**при формировании документов ввода остатков в некоторых редких случаях вводились некорректные данные. Для того, чтобы проверить возникла ли ошибка на Ваших данных и получить рекомендации по исправлению данных и кода обработки СверткаБазыSQL, рекомендуется скачать специальную обработку по ссылке: https://dl.dropbox.com/u/49134062/CheckDocsMadeBySvertkaBasySQL.zip

Обновление от 2013-03-01 17:00 мск. Версия 1.2.8

* Исправлены обнаруженные ошибки:
**при соединении с MSSQL игнорировались имя и пароль - использовалась Windows аутентификация (теперь добавлен флаг отключающий Windows аутентификацию)

=============================================

Copyright © 2012-2013 Тарасенков Александр

Гарантия возврата денег

Гарантия возврата денег

ООО "Инфостарт" гарантирует Вам 100% возврат оплаты, если программа не соответствует заявленному функционалу из описания. Деньги можно вернуть в полном объеме, если вы заявите об этом течение 14-ти дней со дня поступления денег на наш счет.

Программа настолько проверена в работе, что мы с полной уверенностью можем дать такую гарантию. Мы хотим, чтобы все наши покупатели оставались довольны покупкой.

Для возврата оплаты просто свяжитесь с нами.

Скачать файлы

Наименование Файл Версия Размер Кол. Скачив.
Свертка базы SQL + Альтернативный контроль удаления помеченных - Без использования прямых запросов
.zip 311,98Kb
22.09.15
144
.zip 311,98Kb 144 Бесплатно
Инструкция к обработке СверткаБазыSQL
.zip 109,98Kb
22.09.15
195
.zip 109,98Kb 195 Бесплатно
Свертка базы SQL + Альтернативный контроль удаления помеченных - Полная версия
23.05.2014
6500 руб.

Моментальная
доставка

См. также

Подписаться Добавить вознаграждение

Комментарии

2. Андрей Андрей (diarki) 14.06.12 10:02
3. Tsaregorodtsev (TSSV) 14.06.12 14:24
Пару лет назад пришлось обрезать довольно большую базу и критичным было как раз время на эту операцию, так как работу фирмы останавливать было нельзя. В итоге за выходные операция не завершилась и пришлось в обрезанную базу догружать данные, которые пришлось продолжить вводить в старую... Так что вопрос скорости обработки актуален, автору плюс!
4. Виктор Лебедев (eeeio) 15.06.12 16:52
строка 3909 - жалуется на отсутствие у значения метода Типы(). Причина в том, что в запросе выбираются каталоги планов видов характеристик, у которых свойство ТипЗначения = null.
5. Александр Тарасенков (tarasenkov) 15.06.12 23:03
(4) eeeio, спасибо поправлю.

В этой версии, кажется, еще одна ошибка закралась - итоги по оборотным регистрам очищаются, но не пересчитываются - поправлю на след.неделе, а пока рекомендация - после свертки - программно для каждого оборотного регистра вызвать ПересчитатьИтоги().
6. Miffka (mikhailv) 18.06.12 11:14
Нарушение лицензионного соглашения 1С (модификация данных не средствами 1С) + настоящий кошмар для параноика: а вдруг обработка сделала что-то, что пропустили при выверке, но потом убьет базу:)?

Больше понравилась другая идея: отказа от свертки.
http://infostart.ru/public/94040/
7. eigen20 18.06.12 23:32
Отличная идея и разработка, как будут деньгги обязательно скачаю. А то был опыт в обрезке больших sql-ных баз и к сожелению только негативный :((. И стандартная свертка с диска итс работает только на идеальных базах чего в жизни не бывает в принципе.
8. Александр Тарасенков (tarasenkov) 21.06.12 17:11
Нашел, еще одну некритичную ошибку текущей версии - при свертке ломаются текущие итоги (т.е. остатки после периода рассчитанных итогов) по сворачиваемым регистрам накопления и бухгалтерии, на подходе версия без пересчета итогов, а пока рекомендация - после свертки - программно для каждого сворачиваемого регистра накопления и бухгалтерии вызвать ПересчитатьТекущиеИтоги().
9. Александр Тарасенков (tarasenkov) 22.06.12 19:05
Бывает, что свертку желательно запускать только после создания бэкапа базы, а бэкап выполняется батником по расписанию.
В таком случае также по расписанию можно запустить и свертку.

Предварительно Функцию ФормыЗапуска нужно сделать экспортной: ИспользоватьПрямыеЗапросыSQLПриИзменении(Элемент) Экспорт
Саму обработку встроить в базу.
В обработке заполнить закладки НулевыеСчета, НеСворачивать и сохранить в файл "C:\свертка.ini".

Вот пример кода запуска обработки из процедуры ПриНачалеРаботыСистемы():

Если ПараметрЗапуска = "СверткаБазы" тогда
	Обработка = Обработки.СверткаБазыSQL.Создать();
	фм = Обработка.ПолучитьФорму("ФормаЗапуска");
	фм.Открыть();
	фм.ТипСервера_SQL = "MSSQLServer";
	фм.ИспользоватьПрямыеЗапросыSQL = Истина;
	фм.ИспользоватьПрямыеЗапросыSQLПриИзменении(0);
	фм.ИмяБД_SQL = "svertka_test";
	фм.ИмяСервера_SQL = "srv2012";
	фм.ИмяПользователя_SQL = "sa";
	фм.ПарольПользователя_SQL = "sapassword";
	фм.ДатаСверткиИБ = '20111231235959';
	фм.ИспользоватьБалкИнсерт = Истина;
	фм.ИмяФайлаЗагрузкиBULK = "C:\udalenie.txt";
	фм.ИмяФайлаВыгрузкиBULK = "C:\udalenie.txt";
	//фм.ВыводитьСообщенияЗамеровПриКонтролеЦелостностиИУдалении = Истина;
	фм.ДляНеудаляемыхПоказатьПричины = Ложь;
	//фм.ПоискПомеченныхПрямымиЗапросами = Истина; 
	//фм.МонопольныйРежим = Ложь; 
	фм.ПрочитатьНастройки("C:\свертка.ini");
	фм.КнопкаВыполнитьНажатие(0);

	ЗавершитьРаботуСистемы();
КонецЕсли;
...Показать Скрыть

Пример батника (.vbs) запуска свертки /RunModeOrdinaryApplication - для 8.2 - обычное приложение, без управляемых форм, для 8.1 убрать
LogPath = "/OutR:\log_svertki.txt -NoTruncate"
one1CPath = """%systemdrive%\Program Files (x86)\1cv82\common\1cestart.exe""" 
Paramters = "ENTERPRISE /Slocalhost\svertka_test /NИмя /PПароль /DisableStartupMessages /CСверткаБазы /RunModeOrdinaryApplication"
Set fs = CreateObject("Scripting.FileSystemObject")
Set WshShell = CreateObject("WScript.Shell")
WshShell.Run one1CPath & " " & Paramters& " " & LogPath& " ", 1, True
...Показать Скрыть
Пример батника (.vbs) для бэкапа
BackupPath = "/DumpIB С:\arc1c_.dt"
LogPath = "/OutC:\log_arc1c.txt -NoTruncate"
one1CPath = """%systemdrive%\Program Files (x86)\1cv82\common\1cestart.exe""" 
Paramters = "CONFIG /Slocalhost\svertka_test /NИмя /PПароль /DisableStartupMessages /RunModeOrdinaryApplication"
Set fs = CreateObject("Scripting.FileSystemObject")
Set WshShell = CreateObject("WScript.Shell")
WshShell.Run one1CPath & " " & Paramters& " " & LogPath & " " & BackupPath, 0, True
...Показать Скрыть
10. Arthur Pogosjan (shmpart) 23.06.12 15:52
Не получается сделать свертку. Вот что пишет.


{Форма.ФормаЗапуска.Форма(1081)}: Ошибка при вызове метода контекста (Записать)
НаборЗаписей.Записать();
по причине:

по причине:
Ошибка при выполнении обработчика - 'ПередЗаписью'
по причине:
{ОбщийМодуль.НастройкаПравДоступа.Модуль(278)}: Ошибка при получении значения атрибута контекста (ГраницыЗапретаИзмененияДанных)
НаборЗаписей.Записать();
по причине:
Попытка получения неинициализированного значения параметра сеанса

Документ сделал регистратором для всех регистров. Движения никакие не формировал конструктуром.
Как мне кажется, это из-за даты запрета изменения данных, она стоит 01.01.2010. Но каким боком оно там?
+ при попытке изменить её в бухе выскакивает сообщение

{ОбщаяФорма.УстановкаДатыЗапретаИзмененияДанных(67)}: Ошибка при вызове метода контекста (Записать)
Набор.Записать();
по причине:

по причине:
Ошибка при выполнении обработчика - 'ПередЗаписью'
по причине:
{ОбщийМодуль.ПроцедурыОбменаДаннымиПоОрганизации(1183)}: Ошибка при получении значения атрибута контекста (НаличиеОбменаДаннымиПоОрганизации)
Набор.Записать();
по причине:
Попытка получения неинициализированного значения параметра сеанса
11. Модератор раздела Артур Аюханов (artbear) 23.06.12 16:22
(0) Интересная обработка.
Вопрос: документ "Корректировка записей регистров" совпадает с типовым документом от 1С ? или все-таки отличается?
12. Модератор раздела Артур Аюханов (artbear) 23.06.12 16:22
Кто-нибудь, кроме автора, выполнял свертку через сабж?
13. Александр Тарасенков (tarasenkov) 23.06.12 16:53
(11) artbear, документ приложенный к обработке - основан на документе КоррекировкаЗаписейРегистровНакопления из типовой 2008 года (для Украины), в нем добавлен реквизит Счет - ПланСчетовСсылка, доработаны функция настройки перечня регистров, и функция заполнения закладок для поддержки и регистров сведений и регистров бухгалтерии, остальные функции убраны. Для работы обработки достаточно либо иметь/добавить реквизит Счет для документа "КорректировкаЗаписейРегистров" (если такой уже есть), или же убрать его заполнение из обработки (ищите в коде ".Счет = "). Реквизит счет был добавлен для последующего удобного просмотра и редактирования документа.

(12)(10) просьба, если кто-то пробовал сворачивать, делиться информацией, если не секрет, версия типовой конфигурации или на какой основана, размер базы в Гб до и после свертки, время свертки. Если не удалось, сообщите какие ошибки и если они не в обработке, и хотите, чтобы заработало, выложите или пришлите .CF файл конфигурации.

--
Для сравнения, сворачивал базу не типовую, с 20 гиг до 10 гиг за 40 минут со сжатием и переиндексацией, из них 5 минут ушло на удаление 280 тыс помеченных (из 296 тыс) с контролем целостности.
14. Александр Тарасенков (tarasenkov) 25.06.12 12:46
(11) upd: в документ "КорректировкаЗаписейРегистров" были добавлены также табличные части: ТаблицаРегистровСведений, ТаблицаРегистровБухгалтерии, они также нужны для работы обработки. Поэтому, если документ с таким именем уже есть, и вы не хотите его ломать, то в конфигурации желательно сделать отдельный вид документа для СверткиБазыSQL, для этого нужно переименовать документ "КорректировкаЗаписейРегистров" в прилагаемом к обработке .CF файле допустим в "КорректировкаЗаписейРегистровСверткаБазыSQL", после чего встраивать документ в вашу конфигурацию, а также найти и заменить "КорректировкаЗаписейРегистров" на "КорректировкаЗаписейРегистровСверткаБазыSQL" в модуле формы "ФормаЗапуска" обработки.
15. Модератор раздела Артур Аюханов (artbear) 25.06.12 15:52
(14) Из-за подобных сильных изменений в документе "КорректировкаЗаписейРегистров" предлагаю сразу поправить cf-файл и файл самой обработки на использование документа "КорректировкаЗаписейРегистровСверткаБазыSQL"
16. Андрей (ghostishe) 25.06.12 16:12
Не открывается вообще. Продублированы 1Сные процедуры 1-в-1 (что является нарушением лицензии 1С). (Проверял твою обработку на УПП 1.2) Автор, переименуй, пожалуйста, свои процедуры, чтобы они не пересекались с 1Сными из модулей типовых конфигураций.
P.S. По поводу лицензии, задавал этот вопрос в поддержку инфостарта когда-то. Хотел допилить регистрацию СФ на аванс в БУХ-ИИ и сделать ее внешней обработкой. Мне запретили. Пришлось создавать внешней подключаемой обработкой табличных частей.

Текст ошибки на всякий случай:
{Форма.ФормаЗапуска.Форма(1605,11)}: Процедура или функция с указанным именем уже определена (ПроверитьНомерДокумента)
Процедура <<?>>ПроверитьНомерДокумента(ДокументОбъект, НачальнаяДатаДокумента) Экспорт
17. Андрей (ghostishe) 25.06.12 16:25
Допилил проблему с пересечением процедур. Выскочила новая ошибка.


{Форма.ФормаЗапуска.Форма(1168)}: Ошибка при вызове метода контекста (ConnectAgent)
СоединениеСАгентомСервера = COMСоединитель.ConnectAgent(ИмяСервера1с);
по причине:
Произошла исключительная ситуация (V82.COMConnector.1): descr=Сервер недоступен (Не отвечает, завершается аварийно или порт занят другим приложением) line=557 file=Src\RemoteCreatorImpl.cpp


С сервером у нас все в порядке. 200 с лишним пользователей работают без проблем. СОМ-соединения с другими базами тоже четко отрабатываются. Я готов обработку протестировать для всех на базе в 140гиг. Готов выложить отчет, но, увы, она у меня даже не открывается. Автор, разберись, пожалуйста. Оценок пока ставить не могу (ни хороших, ни плохих), ибо не могу даже открыть.
18. Андрей (ghostishe) 25.06.12 16:49
Допилил. Открыл. Прописал параметры соединения. Запустил...

{Форма.ФормаЗапуска.Форма(5340)}: Ошибка при вызове метода контекста (НайтиПомеченныеНаУдаление)
масПомеченные = НайтиПомеченныеНаУдаление();
по причине:
У пользователя недостаточно прав на исполнение операции над базой данных.


Учетка SQL - админская, учетка 1С, под которой запущена обработка, - полные права. Пока автор не отпишется и не устранит чудеса, допиливать не буду больше. =)
Во избежание лишних предположений прикладываю скриншот проверки подключения (выскакивает окно Windows, о чем автору рекомендую упомянуть в инструкции)
Прикрепленные файлы:
19. Александр Тарасенков (tarasenkov) 25.06.12 17:38
(18) Непонятно работают ли личные сообщения. Продублирую тут. "НайтиПомеченныеНаУдаление" - стандартная процедура 1с-ная, могу только предположить, что к некоторым таблицам нет прав на чтение или нет каких-то административных прав. Попробуйте на закладке УдалениеПомеченных включить флаг "Поиск помеченных прямыми запросами" - тогда хотя бы прогресс будет выводить и споткнется именно на той таблице к которой недостаточно прав.
20. Александр Тарасенков (tarasenkov) 26.06.12 19:07
В последнем обновлении замечена ошибка - не активизированы документы ввода остатков по регистрам сведений. - скоро исправлю, а пока активизируйте вручную... (войти в документ ввода остатков нажать кнопку активизации движений)
21. Александр Тарасенков (tarasenkov) 29.06.12 16:14
Хочу сказать о некоторых ограничениях и особенностях обработки текущей версии (1.2.2 - 1.2.5):
1. Механизмы обмена и распределенные базы. - при использовании прямых запросов полноценная поддержка механизмов обмена не реализована.

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

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

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

Итог: при использовании механизмов обмена, информация об удалении, пометке на удаление данных не будет передана в другие узлы по планам обмена. Соответственно, если из другого узла пришлют данные об изменении какого-либо удаленного объекта возможно либо воссоздание объекта, либо возникновение коллизий.

2. Разделение данных с помощью общих реквизитов.
1) Независимо и совместно - чистка помеченных работает, свертка не работает.
2) Независимое разделение - чистка помеченных не работает, свертка не работает.

Соображения.
1) По логике можно свернуть только те данные, которые разделяются, а те которые используются совместно сворачиваться не должны. Хотя, если, к примеру, сворачивать данные по холдингу, то можно свернуть и совместно используемые данные.

2) Для каждого набора разделителей нужно создавать отдельные документы ввода остатков (при свертке данных разделенных совместно в множество наборов разделителей должны быть добавлены наборы с пустым совместным разделителем). И, возможно, некоторые наборы разделителей не должны сворачиваться, так как представляют из себя различные организации к примеру. Т.е. необходима возможность выбора наборов разделителей по которым необходимо сворачивать базу. И затем итеративно подставляя в параметры сеанса тот или иной набор проводить свертку, а при использовании прямых запросов придется добавить условия на поля разделителей.

3) При независимом разделении контроль удаления помеченных можно разрешить проводить, но только в том случае, когда из разделенных данных не может быть ссылок на неразделенные. Либо считать такие неразделенные объекты неудаляемыми. Как вариант для полного контроля можно переписать его на прямые запросы (сработает контроль сразу для всех разделителей), либо проверять наличие ссылок из разделенных данных на неразделенные для каждого набора разделителей.

3. Внешние источники данных и контроль удаления помеченных.
Внешние источники данных не могут содержать ссылок на объекты конфигурации. Но они, как и другие объекты конфигурации могут хранить уникальные идентификаторы на ссылки или другим способом хранить ссылки. Для таких случаев контроль целостности не работает, т.е. не видит этих ссылок, и для объектов на которые ссылаются нестандартным способом удаление не будет запрещено.

4. Поддерживаемые серверы баз данных.
Прямые запросы поддерживаются для MSSQL и PostgreSQL, при необходимости можно добавить поддержку прямых запросов и для других серверов. Есть ли такая необходимость?

new 2012-08-08
5. Стандартный контроль удаления помеченных после свертки лучше не использовать.
Если при свертке стоял запрет на свертку некоторых регистров, а на документы которые вносили движения в этот регистр запрет не стоял - то возникнет ситуация, что эти документы до даты свертки будут помечены на удаление, но у них будут движения.
- При стандартном контроле такие документы могут быть удалены, причем вместе с движениями!
Поэтому в дальнейшем либо используйте альтернативный контроль удаления помеченных, либо снимите пометку удаления с таких документов, чтобы стандарный контроль их не удалил, (* осторожно, при снятии пометки на удаление движения могут быть удалены, если это запрограммировано в вашей конфигурации).
22. maksim.s (Gandalf Белый) 30.06.12 16:26
Большое спасибо! Очень интересная и полезная обработка!
tarasenkov; +1 Ответить
23. constantin (Const885) 03.07.12 10:54
Попытался использовать вашу обработку на УТ 10.3.10.4 8.2.15.301 MSSQl
не метит документы на удаление, пишет :"ошибка получения числа записей для пометки на удаление документа" и вылетает очень быстро
24. Александр Тарасенков (tarasenkov) 03.07.12 12:29
(23) в одной из промежуточных версий была ошибка, но она вскоре была исправлена, проявлявшаяся как раз при пометке на удаление документов...

Попробуйте скачать последнюю версию (от 2012-06-27 17:30мск)
25. constantin (Const885) 03.07.12 14:15
скачано сегодня , вот полный текст
03.07.2012 16:13:34 - Обработка начата
адо команда: alter database [Trade1] set recovery simple;
адо запрос: SELECT offset from _YearOffset
адо команда: drop table #DoNotMarkDocs
адо команда: create table #DoNotMarkDocs (_IDTRef binary(4), _IDRRef binary(16))
адо команда:
insert into #DoNotMarkDocs with(tablockx, holdlock)
select distinct _RecorderTRef as _IDTRef, _RecorderRRef as _IDRRef from _InfoRg6585 with (nolock);
адо команда: create index DoNotMarkDocsInd ON #DoNotMarkDocs (_IDTRef, _IDRRef)
адо команда: update statistics #DoNotMarkDocs
адо запрос: select count(*) from _Document99 as tb1 with (nolock) left outer join (select _IDRRef from #DoNotMarkDocs with (nolock) where _IDTRef=0x00000063) as tb2 on tb1._IDRRef = tb2._IDRRef where (_Date_Time <= '4011-12-31 23:59:59') and tb2._IDRRef is null and _Marked = 0x00
ABCКлассификацияПокупателей (_Document99) ... ошибка получения числа записей для пометки на удаление документа...
адо запрос: select count(*) from _DocumentJournal6015 as tb1 with (nolock) left outer join (select _IDTRef, _IDRRef from #DoNotMarkDocs with (nolock) where 1=1 ) as tb2 on tb1._DocumentTRef = tb2._IDTRef and tb1._DocumentRRef = tb2._IDRRef where (_Date_Time <= '4011-12-31 23:59:59') and tb2._IDRRef is null and _Marked = 0x00
ДокументыКонтрагентов (_DocumentJournal6015) ... ошибка получения числа записей для пометки на удаление документа в журнале...
адо команда: drop table #DoNotMarkDocs;
03.07.2012 16:13:57 - Обработка завершена
26. constantin (Const885) 03.07.12 14:28
если убрать галочку прямых запросов , то метит на удаление , но до этого надо поставить эту галочку , чтобы появился пользователь и пароль , потом он их запоминает и метит, но только, как мне кажется, уже в не прямом запросе.
27. Илья (ПиН) 03.07.12 14:31
была такая на 7.7, один раз очень помогла на базе 20 гигов...
28. constantin (Const885) 03.07.12 17:50
колонки таблиц из Manadgment Studio
Прикрепленные файлы:
29. Александр Тарасенков (tarasenkov) 05.07.12 12:12
Можно не качать обновление 1.2.3 от 2012-07-05 11:30 мск, а добавить код в модуль Формы Запуска:
- в строку 4014 вставить:
	// Установка формата даты для соединения
	Если ИспользоватьПрямыеЗапросыSQL и адоСоединение <> Неопределено Тогда
		Если ТипСервера_SQL = "MSSQLServer" Тогда
			адоВыполнитьКоманду("set dateformat ymd");
		ИначеЕсли ТипСервера_SQL = "PostgreSQL" Тогда
			адоВыполнитьКоманду("set datestyle = 'ISO, YMD'");
		КонецЕсли;
	КонецЕсли;
...Показать Скрыть
30. Александр Тарасенков (tarasenkov) 09.07.12 11:55
Есть информация о том, что обновление 1.2.3 победило ошибку описанную в комментариях: (23), (25), (28)
31. Алексей Сальников (salex2002) 18.07.12 06:35
на файловой КА спотыкается на пометке на удаление документов - как отловить?
32. Алексей Сальников (salex2002) 18.07.12 06:37
И еще вопрос - по умолчанию свертка стоит на 31-12-11 23:59:59. Почему документы ввода остатков формируются 01-01-12 ?
33. Александр Тарасенков (tarasenkov) 18.07.12 13:04
(32) salex2002, таков алгоритм - сперва создаются документы остатков на 01.01.12 с неактивными движениями, затем производится удаление движений по конец дня 31.12.11 включительно, затем документы остатков переносятся в конец дня 31.12.11 и движения активизируются.

(31) ответил в личку
34. Николай (realm) 27.07.12 04:17
Судя по описанию - обработка очень и очень "юзабельна". Вот только из описания же следует один не очень приятный момент. Дело в том, что согласно лицензионному соглашению по использованию программ 1С предприятия, нельзя использовать недокументированные способы обращения к данным минуя механизм использования данных 1С (если нет прямой рекомендации обратного). Конечно, обходной манёвр в виде упоминания, что "(может использовать прямые запросы к MSSQL, PostgreSQL)" предполагает использование прямых запросов что называется на свой страх и риск. Однако, ведь тут собрались сторонники лицензионного ПО, не так ли? :) Так что будьте аккуратны.
35. Александр Тарасенков (tarasenkov) 27.07.12 11:27
(34) realm, К примеру, "альтернативный контроль удаления помеченных" не использует прямые запросы, и работает при большом количестве помеченных объектов многократно быстрее "стандартного контроля", можете его использовать не боясь нарушить лицензионное соглашение.

По поводу ограничения на использование недокументированных способов обращения к базе, якобы они могут повредить целостность и все такое, могу сказать, что и стандартными способами обращения к базе можно натворить дел, и следуя логике лицензионного соглашения в нем необходимо запретить также и документированные способы модификации данных в базе.

Еще хочу сказать, что 1с не без косяков и в документированных способах обращения к базе, из-за чего в обработке выполнен ряд костылей для обхода багов 1с.
36. Жека Moscow (SpartakM) 02.08.12 15:49
{Форма.ФормаЗапуска.Форма(1524)}: Ошибка при вызове метода контекста (Open)
RS.Open(Текст, Соединение);
по причине:
Произошла исключительная ситуация (Microsoft OLE DB Provider for SQL Server): Неправильный синтаксис около "=".
Ошибка во время исполнения..
как причину найти?
37. Александр Тарасенков (tarasenkov) 02.08.12 16:44
(36) SpartakM, на закладке "Описание" включите флаг "Выводить текст прямых запросов для отладки"
38. Жека Moscow (SpartakM) 02.08.12 16:58
39. Александр Тарасенков (tarasenkov) 02.08.12 18:28
40. Жека Moscow (SpartakM) 07.08.12 14:13
Супер обработка.
базу 120гб, свернула за 6-7ч.
Автору респект. Помог разобраться с некоторыми непонятными вопросами. Поддержка вообще на уровне.
Спасибо тебе огромное.
tarasenkov; +1 Ответить
41. www2007 (www2007) 28.10.12 09:54
Отличная разработка!
Сворачиваю комплексную 8.2,в файловом варианте, после свертки не проводятся документы в табличной части которых есть ссылка на счета бухгалтерского и налогового учета, так как они банально исчезли( счета из табличной части).
Регистры сведений , откуда берутся данные по умолчанию,остались без изменений, т.к. не периодические.
Новые документы значений по умолчанию не видят и автоматом не заполняются.
Если в курсе, в чем может быть причина, подскажите пожалуйста.

Еще выдает ошибку в процессе активизации ввода остатков:
{Форма.ФормаЗапуска.Форма(5642)}: Ошибка при вызове метода контекста (Записать)
ДокОбъект.Движения[ТекРегистрДвижений.Имя].Записать(Истина);
по причине:
Ошибка при выполнении обработчика - 'ПередЗаписью'
по причине:
{ОбщийМодуль.РаботаСОбщимиПеременнымиПовтИсп.Модуль(84)}: Ошибка при вызове метода контекста (Получить)
ДокОбъект.Движения[ТекРегистрДвижений.Имя].Записать(Истина);
по причине:
В данной транзакции уже происходили ошибки!

После повторного нажатия кнопки "Выполнить" продолжает работать.
42. Александр Тарасенков (tarasenkov) 06.11.12 17:40
Есть информация, о том, что в последнем обновлении от 2012-11-01 13:30 мск. Версия 1.2.6 внесены изменения в обработку свертки, которые позволили свернуть базу из комментария (41) без ошибок.
43. www2007 (www2007) 08.11.12 22:58
Замотался совсем, до комментариев добрался только сейчас.
Александр, огромное Вам спасибо за помощь и поддержку!
Все вопросы были решены с потрясающей оперативностью и положительным результатом.
Еще раз спасибо!!!
tarasenkov; +1 Ответить
44. Александр Омельянов (proger1c81) 10.11.12 01:01
Я тоже повторюсь и скажу, что обработка суперская. Мне помогла быстро свернуть базу в файловом режиме.
платформа - 8.1
конфа - УПП 1.2.15.4 типовая
пусть и старенькая версия, но суть не в этом.
У меня вопросы к разработчику остались открытыми:
1. Не могу понять для чего в свернутом регистре накопления ПартииТоваровНаСкладах переходящий остаток разбит на несколько строк со знаком "-" и со знаком "+" (вид движения Расход и Приход)?
2. Поле ДокументОприходования заполняется старым документом партии, который хотелось бы тоже удалить из базы.
3. Регистры накопления ПартииТоваровНаСкладах и ТоварыНаСкладах связаны между собой тесно. Не знаю как у моих юзеров (юзЗверей) получилось сделать так, что Конечные или Начальные остатки (количественные значение) по некоторым номенклатурам разнятся на граммы.

Предложение к разработчику: сделать так, чтобы в свернутом регистре накопления ПартииТоваровНаСкладах была только одна строчка с видом движения Приход для одной номенклатуры и склада, а поле ДокументОприходования была заполнен ссылкой на сам себя, т.е. документ "Ввод Остатков свертка базы SQL". И если это возможно, в окно сообщений выводить проблемные номенклатуры, у которых КонечныйОстаток по регистру ПартииТоваров не равен КонечномуОстатку из ТоваровНаСкладах и к примеру в автоматическом режиме записывал в Регистр ТоварыНаСкладах конечныйОстаток правильный из регистра ПартииТоваров.
45. Александр Тарасенков (tarasenkov) 12.11.12 14:09
(44) proger1c81,
Спасибо за отзыв!
1. Для всех регистров накопления, остаток разбит на приход и расход, если остаток не нулевой. Т.к. в некоторых случаях/конфигурациях требуются данные о приходах и расходах, а не только об остатке. Если подобных строк несколько значит отличаются измерения.
2. и 3. Цель обработки свернуть данные без потерь аналитики (данных в разрезе измерений). В данном случае могу порекомендовать написать отдельную обработку, которая бы очищала ссылки на "старые" документы партии, и/или перебивала их на новые документы "ввода остатков".

Проведение анализа корректности существующих данных в "конкретных" регистрах отдельных конфигураций также не входит в цель данной разработки, такой функционал не планируется.
46. Николай (realm) 10.01.13 07:07
Хелп. После пометки документов на удаление (движения уже отсутствовали) база стала дико тормозить при проведении документов. Явно тормоза происходят при работе с регистрами. Может ли кто-нибудь что-то подсказать? Полный пересчет итогов не помог.
47. Александр Тарасенков (tarasenkov) 10.01.13 11:39
(46) realm, либо выгрузите в DT, загрузите из DT, либо выполните переиндексацию встроенными средствами 1с или средствами обработки.
48. Николай (realm) 10.01.13 11:48
(47) tarasenkov, Спасибо за быстрый отклик
После танцев с бубном и с помощью добрых людей было установлено, что проблема оказалась в последовательностях. Они не подчищаются. Накопилось большое количество ссылок типа "объект не найден" и неактуальных (после свертки базы) данных в последовательности. При проведении документов, использующих последовательности, выполнялся какой-то дикий запрос к SQL с кучей соединений. Выполнение этого запроса и приводило к тому, что вместо проведения документа за несколько секунд, реально он проводился больше минуты. Соответственно вываливались блокировки и транзакции.
49. Александр Тарасенков (tarasenkov) 10.01.13 17:21
(48) realm, скажите, "Накопилось большое количество ссылок типа "объект не найден"" - после свертки или до нее?
Смотрю по коду обработки свертки - последовательности должны очищаться от удаляемых помеченных объектов.
Запускали ли Вы переиндексацию или выгрузку/загрузку после свертки?
// После массовых удалений необходимо запускать переиндексацию - иначе будут тормоза.
50. Александр Омельянов (proger1c81) 11.01.13 00:25
(48) realm,
кстати, с этим я тоже столкнулся... "проблема оказалась в последовательностях. Они не подчищаются. Накопилось большое количество ссылок типа "объект не найден" и неактуальных (после свертки базы) данных в последовательности." я решил эту проблему тоже с помощью стандартных проверок "Тестирование и исправление" и !!!обязательно!!! пересчет итогов!!! хотя итоги якобы были пересчитаны, но в инвентаризации полезли косяки. Повторюсь обработка классная. Предлагаю добавить в эту обработку еще инструкцию или предупреждение о подобных действиях обязательных, которые нужно выполнить после свертки базы. (для кого-то это возможно очевидно, а для кого-то не очень)
tarasenkov; +1 Ответить 1
51. Николай (realm) 11.01.13 11:18
(49) tarasenkov,
Сравнив таблицы в SQL, хранящие последовательности, ДО очистки движений документов и ПОСЛЕ, выяснилось, что при очистке последовательности не почистились.
Большое количество записей в последовательностях с "объект не найден" - это оказались пережитки прошлого. 160000 записей насобиралось.
Свертку базы делали в несколько этапов. Пометка документов на удаление была отложена на пару недель, после свертки итогов и очистки движений документов. Видимо так совпало, что база начала сильно тормозить после пометки документов на удаление. Просто количество косяков перевалило за критическую отметку и количество записей в таблицах последовательностей перевалило за 2 000 000.
Собственно, все ожило после удаления косячных ссылок и подчистке таблиц - последовательностей. Очистку таблиц последовательностей сделали непосредственно в SQL простым скриптом. За пару минут всё лишнее удалилось. Стандартными средствами 1С было бы больше суток.
Не смотря ни на что, обработка всё равно очень и очень помогла. Спасибо автору.
tarasenkov; +1 Ответить 1
52. Александр Тарасенков (tarasenkov) 11.01.13 12:27
(50) proger1c81, По поводу пересчета итогов - уточните пожалуйста по поводу косяков (можно в личку, лучше в почту).
// В ранних версиях обработки был включен пересчет итогов и при сворачивании прямыми запросами и при сворачивании без использования прямых запросов, затем для прямых запросов был найден способ обойтись без пересчета итогов, а позже был найден способ обойтись без пересчета и без использования прямых запросов. Не проблема включить код обработки по пересчету итогов, но пересчет весьма затратная по времени процедура, поэтому хотелось бы разобраться с косяками, чтобы её избежать.

(51) realm, Последовательности в обработке чистятся при удалении помеченных объектов, причем только от тех документов, которые удаляются (если документ помечен на удаление, но его удалить нельзя из-за ссылочной целостности - то из последовательностей он не будет удален). Вы так и не ответили, запускалась ли переиндексация.

Если у вас есть идеи о том, как сворачивать последовательности (возможно по аналогии с регистрами?) буду рад выслушать.
53. Александр Омельянов (proger1c81) 04.02.13 19:38
помогите, пожалуйста, разобраться.
Свернул данной обработкой на днях базу у клиентов, конфа УПП на SQL. Какая-то непонятная проблема появилась: Формирую анализ движения денежных средств или ведомость ден.средств (в принципе во всех отчетах эта проблема) и хочу вывести Дополнительное поле Комментарий в отчете для группировки Регистратор. Для пользователя с Полными правами это Дополнительное поле Комментарий выводится, а для других пользователей - не выводится :(
Глянул в базе до свертки - там для всех пользователей выводится в Отчете Дополнительное поле. Любые манипуляции, типа: тестирование и исправление (со всеми включенными галками), выгрузка и повторная загрузка, обновление индекса полнотекстового поиска не дали положительного результата.
Какие будут предположения? с таким я еще ни разу не сталкивался
54. Phoenix F (Lordemar) 04.02.13 23:35
Спасибо за обработку! Будем тестить, а то база пухнет, нужно уже готовится к свертке, то и гляди, получим указ сверху
55. Александр Тарасенков (tarasenkov) 05.02.13 17:48
(53) proger1c81, Поле "Комментарий" имеется у документа "ВводОстатковСверткаБазыSQL", при встраивании документа все права на этот документ даются только роли "ПолныеПрава". Документ "ВводОстатковСверткаБазыSQL" теперь является регистратором для всех регистров, в т.ч. для регистра "ДвижениеДенежныхСредств".

Как вариант можете попробовать дать на документ "ВводОстатковСверткаБазыSQL" для роли "Пользователь" все права кроме интерактивного удаления (такие права есть у "документа КорректировкаЗаписейРегистров"), но для начала я бы ограничился только правами на Чтение, Просмотр, ВводПоСтроке.
56. Александр Тарасенков (tarasenkov) 22.02.13 17:37
Рабочий пример запуска удаления помеченных по расписанию (из "Назначенные задания") с помощью батника (udalenie.vbs).

Предварительно Функцию ФормыЗапуска нужно сделать экспортной: ИспользоватьПрямыеЗапросыSQLПриИзменении(Элемент) Экспорт

Пример кода запуска обработки из процедуры ПриНачалеРаботыСистемы():
Если Лев(ПараметрЗапуска,2)="УД" Тогда
	// Альтернативное удаление помеченных
	Обработка = Обработки.СверткаБазыSQL.Создать();
	Обработка.ТолькоУдалениеПомеченных = Истина;
	фм = Обработка.ПолучитьФорму("ФормаЗапуска");
	фм.Открыть();

	фм.ТипСервера_SQL = "MSSQLServer";
	фм.ИспользоватьПрямыеЗапросыSQL = Истина;
	фм.ИспользоватьПрямыеЗапросыSQLПриИзменении(0);
	фм.ИмяБД_SQL = "svertka_test";
	фм.ИмяСервера_SQL = "server";
	фм.ИмяПользователя_SQL = "admin";
	фм.ПарольПользователя_SQL = "password";
	//фм.ИспользоватьБалкИнсерт = Истина;
	//фм.ИмяФайлаЗагрузкиBULK = "C:\udalenie.txt";
	//фм.ИмяФайлаВыгрузкиBULK = "C:\udalenie.txt";
	фм.ДляНеудаляемыхПоказатьПричины = Ложь;
	фм.ПоискПомеченныхПрямымиЗапросами = Истина; 
	//фм.МонопольныйРежим = Ложь; 

	фм.КнопкаВыполнитьНажатие(0);

	ЗавершитьРаботуСистемы();		
КонецЕсли;
...Показать Скрыть

Пример батника запуска удаления помеченных:
rem /RunModeOrdinaryApplication - для 8.2 - обычное приложение, без управляемых форм, для 8.1 убрать
LogPath = "/OutC:\log_udaleniya.txt -NoTruncate"
one1CPath = """%systemdrive%\Program Files (x86)\1cv82\common\1cestart.exe""" 
Paramters = "ENTERPRISE /Slocalhost\svertka_test /NИмяПользователя1с /PПарольПользователя1с /DisableStartupMessages /RunModeOrdinaryApplication /CУД"
Set fs = CreateObject("Scripting.FileSystemObject")
Set WshShell = CreateObject("WScript.Shell")
WshShell.Run one1CPath & " " & Paramters& " " & LogPath& " ", 1, True
...Показать Скрыть
57. Александр Тарасенков (tarasenkov) 22.02.13 20:00
Господа, хотелось бы обсудить варианты свертки распределенных баз.
Распределенные базы могут обмениваться данными как с помощью .xml пакетов, сформированных обработкой "УниверсальныйОбменДаннымиXML" по правилам созданным в конфигурации "Конвертация", либо же при помощи "ПлановОбмена".

Я вижу такие варианты:
Вариант 1.
Свертка прямыми запросами во всех узлах параллельно с обнулением регистрации изменений.
Если есть доступ ко всем узлам, то можно сделать следующим образом (на практике не проверялось!):
1. Приостановить доступ к базам.
2. Провести финальный обмен пакетами данных об изменениях.
3. Сделать резервные копии всех узлов (баз).
4. На каждом узле запустить быструю свертку прямыми запросами с очисткой регистрации изменений.
Если существует ограничение по времени - то усечение файлов баз, и, возможно, переиндексацию, можно отложить на другой день
[5. Сделать резервную копию после свертки на всякий случай]
6. Установить запрет на создание движений(проводок) в свернутом периоде во всех базах, кроме как документом ВводОстатковСверткаБазыSQL, кроме того этот вид документов не должен входить в планы обмена.
7. Разрешить пользователям работать с базами и включить обмен пакетами данных об изменениях.
8. Если 1с работает неадекватно - например резкие тормоза, то можно выгрузить загрузить базу, или в ручную найти в SQL базе испортившийся индекс и пересоздать его (бывает REBUILD не помогает и нужно делать DROP/CREATE), или все индексы пересоздать.

Для того, чтобы свертка проходила параллельно можно создать батники (или vbs скрипты) и поставить их в "Назначенные Задания".

Вариант 2.
Без использования прямых запросов - данные сворачиваются в главной базе, и затем при помощи регистрации изменений в планах обмена попадают в подчиненные узлы (справочники, документы, движения и т.д.).
Этот вариант значительно более затратен по времени, т.к. прямые запросы не используются, но есть и плюсы, если удаленных узлов большое количество - нет нужды на каждом узле проводить свертку, достаточно после свертки запустить обмен изменениями из главного узла к подчиненным.

--
Возможно существуют и другие варианты - например удаление прямыми запросами с записью в "регистрацию изменений" событий об удалении и последующей выгрузке "изменений" через планы обмена на подчиненные узлы (насколько такой вариант реален?).

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

Пожалуй стоит сверстать отдельную статью на эту тему.
58. Александр Тарасенков (tarasenkov) 06.03.13 19:00
С приcкорбием вынужден сообщить, что в версиях обработки СверткаБазыSQL, выпущенных, до 5 марта 2013 года обнаружена ошибка формирования документов ввода остатков, эта ошибка ведет в некоторых редких случаях к некорректным данным в документах ввода остатков.

Для того, чтобы проверить возникла ли ошибка на Ваших данных и получить рекомендации по исправлению данных и кода обработки СверткаБазыSQL, рекомендуется скачать специальную обработку по ссылке:
https://dl.dropbox.com/u/49134062/CheckDocsMadeBySvertkaBasySQL.zip

При возникновении технических вопросов, обращайтесь в личку/почту.
Прикрепленные файлы:
CheckDocsMadeBySvertkaBasySQL.zip
59. Николай (realm) 11.03.13 04:08
Приветствую.
Есть ещё один момент. По какой-то причине контроль ссылочной целости не всегда корректно работает. При выполнении удаления прямыми запросами с альтернативным контролем целостности у меня удалились элементы справочников, по которым есть остатки по бухгалтерским проводкам.
60. Александр Тарасенков (tarasenkov) 12.03.13 12:58
(59) realm, Спасибо за сообщение (и за подробное описание места возникновения ошибки в личке), ситуацию удалось воссоздать, а обработку исправить.

При альтернативном контроле целостности в некоторых случаях допускалось удаление помеченных объектов на которые имелись ссылки. Для исправления обработки СверткаБазыSQL требуется заменить в модуле формы процедуру "внОбработатьНепомеченные" на её исправленную версию: https://dl.dropbox.com/u/49134062/Procedure_ProcessNotMarked.zip
Прикрепленные файлы:
Procedure_ProcessNotMarked.zip
61. chernoff (chernoff) 12.03.13 16:59
(58) Пичалька. Делал свёртку 08 марта. Делал версией от 16/11/12. Т.е. у меня все шансы нарваться. После свёртки визуально сравнил остатки с базой сохраненной до свёртки. Все шло до копейки. Проблема осложняется тем, что после свёртки и проверки остатков я сделал ТиИ по полной (включил все галки). Как мне теперь понять попал ли я на те редкие случаи?
62. Александр Тарасенков (tarasenkov) 12.03.13 18:25
(61) chernoff,
1) для начала проверьте этой штукой остатки (сверяет по регистрам накопления с исходной базой): https://dl.dropbox.com/u/49134062/CheckDocsMadeBySvertkaBasySQL.zip

2) по удалению помеченных, понять коснулось ли Вас, можно так:
2.1) сделать копию обработки, внести в нее исправления (последних двух обновлений), при этом оставить и исходную версию.
2.2) поднять копию базы до свертки, свернуть её НЕисправленной версией обработки (но не делать удаление помеченных, сжатия и реиндексации).
2.3) запустить удаление помеченных БЕЗ удаления объектов, старой версией с сохранением в файл "oldver-candel.txt"
2.4) запустить удаление помеченных БЕЗ удаления объектов, новой версией с сохранением в файл "newver-candel.txt"
2.5) сравнить полученные файлы - если не отличаются значит ок, если отличаются значит удалилось лишнее.

3) Варианты исправления.
3.а) Как вариант с помощью конфигурации Конвертация можно создать правила обмена и попробовать выгрузить из исходной в свернутую эти удалившиеся объекты (сперва в тестовую копию).

Если ТИИ запускали с флагом "При наличии ссылок на несуществующие объекты"="Не изменять" или "Создавать объекты", то такая схема может пройти. Если = "Очищать ссылки" - то чревато потерей детализации.

3.б) Другой вариант, повторно свернуть исходную исправленной обработкой, и в неё выгрузить все данные, что были наработаны с момента свертки, при помощи тех же правил обмена конфигурации "Конвертация".

3.в) Разработать хитрую обработку, которая автоматически выполнит пункты 2.3), 2.4) сравнит какие объекты удалились неправильно, по ним определит какие объекты и откуда на них ссылаются в исходной, свернутой правильной обработкой базе, воссоздаст эти объекты в текущей базе и воссоздаст ссылки на эти объекты из других объектов в текущей базе. Это в планах, посмотрим, что получится...
63. Александр Тарасенков (tarasenkov) 12.03.13 19:03
(61) chernoff, вот варианты обработки, восстанавливающей битые ссылки из архива:
1) http://infostart.ru/public/92259/
2) http://infostart.ru/public/98973/
по идее должны исправлять ситуацию, если ТИИ запускали с флагом "При наличии ссылок на несуществующие объекты"="Не изменять". (пока не ясно восстанавливают ли объекты и движения, подчиненные удаленному).
64. Николай (realm) 13.03.13 05:52
(61) chernoff, Остатки у вас, скорее всего, должны быть верные. Некоторые элементы справочников могут оказаться "Объект не найден ...". Как вариант, лечится применением универсальной выгрузки в XML этих элементов справочников из "непорезанной базы" и загрузкой в "рабочую".
65. chernoff (chernoff) 13.03.13 10:12
Коллеги tarasenkov и realm, спасибо за помощь
В результате исследований обнаружилось что поплыл регистр Товары переданные (у меня УПП) в ситуации,
когда количество = 0, а сумма взаиморасчетов <> 0, как я понял.
Остатков немного - поправил в ручную
По удалению помеченных - меня это не коснулось.
Я после свёртки делал, как я уже говорил, ТиИ - никаких ошибок не было, да и визуально я ничего не вижу
В УПП ( но думаю, что и КА, а может еще где) есть проблема с регистром "Свободные остатки", т.к. в модуле набора регистров "Товары в резерве на складка", "Товары на складах", "Товары в рознице", "Товары к передаче со складов" ПередЗаписью вызывается ОбщегоНазначения.ВыполнитьДвиженияПоРегиструСвободныеОстатки()
Решил эту проблему добавив в указанную процедуру код
	Если ТипЗнч(Регистратор) = Тип("ДокументСсылка.ВводОстатковСверткаБазыSQL") Тогда
		// При изменении базовых регистров документом "Ввод остатков свертка базы SQL"
		// не выполняется автоматическое формирование движений по регистру
		Возврат;
	КонецЕсли; 
...Показать Скрыть


Автору отдельная благодарность - испытал удовольствие после свёртки от 1С
tarasenkov; +1 Ответить
66. Z Lu (validat) 30.03.13 23:56
Спасибо. Буду пробовать, но я только учусь, поэтому вопросов больше чем опыта и результатов.
67. Александр Тарасюк (Aletar) 05.04.13 05:43
Подскажите, пожалуйста, какие-то странности со сверткой бух. регистров. После свертки, оборотно-сальдовая ведомость операцию ввода остатков не разворачивает по субконто, + не работают отборы по субконто. Т.е. все суммы есть, но вот подробно не посмотреть. Более того, если из документа ввода остатков перейти в журнал проводок (Перейти->Журнал проводок) то там отбор по субконто тоже не будет работать, т.е. записи все есть, но вот если я сделаю отбор по субконто любой из этих записей, то отбор ничего не найдет. В консоли запросов тоже самое.

Исправляется только если убрать активность записей, пересчитать итоги бухгалтерских регистров и снова включить активность. Если активность не изменять, то эффекта нет.

Возможно ли это как-то исправить?
68. Александр Тарасенков (tarasenkov) 06.04.13 02:45
(67) Aletar, при свертке прямыми запросами таблицы регистров очищаются до заданной даты включая её, для каждого движения по регистру бухгалтерии 1с создает несколько записей в таблице субконто - для каждого выбранного субконто, а в таблице движений хранит ссылки на созданные записи в таблице субконто. При создании документов остатков с выключенной активностью 1с скорее всего создает записи субконто, а вот при активизации и переносе в предыдущий день прямыми запросами движения переносятся, а вот записи субконто не перенеслись, т.к. их перенос не был предусмотрен, скорее всего это и является причиной такой "странности".

Постараюсь что-то придумать, чтобы и они переносились. В принципе, на начало дня после даты свертки все должно разворачиваться нормально, но там только остатки.
69. Александр Тарасенков (tarasenkov) 08.04.13 00:21
(67) Aletar, решение следующее, правим код обработки как указано ниже и запускаем обработку еще раз, с теми же параметрами и той же датой, но запускаем только один этап - этап активизации остатков.

В модуле ФормыЗапуска, в функции ВыполнитьЭтап6(), в самом низу, перед кодом:
	КонецЕсли;

	Возврат Истина;
КонецФункции
...Показать Скрыть
вставляем код:
		// Таблицы Значений Субконто для регистра БухИтогов
		масТаблицыЗначенийСубконто = тзСтруктура.НайтиСтроки(Новый Структура("Назначение", "ЗначенияСубконто"));
		к = 0;
		квсего = масТаблицыЗначенийСубконто.Количество();
		Для каждого стрСтруктура из масТаблицыЗначенийСубконто Цикл
			ОбработкаПрерыванияПользователя();
			к = к + 1;
			
			// Периодичность = секунда
			стрПериодБыло = "("+ПолеПериод+" = '"+Формат(ДобавитьМесяц(ДатаСверткиИБ+1, СмещениеДат * 12), "ДФ='yyyy-MM-dd HH:mm:ss'")+"')";
			стрПериодСтало = ПолеПериод+" = '"+Формат(ДобавитьМесяц(ДатаСверткиИБ, СмещениеДат * 12), "ДФ='yyyy-MM-dd HH:mm:ss'")+"'";
			//
			
			// Поле типа регистратора может отсутствовать
			ПолеТипа = "";
			ПолеРегистратора = "";
			ПолеТипаРегистратора = "";
			Для каждого внПолеХранения из стрСтруктура.Поля Цикл
				Если Лев(внПолеХранения.ИмяПоляХранения, СтрДлина("_Recorder")) = "_Recorder" и Прав(внПолеХранения.ИмяПоляХранения, 4) = "RRef" Тогда
					ПолеРегистратора = внПолеХранения.ИмяПоляХранения;
				КонецЕсли;
				Если Лев(внПолеХранения.ИмяПоляХранения, СтрДлина("_Recorder")) = "_Recorder" и Прав(внПолеХранения.ИмяПоляХранения, 4) = "TRef" Тогда
					ПолеТипаРегистратора = внПолеХранения.ИмяПоляХранения;
				КонецЕсли;
				Если Лев(внПолеХранения.ИмяПоляХранения, СтрДлина("_Recorder")) = "_Recorder" и Прав(внПолеХранения.ИмяПоляХранения, 4) = "TYPE" Тогда
					ПолеТипа = внПолеХранения.ИмяПоляХранения;
				КонецЕсли;
			КонецЦикла;
			
			Состояние("Активизация остатков ["+к+"/"+квсего+"] "+стрСтруктура.Метаданные+" определение числа записей для активизации остатков (значения субконто)...");
			
			// -- Сколько нужно активизировать
			RS = адоВыполнитьЗапрос("select count(*) from "+стрСтруктура.ИмяТаблицыХранения+" "+стрНеБлокировать+" where "+стрПериодБыло+?(ПолеТипаРегистратора = "", "", " and "+ПолеТипаРегистратора+" = "+стрУсловиеНомерТаблицы));
			RS.MoveFirst();
			КвоЗаписей = RS.Fields(0).Value;
			
			Если КвоЗаписей = 0 Тогда
				Продолжить;
			КонецЕсли;	
			
			// Переносим ЗначенияСубконто в дату свертки
			внПрогрессСоздать(Макс(1, Цел(КвоЗаписей/удУдалятьКвоСтрокЗаОдинЗапрос)), "Активизация остатков ["+к+"/"+квсего+"] "+стрСтруктура.Метаданные+" активизируем остатки (значения субконто) (к-во: "+КвоЗаписей+"): ");
			ОбработаноЗаписей = 0;
			Пока (ОбработаноЗаписей < КвоЗаписей) Цикл
				внПрогресс();
				ОбработкаПрерыванияПользователя();
				адоСтартТранзакции();
				Попытка
					Если ТипСервера_SQL = "MSSQLServer" тогда
						адоВыполнитьКоманду("update top ("+Формат(удУдалятьКвоСтрокЗаОдинЗапрос, "ЧГ=")+") "+стрСтруктура.ИмяТаблицыХранения+" "+удИспользоватьТабличнуюБлокировку+" set "+стрПериодСтало+" where "+стрПериодБыло+?(ПолеТипаРегистратора = "", "", " and "+ПолеТипаРегистратора+" = "+стрУсловиеНомерТаблицы));
					ИначеЕсли ТипСервера_SQL = "PostgreSQL" тогда
						адоВыполнитьКоманду("begin work; "+СтрЗаменить(удИспользоватьТабличнуюБлокировку, "$1", стрСтруктура.ИмяТаблицыХранения)+" update "+стрСтруктура.ИмяТаблицыХранения+" as tb1 set "+стрПериодСтало+" from (select "+ПолеПериод+", "+ПолеТипаРегистратора+", "+ПолеРегистратора+", "+ПолеНомерСтроки+" from "+стрСтруктура.ИмяТаблицыХранения+" where "+стрПериодБыло+?(ПолеТипаРегистратора = "", "", " and "+ПолеТипаРегистратора+" = "+стрУсловиеНомерТаблицы)+" limit "+Формат(удУдалятьКвоСтрокЗаОдинЗапрос, "ЧГ=")+") as tb2 where tb1."+ПолеПериод+"=tb2."+ПолеПериод+" and tb1."+ПолеТипаРегистратора+"=tb2."+ПолеТипаРегистратора+" and tb1."+ПолеРегистратора+"=tb2."+ПолеРегистратора+" and tb1."+ПолеНомерСтроки+"=tb2."+ПолеНомерСтроки+"; commit work;");
					КонецЕсли;	
					ОбработаноЗаписей = Мин(ОбработаноЗаписей + удУдалятьКвоСтрокЗаОдинЗапрос, КвоЗаписей);
					адоФинишТранзакции();
				Исключение
					Успешно = Ложь;
					адоОтменаТранзакции();
					Сообщить(стрСтруктура.ИмяТаблицыХранения+" ... ошибка, активизировано (значений субконто) " + ОбработаноЗаписей + " из " + КвоЗаписей);
					ПоказатьИнформациюОбОшибке(ИнформацияОбОшибке());
					Прервать;
				КонецПопытки;	
			КонецЦикла;
		КонецЦикла;
...Показать Скрыть

*Т.к. ошибка возникает только при свертке прямыми запросами то и решение действует для свертки прямыми запросами.
70. Александр Тарасюк (Aletar) 08.04.13 05:20
72. Александр Тарасенков (tarasenkov) 18.10.13 13:56
(71) dyak84,
1) по поводу времени свертки:
40.
SpartakM
(файл скачал)
07.08.12 14:13

Супер обработка.
базу 120гб, свернула за 6-7ч.
Время свертки обозримое. А если база уж очень большая и время монопольного доступа ограничено, то процесс свертки можно разбить, сворачивая регистры по одному или нескольким за запуск.

2) В свертке нет привязки к какой-либо конфигурации, работает как с типовыми так и с самописными одинаково.

3) Для быстрой свертки базы Оракла нужно будет либо написать прямые запросы под Оракл в коде обработки, либо выгрузить из Оракла в MS SQL или Postgre SQL, свернуть, и затем залить обратно в Оракл. Иначе будет сворачивать медленно.
73. Lioneе (Lionee) 11.12.13 21:10
ок , как раз надо, пригодится , опробую
74. Олег Ортман (ortpro) 22.01.14 08:51
Здравствуйте!
Купил сию обработку.
Есть у кого-нибудь опыт сворачивания УПП?
Может кто-нибудь поделится рекомендациями/советами?
У меня:
Клиент-сервер
1С:Предприятие 8.2 (8.2.19.76)
Управление производственным предприятием, редакция 1.3 (1.3.39.1)
Объем базы ~700 Gb
Microsoft SQL 2008 Server Standard Edition (64-bit)
75. Ivan B (wolverine87) 10.08.14 06:27
Автору спасибо. Давно хотел что-то подобное. опробую на днях. +
76. Viktor Volchinskij (viva17) 24.11.14 13:29
Здравствуйте. Приобрел ваш обработку по свертыванию базы и по ней есть некоторые вопросы:
1) не помечается на удаление документ, по которому идет движение только по регистру сведений;
2) не удаляются помечены на удаление документы, при обработке вылетает ошибка недостаточно памяти. Процесс 1с на клиенте доходит до 1600 мб и выбрасывает. Сделав отбор по определенному виду документа, операция удаления проходит до конца, но не удаляются элементы, которые находятся в регистре "ОБъектыДоступаДокументов".
Подскажите пожалуйста, как правельно удалить помечены на удаление элементы конфигурации?
77. Клим (Ex) 27.11.14 11:16
А если ссылка, например на документ реализации, попадает в документ "Ввод остатков SQL", как этот документ удалиться?
78. Александр Тарасенков (tarasenkov) 27.11.14 12:56
(77) Ex,
Идея алгоритма контроля вкратце:
1) Если на помеченный объект ссылается не помеченный на удаление либо движение регистра, значит его нельзя удалить.
2) Если на помеченный объект ссылается помеченный, который нельзя удалить, значит его тоже нельзя удалить.
3) В остальных случаях помеченный объект подлежит удалению.

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

* По регистрам сведений немного отличается:
- считаем что запись помечена на удаление, если хотя бы одно ведущее измерение помечено на удаление
- считаем что запись не помечена на удаление, если нет ссылочных ведущих измерений, или ни одно ведущее не помечено на удаление
- неудаляемые равносильно непомеченным на удаление

** Исключение составляют удаление записей регистра сведений, подчиненных регистратору, которые будут удаляться при удалении ведущего измерения только при включенном флажке на вкладке "Удаление" или при удалении регистратора. Стандартный контроль целостности позволяет их удалять только при удалении регистратора.
79. Alex Phantom (alex_phantom) 03.12.14 12:15
Вот такое получил.
Форма.ФормаЗапуска.Форма(1520)}: Ошибка при вызове метода контекста (Open)
RS.Open(Текст, Соединение);
по причине:
Произошла исключительная ситуация (Microsoft OLE DB Provider for SQL Server): Неправильный синтаксис около конструкции "=".
80. Александр Тарасенков (tarasenkov) 04.12.14 13:31
(79) alex_phantom, сообщил, что ошибка разрешилась сама собой
81. Андрей Корнюхин (GATTUSO) 16.12.14 16:12
скажите, с объемными базами обработка нормально справляется? Порядка 300гб
82. Александр Тарасенков (tarasenkov) 16.12.14 19:12
(81) GATTUSO,
Если будет много помеченных объектов для контроля помеченных (несколько миллионов) - будет вылетать от нехватки памяти.
В таком случае свертку нужно выполнять в несколько этапов, например не 4 года за один раз сворачивать, а за один год (или меньше).
83. Стас Мат (Asaharu) 03.03.16 14:17
(80) tarasenkov, Тоже выскочила эта ошибка.
sel ect count(*) fr om _InfoRgOpt9225 as tbMain  with(nolock)  inner join #Udalenie as tbUdal  with(nolock)  on  tbMain.=tbUdal._IDRRef where tbUdal._IDTRef in (0x000020E0)


Где-то ПолеСсылка не заполнилась.

(82) tarasenkov, Там есть возможность делать выборку документов за опр. период. Тогда можно обойти нехватку памяти
 AND [_Date_Time] < CONVERT (datetime, '"+(ДобавитьМесяц(ДатаСвертки, 12*2000)+1)+"', 104

Чуть страдает производительность, но работает.
Для написания сообщения необходимо авторизоваться
Прикрепить файл
Дополнительные параметры ответа