Как исправить ошибку «Функция не обнаружена» и перенести справочник из 1С 7.7 в перечисление 1С 8.3?

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

Перенос данных между различными поколениями систем 1С — это всегда увлекательный, но тернистый путь. Особые трудности возникают при интеграции устаревшей платформы «1С:Предприятие 7.7» с современными конфигурациями на базе «1С:Предприятие 8.3» (например, «Бухгалтерия предприятия 3.0»). Одной из классических задач в процессе такого перехода является конвертация типов данных. Сегодня мы детально разберем, как правильно перенести реквизит, который в базе-источнике 7.7 представлен справочником (например, справочник «Пол» или «ФизическиеЛица» с реквизитом пола), в перечисление базы-приемника 1С 8.3.

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

Выясняем причину ошибки «Функция не обнаружена» в 1С 7.7

Начнем с разбора технического сбоя, который часто ставит в тупик начинающих специалистов по «Конвертации данных 2.1». При выгрузке данных из 1С 7.7 система внезапно аварийно завершает работу, выдавая в окно сообщений ошибку вида: ПКС_ПриВыгрузке_ФизическиеЛица_Пол_Реквизит5 <<?>> ... Функция не обнаружена.

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

Когда вы создаете или изменяете алгоритмы в правилах конвертации свойств (ПКС) или объектов (ПКО), программа «Конвертация данных» записывает эти обработчики в виде отдельных функций. При генерации правил обмена для платформы 7.7 КД 2.1 формирует не только XML-файл, но и специальный текстовый модуль выгрузки (файл с расширением .prt или просто отдельный текстовый блок с кодом обработчиков).

Суть проблемы: Если вы обновили правила в XML, написали код в обработчиках КД, но забыли обновить программный код самой обработки выгрузки в Конфигураторе 7.7, платформа при запуске обмена не сможет найти новые функции. В XML-файле правил вызовы этих функций прописаны, а в глобальном модуле внешней обработки выгрузки V77Exp.ert их физически нет. Отсюда и возникает закономерное сообщение об ошибке.

Пошаговое исправление ошибки «Функция не обнаружена»

Для устранения этой неполадки нам потребуется выполнить несложную, но обязательную процедуру синхронизации правил обмена и модуля выгрузки. Рассмотрим последовательность наших действий:

  1. Откроем информационную базу «Конвертация данных 2.1» и перейдем к форме сохранения правил обмена.
  2. При выгрузке правил для платформы 7.7 обязательно обратим внимание на настройки сохранения. Нам необходимо поставить флаг (галочку), отвечающий за сохранение модуля правил обмена, или сгенерировать текст модуля выгрузки.
  3. Программа создаст текстовый файл (обычно с расширением .prt или предложит скопировать код в буфер обмена). В этом файле будут находиться все сгенерированные функции, включая ту самую проблемную ПКС_ПриВыгрузке_ФизическиеЛица_Пол_Реквизит5.
  4. Запустим Конфигуратор нашей исходной базы «1С:Предприятие 7.7».
  5. Откроем через меню «Файл — Открыть» внешнюю обработку выгрузки (обычно используется типовая обработка V77Exp.ert).
  6. Перейдем в модуль этой обработки (вкладка «Модуль» в нижней части окна редактора формы).
  7. Полностью выделим весь текст модуля (сочетанием клавиш Ctrl+A) и удалим его, либо найдем область, предназначенную для вставки пользовательского кода правил, если используется специализированная версия обработки. Лучшим решением будет полная замена старого кода модуля на новый сгенерированный текст из «Конвертации данных».
  8. Сохраним изменения в обработке V77Exp.ert.

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

Решение задачи: Перенос Справочника (7.7) в Перечисление (8.3)

Теперь перейдем к непосредственной настройке правил конвертации. Наша задача — перенести значение пола физического лица. В базе 1С 7.7 «Комплексная» пол может быть представлен элементами справочника, а в «Бухгалтерии предприятия 3.0» это жестко заданное перечисление со значениями Мужской и Женский.

Существует два основных подхода к решению данной задачи. Проанализируем каждый из них подробнее, чтобы вы могли выбрать наиболее подходящий под ваши требования инструмент.

Способ 1. Настройка сопоставления напрямую в ПКС (без использования ПКО)

Этот способ является самым простым, лаконичным и быстрым в реализации. Он идеально подходит, когда исходный справочник содержит строго ограниченное количество стабильных значений, которые гарантированно не будут расширяться пользователями.

Давайте настроим это правило вместе:

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

Если Источник.Пол.Наименование = "Мужской" Тогда 
    Значение = "Мужской"; 
ИначеЕсли Источник.Пол.Наименование = "Женский" Тогда 
    Значение = "Женский"; 
Иначе 
    Значение = ""; 
КонецЕсли;

Рассмотрим, как работает этот код. Во время выгрузки конкретного физического лица система обращается к его реквизиту пола в базе 7.7. Мы анализируем наименование элемента справочника. Если оно равно «Мужской», мы присваиваем переменной Значение строковое представление имени значения перечисления в базе-приемнике 8.3 (именно имя значения в конфигураторе, а не синоним!). Если в источнике наименование пустое или не совпадает с ожидаемыми, мы передаем пустую строку, чтобы в приемнике реквизит остался незаполненным.

Помните, что после внесения изменений в данный обработчик ПКС вам обязательно нужно будет повторить шаги по выгрузке модуля переходов и обновлению текста обработки V77Exp.ert, как мы описывали в предыдущем разделе!

Способ 2. Создание полноценного ПКО сопоставления «Справочник — Перечисление»

Данный вариант сложнее, но он незаменим в тех ситуациях, когда аналогичное сопоставление справочника и перечисления требуется использовать в нескольких местах конфигурации (например, ставки НДС, виды контрагентов или типы договоров), либо когда элементов в справочнике достаточно много и писать длинные конструкции Если... ИначеЕсли в коде нецелесообразно.

Давайте разберем этот системный подход по шагам:

  1. Создадим новое Правило конвертации объектов (ПКО).
  2. В качестве источника выберем справочник из 7.7 (например, СправочникСсылка.Пол или аналогичный), а в качестве приемника укажем перечисление из 8.3 — ПеречислениеСсылка.ПолФизическогоЛица.
  3. Важнейший нюанс: В форме настройки созданного ПКО обязательно перейдем на вкладку свойств и установим флаг «Не запоминать выгруженные объекты». Если пренебречь этим правилом, система КД попытается сопоставить GUID/ID справочника из 7.7 со значениями перечисления 1С 8.3 во внутренней таблице выгруженных объектов. Это неизбежно приведет к ошибкам сопоставления и сбоям при загрузке данных в базу-приемник.
  4. Внутри этого ПКО перейдем к настройке «Правил конвертации значений» (ПКЗ). Здесь мы можем вручную сопоставить элементы справочника-источника конкретным значениям перечисления-приемника.
  5. Если элементы справочника в источнике создавались пользователями вручную и не являются предопределенными, стандартное сопоставление КД по умолчанию может не отработать автоматически. Чтобы гарантировать корректный перенос, мы можем переопределить поведение системы в обработчике ПКО «После выгрузки». Напишем в нем следующий код:

Приемник = Источник; 
Если Источник.Наименование = "Мужской" Тогда 
    УзелСсылки = "Мужской"; 
ИначеЕсли Источник.Наименование = "Женский" Тогда 
    УзелСсылки = "Женский"; 
КонецЕсли; 
Отказ = Истина;

Проанализируем этот алгоритм. Строка Приемник = Источник; производит сопоставление объектов. Далее мы проверяем текстовое наименование справочника-источника и присваиваем переменной УзелСсылки имя значения перечисления приемника в формате строки. Инструкция Отказ = Истина; здесь играет ключевую роль: она сообщает платформе КД, что нам не требуется стандартная выгрузка всех свойств и реквизитов справочника (ведь у перечисления нет реквизитов), и мы принудительно прекращаем дальнейшую обработку этого объекта, зафиксировав только значение ссылки.

Особенности работы с реквизитами составного типа

Иногда в современных конфигурациях 1С 8.3 реквизит, в который вы переносите данные, имеет составной тип данных. Например, реквизит может принимать значения типов СправочникСсылка.ФизическиеЛица, СправочникСсылка.Контрагенты или нашего перечисления ПеречислениеСсылка.ПолФизическогоЛица.

В таких ситуациях при выгрузке через ПКС (по первому способу) принимающая сторона может не понять, к какому именно типу из доступных нужно привести текстовую строку "Мужской" или "Женский". В результате реквизит в базе-приемнике останется незаполненным либо запишется как обычная строка.

Чтобы избежать подобных проблем, в обработчике «Перед выгрузкой» в ПКС необходимо явно указывать системный параметр ТипПриемника. Посмотрим, как будет выглядеть правильный код:


ТипПриемника = "ПеречислениеСсылка.ПолФизическогоЛица";
Если Источник.Пол.Наименование = "Мужской" Тогда 
    Значение = "Мужской"; 
ИначеЕсли Источник.Пол.Наименование = "Женский" Тогда 
    Значение = "Женский"; 
Иначе 
    Значение = ""; 
КонецЕсли;

Благодаря явной установке параметра ТипПриемника, принимающий загрузчик в 1С 8.3 безошибочно определит целевой метатип данных, создаст правильную ссылку на перечисление и запишет её в нужный реквизит объекта.

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

← На главную