Как исправить ошибку Функция не обнаружена при переносе Номенклатуры из 1С 7.7 в 1С 8.3 и правильно установить Ставку НДС

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

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

В этой статье мы подробно разберем, почему возникает эта ошибка, как правильно передавать значения перечислений из «семерки» в «восьмерку» и какие нюансы настройки Конвертации данных 2.1 помогут сделать перенос справочников бесшовным.

Разбор причины возникновения ошибки «Функция не обнаружена»

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

Автор проблемы пытался указать значение следующим образом:

Значение = ПеречислениеСсылка.СтавкиНДС.НДС20;

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

Решение №1: Использование строковых идентификаторов в коде

Рассмотрим первый и самый простой способ исправления. Чтобы передать значение в приемник (1С 8.3), которое в будущем станет элементом перечисления, нам не нужно обращаться к объектам восьмой версии напрямую. Нам достаточно передать строковое имя (идентификатор) значения перечисления, как оно задано в конфигураторе базы-приемника.

Посмотрим на пример правильного кода для обработчика Перед выгрузкой в ПКС СтавкаНДС:


// В 1С 7.7 мы просто присваиваем переменной Значение строку.
// Система Конвертации данных при загрузке сама сопоставит эту строку 
// с именем значения перечисления в 8.3.
Значение = "НДС20"; 

Важный момент: Необходимо проверить точное имя значения в конфигураторе 1С 8.3. Например, для конфигурации BAS Бухгалтерия (Украина) или БП 3.0 это может быть НДС20, Vat20 или даже БезНДС. Не путайте это с синонимом (тем, что видит пользователь), вам нужно именно внутреннее «Имя».

Решение №2: Использование Таблицы сопоставления значений

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

Выполним следующие шаги:

  1. Откроем ПКС для реквизита СтавкаНДС в справочнике Номенклатура.
  2. Оставим поле Правило конвертации (ПКО) пустым, если мы хотим передать фиксированное значение.
  3. Перейдем на закладку Настройка сопоставления значений.
  4. Здесь мы можем вручную указать: какое значение справочника СтавкиНДС из 1С 7.7 соответствует какому значению перечисления СтавкиНДС из 1С 8.3.
  5. Если нам нужно всем объектам присвоить одну ставку (как в вопросе автора), мы можем создать ПКО для перечисления и в нем настроить сопоставление по умолчанию.

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

Особенности переноса в BAS Бухгалтерия и современные БП 3.0

Поскольку автор упоминает конфигурацию BAS Бухгалтерия для Украины 2.1, нужно учитывать специфику метаданных. В этой конфигурации (как и в российской версии 3.0) работа с НДС может быть завязана не только на перечислении, но и на налоговых назначениях.

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


// Пример установки вида номенклатуры "Товар" для всей выгрузки
Значение = "Товар";
// Или если это услуга в 7.7
Если Источник.ЭтоУслуга = 1 Тогда
    Значение = "Услуга";
КонецЕсли;

Проблемы с измененными конфигурациями 7.7

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

Рассмотрим алгоритм действий при работе с сильно кастомизированной «семеркой»:

  1. Не используйте стандартные обработки переноса, которые идут в комплекте с 8-кой.
  2. Используйте только актуальную версию Конвертации данных 2.1.
  3. В базу 7.7 обязательно загрузите свежую обработку выгрузки V8Expor.ert.
  4. При возникновении ошибок типа Функция не обнаружена, первым делом проверяйте код в ПКС на наличие «восьмерочных» конструкций: Справочники..., Перечисления..., ПланыСчетов... — в 7.7 их использовать нельзя!

Итоги и рекомендации

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

Короткий чек-лист для исправления:

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

← На главную