Переход со старой редакции «1С:Бухгалтерия предприятия 2.0» на современную «1С:Бухгалтерия предприятия 3.0» — это сложный процесс, сопровождающийся масштабной реструктуризацией данных. Одной из наиболее частых и неприятных проблем, с которой сталкиваются специалисты при обновлении, является критический сбой при выполнении дополнительных процедур обработки данных. Система аварийно завершает работу, выдавая ошибку в модуле интеграции КИ:
{ОбщийМодуль.УправлениеКонтактнойИнформацией.Модуль(4407)}: Поле объекта не обнаружено (CountryCode)
КодСтраны = Телефон.CountryCode;
В этой статье мы подробно разберем, почему возникает данная ошибка, проанализируем внутренние механизмы платформы и предложим четыре практических способа ее решения.
Для того чтобы понять природу этой ошибки, нам необходимо рассмотреть, как именно хранится контактная информация в разных редакциях «1С:Бухгалтерии»:
КонтактнаяИнформация. Поля часто представляли собой простые текстовые строки, не имеющие строгой структуры.Контрагенты, ФизическиеЛица, Организации). Для хранения используется сложная структура в формате XML или JSON, которая детально описывает каждый элемент контактной информации (код страны, код города, номер, добавочный номер и т.д.).При первом запуске базы после обновления конфигурации срабатывает специальный отложенный обработчик обновления. Он считывает старые записи из временных таблиц регистра сведений и пытается преобразовать их в структурированный JSON-формат. Для этого вызывается парсер БСП.
Если в исходной базе БП 2.0 пользователи или внешние обмены (например, из «Управление торговлей 10.3») занесли в поле телефона некорректные данные — произвольный текст, примечания (например, «Виталий кладовщик», «бухгалтерия, звонить после 14:00») или нечитаемые символы, то парсер не может распознать эту строку как телефонный номер. В результате создается пустая или поврежденная структура, у которой отсутствует свойство CountryCode (Код страны). Попытка программы обратиться к этому свойству напрямую в строке КодСтраны = Телефон.CountryCode; приводит к аварийному завершению работы обработчика обновления.
---
Самый надежный и корректный способ решить проблему — исправить исходные данные в базе редакции 2.0 до начала процедуры обновления. Это позволит избежать «мусора» в новой базе и гарантирует успешный переход.
Разберем по шагам, как локализовать и устранить сбойные записи:
КонтактнаяИнформация.Тип со значением Телефон.Для автоматизации этого процесса мы можем написать простую обработку или выполнить следующий код в консоли кода (или временно добавив его в любую кнопку внешней обработки):
Выборка = РегистрыСведений.КонтактнаяИнформация.Выбрать();
КоличествоПроблемных = 0;
Пока Выборка.Следующий() Цикл
Если Выборка.Тип = Перечисления.ТипыКонтактнойИнформации.Телефон Тогда
ПредставлениеТелефона = Выборка.Представление;
СодержитБуквы = Ложь;
// Проверяем строку на наличие буквенных символов
Для Индекс = 1 По СтрДлина(ПредставлениеТелефона) Цикл
Символ = Сред(ПредставлениеТелефона, Индекс, 1);
Если Найти("абвгдеёжзийклмнопрстуфхцчшщъыьэюяabcdefghijklmnopqrstuvwxyz", НРег(Символ)) > 0 Тогда
СодержитБуквы = Истина;
Прервать;
КонецЕсли;
КонецЦикла;
Если СодержитБуквы Тогда
КоличествоПроблемных = КоличествоПроблемных + 1;
Сообщить("Проблемная запись у объекта: " + СокрЛП(Выборка.Объект)
+ " (Тип: " + Выборка.Вид + "). Значение: '" + ПредставлениеТелефона + "'");
EndIf;
КонецЕсли;
КонецЦикла;
Сообщить("Всего найдено проблемных номеров: " + КоличествоПроблемных);
После запуска этого скрипта мы получим список всех объектов (контрагентов, физических лиц), у которых контактная информация заполнена некорректно. Нам остается лишь открыть эти объекты в БП 2.0 и очистить либо исправить номера телефонов, удалив из них текстовые примечания. После очистки данных можно повторно запускать обновление на редакцию 3.0 — оно пройдет без ошибок.
---
Если база данных уже находится в процессе обновления на редакцию 3.0, и возвращаться к резервной копии БП 2.0 крайне нежелательно, мы можем временно модифицировать код общего модуля, чтобы программа игнорировала проблемные записи.
Рассмотрим, как правильно применить это решение:
УправлениеКонтактнойИнформацией и перейдем к строке 4407 (или воспользуемся глобальным поиском по строке .CountryCode).
КодСтраны = Телефон.CountryCode;
Попытка...Исключение. Изменим этот фрагмент кода следующим образом:
Попытка
КодСтраны = Телефон.CountryCode;
Исключение
КодСтраны = "";
КонецПопытки;
---
Если ваша конфигурация находится на строгой поддержке и вы не хотите включать возможность изменения («снимать с поддержки») ради исправления одной ошибки, мы можем применить механизм расширений. Это более современный и безопасный способ программирования в среде 1С.
Проанализируем алгоритм создания расширения:
УправлениеКонтактнойИнформацией.&Вместо или &ИзменениеИКонтроль).Телефон с помощью функции БСП Свойство или конструкции проверки типа:
&Вместо("ЗаполнитьРеквизитыТелефона") // Имя процедуры может отличаться в зависимости от версии БСП
Процедура ИмяПроцедуры(Телефон, Реквизиты)
// Реализуем безопасное чтение свойства
Если Телефон.Свойство("CountryCode") Тогда
КодСтраны = Телефон.CountryCode;
Иначе
КодСтраны = "";
КонецЕсли;
// Продолжение логики заполнения...
КонецПроцедуры
---
Если вы выполняете обновление напрямую на очень свежий релиз БП 3.0 (где используются последние, наиболее строгие к качеству данных версии БСП), можно попробовать обмануть систему, выполнив переход поэтапно.
Выясним схему этого процесса:
CountryCode.Мы надеемся, что предложенные нами варианты помогут вам быстро и безболезненно справиться с ошибкой обновления контактной информации и успешно перевести вашу базу данных на современную редакцию 3.0!