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