Возможно ли обновить нетиповую БП 3.0 без удаления объектов и потери данных?

Программист 1С v8.3 (Управляемые формы) 1C:Бухгалтерия IT и автоматизация бизнеса
← На главную

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

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

---

Почему возникает ошибка «На удаляемый объект есть ссылки...»?

Проанализируем техническую суть проблемы. Автор темы столкнулся с ошибкой блокировки обновления при попытке объединения конфигураций:

На удаляемый объект Документ.ПоступлениеНаРасчетныйСчет.Реквизит.бит_ЭтоКомиссия есть ссылки в объектах основной конфигурации: Документ.ПоступлениеНаРасчетныйСчет.Форма.ФормаДокумента.Форма

Выясним причину этого поведения системы. Она кроется в двух ключевых факторах:

  1. Использование конфигурации на «двойной поддержке» (Dual Support). Префикс бит_ указывает на то, что в базе установлена доработка от стороннего поставщика (в данном случае — компании «Первый Бит»). Это означает, что конфигурация находится на поддержке сразу у двух вендоров: фирмы «1С» и отраслевого разработчика. Если вы пытаетесь обновить такую базу обычным файлом обновления (.cfu или .cf) от типовой «1С:Бухгалтерии», платформа не найдет в файле обновления реквизитов стороннего поставщика и пометит их «к удалению».
  2. Нарушение ссылочной целостности при обновлении. Платформа пытается удалить реквизит бит_ЭтоКомиссия, так как его нет в файле обновления от «1С». Однако этот реквизит выведен на форму документа, которая также участвует в обновлении или изменена вами. Платформа распознает, что удаление реквизита «сломает» форму, и блокирует процесс, чтобы защитить базу данных от критических ошибок компиляции.

---

Варианты решения проблемы

Рассмотрим подробно несколько стратегий обновления такой конфигурации, начиная от простых классических методов и заканчивая современными стандартами разработки 1С.

---

Вариант 1. Классическое обновление через правильные файлы и настройку правил объединения

Если вам необходимо быстро обновить конфигурацию «как есть», без глобального переписывания кода и переноса объектов, выполните следующие шаги:

  1. Используйте правильный файл обновления. Поскольку у вас используется БИТ-поставка, обычный файл обновления от типовой БП 3.0 не подойдет. Вам необходимо запросить файл обновления (или полный .cf файл) именно вашей версии отраслевого решения у компании-франчайзи. В этом файле разработчики уже объединили новые механизмы «1С» со своими объектами.
  2. Тщательно настройте окно сравнения и объединения. При выполнении обновления через меню Конфигурация -> Поддержка -> Обновить конфигурацию (или при ручном сравнении с файлом .cf):
    • В открывшемся окне сравнения и объединения снимите галочки с удаления ваших нетиповых реквизитов.
    • Обратите внимание на свойства измененных форм. Не выбирайте для них режим «Взять из конфигурации поставщика» вслепую. Используйте режим «Объединить с приоритетом основной конфигурации» или настройте ручное объединение модулей через контекстное меню.
    • В настройках окна сравнения установите фильтр «Показывать только дважды измененные свойства». Это позволит вам сфокусироваться только на тех объектах, которые изменили и вы (или БИТ), и фирма «1С» в новом релизе.

---

Вариант 2. Полный перенос доработок в Расширение конфигурации

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

Однако при переносе реквизитов в расширение есть критически важный нюанс: риск потери накопленных данных. Если вы просто удалите реквизит из основной конфигурации и создадите его в расширении, СУБД физически очистит старую колонку в таблице базы данных.

Разберем безопасный алгоритм переноса данных по шагам:

  1. Создание расширения и подготовка новых реквизитов:
    • Создайте новое расширение в базе данных.
    • Добавьте в расширение документ ПоступлениеНаРасчетныйСчет.
    • Создайте в расширении новый реквизит с временным именем, например, бит_ЭтоКомиссия_Перенос с тем же типом данных.
  2. Написание обработки для переноса данных:

    Напишите и запустите во внешней обработке простой код, который скопирует данные из старого реквизита основной конфигурации в новый реквизит расширения:

    
    ВыборкаДокументов = Документы.ПоступлениеНаРасчетныйСчет.Выбрать();
    Пока ВыборкаДокументов.Следующий() Цикл
        // Получаем объект для записи
        ДокументОбъект = ВыборкаДокументов.ПолучитьОбъект();
        
        // Копируем значение в реквизит расширения
        ДокументОбъект.бит_ЭтоКомиссия_Перенос = ДокументОбъект.бит_ЭтоКомиссия;
        
        // Записываем объект без проведения для ускорения процесса, 
        // но с отключением проверок при необходимости
        ДокументОбъект.ОбменДанными.Загрузка = Истина;
        ДокументОбъект.Записать();
    КонецЦикла;
    
  3. Удаление старого реквизита:
    • Убедитесь, что все данные успешно скопированы.
    • Удалите старый реквизит бит_ЭтоКомиссия из основной конфигурации.
    • Обновите конфигурацию базы данных (F7).
  4. Финальное переименование:
    • В расширении переименуйте реквизит бит_ЭтоКомиссия_Перенос обратно в его исходное имя бит_ЭтоКомиссия.
    • Платформа автоматически переименует колонку на уровне СУБД, сохранив все данные.

Важное предупреждение: Хранение важных данных в реквизитах расширений сопряжено с рисками. Если администратор базы данных случайно удалит расширение из списка или запустит процедуру «Тестирование и исправление» с включенной опцией «Очищать неиспользуемые таблицы и поля», данные будут безвозвратно утеряны. Для защиты расширения всегда настраивайте соответствующие права доступа и профили безопасности.

---

Вариант 3. Гибридный подход (Оптимальный для новичков)

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

Суть метода заключается в следующем:

Посмотрим на пример, как программно вывести наш реквизит бит_ЭтоКомиссия на типовую форму документа в расширении, вообще не меняя саму форму в конфигураторе:

  1. Добавьте форму документа ПоступлениеНаРасчетныйСчет в расширение (заимствуйте ее).
  2. Создайте в расширении обработчик события формы ПриСозданииНаСервере с аннотацией &После.
  3. Пропишите программный вывод элемента формы с помощью следующего кода:

&После("ПриСозданииНаСервере")
Процедура Расш_ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
    
    // Определим группу на форме, куда мы хотим поместить наш реквизит.
    // Например, в типовую группу шапки документа.
    РодительскийЭлемент = Элементы.ГруппаШапка; 
    
    // Проверим, чтобы элемент случайно не был создан дважды
    Если Элементы.Найти("ДекорацияКомиссия") = Неопределено Тогда
        
        // Добавляем новое поле ввода на форму программно
        НовоеПоле = Элементы.Добавить("ДекорацияКомиссия", Тип("ПолеФормы"), РодительскийЭлемент);
        НовоеПоле.Вид = ВидПоляФормы.ПолеВвода;
        
        // Связываем поле формы с реквизитом нашего объекта
        НовоеПоле.ПутьКДанным = "Объект.бит_ЭтоКомиссия";
        НовоеПоле.Заголовок = "Это комиссия (БИТ)";
        
    КонецЕсли;
    
КонецПроцедуры

При таком гибридном подходе основная форма документа в конфигурации остается абсолютно чистой и типовой. Когда фирма «1С» выпустит очередное обновление с изменением дизайна этой формы, оно установится без единого конфликта. А ваше расширение при запуске формы просто аккуратно добавит нужное поле ввода в интерфейс «на лету».

← На главную