1с регистр сведений версии объектов очистить
Данная обработка очищает регистр сведений "Версии объектов" по указанную дату. Очистка выполняется методом "кусочных" запросов на конкретную дату. Сделано так, ввиду того что за один день может быть по несколько тысяч записей. После очистки оставшиеся версии с большей датой можно просмотреть в обычном режиме. Минус в номерах версий. Предположим было 5 версий. 3 первых удалили . Тогда для анализа доступны версии с номером 4 и 5. В качестве примера: Размер архива .dt до чистки регистра 1,62 Gb после очистки информации за 4 месяца размер архива .dt стал 1,29 Gb.
Добавлена возможность прерывания по Ctrl+Break.
Специальные предложения
Народ столкнулся с этой проблемой.
Ситуация: в организации несколько лет работал механизм версионирования, год назад был отключен. Нужно полностью очистить регистр с Версиями объектов. В принципе проблем никаких пишем обработку удаляем записи регистра.
Вопрос: нужно ли удалить что-то еще кроме записей регистра? И не будет ли в дальнейшем каких либо проблем?
Тоже планируем сделать такую только удаление хотим сделать не на определенную дату, а в случае если версии за две даты ни чем не отличаются.
Такое часто бывает например перепровели документ не изменяя реквизитов.
Или зашли в элемент справочника, а когда выходили нажали не на кнопку закрыть а на кнопку ок.
Все это попадает в регистр(но таким записям там явно делать нечего, только размер базы пухнет).
мда. такие штатное 1С-ное версионирование дюже хромое
Если кому интересно, у уважаемого O-Planet есть собственная разработка вроде как достойного качества. Лог выгружает в отдельную базу.
Так собственно, на вопрос то никто не ответил.
Удалять то можно просто из регистра? Никаких косяков в районе целостности базы не будет? Обработку то писать 5 минут. У меня вопрос, не будет ли проблем потом?
(6). Периодически с определенным интервалом запускаю данную обработку на базе УПП. Проблем с целостностью базы не наблюдаю.
Спасибо:) Работает. Регистр почти в 5 миллионов записей удалось сократить на треть. В качестве пожелания разработчику: если бы еще бы можно было настраивать отборы (например документы за определенный месяц) чтобы была возможность запускать обработку частями - было бы вообще идеально. А то в том случае, когда количество обрабатываемых документов приближается к паре миллионов дело может затянуться:)
немного долго - если достаточно большой период для удаления, но все работает. Не хватает: при необходимости прервать работу обработки, Ctrl-Break не работает.
и относительно самого версионирования, к сожалению не нашел ни одного отчета, который позволяет сформировать статистику изменений не по одной позиции, а по определенному набору или хотя бы определенному справочнику используя этот механизм. Придется попробовать самому разобраться, хотя наверное не все тут так просто в использовании этого механизма, если до сих пор таких отчетов никто так и не сделал.
Вообще просто удалять неправильно.
Лучше создать отдельно базу с одним РС ВерсииОбъектов и перегружать туда данные.
Обработка вычищает все записи на хер, не оставляя последних. потом не с чем будет сравнивать измененную версию объекта.
Прошли реорганизацию, оставили по старой конторе базу. Использовал обработку, с 3 ГГ упало до 2 ГГ. Плюс.
Пришел к этой проблеме совсем с другой стороны, открыл для себя много нового что и вам поведаю.
Предыстория:
В один "прекрасный" день база перестала быть адекватной минув барьер 4 гб (не давала сохранять документы и т.д -вылет с ошибкой).
Сначала грешили на почту подключенную в 1с. Решили удалить переписку но база уже не давала -ее просто заклинило и выбивало с ошибкой даже при попытке что то удалить. Не знаю как но бухгалтер умудрилась все таки что то удалить после чего базу немного попустило и стало возможно удалить переписку, но объем уменьшился не на много. Я в это время на копии пытался шаманить -выгружал базу в файл загружал обратно, тестировал и реорганизовывал таблицы через конфигуратор -ничего не дало результат, объем был непоколебим. Уже было решили кинуться в крайность - перейти на sql вариант, все программисты так и советовали) но там свои заморочки и я решил разобраться в проблеме все таки. Покопал немного в сети и нашел программу просмотра таблиц базы, вместе с бухгалтером поняли что как раз таблица версий занимает эти предельные 4 гб на таблицу (для файловой 1с). Теперь пробую варианты уменьшить таблицу - один из них использовать штатную обработку 1с в УТП это "универсальный обмен данными в формате xml". там есть секция удаление данных, но нету возможности удалять по дате а только все данные и так как процесс ресурсоемкий то опять же вылет с ошибкой "нехватка памяти" (это уже ограничение самой ОС на 32 битные приложения) и снова надо шаманить уже над ОС чтобы перешагнуть этот барьер. Остается вариант написать самому что то или вашу обработку пробовать, вариант сделать свертку базы тоже бухгалтер не очень хочет так как не очень ей удобно пару баз иметь. Так что такие обработки из разряда стратегически важных потому что на весах сохранность всей базы, ведь проблема не только в ее объеме но и в дальнейшем функционировании и без вовремя сделанной копии восстановить работоспособность не просто (при пороге 4 гб свертка тоже не работает уже, база просто в нокдауне, хоть бери да ножом режь).
(g123) спасибо за столь развернутый комментарий. По своему опыту могу сказать, что когда возникает подобная проблема, то лучше все же перейти на SQL.
Я поглядел код этой обработки и что-то мне показалось не сильно оптимально читать данные из регистра, потом их записывать привязывая на пустую ссылку, чтобы потом отбором по ней грохнуть данные.
в общем запилил альтернативный код для кнопки выполнить
Уж лучше удалять со ссылками на объекты, помеченные на удаление, если они не нужны, и по одной версии остальных оставлять.
Недостаток обработки - что записи регистра сначала не удаляются, а:
1. записываются с Объект = Справочники.Номенклатура.ПустаяСсылка()
2. и только потом удаляются все записи с этой пустой ссылкой.
И если включено версионирование Номенклатуры, то при попытке записать элемент справочника Номенклатура пока не завершён п.2 - будет выдана ошибка записи.
Код 1C v 8.х
Создаем переменную НаборЗаписей как набор записей регистра сведений. Поскольку мы не прочитали данные из регистра – в этот момент это пустой набор записей.
Записываем новый набор записей (пустой) с замещением всех предыдущих записей (по умолчанию параметр Замещать метода Записать() имеет значение Истина).
Данную технологию можно применять только для регистров сведений с независимым режимом записи.
Похожие FAQ
Еще в этой же категории
Как изменить запись регистра сведений? 36
НаборЗаписей = РегистрыСведений.НумерацияДоговоров.СоздатьНаборЗаписей(); НаборЗаписей.Отбор.Период.Установить(НачалоГода(Дата)); НаборЗаписей.Отбор.Организация.Установить(Организация); НаборЗаписей.Прочитать(); Если НаборЗаписей.Количество Как добавить запись в периодический независимый регистр сведений? 16
// Добавление записей в периодический независимый регистр сведений НаборЗаписей = РегистрыСведений.КурсыВалют.СоздатьНаборЗаписей(); НаборЗаписей.Отбор.Валюта.Установить(ТекущаяВалюта); НаборЗаписей.Отбор.Период.Установить(ТекущаяДата); НовЗапис Как добавить записи в непериодический независимый регистр сведений? 13
НаборЗаписей = РегистрыСведений.ЗначенияСвойств.СоздатьНаборЗаписей(); НаборЗаписей.Отбор.Номенклатура.Установить(ТекущаяНоменклатура); НаборЗаписей.Отбор.Свойство.Установить(ТекущееСвойство); НоваяЗапись = НаборЗаписей.Добавить(); НоваяЗапи Как добавить записи в независимый регистр сведений? 11
Для добавления отдельной записи в регистр сведений, не подчиненный регистратору, можно использовать объект РегистрСведенийМенеджерЗаписи. имя . Например, для того, чтобы в независимый регистр сведений ЗначенияСвойствОбъектов с измерениями Объект, Открыть запись регистра сведений по ключу. 10
// Создание структуры значений СтруктураФормы = Новый Структура; СтруктураФормы.Вставить(" Пользователь" , Пользователь); СтруктураФормы.Вставить(" Настройка" , Элемент.ТекущаяСтрока); // Почему-то нужно создавать запись через массив (по друго Посмотреть все в категории Регистры сведений
Код 1C v 8.х
Сначала запросом получаем выборку всех документов, являющихся регистраторами для нужного регистра.
Далее создаем набор записей по данному регистру.
В цикле перебора выборки из результата запроса устанавливаем отборы для набора записей по нужным регистраторам и записываем пустые наборы записей в регистр с замещением старых наборов.
Код 1C v 8.х
Похожие FAQ
Еще в этой же категории
Как изменить запись регистра сведений? 36
НаборЗаписей = РегистрыСведений.НумерацияДоговоров.СоздатьНаборЗаписей(); НаборЗаписей.Отбор.Период.Установить(НачалоГода(Дата)); НаборЗаписей.Отбор.Организация.Установить(Организация); НаборЗаписей.Прочитать(); Если НаборЗаписей.Количество Как добавить запись в периодический независимый регистр сведений? 16
// Добавление записей в периодический независимый регистр сведений НаборЗаписей = РегистрыСведений.КурсыВалют.СоздатьНаборЗаписей(); НаборЗаписей.Отбор.Валюта.Установить(ТекущаяВалюта); НаборЗаписей.Отбор.Период.Установить(ТекущаяДата); НовЗапис Как добавить записи в непериодический независимый регистр сведений? 13
НаборЗаписей = РегистрыСведений.ЗначенияСвойств.СоздатьНаборЗаписей(); НаборЗаписей.Отбор.Номенклатура.Установить(ТекущаяНоменклатура); НаборЗаписей.Отбор.Свойство.Установить(ТекущееСвойство); НоваяЗапись = НаборЗаписей.Добавить(); НоваяЗапи Как добавить записи в независимый регистр сведений? 11
Для добавления отдельной записи в регистр сведений, не подчиненный регистратору, можно использовать объект РегистрСведенийМенеджерЗаписи. имя . Например, для того, чтобы в независимый регистр сведений ЗначенияСвойствОбъектов с измерениями Объект, Открыть запись регистра сведений по ключу. 10
// Создание структуры значений СтруктураФормы = Новый Структура; СтруктураФормы.Вставить(" Пользователь" , Пользователь); СтруктураФормы.Вставить(" Настройка" , Элемент.ТекущаяСтрока); // Почему-то нужно создавать запись через массив (по друго Посмотреть все в категории Регистры сведений
Переменная УдаляемаяОрганизация содержит соответствующую ссылку.
Тогда очистка регистра от удаляемых записей может быть произведена следующим образом:
Код 1C v 8.х
Создаем переменную НаборЗаписей, устанавливаем для нее отбор по значению организации равный УдаляемаяОрганизация. Кстати, отбор набора записей регистра всегда может устанавливаться только на равенство.
Далее записываем полученный пустой набор записей с замещением.
В результате все записи, соответствовавшие отбору, будут замещены пустым набором записей.
Похожие FAQ
Как заполнить табличную часть формы программно? 8
Нужно по кнопке Заполнить - сформировать данные для заполнения табличных частей и заполнить их. Форма имеет вид: Рядом с кнопкой Записать и закрыть добавлена кнопка Заполнить документ , код ее команды: // Код заполнения ТЧ НаСервере П 17 правил для составления оптимального ЗАПРОСа к данным базы 1С 44
Для формирования и выполнения запросов к таблицам базы данных в платформе 1С используется специальный объект языка программирования Запрос . Создается этот объект вызовом конструкции Новый Запрос . Запрос удобно использовать, когда требуется получ PostgreSQL: установка, настройка, обслуживание 11
PostgreSQL напрямую "из коробки" применяться для использования с 1С Предприятем не может. Необходима именно адаптированная версия от 1С, превращающая PostgreSQL в блокировочник, причем нужно понимать, что блокировки будут накладываться на всю таблиц Блокировка записей, невозможно изменить или удалить из регистра. Конфликт блокировок MS SQL + 1C 3
При попытке удалить запись из регистра сведений - получаю ошибку: она заблокирована, ошибка блокировок и т.д. Отключил всех пользователей, перезапустил сервер, пробую удалить - опять ошибка блокировки :( Путем тестов было вяснено, что проблема Ввод договоров ГПХ в ЗУП (счет 76) 9
Часто меня спрашивают: Как правильно отразить договор ГПХ в ЗУП? Ниже небольшая, последовательная инструкция: Прием на работу Сведения о физическом лице, выполняющем работы по договору подряда, должны быть внесены в справочник Сотрудники организ Посмотреть все результаты поиска похожих
Еще в этой же категории
Как изменить запись регистра сведений? 36
НаборЗаписей = РегистрыСведений.НумерацияДоговоров.СоздатьНаборЗаписей(); НаборЗаписей.Отбор.Период.Установить(НачалоГода(Дата)); НаборЗаписей.Отбор.Организация.Установить(Организация); НаборЗаписей.Прочитать(); Если НаборЗаписей.Количество Как добавить запись в периодический независимый регистр сведений? 16
// Добавление записей в периодический независимый регистр сведений НаборЗаписей = РегистрыСведений.КурсыВалют.СоздатьНаборЗаписей(); НаборЗаписей.Отбор.Валюта.Установить(ТекущаяВалюта); НаборЗаписей.Отбор.Период.Установить(ТекущаяДата); НовЗапис Как добавить записи в непериодический независимый регистр сведений? 13
НаборЗаписей = РегистрыСведений.ЗначенияСвойств.СоздатьНаборЗаписей(); НаборЗаписей.Отбор.Номенклатура.Установить(ТекущаяНоменклатура); НаборЗаписей.Отбор.Свойство.Установить(ТекущееСвойство); НоваяЗапись = НаборЗаписей.Добавить(); НоваяЗапи Открыть запись регистра сведений по ключу. 10
// Создание структуры значений СтруктураФормы = Новый Структура; СтруктураФормы.Вставить(" Пользователь" , Пользователь); СтруктураФормы.Вставить(" Настройка" , Элемент.ТекущаяСтрока); // Почему-то нужно создавать запись через массив (по друго Как выбрать записи из регистра сведений? 9
//ВНИМАНИЕ . // В качестве полей для отбора могут задаваться измерения или реквизиты, для которых // в конфигураторе признак индексирования установлен в значение " Индексировать" или // установлен признак " Ведущее" . Вид сравнения может бы Посмотреть все в категории Регистры сведений
У каждого была проблема «растущего» регистра "Версии объектов". Мы дорастили просто до чудовищных размеров(20 мил.) почистить обработкой очень трудоемко, плюс баз у нас много. Решили написать регламентное задание.
Чистит каждую ночь по 5 часов
Удаляет записи прошлых лет
Оставляет всегда 1 самую старую версию.
После отработки пишет в журнал регистрации информацию по проделанной работе.
Все входные параметры легко зашиваются на константы.
Проверено на УПП 107.2.1.3 платформа (8.3.8.1933).
После очистки рекомендую сделать сжатие базы.
Листинг регламентированного задания.
Помидорами не кидаемся.
Специальные предложения
Мне кажется так будет быстрее + время будет тратиться только на удаление существующих записей + можно получать данные для удаления порциями
Пока Выборка.Следующий() Цикл
Далее уже отборы и запись.
Есть ряд замечаний:
1. не понятно, вы хотите оставить самый первый или самый последний экземпляр? Удаляя все записи, кроме первой или последней, вы лишаете себя возможности видеть все изменения, вносимые пользователями. В результате прояснить: кто, когда изменил документ и что изменено не представляется возможным. ( в случает отличия с печатной формой).
2. Ежедневно выставляя параметр запроса "Период" как начало года, вы не уменьшаете объем данных регистра за текущий год.(т.е. весь текущий год регистр растет)- текущий год не обрабатывается. ( запускать обработку ежедневно не имеет смысла - только раз в году). Обработав первый раз регистр "Версии объектов" в 2018 году, набор данных за 2017 год и ранее мало изменится, т.к. вам навряд ли разрешат изменять данные закрытых периодов, а реквизит регистра ДатаВерсии будет = дате записи, внесения изменений или перепроведения - в любом случае>01.01.2018
Постановка задачи:
Оставляем самую свежую запись за 2017 год.Общая история хранится в бекапах.
При больших объемах регистра в 20 мил записей до 2017 г. удалять приходится порциями.
Закрытие периода не влияет на регистр "Версии объектов". Ночные задания проходят под правами администратора.
Все входные параметры(Период отбора, Количество оставляемых версия, Время работы) можно зашить на Константы в таком случае работа механизма будет гибкой.
у себя для очистки версий использую следующий принцип:
1) запросом выбираю объекты, которые не изменялись с какого-то момента времени (например с 01.01.18) - эти записи уже можно назвать условно постоянными и история по ним в рабочей базе не так важна.
обращаю внимание что определения переменных НЗ и ОТБОР вынесены за пределы цикла. 480 тысяч записей по 130 тысячам объектов были освобождены в течение 5-6 минут.
Читайте также: