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