Перенос данных из устаревших систем на платформе 1С:Предприятие 7.7 в современные конфигурации на 8.3, такие как Управление нашей фирмой (УНФ), всегда сопряжен с архитектурными различиями. Одной из наиболее частых проблем является перенос реквизитов ИНН и КПП для справочника Контрагенты. В данной статье мы детально разберем, как преодолеть разницу в структурах этих баз и правильно настроить правила в Конвертации данных 2.1 (КД 2.1).
Проанализируем ситуацию: в типовой конфигурации «Торговля и Склад» (ТиС) 7.7 справочник Контрагенты не содержит ИНН напрямую. Вместо этого в нем есть реквизит ЮрФизЛицо, который имеет неопределенный тип и ссылается на один из трех справочников: ЮрЛица, ФизЛица или СвоиЮрЛица. Именно в этих подчиненных справочниках и хранятся данные о государственной регистрации.
В 1С:УНФ 8.3 структура иная: справочник Контрагенты является плоским и содержит реквизиты ИНН и КПП непосредственно в своей карточке. Наша задача — при выгрузке из 7.7 «дотянуться» до этих данных через реквизит ЮрФизЛицо и передать их в соответствующие поля целевой базы.
Рассмотрим первый способ. В 7.7 ИНН и КПП часто хранятся в одной строке, разделенной символом «/» или «\». Чтобы корректно передать их в разные реквизиты 8.3, нам потребуются функции парсинга. Мы можем использовать встроенные в конфигурацию ТиС функции или написать свои в обработчиках КД.
Разберем пример функции для выделения ИНН:
Функция глПолучитьИНН(ИННКПП) Экспорт
поз = Найти(ИННКПП, "\");
Если поз <> 0 Тогда
Возврат Лев(ИННКПП, поз - 1);
Иначе
поз = Найти(ИННКПП, "/");
Если поз <> 0 Тогда
Возврат Лев(ИННКПП, поз - 1);
Иначе
Возврат СокрЛП(ИННКПП);
КонецЕсли;
КонецЕсли;
КонецФункции
И аналогично для КПП:
Функция глПолучитьКПП(ИННКПП) Экспорт
поз = Найти(ИННКПП, "\");
Если поз <> 0 Тогда
Возврат Сред(ИННКПП, поз + 1);
Иначе
поз = Найти(ИННКПП, "/");
Если поз <> 0 Тогда
Возврат Сред(ИННКПП, поз + 1);
Иначе
Возврат "";
КонецЕсли;
КонецЕсли;
КонецФункции
Эти функции позволяют нам получить «чистые» значения, которые примет УНФ без ошибок валидации.
Выясним, как реализовать обращение к данным в самой Конвертации данных. Самый гибкий вариант — прописать код в обработчике Перед выгрузкой для конкретного свойства в Правилах Конвертации Объектов (ПКО) для справочника Контрагенты.
Пошагово это выглядит так:
Контрагенты.ИНН.
Если ПустоеЗначение(Источник.ЮрФизЛицо) = 0 Тогда
ОбъектЮФЛ = Источник.ЮрФизЛицо;
// Обращаемся к реквизиту ИНН справочника ЮрЛица или ФизЛица
СтрокаИНН_КПП = ОбъектЮФЛ.ИНН;
Значение = глПолучитьИНН(СтрокаИНН_КПП);
Иначе
Значение = "";
КонецЕсли;
Аналогично поступим для КПП, используя функцию глПолучитьКПП. Обратите внимание, что в 1С 7.7 доступ к атрибутам объекта осуществляется через точку, даже если тип реквизита ЮрФизЛицо неопределен (система выполнит позднее связывание).
Рассмотрим более сложный, но производительный метод — использование Правил Выгрузки Данных (ПВД) с произвольным алгоритмом. Этот метод хорош тем, что мы можем один раз собрать все необходимые данные запросом или циклом, сформировать таблицу и передать её на вход ПКО.
В ПВД для контрагентов установите способ выборки «Произвольный алгоритм». В обработчике Перед обработкой мы можем сформировать таблицу значений:
ВыборкаДанных = СоздатьОбъект("ТаблицаЗначений");
ВыборкаДанных.НоваяКолонка("Ссылка");
ВыборкаДанных.НоваяКолонка("Наименование");
ВыборкаДанных.НоваяКолонка("ИНН");
ВыборкаДанных.НоваяКолонка("КПП");
ВыборкаДанных.НоваяКолонка("ВидКонтрагента");
Спр = СоздатьОбъект("Справочник.Контрагенты");
Спр.ВыбратьЭлементы();
Пока Спр.ПолучитьЭлемент() = 1 Цикл
Если Спр.ЭтоГруппа() = 1 Тогда Продолжить; КонецЕсли;
ВыборкаДанных.НоваяСтрока();
ВыборкаДанных.Ссылка = Спр.ТекущийЭлемент();
ВыборкаДанных.Наименование = Спр.Наименование;
ЮФЛ = Спр.ЮрФизЛицо;
Если ЮФЛ.Выбран() = 1 Тогда
ВыборкаДанных.ИНН = глПолучитьИНН(ЮФЛ.ИНН);
ВыборкаДанных.КПП = глПолучитьКПП(ЮФЛ.ИНН);
// Определяем вид для УНФ
Если ЮФЛ.Вид() = "ЮрЛица" Тогда
ВыборкаДанных.ВидКонтрагента = "ЮрЛицо";
Иначе
ВыборкаДанных.ВидКонтрагента = "ФизЛицо";
КонецЕсли;
КонецЕсли;
КонецЦикла;
Важно помнить: при использовании ВыборкаДанных в ПВД, в ПКО необходимо будет указать, что поиск и заполнение реквизитов ведется по входящим данным.
Проанализируем важный нюанс: в 1С:УНФ для корректной работы обязательно должен быть заполнен реквизит ВидКонтрагента. Это перечисление, которое может принимать значения: ЮрЛицо, ФизЛицо, ИндивидуальныйПредприниматель или ГосударственныйОрган.
Поскольку в 7.7 ТиС нет прямого аналога этого перечисления, мы должны вычислить его на основе метаданных. Если ЮрФизЛицо.Вид() возвращает "ФизЛица", в УНФ следует передавать ФизЛицо. Если "ЮрЛица" — соответственно, ЮрЛицо. Для Индивидуальных предпринимателей в 7.7 часто не выделяли отдельный справочник, поэтому признак ИП можно определять по длине ИНН (12 знаков) или по наличию определенных слов в наименовании.
Посмотрим на ситуацию с качеством данных. В базе 7.7 пользователи часто вводили ИНН с пробелами, тире или другими лишними знаками. В 8.3 встроенные механизмы проверки контрагентов могут блокировать запись таких объектов.
Рекомендуем добавить в правила выгрузки функцию очистки строки от нецифровых символов:
Функция ОчиститьИНН(Знач Стр)
Результат = "";
Для к = 1 По СтрДлина(Стр) Цикл
Символ = Сред(Стр, к, 1);
Если Найти("0123456789", Символ) > 0 Тогда
Результат = Результат + Символ;
КонецЕсли;
КонецЦикла;
Возврат Результат;
КонецФункции
Также стоит уделить внимание поиску объектов. Если в 7.7 несколько карточек контрагентов ссылаются на одно и то же ЮрФизЛицо, в УНФ могут возникнуть дубли. Чтобы этого избежать, в Настройках поиска ПКО рекомендуется установить приоритет поиска по ИНН + КПП, а не только по внутреннему идентификатору (GUID).
Мы разобрали основные подходы к переносу данных из 1С 7.7 ТиС в 1С 8.3 УНФ. Ключ к успеху здесь — правильное обращение к подчиненным справочникам через ЮрФизЛицо и предварительная обработка строк. Используя предложенные алгоритмы в обработчиках ПКС или ПВД, вы сможете обеспечить чистоту и корректность переносимой нормативно-справочной информации.