В процессе обновления нетиповых или доработанных конфигураций разработчики нередко сталкиваются с ситуацией, когда платформа блокирует сохранение конфигурации базы данных из-за нового регистра сведений. В структуре метаданных появляется регистр с режимом записи Подчинение регистратору, но в списке его регистраторов нет ни одного документа. Платформа «1С:Предприятие» не позволяет применить такие изменения структуры данных.
Попытка обойти ошибку переключением режима записи регистра в значение Независимый приводит к еще более серьезным проблемам. При таком переключении физически удаляются стандартные реквизиты Регистратор и НомерСтроки, в результате чего при проверке конфигурации падает весь исходный код: модули проведения, запросы и обработчики наборов записей, обращающиеся к регистратору. Разберем архитектурные особенности этой проблемы и рассмотрим по шагам, как выявить нужные документы и корректно восстановить связи метаданных.
Проанализируем механизм связывания метаданных в платформе 1С. В дереве метаданных у регистра сведений вкладка Регистраторы доступна только для чтения: разработчик не может вручную отметить нужные документы непосредственно в свойствах регистра. Привязка настраивается исключительно на стороне документа — в ветке свойств Движения.
Сбой возникает при выполнении процедуры «Сравнить, объединить с конфигурацией из файла» или обновлении через поддержку. Если новый регистр был отмечен к объединению, а типовые документы, формирующие движения, ранее были доработаны и исключены из обновления (или для них был установлен запрет на перезапись свойств), их ветка Движения не обновляется. В результате регистр сведений переносится в основную конфигурацию, а флажки в документах не выставляются, оставляя подчиненный регистр без единого источника записей.
Самый надежный и быстрый способ узнать полный состав регистраторов — обратиться к эталонной конфигурации поставщика, откуда пришел новый регистр. Разберем возможные варианты работы с файлами поставки:
Конфигурация — Поддержка — Настройка поддержки. В открывшемся окне нажмем кнопку Включить возможность изменения (если она еще не включена) или нажмем Сравнить, чтобы сопоставить текущую конфигурацию с конфигурацией поставщика. В окне сравнения раскроем нужный регистр сведений: вкладка регистраторов покажет весь исходный состав документов..cf, его не требуется загружать в отдельную базу. Достаточно в меню Конфигуратора выбрать Файл — Открыть, выбрать файл .cf и открыть его как конфигурацию из файла. Раскрыв дерево метаданных открытого файла, перейдем к регистру и посмотрим заполненный список регистраторов..cfu содержит только дельту (разницу) между версиями и не может быть открыт напрямую. В такой ситуации развернем пустую информационную базу, загрузим в нее конфигурацию поставщика предыдущей версии, штатно применим обновление через меню поддержки и уже из полученной конфигурации извлечем нужные связи.Если у нас есть доступ к демонстрационной базе нужного релиза или к конфигурации поставщика, мы можем получить полный список документов программно. Для этого выполним короткий фрагмент кода во внешней обработке или в консоли кода:
Для Каждого Регистратор Из Метаданные.РегистрыСведений.ЛМБ_ПерезаложенныеБилеты.Регистраторы Цикл
Сообщить(Регистратор.Имя);
КонецЦикла;
Коллекция Метаданные.РегистрыСведений.[ИмяРегистра].Регистраторы возвращает массив объектов описания метаданных документов, назначенных регистраторами в данной конфигурации. Этот способ полностью исключает человеческий фактор и позволяет мгновенно сформировать точный список для переноса.
Если под рукой нет эталонной базы, выясним регистраторы по текстам модулей. Формирование движений по подчиненным регистрам в подавляющем большинстве случаев происходит в процедуре ОбработкаПроведения модуля документа через коллекцию Движения.
Выполним следующие шаги:
Ctrl + Shift + F для вызова диалога Глобальный поиск.Движения.ЛМБ_ПерезаложенныеБилеты (где вместо имени примера подставим имя проблемного регистра).КорректировкаЗаписейРегистров или КорректировкаРегистров), который в большинстве типовых конфигураций выступает регистратором практически для всех подчиненных регистров.После того как список документов-регистраторов определен, выполним правильное объединение свойств, чтобы не затереть сделанные ранее пользовательские доработки:
Конфигурация — Сравнить, объединить с конфигурацией из файла.F5.Соблюдение этой последовательности действий гарантирует корректную структуру базы данных и сохраняет работоспособность прикладного кода при обновлении нетиповых конфигураций.