Как перенести иерархический справочник из 1С 8 в 1С 7.7, если в семерке не виден реквизит Родитель?

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

Перенос данных между платформами 1С 8.х и 1С 7.7 часто преподносит сюрпризы, особенно когда речь идет об иерархических справочниках. Программисты нередко сталкиваются с ситуацией, когда в конфигураторе 1С 7.7 у справочника визуально отсутствует реквизит Родитель, хотя в режиме предприятия иерархия (папки и элементы) отчетливо видна. Это создает сложности при настройке правил в конфигурации «Конвертация данных 2.0».

В данной статье мы подробно разберем, как правильно организовать поиск и создание элементов с учетом иерархии при выгрузке из ЗУП 8 в ЗиК 7.7, проанализируем системные особенности платформы 7.7 и рассмотрим программные способы решения задачи.

Особенности иерархии в 1С 7.7

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

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

Шаг 1: Подготовка структуры метаданных

Прежде чем писать сложный код поиска, выполним правильную подготовку метаданных. Рассмотрим правильный алгоритм действий:

Воспользуемся обработкой выгрузки описания конфигурации для 7.7 (обычно это MD77Exp.ert). При выгрузке убедимся, что выгружаются все системные поля. После этого загрузим полученный файл в базу «Конвертация данных». После обновления структуры справочник должен отобразить поле Родитель, что позволит сопоставить его с аналогичным полем из 1С 8.

Шаг 2: Программный поиск элемента внутри родителя

Если автоматическое сопоставление не дает нужного результата или требуется сложный поиск (например, найти элемент по наименованию строго внутри определенной папки, найденной по коду), воспользуемся обработчиками в КД. Рассмотрим пример кода, который можно применить в событии «Поля поиска» на стороне загрузки (в коде 7.7):


// Создаем объект справочника для поиска группы
СпрГруппа = СоздатьОбъект("Справочник.ТарифныеРазряды");
Если СпрГруппа.НайтиПоКоду(КодРодителяИзФайла) = 1 Тогда
    Если СпрГруппа.ЭтоГруппа() = 1 Тогда
        // Устанавливаем фильтр поиска внутри найденной группы
        СпрЭлемент = СоздатьОбъект("Справочник.ТарифныеРазряды");
        СпрЭлемент.ИспользоватьРодителя(СпрГруппа.ТекущийЭлемент());
        Если СпрЭлемент.НайтиПоНаименованию(НаименованиеИзФайла, 0, 1) = 1 Тогда
            // Элемент найден
            Найдено = 1;
            Объект = СпрЭлемент.ТекущийЭлемент();
        КонецЕсли;
    КонецЕсли;
КонецЕсли;

Разберем, что здесь происходит. Метод ИспользоватьРодителя() является ключевым для 7.7. Он ограничивает область поиска или выборки конкретной веткой дерева. Второй параметр в НайтиПоНаименованию (значение 0) означает, что мы ищем внутри установленного родителя, а не по всему справочнику.

Шаг 3: Использование штатных правил перехода

Проанализируем ситуацию с переносом ЗУП -> ЗиК. Фирма 1С часто выпускает готовые правила для «обратного» перехода или синхронизации. Посмотрим, где их найти:

  1. Перейдем в каталог установки шаблона конфигурации ЗУП 2.5 (обычно это папка в AppData или программных файлах).
  2. Найдем подкаталог \Convert.
  3. Там часто хранятся файлы правил (XML), предназначенные для обмена с 7.7.

Загрузим эти правила в свою «Конвертацию данных». Это позволит увидеть, как методисты 1С решили проблему поиска Тарифных разрядов. Зачастую там реализованы специализированные алгоритмы, учитывающие, что в ЗиК 7.7 разряды могут быть подчинены Тарифным сеткам (выступающим в роли владельцев), а не просто находиться в папках.

Шаг 4: Работа с неопределенными типами данных

В конфигурации «Зарплата и Кадры 7.7» часто встречается реквизит Оклад (или Ставка), который имеет Неопределенный тип. Он может принимать как числовое значение, так и ссылку на справочник. При конвертации это вызывает дополнительные сложности.

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


// Пример для 7.7, если нужно программно назначить значение
Если ТипЗначенияИзФайла = "Справочник" Тогда
    // Сначала находим объект
    Объект.Оклад = СозданныйОбъектСправочника;
Иначе
    Объект.Оклад = Число(ЗначениеИзФайла);
КонецЕсли;

Метод поиска по «Полному коду»

Если иерархия в справочнике жесткая, можно применить упрощенный технический прием. В 1С 7.7 метод НайтиПоКоду может работать с учетом иерархии, если коды уникальны в пределах всего справочника. Если же уникальность только внутри группы, можно при выгрузке формировать «составной код» (код родителя + код элемента) и использовать его как единственный идентификатор поиска. Это избавит от необходимости использовать ИспользоватьРодителя() в сложных правилах.

Важный момент: При выгрузке иерархии в 7.7 крайне важно соблюдать порядок объектов в XML. Сначала должны выгружаться и создаваться группы (папки), и только потом — элементы, которые в них входят. В КД 2.0 это настраивается приоритетом выполнения ПКО.

Подведем итог: отсутствие реквизита Родитель в визуальном списке 7.7 — это лишь особенность интерфейса конфигуратора. Используя программные методы ИспользоватьРодителя(), правильную загрузку структуры метаданных и обращаясь к штатным правилам от 1С, вы сможете успешно реализовать перенос любой сложности.

← На главную