Часто в процессе эксплуатации системы 1С возникает ситуация, когда конфигурация была снята с поддержки для добавления новых справочников или документов. Со временем становится понятно, что поддерживать такую базу сложно: каждое обновление требует ручного сравнения и объединения. В этой статье мы разберем, как правильно перенести доработки в расширение, чтобы вернуть основную конфигурацию «на замок».
Прежде чем приступать к техническим действиям, проанализируем ситуацию. Нам необходимо перенести не только структуру метаданных (поля, типы, формы), но и накопленные в базе данные. Основная сложность заключается в сохранении ссылочной целостности. Если мы просто создадим новый справочник в расширении и удалим старый в основной конфигурации, все ссылки в документах, регистрах и других объектах превратятся в «Объект не найден», так как у новых записей будут другие UUID (Уникальные Идентификаторы).
Рассмотрим самый простой способ копирования структуры. Платформа позволяет использовать стандартные команды буфера обмена. Проделаем следующие действия:
Справочник.ДополнительнаяИнформация).Важный совет: Рекомендуем сразу использовать префиксы для имен объектов в расширении (например, Прф_ДополнительнаяИнформация). Это исключит конфликты имен, если в будущем фирма «1С» добавит объект с таким же именем в типовую конфигурацию.
Выясним, как не потерять данные. Создание объекта «с единичкой» в конце имени и последующее копирование — рабочий, но трудоемкий путь. Проанализируем более профессиональный алгоритм с использованием обработки «Выгрузка и загрузка данных XML»:
УстановитьСсылкуНового() при программном переносе или использование режима «Загружать объекты с их идентификаторами» в типовых обработках.Если вы решили писать свою обработку для переноса, пример кода для сохранения UUID будет выглядеть так:
// Пример программного создания элемента в расширении с сохранением ГУИД
СтараяСсылка = Справочники.СтарыйСправочник.НайтиПоКоду("001");
НовыйЭлемент = Справочники.Прф_НовыйСправочник.СоздатьЭлемент();
НовыйЭлемент.УстановитьСсылкуНового(Справочники.Прф_НовыйСправочник.ПолучитьСсылку(СтараяСсылка.УникальныйИдентификатор()));
// Заполнение реквизитов
НовыйЭлемент.Наименование = СтараяСсылка.Наименование;
// ...
НовыйЭлемент.Записать();
Разберем ситуацию с ролью «Особые полные права». Автор темы столкнулся с проблемой: как в расширении сделать роль, которая разрешает всё, кроме удаления? Здесь кроется важная особенность платформы: права в расширении аддитивны.
Проанализируем это правило: если в основной конфигурации у пользователя есть роль ПолныеПрава, которая разрешает удаление, то добавление любой роли в расширении не сможет запретить это действие. Расширение может только «добавить» права, но не «отобрать» их.
Рассмотрим правильный алгоритм работы с ролями в данной ситуации:
Прф_ПолныеПраваБезУдаления).ПолныеПрава и включить вашу роль из расширения. Только так ограничение на удаление вступит в силу.Существует мнение, что хранение объектов в расширении замедляет систему из-за «лишних таблиц». Проясним ситуацию с точки зрения СУБД:
Номенклатуру), платформа создаст дополнительную таблицу. При каждом запросе к номенклатуре система будет делать LEFT JOIN к таблице расширения. Это может незначительно влиять на скорость при работе с миллионами записей, но для большинства задач это несущественно.После того как данные перенесены, а роли настроены, выполните финальные действия:
Теперь ваша конфигурация снова стала типовой, что позволит обновлять её в автоматическом режиме, а все ваши уникальные доработки будут надежно изолированы в расширении.