Работа с хранилищем конфигурации 1С — это ежедневная рутина для многих команд разработчиков. Однако, помимо стандартных функций версионирования и совместной разработки, механизмы хранилища скрывают в себе интересные нюансы поведения, которые можно использовать для решения нетривиальных задач. В этой статье мы подробно разберем вопрос отмены захвата объектов после наката обновления, а также рассмотрим, как этот механизм превращается в мощный инструмент для администрирования базы данных.
В процессе коллективной разработки часто возникает ситуация, когда конфигурация была захвачена полностью (или частично), на нее были накатаны изменения (например, новый релиз поставщика), но по каким-то причинам эти изменения нужно откатить. Автор темы задается вопросом: что произойдет, если конфигурация была захвачена, обновлена новым релизом, а потом мы отменим захват всех объектов?
Второй аспект обсуждения, выросший из первого вопроса, касается производительности. Как быть, если нужно очистить регистр сведений, содержащий сотни миллионов записей? Стандартные методы удаления могут занимать сутки. Мы проанализируем, как механика хранилища помогает решить эту задачу за несколько минут.
Для начала ответим на прямой вопрос. Рассмотрим ситуацию по шагам:
Результат: Конфигурация вернется в состояние, которое зафиксировано в хранилище последней версией. Локальные изменения будут потеряны. Объекты, как метко замечено в обсуждении, «подгрузятся из хранилища, как будто изменений не было».
Однако здесь есть критически важный нюанс, касающийся структуры базы данных (SQL или файловой).
Если после обновления конфигурации (шаг 2) вы успели нажать F7 (Обновить конфигурацию базы данных), то структура таблиц в базе данных уже изменилась. Если после этого вы отмените захват (шаг 4), то конфигурация вернется к старому состоянию, но база данных останется в новом. При следующем нажатии F7 платформа потребует реструктуризации обратно — к старому состоянию. Если изменений в структуре данных (добавление полей, индексов) не было, это пройдет быстро. Если были — потребуется время.
Наибольший интерес в данной теме представляет метод быстрой очистки таблиц, предложенный участниками обсуждения. Представим, что у вас есть регистр сведений (или документ, или справочник) с миллионами записей. Вам нужно полностью очистить его.
Традиционный подход программиста выглядит так:
НаборЗаписей = РегистрыСведений.НашОгромныйРегистр.СоздатьНаборЗаписей();
НаборЗаписей.Записать(); // Записываем пустой набор без отборов
Почему это плохо для больших объемов?
При выполнении этого кода платформа 1С выполняет на уровне СУБД (например, MS SQL Server) команду DELETE. Это транзакционная операция. Каждая удаляемая строка записывается в журнал транзакций (Transaction Log). Если строк миллионы:
Out of memory или таймаута.Участники форума предлагают элегантное решение, использующее механику реструктуризации. Давайте разберем этот алгоритм пошагово. Этот метод эмулирует команду SQL TRUNCATE TABLE или пару DROP TABLE + CREATE TABLE, которые выполняются почти мгновенно.
Порядок действий:
DROP TABLE. Таблица удаляется физически вместе со всеми данными. Это происходит мгновенно и почти не пишет данных в журнал транзакций (только факт удаления метаданных).CREATE TABLE. Создается новая, абсолютно чистая таблица.Итог: Мы получили пустой регистр за 5-10 минут (время уходит только на реструктуризацию и принятие изменений), вместо 10 часов удаления записей.
В обсуждении возник справедливый вопрос: зачем использовать хранилище, если можно просто удалить объект и создать такой же новый вручную? Давайте проанализируем разницу.
Каждый объект метаданных в 1С (Справочник, Регистр, Реквизит) имеет уникальный внутренний идентификатор (GUID). Он хранится во внутренних файлах конфигурации и используется для связей внутри системы.
Если вы удалите объект и создадите новый с таким же именем:
<Объект не найден>).Преимущество метода с хранилищем (или метода с CF, описанного ниже):
При отмене захвата объект восстанавливается из хранилища с тем же самым GUID. Для платформы это "тот же самый" объект. Все ссылки в коде, ролях и типах данных сохраняются корректно. История версий (если ведется параллельно в Git) не прерывается.
Если у вас нет развернутого хранилища конфигурации, но задачу быстрой очистки нужно решить, можно использовать аналогичный подход с выгрузкой конфигурации (Message 7).
Алгоритм действий без хранилища:
backup.cf).backup.cf.Несмотря на эффективность метода DROP/CREATE, мы должны помнить об ограничениях, накладываемых платформой 1С на удаление объектов.
Вы не сможете применить обновление (пункт 3 в алгоритме), если на удаляемый объект есть жесткие ссылки, которые препятствуют реструктуризации. Например:
В таких случаях платформа при попытке обновления БД выдаст ошибку: "Объект не может быть удален, так как на него есть ссылки...". Тогда этот метод использовать нельзя, либо придется временно удалять и ссылающиеся объекты, что значительно усложняет процесс и повышает риски.
1. Отмена захвата после обновления конфигурации безопасна и возвращает метаданные к состоянию, зафиксированному в хранилище. Это рабочий способ отката неудачных экспериментов.
2. Очистка таблиц через удаление метаданных, обновление БД и последующее восстановление объекта (через хранилище или CF) — это мощный прием для администраторов и ведущих разработчиков. Он заменяет долгие часы работы DELETE на мгновенный DROP/CREATE, но требует внимательности и понимания того, как работают идентификаторы метаданных (GUID).