Перенос данных между платформами 1С 8.х и 1С 7.7 часто преподносит сюрпризы, особенно когда речь идет об иерархических справочниках. Программисты нередко сталкиваются с ситуацией, когда в конфигураторе 1С 7.7 у справочника визуально отсутствует реквизит Родитель, хотя в режиме предприятия иерархия (папки и элементы) отчетливо видна. Это создает сложности при настройке правил в конфигурации «Конвертация данных 2.0».
В данной статье мы подробно разберем, как правильно организовать поиск и создание элементов с учетом иерархии при выгрузке из ЗУП 8 в ЗиК 7.7, проанализируем системные особенности платформы 7.7 и рассмотрим программные способы решения задачи.
Для начала проанализируем причину, по которой реквизит Родитель может «отсутствовать». В платформе 1С 7.7 иерархия реализована иначе, чем в 8.х. Рассмотрим основные моменты:
Родитель является предопределенным (системным). В конфигураторе 7.7 он не отображается в общем списке реквизитов справочника на вкладке «Реквизиты». Чтобы убедиться в его наличии, необходимо открыть свойства справочника и проверить вкладку «Группировка» или тип справочника (он должен быть «Иерархический»).Родитель доступен программно всегда. Если же используется подчиненность (один справочник подчинен другому), то вместо родителя используется понятие Владелец.Родитель может быть невидимым для настройки.Прежде чем писать сложный код поиска, выполним правильную подготовку метаданных. Рассмотрим правильный алгоритм действий:
Воспользуемся обработкой выгрузки описания конфигурации для 7.7 (обычно это MD77Exp.ert). При выгрузке убедимся, что выгружаются все системные поля. После этого загрузим полученный файл в базу «Конвертация данных». После обновления структуры справочник должен отобразить поле Родитель, что позволит сопоставить его с аналогичным полем из 1С 8.
Если автоматическое сопоставление не дает нужного результата или требуется сложный поиск (например, найти элемент по наименованию строго внутри определенной папки, найденной по коду), воспользуемся обработчиками в КД. Рассмотрим пример кода, который можно применить в событии «Поля поиска» на стороне загрузки (в коде 7.7):
// Создаем объект справочника для поиска группы
СпрГруппа = СоздатьОбъект("Справочник.ТарифныеРазряды");
Если СпрГруппа.НайтиПоКоду(КодРодителяИзФайла) = 1 Тогда
Если СпрГруппа.ЭтоГруппа() = 1 Тогда
// Устанавливаем фильтр поиска внутри найденной группы
СпрЭлемент = СоздатьОбъект("Справочник.ТарифныеРазряды");
СпрЭлемент.ИспользоватьРодителя(СпрГруппа.ТекущийЭлемент());
Если СпрЭлемент.НайтиПоНаименованию(НаименованиеИзФайла, 0, 1) = 1 Тогда
// Элемент найден
Найдено = 1;
Объект = СпрЭлемент.ТекущийЭлемент();
КонецЕсли;
КонецЕсли;
КонецЕсли;
Разберем, что здесь происходит. Метод ИспользоватьРодителя() является ключевым для 7.7. Он ограничивает область поиска или выборки конкретной веткой дерева. Второй параметр в НайтиПоНаименованию (значение 0) означает, что мы ищем внутри установленного родителя, а не по всему справочнику.
Проанализируем ситуацию с переносом ЗУП -> ЗиК. Фирма 1С часто выпускает готовые правила для «обратного» перехода или синхронизации. Посмотрим, где их найти:
AppData или программных файлах).\Convert.Загрузим эти правила в свою «Конвертацию данных». Это позволит увидеть, как методисты 1С решили проблему поиска Тарифных разрядов. Зачастую там реализованы специализированные алгоритмы, учитывающие, что в ЗиК 7.7 разряды могут быть подчинены Тарифным сеткам (выступающим в роли владельцев), а не просто находиться в папках.
В конфигурации «Зарплата и Кадры 7.7» часто встречается реквизит Оклад (или Ставка), который имеет Неопределенный тип. Он может принимать как числовое значение, так и ссылку на справочник. При конвертации это вызывает дополнительные сложности.
Выясним причину ошибки: если мы просто передаем ссылку на справочник в поле неопределенного типа, 7.7 может не понять, к какому именно метаданному относится это значение. Рекомендуется в ПКС (Правилах конвертации свойств) для таких полей использовать обработчик «После загрузки»:
// Пример для 7.7, если нужно программно назначить значение
Если ТипЗначенияИзФайла = "Справочник" Тогда
// Сначала находим объект
Объект.Оклад = СозданныйОбъектСправочника;
Иначе
Объект.Оклад = Число(ЗначениеИзФайла);
КонецЕсли;
Если иерархия в справочнике жесткая, можно применить упрощенный технический прием. В 1С 7.7 метод НайтиПоКоду может работать с учетом иерархии, если коды уникальны в пределах всего справочника. Если же уникальность только внутри группы, можно при выгрузке формировать «составной код» (код родителя + код элемента) и использовать его как единственный идентификатор поиска. Это избавит от необходимости использовать ИспользоватьРодителя() в сложных правилах.
Важный момент: При выгрузке иерархии в 7.7 крайне важно соблюдать порядок объектов в XML. Сначала должны выгружаться и создаваться группы (папки), и только потом — элементы, которые в них входят. В КД 2.0 это настраивается приоритетом выполнения ПКО.
Подведем итог: отсутствие реквизита Родитель в визуальном списке 7.7 — это лишь особенность интерфейса конфигуратора. Используя программные методы ИспользоватьРодителя(), правильную загрузку структуры метаданных и обращаясь к штатным правилам от 1С, вы сможете успешно реализовать перенос любой сложности.