Работа с хранилищем конфигурации в «1С:Предприятие 8» — это неотъемлемая часть коллективной разработки. Однако многие программисты сталкиваются с досадной ситуацией: при попытке удалить, казалось бы, совершенно изолированный объект (например, отчет или справочник), система выдает длинный список ролей, которые необходимо захватить. Самое странное в этой ситуации то, что эти роли зачастую никак не связаны с удаляемым объектом. Рассмотрим подробнее, почему так происходит, и разберем эффективные методы борьбы с этим явлением.
Для начала проанализируем ситуацию с технической точки зрения. Метаданные в 1С, особенно в контексте ролей, не являются плоским списком независимых записей. В файловом представлении (и внутри базы данных хранилища) роль — это сложная XML-структура. Когда мы удаляем любой объект метаданных, платформа должна гарантировать целостность всей конфигурации. Это означает, что упоминание удаляемого объекта должно быть вычищено из всех структур, где он мог фигурировать даже потенциально.
Выясним причину, по которой «чистые» роли попадают в список на захват. Даже если вы не настраивали права для конкретного отчета в конкретной роли, в её XML-структуре может существовать запись об этом объекте или его уникальном идентификаторе (GUID). При удалении объекта 1С инициирует процедуру обновления индексов прав и пересчета контрольных сумм. В результате объект Роль помечается как измененный (состояние «dirty»), и платформа блокирует выполнение операции до тех пор, пока вы не захватите этот объект в хранилище.
Существует несколько скрытых механизмов, которые заставляют систему требовать захвата ролей. Рассмотрим их по порядку:
Справочник в роли не задано, система может хранить записи о правах на его стандартные реквизиты или специфические данные, которые подлежат очистке при удалении основного объекта.Если вы столкнулись с необходимостью захвата десятков ролей, не стоит захватывать каждую вручную через дерево метаданных. Рассмотрим наиболее эффективные алгоритмы действий.
Вместо того чтобы искать роли в дереве конфигурации, воспользуйтесь специализированным интерфейсом. Перейдите в меню: Конфигурация — Хранилище конфигурации — Хранилище. В открывшемся окне можно быстро выделить нужный список объектов и произвести групповой захват. Это сэкономит массу времени, сократив процедуру до нескольких секунд.
Иногда требования системы обусловлены «замусоренностью» самой базы хранилища (файла 1cv8ddb.1cd). Логические несоответствия в таблицах ссылок приводят к фантомным зависимостям. Попробуем выполнить очистку и пересчет индексов хранилища. Для этого необходимо запустить конфигуратор из командной строки с параметром /ConfigurationStorageVerify.
Пример команды для запуска проверки (выполняется на сервере или локально, где доступна база хранилища):
"C:\Program Files\1cv8\common\1cestart.exe" DESIGNER /F "ПутьКВашейБазе" /ConfigurationStorage /ConfigurationStorageVerify
После выполнения этой операции многие ложные зависимости обычно исчезают.
Часто информация о том, что роль якобы изменена, берется из локального кэша разработчика. Перед выполнением критических операций по удалению объектов рекомендуется очистить папки Config и ConfigSave в профиле пользователя. Это заставит систему заново пересчитать дерево зависимостей на основе актуальных данных из хранилища.
Для крупных проектов с большим количеством взаимосвязей (например, при удалении ресурсов из часто используемых регистров сведений) наиболее надежным способом является временный захват корня конфигурации и всех ролей сразу. Попытки «точечного» удаления часто приводят к тому, что транзакция помещения в хранилище (Commit) откатывается в последний момент из-за вновь обнаруженной зависимости.
Алгоритм действий следующий:
Посмотрим на пример из практики: при удалении ресурсов регистра сведений иногда помогает предварительная очистка этих ресурсов в самой конфигурации. Сначала удалите содержимое ресурса (или сам ресурс без удаления объекта), сохранитесь, а уже вторым шагом удаляйте сам регистр. Это помогает платформе более корректно отработать связи в ролях.
Подводя итог, можно сказать, что избыточный захват ролей — это следствие архитектуры хранения метаданных в 1С. Понимание механизмов XML-сериализации и использование инструментов обслуживания хранилища позволяют значительно минимизировать неудобства при рефакторинге конфигурации.