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