Перенос справочников и связанных с ними периодических сведений из конфигураций платформы 1С:Предприятие 7.7 в современные конфигурации на базе 1С:Предприятия 8.3 — классическая задача при модернизации учетных систем. При самостоятельной разработке правил обмена в конфигурации «Конвертация данных 2.0» разработчики часто сталкиваются со специфическими проблемами: дублированием групп справочников в виде элементов, незаполненными измерениями в регистрах сведений (например, потеря ссылки на физическое лицо в паспортных данных) и некорректным сопоставлением видов документов. Разберем по шагам причины этих ошибок и методы их правильного устранения.
Проанализируем ситуацию: при выгрузке регистра сведений ДокументыФизическихЛиц в сформированном XML-файле свойство Физлицо выгружается пустым:
<Свойство Имя="Физлицо" Тип="СправочникСсылка.ФизическиеЛица">
<Пусто/>
</Свойство>
Это происходит по двум основным причинам:
СписокЗначений (без прямой привязки к объекту метаданных источника), механизм выгрузки не может автоматически определить правило для конвертации ссылки. В правиле конвертации свойств (ПКС) для измерения Физлицо необходимо явно указать Правило конвертации (например, ФизическиеЛица) и обязательно включить флаг «Получить из входящих данных».V77Exp.ert вызов функции ВыгрузитьПоПравилу требует точного соблюдения порядка следования параметров. Если данные передаются через входящие данные, коллекция должна передаваться третьим параметром:
ПаспортныеДанные = СоздатьОбъект("СписокЗначений");
ПаспортныеДанные.Установить("Период", Период);
ПаспортныеДанные.Установить("ФизЛицо", Источник);
ПаспортныеДанные.Установить("ВидДокумента", ДокументВид);
ПаспортныеДанные.Установить("Серия", ДокументСерия);
ПаспортныеДанные.Установить("Номер", ДокументНомер);
ПаспортныеДанные.Установить("ДатаВыдачи", ДокументДатаВыдачи);
ПаспортныеДанные.Установить("КемВыдан", ДокументКемВыдан);
// Передаем структуру входящих данных третьим параметром
ВыгрузитьПоПравилу(, , ПаспортныеДанные, , "ПаспортныеДанныеФизЛиц");
Также важно убедиться, что обработчик V77Exp.ert содержит актуальный программный модуль, сгенерированный текущей версией правил обмена при выгрузке из «Конвертации данных».
Выясним причину, почему в справочнике ФизическиеЛица папки из 1С 7.7 задваиваются и превращаются в обычные элементы приемника. В платформе 1С 7.7 иерархия справочника не разделяет жестко сущности на уровне метаданных, тогда как в 1С 8 у справочников с иерархией групп и элементов создание группы выполняется методом СоздатьГруппу(), а элемента — методом СоздатьЭлемент().
Если для выгрузки используется одно общее правило конвертации объектов (ПКО), механизм загрузки по умолчанию пытается создать элемент. Чтобы этого избежать, разделим правила конвертации:
ФизическиеЛицаГруппа для групп и отдельное ПКО ФизическиеЛица для элементов.
Если Источник.ЭтоГруппа() = 1 Тогда
Отказ = 1;
КонецЕсли;
Если Источник.ЭтоГруппа() = 0 Тогда
Отказ = 1;
КонецЕсли;
Родитель (и для элементов, и для групп) обязательно укажем правило конвертации ФизическиеЛицаГруппа. Это гарантирует, что иерархия в базе-приемнике будет создана корректно, без создания ложных элементов вместо папок.Рассмотрим подробнее проблему, когда вид документа (например, «Паспорт гражданина РФ») выгружен в XML, но в базе-приемнике реквизит остается пустым либо создаются дубли предопределенных элементов.
В конфигурациях 1С 8.3 справочник ВидыДокументовФизическихЛиц содержит предопределенные элементы. Поиск по наименованию часто дает сбой из-за скрытых неразрывных пробелов, различий в регистрах или несовпадения строк между ЗиК 7.7 и БП 3.0 (например, «Паспорт гражданина Российской Федерации» и «Паспорт гражданина РФ»).
Для надежного сопоставления видов документов применим поиск предопределенного значения в обработчике «Поля поиска» ПКО ВидыДокументовФизическихЛиц базы-приемника:
Если СвойстваПоиска["Наименование"] = "Паспорт гражданина РФ"
Или СвойстваПоиска["Наименование"] = "Паспорт гражданина Российской Федерации" Тогда
СсылкаНаОбъект = ПредопределенноеЗначение("Справочник.ВидыДокументовФизическихЛиц.ПаспортРФ");
ПрекратитьПоиск = Истина;
КонецЕсли;
Если же элемент создается заново, обратите внимание на обязательные реквизиты в конфигурации 1С:Бухгалтерия 3.0: для корректного отображения в интерфейсе у вида документа должны быть заполнены реквизиты ЯвляетсяДокументомУдостоверяющимЛичность (тип Булево) и Представление.
Если перенос через отдельные ПКО для регистров сведений вызывает сложности с синхронизацией ссылок, применим альтернативный подход. Передадим паспортные данные и ФИО в параметрах самого объекта ФизическиеЛица, а запись в регистры выполним в базе-приемнике в обработчике «После загрузки» ПКО ФизическиеЛица:
Если Не Объект.ЭтоГруппа Тогда
// Запись паспортных данных напрямую в регистр сведений
НаборЗаписей = РегистрыСведений.ДокументыФизическихЛиц.СоздатьНаборЗаписей();
НаборЗаписей.Отбор.Физлицо.Установить(Ссылка);
НоваяЗапись = НаборЗаписей.Добавить();
НоваяЗапись.Физлицо = Ссылка;
НоваяЗапись.ВидДокумента = ПредопределенноеЗначение("Справочник.ВидыДокументовФизическихЛиц.ПаспортРФ");
НоваяЗапись.Период = ПараметрыОбъекта["ДатаВыдачи"];
НоваяЗапись.Серия = ПараметрыОбъекта["Серия"];
НоваяЗапись.Номер = ПараметрыОбъекта["Номер"];
НоваяЗапись.ДатаВыдачи = ПараметрыОбъекта["ДатаВыдачи"];
НоваяЗапись.КемВыдан = ПараметрыОбъекта["КемВыдан"];
НаборЗаписей.Записать(Истина);
КонецЕсли;
Такой подход полностью исключает рассинхронизацию между созданием ссылки на физическое лицо и формированием записей в независимых регистрах сведений.