Часто при настройке распределенной информационной базы (РИБ) разработчики и администраторы сталкиваются с неприятной ситуацией: процесс создания начального образа прерывается спустя некоторое время, и система выдает лаконичную ошибку: Не удалось создать начальный образ по причине: запись не верна. При этом стандартное тестирование и исправление базы (ТиИ) может не приносить никаких результатов. Разберем эту проблему подробно, выясним причину сбоя и рассмотрим несколько надежных способов обойти эту ошибку.
Проанализируем природу этой ошибки. Данное сообщение генерируется платформой 1С на уровне работы с базой данных (СУБД). Оно означает, что при попытке физически записать конкретный объект в новую подчиненную базу нарушаются строгие ограничения структуры данных. Чаще всего проблема кроется в регистрах сведений или регистрах накопления.
Рассмотрим основные причины, почему выгружаемые данные отвергаются:
Прежде чем принимать радикальные меры, выясним, какой именно объект не может перенести платформа. Для этого воспользуемся двумя проверенными инструментами.
Использование Журнала регистрации (ЖР)
В момент падения процесса откроем Журнал регистрации главной базы (или логируемые события подчиненной, если они успели сформироваться в файле). Платформа обязательно фиксирует там детальное описание сбоя. Мы увидим запись примерно такого содержания: Запись не верна! Значение поля "Организация" не может быть пустым: (Регистр сведений: ...). Это сразу укажет нам на таблицу, которую нужно почистить в главной базе.
Использование отладчика
Запустим создание начального образа в режиме отладки с включенной функцией «Остановка по ошибке». Отладчик прервет выполнение кода ровно на том объекте данных, который система пытается записать. Изучив значения переменных в табло, мы поймем, какая запись вызывает сбой.
Если диагностика показала, что проблема кроется в объектах, добавленных через расширения, применим следующий метод:
Иногда базе много лет, в ней накопились терабайты данных, а подчиненный узел создается для узкой задачи (например, чтобы кладовщики на складах вбивали только новые поступления). Переносить старые данные бессмысленно, а штатный механизм падает или зависает. Рассмотрим по шагам метод создания узла вручную из пустого файла конфигурации (CF):
ЭтотУзел (код нашей новой подчиненной базы) и создадим узел, который будет соответствовать главной базе.
// Устанавливаем главный узел для нашей подчиненной базы
УзелГлавнойБазы = ПланыОбмена.МойПланОбмена.НайтиПоКоду("ЦБ");
ПланыОбмена.УстановитьГлавныйУзел(УзелГлавнойБазы);
Если подчиненных узлов планируется несколько, просто копируем полученную пустую базу-шаблон, заходим в нее, и вручную меняем код узла ЭтотУзел и префикс базы на нужные.
Если же нам необходимо передать в подчиненный узел абсолютно все старые данные, но штатный механизм упорно выдает ошибку «Запись не верна», применим классический метод обхода — создание РИБ через физическое копирование.
Этот способ работает в разы быстрее, так как полностью игнорирует пообъектную запись и копирует структуру СУБД целиком:
1Cv8.1CD), если база файловая, или бекап/рестор средствами СУБД (SQL).
// Отвязываем базу
ПланыОбмена.УстановитьГлавныйУзел(Неопределено);
ЭтотУзел и поменяем его код на код нашей будущей подчиненной базы. Узел, который ранее был ЭтотУзел (Центр), оставим обычным узлом плана обмена.
УзелЦентра = ПланыОбмена.МойПланОбмена.НайтиПоКоду("ЦБ");
ПланыОбмена.УстановитьГлавныйУзел(УзелЦентра);
Подведем итог: Ошибка при формировании начального образа — это сигнал о наличии структурных проблем в данных или о несовместимости расширений. Проанализируем Журнал регистрации, чтобы найти корень проблемы. Если очистка данных нецелесообразна или невозможна, используем альтернативные пути: ручную настройку пустой базы (если исторические данные не нужны) или физическое копирование файла (если нужны все данные).