Перенос данных между различными поколениями систем 1С — это всегда увлекательный, но тернистый путь. Особые трудности возникают при интеграции устаревшей платформы «1С:Предприятие 7.7» с современными конфигурациями на базе «1С:Предприятие 8.3» (например, «Бухгалтерия предприятия 3.0»). Одной из классических задач в процессе такого перехода является конвертация типов данных. Сегодня мы детально разберем, как правильно перенести реквизит, который в базе-источнике 7.7 представлен справочником (например, справочник «Пол» или «ФизическиеЛица» с реквизитом пола), в перечисление базы-приемника 1С 8.3.
Параллельно мы решим крайне распространенную техническую проблему платформы 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 их физически нет. Отсюда и возникает закономерное сообщение об ошибке.
Для устранения этой неполадки нам потребуется выполнить несложную, но обязательную процедуру синхронизации правил обмена и модуля выгрузки. Рассмотрим последовательность наших действий:
.prt или предложит скопировать код в буфер обмена). В этом файле будут находиться все сгенерированные функции, включая ту самую проблемную ПКС_ПриВыгрузке_ФизическиеЛица_Пол_Реквизит5.V77Exp.ert).V77Exp.ert.Теперь при запуске выгрузки в режиме «1С:Предприятие 7.7» через обновленную обработку система без труда найдет все необходимые функции, и выгрузка пройдет в штатном режиме.
Теперь перейдем к непосредственной настройке правил конвертации. Наша задача — перенести значение пола физического лица. В базе 1С 7.7 «Комплексная» пол может быть представлен элементами справочника, а в «Бухгалтерии предприятия 3.0» это жестко заданное перечисление со значениями Мужской и Женский.
Существует два основных подхода к решению данной задачи. Проанализируем каждый из них подробнее, чтобы вы могли выбрать наиболее подходящий под ваши требования инструмент.
Этот способ является самым простым, лаконичным и быстрым в реализации. Он идеально подходит, когда исходный справочник содержит строго ограниченное количество стабильных значений, которые гарантированно не будут расширяться пользователями.
Давайте настроим это правило вместе:
ФизическиеЛица).Пол.ПеречислениеСсылка.ПолФизическогоЛица. Это критически важно, особенно если реквизит приемника имеет составной тип данных.
Если Источник.Пол.Наименование = "Мужской" Тогда
Значение = "Мужской";
ИначеЕсли Источник.Пол.Наименование = "Женский" Тогда
Значение = "Женский";
Иначе
Значение = "";
КонецЕсли;
Рассмотрим, как работает этот код. Во время выгрузки конкретного физического лица система обращается к его реквизиту пола в базе 7.7. Мы анализируем наименование элемента справочника. Если оно равно «Мужской», мы присваиваем переменной Значение строковое представление имени значения перечисления в базе-приемнике 8.3 (именно имя значения в конфигураторе, а не синоним!). Если в источнике наименование пустое или не совпадает с ожидаемыми, мы передаем пустую строку, чтобы в приемнике реквизит остался незаполненным.
Помните, что после внесения изменений в данный обработчик ПКС вам обязательно нужно будет повторить шаги по выгрузке модуля переходов и обновлению текста обработки V77Exp.ert, как мы описывали в предыдущем разделе!
Данный вариант сложнее, но он незаменим в тех ситуациях, когда аналогичное сопоставление справочника и перечисления требуется использовать в нескольких местах конфигурации (например, ставки НДС, виды контрагентов или типы договоров), либо когда элементов в справочнике достаточно много и писать длинные конструкции Если... ИначеЕсли в коде нецелесообразно.
Давайте разберем этот системный подход по шагам:
СправочникСсылка.Пол или аналогичный), а в качестве приемника укажем перечисление из 8.3 — ПеречислениеСсылка.ПолФизическогоЛица.
Приемник = Источник;
Если Источник.Наименование = "Мужской" Тогда
УзелСсылки = "Мужской";
ИначеЕсли Источник.Наименование = "Женский" Тогда
УзелСсылки = "Женский";
КонецЕсли;
Отказ = Истина;
Проанализируем этот алгоритм. Строка Приемник = Источник; производит сопоставление объектов. Далее мы проверяем текстовое наименование справочника-источника и присваиваем переменной УзелСсылки имя значения перечисления приемника в формате строки. Инструкция Отказ = Истина; здесь играет ключевую роль: она сообщает платформе КД, что нам не требуется стандартная выгрузка всех свойств и реквизитов справочника (ведь у перечисления нет реквизитов), и мы принудительно прекращаем дальнейшую обработку этого объекта, зафиксировав только значение ссылки.
Иногда в современных конфигурациях 1С 8.3 реквизит, в который вы переносите данные, имеет составной тип данных. Например, реквизит может принимать значения типов СправочникСсылка.ФизическиеЛица, СправочникСсылка.Контрагенты или нашего перечисления ПеречислениеСсылка.ПолФизическогоЛица.
В таких ситуациях при выгрузке через ПКС (по первому способу) принимающая сторона может не понять, к какому именно типу из доступных нужно привести текстовую строку "Мужской" или "Женский". В результате реквизит в базе-приемнике останется незаполненным либо запишется как обычная строка.
Чтобы избежать подобных проблем, в обработчике «Перед выгрузкой» в ПКС необходимо явно указывать системный параметр ТипПриемника. Посмотрим, как будет выглядеть правильный код:
ТипПриемника = "ПеречислениеСсылка.ПолФизическогоЛица";
Если Источник.Пол.Наименование = "Мужской" Тогда
Значение = "Мужской";
ИначеЕсли Источник.Пол.Наименование = "Женский" Тогда
Значение = "Женский";
Иначе
Значение = "";
КонецЕсли;
Благодаря явной установке параметра ТипПриемника, принимающий загрузчик в 1С 8.3 безошибочно определит целевой метатип данных, создаст правильную ссылку на перечисление и запишет её в нужный реквизит объекта.
Придерживаясь этих несложных правил и всегда своевременно обновляя модуль выгрузки во внешней обработке 1С 7.7, вы гарантируете себе быструю, стабильную и безошибочную конвертацию данных между поколениями платформ 1С.