Переход с редакции 2.0 на 3.0 в «1С:Бухгалтерия предприятия» — это не просто обновление конфигурации, а масштабная трансформация данных. Одним из самых «болезненных» участков является конвертация контактной информации. Часто пользователи и разработчики сталкиваются с ошибкой в общем модуле УправлениеКонтактнойИнформациейСлужебныйПовтИсп, где метод ЗаполнитьЗначенияСвойств аварийно завершает работу из-за недопустимого значения параметра. Рассмотрим подробно, почему это происходит и как решить проблему несколькими способами.
Разберем ситуацию: при выполнении обработок обновления в режиме «1С:Предприятие» система выдает сообщение об ошибке, указывающее на строку кода:
ЗаполнитьЗначенияСвойств(Данные, ВидИнформации);
Проанализируем техническую суть проблемы. В редакции 3.0 была полностью пересмотрена архитектура хранения адресов, телефонов и других данных. Если в исходной базе 2.0 справочник ВидыКонтактнойИформации содержит некорректные записи, дубли или битые ссылки, механизм конвертации не может сопоставить их с новыми метаданными. Параметр ВидИнформации принимает значение Неопределено или ссылку на объект, который физически отсутствует в базе (объект не найден), что и вызывает исключение в платформенном методе.
Многие сталкиваются с тем, что точка останова в служебных модулях не срабатывает. Это происходит из-за того, что обновление данных выполняется в фоновом задании на сервере. Пройдем по шагам процесс настройки отладки, чтобы увидеть проблемный объект своими глазами:
-debug. Без этого отладчик не сможет подключиться к серверному вызову.Когда отладчик остановится на строке с ошибкой, проанализируем содержимое переменной ВидИнформации. Скорее всего, мы увидим там Неопределено или «Объект не найден». Это даст нам понимание, в каком именно объекте (контрагенте, физлице или организации) данные повреждены.
Как показывает практика, попытка обновиться с очень старого релиза 2.0 сразу на актуальный релиз 3.0 часто приводит к несовместимости алгоритмов конвертации. Рассмотрим стратегию «мелких шагов»:
Выясним, какой релиз является минимально необходимым для перехода. Вместо последнего доступного релиза 3.0, попробуем использовать один из первых релизов ветки 3.0 (например, 3.0.43.XX или 3.0.44.XX). Последовательность действий будет следующей:
Этот метод часто помогает, так как в промежуточных релизах механизмы трансформации данных могут быть менее требовательными к чистоте справочников.
Чтобы предотвратить ошибку, проанализируем состояние данных еще до начала обновления. Выполним следующие действия в редакции 2.0:
Виды контактной информации. Наличие двух «Юридических адресов» с одинаковыми именами, но разными внутренними идентификаторами — гарантированная причина сбоя.КонтактнаяИнформация. Если в нем есть записи с пустым полем Вид или Объект, их необходимо удалить. Рассмотрим пример запроса для поиска таких записей:
ВЫБРАТЬ
КонтактнаяИнформация.Объект,
КонтактнаяИнформация.Тип,
КонтактнаяИнформация.Вид
ИЗ
РегистрСведений.КонтактнаяИнформация КАК КонтактнаяИнформация
ГДЕ
(КонтактнаяИнформация.Вид ЕСТЬ NULL
ИЛИ КонтактнаяИнформация.Вид = ЗНАЧЕНИЕ(Справочник.ВидыКонтактнойИнформации.ПустаяСсылка))
Перед переходом обязательно выполним Тестирование и исправление (ТиИ). Однако здесь есть важный нюанс. Посмотрим на настройки:
При выборе варианта «Проверка ссылочной целостности», в поле «При наличии ссылок на несуществующие объекты» необходимо выбрать Очищать объекты. Если оставить значение по умолчанию «Создавать объекты», система создаст пустые элементы в справочнике Виды контактной информации, которые не будут иметь необходимых реквизитов, и конвертация снова упадет с ошибкой Недопустимое значение параметра.
Если время поджимает и базу нужно запустить «здесь и сейчас», можно прибегнуть к временной модификации кода. Найдем в конфигурации общий модуль УправлениеКонтактнойИнформациейСлужебныйПовтИсп и внесем правку в процедуру, где происходит заполнение свойств.
Проанализируем следующий фрагмент кода:
// Было:
ЗаполнитьЗначенияСвойств(Данные, ВидИнформации);
// Стало (добавляем проверку):
Если ВидИнформации <> Неопределено И ТипЗнч(ВидИнформации) = Тип("СправочникСсылка.ВидыКонтактнойИнформации") Тогда
ЗаполнитьЗначенияСвойств(Данные, ВидИнформации);
Иначе
// Записываем лог, чтобы потом понять, какие данные не перенеслись
ЗаписьЖурналаРегистрации("ОбновлениеДанных", УровеньЖурналаРегистрации.Предупреждение, , , "Пропущен некорректный вид контактной информации");
КонецЕсли;
Важно: После завершения обновления этим способом необходимо обязательно проверить контактную информацию у контрагентов и сотрудников, так как часть данных могла не перенестись из-за пропущенных итераций.
Мы рассмотрели комплексный подход к решению проблемы при переходе с БП 2.0 на 3.0. Помним, что наиболее эффективным методом является предварительная очистка данных в исходной базе и использование промежуточных релизов. Чистота справочника Виды контактной информации и отсутствие «битых» записей в регистре — залог успешной конвертации без необходимости вмешательства в программный код 1С.