Как исправить ошибку «Функция не обнаружена» при выгрузке из 1С 7.7 через Конвертацию данных 2?

Программист 1С v7.7 IT и автоматизация бизнеса
← На главную

При переносе нормативно-справочной информации, например, номенклатуры, из старых баз на платформе 1С 7.7 (таких как «Торговля и склад») в современные конфигурации с помощью «Конвертации данных 2» (КД 2), программисты часто сталкиваются с неожиданным поведением. Базовые типы (строка, число) выгружаются без проблем, но стоит попытаться получить реквизит через точку (например, вес из подчиненного справочника единиц измерения) или написать простейший код в ПКС (Правила конвертации свойств), как стандартная обработка выгрузки начинает выдавать ошибку «Функция не обнаружена».

Разберем подробнее, почему возникает эта ошибка, как ее правильно устранить и проанализируем альтернативные способы выгрузки данных, включая передачу параметров из 1С 7.7 в 1С 8.х.

Почему возникает ошибка «Функция не обнаружена»?

Посмотрим на причину проблемы. В отличие от платформы 1С:Предприятие 8.х, которая умеет динамически считывать и исполнять программный код обработчиков обмена прямо из загруженного XML-файла с правилами, платформа 1С 7.7 имеет серьезные ограничения. Она не поддерживает динамическое выполнение произвольного кода таким образом.

Для обхода этого ограничения КД 2 использует механизм компиляции. Весь написанный вами код (в ПКО, ПКС, ПВД) собирается в единый набор функций на языке 1С 7.7. Когда вы запускаете стандартную обработку V77Exp.ert, она пытается вызвать функцию, соответствующую конкретному правилу. Но поскольку текст обработки по умолчанию не содержит вашего нового кода, система не находит нужную функцию и выдает ошибку.

Решение 1: Правильная интеграция кода из КД 2 в обработку 1С 7.7

Выясним по шагам, как заставить любой написанный вами код работать в 1С 7.7. Для примера возьмем задачу выгрузки веса, который хранится по пути Источник.ОсновнаяЕдиница.Вес. Если мы в ПКС пропишем этот код в обработчик «Перед выгрузкой» или «При выгрузке», нам потребуется обновить саму обработку.

  1. В конфигурации «Конвертация данных 2» при сохранении правил обмена обязательно установите флажок «Выгружать модуль обработки выгрузки данных для платформы 7.7».
  2. Укажите путь и имя текстового файла, в который будет сохранен сгенерированный код (например, МодульВыгрузки.txt).
  3. Откройте конфигуратор вашей базы 1С 7.7.
  4. Через меню «Файл - Открыть» выберите вашу обработку выгрузки (обычно это стандартная V77Exp.ert).
  5. Перейдите в модуль обработки, выделите весь текст (Ctrl+A) и полностью удалите его.
  6. Откройте сгенерированный файл МодульВыгрузки.txt, скопируйте из него весь текст и вставьте в пустой модуль обработки V77Exp.ert.
  7. Сохраните обработку.

Важно: Эту процедуру необходимо повторять каждый раз, когда вы вносите малейшие изменения в программный код правил обмена для 7.7 в КД 2! Без программного кода можно использовать неизмененную V77Exp.ert, но при наличии кода в обработчиках замена модуля строго обязательна.

Теперь код вида:

Значение = Источник.ОсновнаяЕдиница.Вес;

будет прекрасно работать и выгружать нужные данные без ошибок.

Решение 2: Альтернативный способ выгрузки без программирования

Рассмотрим ситуацию, когда у вас нет возможности или желания постоянно переносить модуль через конфигуратор 1С 7.7. Задачу с получением реквизита «через точку» (как в случае с весом) можно решить исключительно настройками, не написав ни строчки кода.

  1. Для начала необходимо корректно выгрузить структуру метаданных базы 1С 7.7. Используйте для этого штатную обработку MD77Exp.ert.
  2. При выгрузке метаданных обязательно обратите внимание на то, чтобы были включены подчиненные справочники (в нашем случае — справочник единиц измерения, где хранится вес).
  3. Загрузите обновленное описание структуры метаданных в КД 2.
  4. Перейдите к настройке ПКС (Правил конвертации свойств) для справочника «Номенклатура».
  5. В колонке «Источник» найдите реквизит ОсновнаяЕдиница, нажмите на плюсик («+») слева от него, чтобы раскрыть его структуру.
  6. В выпадающем списке выберите подчиненный реквизит Вес.

КД 2 автоматически пропишет цепочку реквизитов через точку. Движок стандартной обработки обмена умеет получать такие реквизиты базовыми механизмами платформы без использования обработчиков. Следовательно, вам не придется компилировать и обновлять модуль V77Exp.ert.

Работа с параметрами: разрушаем мифы о 1С 7.7

Существует распространенное заблуждение, что платформа 1С 7.7 не умеет выгружать данные в параметры обмена. Проанализируем, как на самом деле работает передача параметров в связке 7.7 → 8.х.

Передача свойств в параметры объекта работает, но имеет свои нюансы загрузки. Чтобы передать значение:

  1. В ПКС в настройках установите флажок «Передавать данные в параметр» и задайте имя параметра (например, ВесНоменклатуры).
  2. При загрузке на стороне приемника (в 1С 8) это значение не запишется в реквизит автоматически. Оно будет сохранено в коллекции параметров.
  3. Чтобы использовать это значение, в обработчике «После загрузки» ПКО на стороне 1С 8 нужно прочитать его следующим кодом:

Вес = ПараметрыОбъекта.Получить("ВесНоменклатуры");
Если Вес <> Неопределено Тогда
    // Ваша логика обработки
КонецЕсли;

Также вы можете инициализировать глобальные параметры для всего сеанса выгрузки. Для этого в обработчике «Перед выгрузкой данных» глобальных правил можно заполнить структуру Параметры.

Если же штатные механизмы старых релизов V77Exp.ert дают сбой, программисты применяют обходной путь с прямым доступом к XML (DOM-модели). В коде обработчика 7.7 можно вручную создать узел XML-документа с помощью метода DOMDocument.СоздатьУзел(), записать туда необходимые атрибуты и прикрепить к текущему выгружаемому объекту. Восьмерка без проблем прочитает эти узлы.

Используя описанные выше методы, вы сможете настроить стабильную выгрузку любых данных, включая сложную подчиненную информацию, из устаревших баз 1С 7.7 в современные учетные системы.

← На главную