Очистить таблицу sql 1c

Обновлено: 07.07.2024

В данной статье будет рассмотрена методика удаления данных запросом в MSSQL-студии.

Отказ от ответственности

Проверяйте, пожалуйста, текст скрипта перед выполнением. Понимайте, что делаете. Помните, что ответственность лежит целиком на Вас!

С особой внимательностью рекомендую проверять скрипт перед выполнением, если в Вашей базе есть случаи, когда период записей регистров отличается от даты регистратора.

Основная цель применения

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

Предыстория

Проблема: свертка стандартными средствами происходила неприлично долго. Точней, именно этап удаления старых данных. Остатки вводятся быстро, а вот удаление движений регистров, пометка на удаление документов, само удаление - по нашим оценкам на наших объёмах (500ГБ) заняло бы недели.

Решение: удалить данные средствами SQL, чтоб миновать механизмы платформы 1С, ненужные при данной операции, но отнимающие драгоценное (в рамках данной задачи) время.

Препятствия: Данные в SQL хранятся в разных таблицах. Таблиц много, как их связать - не всегда понятно. То есть мало очистить сам документ (шапку), надо очистить также данные табличных частей, и движений документа. Движения по разным регистрам. Для одного документа регистров может быть много. Каждый регистр в свою очередь хранит данные также в нескольких таблицах. Наименования таблиц - неосмысленные.

Теория

Варианты (операторы) удаления в SQL.

  1. DROP - полное удаление таблицы из структуры данных (вместе с данными). То есть очищаются не только данные, но и метаданные. Работает мгновенно.
  2. TRUNCATE - полная очистка таблицы с сохранением структуры таблицы (очищаются только строки таблицы, колонки остаются прежними). Работает мгновенно.
  3. DELETE - удаление записей в таблице по определенному условию. Занимает определенное время.

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

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

В итоге была выбрана и реализована следующая стратегия

  1. Удаляем движения регистров, которые двигает нужный вид документа, по связке с основной таблицей документа
  2. Удаляем строки табличных частей документа, по связке с основной таблицей документа
  3. Удаляем основную таблицу документа
  4. Очищаем целиком таблицы журналов, где участвует документ (нехорошо, но в нашем случае - не критично, можно и не трогать)
  5. Опционально можно очистить таблицы регистрации изменений для обмена

Таблиц много + названия неудобные + конструктора запросов нет = очень много рутины с высокой вероятностью ошибки и дороговизной ошибок. Поэтому был создан инструмент, берущий большую часть рутины на себя.

Устаревшая стратегия (альтернатива)

Первое решение, от которого я впоследствии отказался. Хотя вначале оно казалось более удобным и простым. А именно - очистить шапку. А потом все связанные таблицы поочередно, у кого нет "пары" в основной таблице (ссылка/регистратор = "битая" ссылка).

Данный вариант не работает для движений документа. Так как после удаления основной таблицы документа - IS NULL даёт истину после соединения таблицы движений регистра и основной таблицы документа в 2х случаях

  1. Когда действительно записи сделаны этим видом документа, и эти документы были удалены (тут всё хорошо)
  2. Когда записи были сделаны документами других видов, и в этом случае записи удаляются ошибочно (так нельзя!). Чтоб решить эту проблему надо связывать таблицу регистра со всеми возможными типами регистраторов, а это слишком сложно

Вобщем порядок был такой (отличия в пунктах 2 и 3)

  1. Удаляем записи регистров, которые двигает нужный вид документа, по связке с основной таблицей документа
  2. Удаляем основную таблицу документа
  3. Удаляем записи табличных частей документа, у которых Ссылка после соединения = IS NULL
  4. Остальное (как в основном варианте, журналы и регистрация изменений)

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

Особенности

  1. Доступна опция порционного удаления.
  2. На данный момент, обработка существует только для обычного приложения.
  3. Обработка сама не подключается в SQL и не запускает скрипт там на выполнение. Только формирует текст скрипта. Считаю, что скопировать-вставить нетрудно, а если нет навыков работы в SQL-студии, то и запускать подобное, возможно, рано.
  4. Исходный код открыт.

Порядок действий

При желании протестировать/посмотреть "что именно будет удаляться" предусмотрена соответствующая опция (галочка справа внизу), в этом случае скрипты будут формироваться с оператором SELECT, а не DELETE. Можно выделить нужный кусок, запустить на исполнение, посмотреть результаты, прежде чем запускать на удаление.

Эта статья для тех, кто хоть раз сталкивался с необходимостью очистить базу 1С , за период с устаревшими данными. Речь пойдет об удалении данных в ненужном периоде напрямую, средствами SQL -сервера. Также следует уточнить, что речь идет о конфигурациях, использующих компоненту «Оперативный учет». На бухгалтерских и расчетных базах данный метод не тестировался.

Для начала рассмотрим, как происходит резка периода. На определенную дату, чаще всего не конец года, скажем « 31.12.2003 », вычисляются конечные остатки по всем регистрам. Далее, на начало года, на « 01.01.2004 », вводятся эти остатки документами ввода начальных остатков. При этом в новом году в документах не должно быть ссылок на документы прошлого года – так называемых документов, введенных на основании, иначе удаление средствами 1С не сможет удалить документы, на которые есть ссылки. Также следует уделить внимания периодическим реквизитам, введенных документами, так как в момент отмены проведения документа эти периодические реквизиты перестанут существовать. Чтобы не было казусов, все периодические реквизиты, устанавливаемые документами нужно перед удалением выставить заново с начала года.

Теперь рассмотрим, как обычно происходит очистка базы средствами 1С . Запускается какая-то обработка проведения, которая помечает на удаление все документы. Это достаточно длительный процесс, так как при проведении каждого из документов 1С :Предприятие очищает все движения документов, в том числе периодические реквизиты, введенные документом. Это достаточно длительный процесс с учетом большого количества документов. Далее через пункт меню «Операции -> Удаление помеченных объектов» выполняется окончательное удаление.

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

Альтернативный вариант очистки базы 1С – воспользоваться имеющимися в нашем распоряжении средствами MS-SQL . Из вышеуказанной последовательности мы можем ускорить последние два пункта, а именно пометку на удаление и окончательное удаление документов.

Что требуется сделать? Просто запустить скрипт, например из SQL Query Analizer ’а. Текст скрипта представлен ниже:

Сначала из таблицы журналов документов выбираются в отдельную временную таблицу все идентификаторы документов с датой меньше заданной. Теперь о том, что делает этот скрипт. Он проходится по метаданным и удаляет из всех таблиц, где есть колонка IDDOC или DOCID , строки с идентификатором документа, входящим в таблицу удаляемых. Таким образом чистятся таблицы документов, регистров и периодических реквизитов.

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

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

Теперь о производительности. Я проверил оба варианта очистки базы 1С - удаление в 1С методом выбора всех документов и удаления их без контроля ссылочной целостности, и удаление путем выполнения данного скрипта. В базе данных содержалась информация за период с « 01.09.2001 » по « 15.06.2004 ». Удалялся период по 2003 год включительно. Конфигурация самописная, но в данном случае, думаю, это никакого значения не имеет. Данные сравнения указаны в таблице:

Как видно по результатам сравнения, удаление средствами MS-SQL фактически ровно в 10 раз быстрее. Это соотношение действительно с учетом того, что для обоих вариантов будет запущен полный пересчет итогов из конфигуратора. Хотя в случае с 1C его выполнять желательно, но не обязательно (почему - читайте здесь и здесь), а в случае с MS-SQL - обязательно. Так что, если вы не будете выполнять пересчет итогов в случае удаления в 1С , то для полноценного сравнения времени работы нужно к времени работы скрипта ( 5:39 ), добавить время пересчета итогов в конфигураторе ( 2:00 ).


Бывают нередко случаи, когда ваши базы данных хранятся на SQL-сервере и необходимо подготовить одну из баз определенным образом, очистив не нужные данные из нее. И тут на помощь придет данная обработка. С ее помощью вы сможете:

1) Удалить документы:

- Удалить все документы из базы, либо интересующий вас вид документов.

- Удалить документы за определенный период

- Удалить документы по Организации

2) Удалить справочники

3) Удалить регистры сведений

4) Удалить регистры накопления, регистры бухгалтерии, регистры расчета.

5) Очистить последовательность документов, бизнес-процессы, задачи

Обновление (03.04.2012)

Добавлено удаление по определенному документу. Вид документа можно выбирать, либо из списка документов, либо, если отмечено все, то самим выбирать вид документа при выборе.

Обновление (28.11.2012)

Добавлена версия для платформы 1С 8.1

Обновление (13.12.2012)

Добавлены дополнения к объектам метаданных выводимых на форме, а именно:

- Добавлено наименование таблицы в терминах СУБД (имя таблицы в SQL-сервере)

- Добавлен размер занимаемый таблицей в SQL-сервере

Обновление (23.10.2013)

- Добавлено удаление элементов справочников с отбором по реквизитам удаляемого справочника

- Добавлено удаление записей регистров накопления за период

- Исправлены некоторые ошибки при работе

Обновление (18.11.2013)

- Добавлено удаление документов "Только помеченные на удаление", т.е. удаление документов с признаком ПометкаУдаления = ИСТИНА

Обновление (09.02.2015)

- Добавлена возможность "Не ограничивать время ожидания выполнения команды SQL", понадобится тем, у кого большие объемы данных хранятся в регистрах и при попытке их удалить приходит ответ от сервера SQL ". время ожидания истекло . "

Обновление (27.05.2016)

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

Обновление (06.06.2016)

- Исправлена ошибка с удалением справочников.

- Добавлена возможность предварительно проверить соединение с SQL не выполняя каких-либо удалений.

- Исправлены мелкие недочеты.

Обновление (15.09.2016)

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

- Исправлены ошибки с запросом размеров таблиц SQL по регистрам сведений, накопления, бухгалтерии.

- Исправлены мелкие недочеты.

Обновление (16.09.2016)

- Добавлено удаление табличных частей справочников при удалении элементов справочников.

Обновление (07.02.2017)

- Добавлена обработка для управляемых форм ( также для режима такси).

- Механизм отборов реализован через средства СКД

Ограничения в версии для управляемых форм:

- На данный момент работает лишь удаление с произвольным отбором документов и справочников.

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

Обновление (16.03.2017)

- Исправлена ошибка: при выборе всех регистров сведений они не очищались сразу.

Обновление (28.03.2017)

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

Обновление (30.03.2017)

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

Обновление (10.08.2017)

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

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

В статье мы расскажем, как в MySQL очистить таблицу. Мы покажем два способа и объясним разницу между ними.

Очистить таблицу можно при помощи одной из команд:

Разница между TRUNCATE и DELETE

Команда TRUNCATE является оператором DDL. DDL (Data Definition Language) — это язык определения данных. Операторы языка DDL управляют объектами баз данных: удаляют, создают или переименовывают объекты БД.

Пример команды TRUNCATE

Команда DELETE является DML-оператором. DML (Data Manipulation Language) — это язык манипуляции данными. Операторы языка DML позволяют вставить, удалить, изменить, извлечь или обновить данные в базе.

Пример команды DELETE

Сравним работу команд:

TRUNCATEDELETE
Удаляет все данные из таблицыМожет удалить часть данных в соответствии с условием WHERE
Удаляет все строки из таблицы освобождением страницУдаляет строки по одной
Записывает в журнал транзакций сведения о каждой удалённой странице, а не строкеДелает запись в журнал транзакций при удалении каждой строки
Работает быстрееРаботает медленнее
Нужны привилегии ALTERНужны привилегии DELETE
Сбрасывает идентификаторыНе сбрасывает идентификаторы
Блокирует таблицу и страницу перед удалениемБлокирует строку перед её удалением

Выбор команды зависит от конкретного случая. Если нужно удалить некоторые строки по условию, подойдёт только DELETE. Если нужно полностью очистить таблицу и сбросить идентификаторы, используйте TRUNCATE.

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

DDLDML
CREATESELECT
ALTERINSERT
DROPUPDATE
TRUNCATEDELETE
COMMENTMERGE
RENAMECALL
EXPLAIN PLAN
LOCK TABLE

Таким образом, операторы DDL управляют структурой, а операторы DML — её содержимым.

Как в MySQL очистить таблицу

Подключитесь к серверу по SSH. Затем подключитесь к MySQL при помощи команды:

Вместо username введите имя пользователя, вместо password — пароль.

Если вы не знаете пароль, попробуйте войти без него при помощи команды:

Если подключение без пароля не настроено, возникнет ошибка:

Ошибка при подключении к серверу MySQL

В этом случае сбросьте пароль от root-пользователя MySQL по инструкции.

TRUNCATE

TRUNCATE полностью очищает таблицу без возможности указать дополнительные условия. Для этого:

Выберите базу данных, в которой находится таблица, которую вы хотите очистить:

Вместо db_name введите имя базы данных.

Очистите таблицу при помощи команды:

TRUNCATE позволяет указать название БД и название таблицы в одном запросе. Для этого используйте команду:

Вместо db_name введите имя базы данных, а вместо table_name введите имя таблицы.

Готово, вы очистили таблицу.

DELETE

Выберите базу данных, в которой находится таблица, которую вы хотите очистить:

Вместо db_name введите имя базы данных.

Очистите таблицу при помощи команды:

Вы можете указать название БД и таблицы в одном запросе:

Вместо db_name введите имя базы данных, а вместо table_name введите имя таблицы.

Готово, вы очистили таблицу при помощи DELETE.

DELETE позволяет использовать условие WHERE, чтобы удалить некоторые строки из таблицы:

DELETE FROM table_name WHERE condition;

Где condition — это условие.

Пример команды, в котором будут удалены все строки, значение столбца, id которых больше 1000:

DELETE FROM table_name WHERE id > 1000;

Как проверить содержимое таблицы

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

Вместо db_name введите имя базы данных, а вместо table_name введите имя таблицы.

Читайте также: