При переносе нормативно-справочной информации, например, номенклатуры, из старых баз на платформе 1С 7.7 (таких как «Торговля и склад») в современные конфигурации с помощью «Конвертации данных 2» (КД 2), программисты часто сталкиваются с неожиданным поведением. Базовые типы (строка, число) выгружаются без проблем, но стоит попытаться получить реквизит через точку (например, вес из подчиненного справочника единиц измерения) или написать простейший код в ПКС (Правила конвертации свойств), как стандартная обработка выгрузки начинает выдавать ошибку «Функция не обнаружена».
Разберем подробнее, почему возникает эта ошибка, как ее правильно устранить и проанализируем альтернативные способы выгрузки данных, включая передачу параметров из 1С 7.7 в 1С 8.х.
Посмотрим на причину проблемы. В отличие от платформы 1С:Предприятие 8.х, которая умеет динамически считывать и исполнять программный код обработчиков обмена прямо из загруженного XML-файла с правилами, платформа 1С 7.7 имеет серьезные ограничения. Она не поддерживает динамическое выполнение произвольного кода таким образом.
Для обхода этого ограничения КД 2 использует механизм компиляции. Весь написанный вами код (в ПКО, ПКС, ПВД) собирается в единый набор функций на языке 1С 7.7. Когда вы запускаете стандартную обработку V77Exp.ert, она пытается вызвать функцию, соответствующую конкретному правилу. Но поскольку текст обработки по умолчанию не содержит вашего нового кода, система не находит нужную функцию и выдает ошибку.
Выясним по шагам, как заставить любой написанный вами код работать в 1С 7.7. Для примера возьмем задачу выгрузки веса, который хранится по пути Источник.ОсновнаяЕдиница.Вес. Если мы в ПКС пропишем этот код в обработчик «Перед выгрузкой» или «При выгрузке», нам потребуется обновить саму обработку.
МодульВыгрузки.txt).V77Exp.ert).МодульВыгрузки.txt, скопируйте из него весь текст и вставьте в пустой модуль обработки V77Exp.ert.Важно: Эту процедуру необходимо повторять каждый раз, когда вы вносите малейшие изменения в программный код правил обмена для 7.7 в КД 2! Без программного кода можно использовать неизмененную V77Exp.ert, но при наличии кода в обработчиках замена модуля строго обязательна.
Теперь код вида:
Значение = Источник.ОсновнаяЕдиница.Вес;
будет прекрасно работать и выгружать нужные данные без ошибок.
Рассмотрим ситуацию, когда у вас нет возможности или желания постоянно переносить модуль через конфигуратор 1С 7.7. Задачу с получением реквизита «через точку» (как в случае с весом) можно решить исключительно настройками, не написав ни строчки кода.
MD77Exp.ert.ОсновнаяЕдиница, нажмите на плюсик («+») слева от него, чтобы раскрыть его структуру.Вес.КД 2 автоматически пропишет цепочку реквизитов через точку. Движок стандартной обработки обмена умеет получать такие реквизиты базовыми механизмами платформы без использования обработчиков. Следовательно, вам не придется компилировать и обновлять модуль V77Exp.ert.
Существует распространенное заблуждение, что платформа 1С 7.7 не умеет выгружать данные в параметры обмена. Проанализируем, как на самом деле работает передача параметров в связке 7.7 → 8.х.
Передача свойств в параметры объекта работает, но имеет свои нюансы загрузки. Чтобы передать значение:
ВесНоменклатуры).
Вес = ПараметрыОбъекта.Получить("ВесНоменклатуры");
Если Вес <> Неопределено Тогда
// Ваша логика обработки
КонецЕсли;
Также вы можете инициализировать глобальные параметры для всего сеанса выгрузки. Для этого в обработчике «Перед выгрузкой данных» глобальных правил можно заполнить структуру Параметры.
Если же штатные механизмы старых релизов V77Exp.ert дают сбой, программисты применяют обходной путь с прямым доступом к XML (DOM-модели). В коде обработчика 7.7 можно вручную создать узел XML-документа с помощью метода DOMDocument.СоздатьУзел(), записать туда необходимые атрибуты и прикрепить к текущему выгружаемому объекту. Восьмерка без проблем прочитает эти узлы.
Используя описанные выше методы, вы сможете настроить стабильную выгрузку любых данных, включая сложную подчиненную информацию, из устаревших баз 1С 7.7 в современные учетные системы.