Приветствую Вас ГостьСуббота, 04.05.2024, 08:33

Каталог статей


Конвертация. Запомнить ключ ранее выгруженного объекта и избавиться от многократной выгрузки объекта.

Когда выгружается Ссылка и если не стоит в ПКО свойство "Не Запоминать Выгруженные Объекты", то выгруженный объект загружается в структуру выгруженных объектов (тип Соответствие). В этом случае, если встречается ссылка на данный объект, то он не выгружается повторно, а подставляется значение из этой структуры. В файле выгрузки это выглядит так: <Ссылка Нпп="3"><Свойство Имя="Наименование" Тип="Строка"> <Значение>Пересечения</Значение>...</Ссылка>. Здесь Нпп - это ключ в соответствии ЗагруженныеОбъекты, из которого определяется ссылка на ранее созданный объект при загрузке, без дополнительного поиска.

А вот когда выгружаем не ссылочный тип в приемник ссылочного типа, например таблицу значений в справочник, то соответствие выгруженных объектов не заполняется и при появлении в выгрузке ссылки на ранее выгруженные данные, записывается узел для повторного поиска/создания объекта. Чтобы этого избежать, надо в методе "Перед выгрузкой" правила конвертации объекта установить значение параметров:

  • КлючВыгружаемыхДанных по правилам формирования ключа структуры
  • ЗапоминатьВыгруженные = Истина

 

Пример: нужно выгрузить иерархическую структуру в справочник, причем источник формируется по производному алгоритму по таблице значений. В таблице значений сначала выгружается группа, а потом элементы группы. В каждой записи элемента группы есть реквизит "Родитель", который ссылается на ранее созданную группу. Так как источник не ссылочный тип, то надо найти группу по её наименованию.

1. Настроим правила конвертации свойств. Родителя будем искать тем же правилом.

Поиск объекта настроен по свойства "Наименование" и "Это группа" так как справочник иерархический.

Так как источником данных может быть как строка таблицы значений, так и строка (поиск группы по её названию) то прежде всего заполняем правила заполнения этих полей:

Наименование. Перед выгрузкой:

Если ТипЗнч(Источник) = Тип("Строка") Тогда
    Значение = Источник;
КонецЕсли;

Если источник строка, то считаем, что ищем группу по её названию, в противном случае значение автоматически заполняется из одноименной колонки таблицы значений.

Это группа. Перед выгрузкой:

Если ТипЗнч(Источник) = Тип("Строка") Тогда // если источник строка, то ищем группу по имени и свойство "ЭтоГруппа" = Истина
    Значение = Истина;
КонецЕсли

Теперь в правиле конвертации объекта задаем свойства и метод "Перед выгрузкой":

    Если ТипЗнч(Источник) = Тип("СтрокаТаблицыЗначений") Тогда
        КлючВыгружаемыхДанных = "ТипЭСГП " + Источник.Наименование;
        ЗапоминатьВыгруженные = Истина;
    ИначеЕсли ТипЗнч(Источник) = Тип("Строка") Тогда
        КлючВыгружаемыхДанных = "ТипЭСГП " + Источник;
        ЗапоминатьВыгруженные = Истина;         
    КонецЕсли;

Чтобы сформировать уникальный ключ используем наименование и прибавляем к нему некоторый префикс. В данном случае "ТипЭСГП ". Так как выгружаемые данные - соответствие, то прбелы и служебные символы убирать не надо.

Определяем тип источника: если строка, то формируем КлючВыгружаемыхДанных по источнику, если строка таблицы значений, то по соответствующей колонке. Когда в первый раз выгружаем объект, то он добавляется в соответствие выгруженных объектов. В дальнейшем, по соответствию получают нужное значение.

Сравним полученные файлы с заполненным КлючВыгружаемыхДанных и без него.

Исходные данные:

Наименование Родитель ЭтоГруппа ПропускаетГаз ИндексКартинки
Участки газопроводов   Истина Ложь 13
Преграды Участки газопроводов Ложь Ложь 0
Пересечения Участки газопроводов Ложь Ложь 0

Файл выгрузки с установкой КлючВыгружаемыхДанных. Выгружено 3 объекта:

<Объект Нпп="1" Тип="СправочникСсылка.ТипыЭлементовСетиГП" ИмяПравила="ТипыЭлементовСетиГП_ПРедварительныеДанные" НеЗамещать="true"><Ссылка Нпп="1"><Свойство Имя="Наименование" Тип="Строка">
    <Значение>Участки газопроводов</Значение>
</Свойство><Свойство Имя="ЭтоГруппа" Тип="Булево">
    <Значение>true</Значение>
</Свойство>
</Ссылка><Свойство Имя="ПропускаетГаз" Тип="Булево">
    <Значение>false</Значение>
</Свойство><Свойство Имя="Родитель" Тип="СправочникСсылка.ТипыЭлементовСетиГП">
    <Пусто/>
</Свойство><Свойство Имя="ИндексКартинки" Тип="Число">
    <Значение>13</Значение>
</Свойство>
</Объект>
<Объект Нпп="2" Тип="СправочникСсылка.ТипыЭлементовСетиГП" ИмяПравила="ТипыЭлементовСетиГП_ПРедварительныеДанные" НеЗамещать="true"><Ссылка Нпп="2"><Свойство Имя="Наименование" Тип="Строка">
    <Значение>Преграды</Значение>
</Свойство><Свойство Имя="ЭтоГруппа" Тип="Булево">
    <Значение>false</Значение>
</Свойство>
</Ссылка><Свойство Имя="ПропускаетГаз" Тип="Булево">
    <Значение>false</Значение>
</Свойство><Свойство Имя="Родитель" Тип="СправочникСсылка.ТипыЭлементовСетиГП"><Ссылка Нпп="1"><Свойство Имя="Наименование" Тип="Строка">
    <Значение>Участки газопроводов</Значение>
</Свойство><Свойство Имя="ЭтоГруппа" Тип="Булево">
    <Значение>true</Значение>
</Свойство>
</Ссылка>

</Свойство><Свойство Имя="ИндексКартинки" Тип="Число">
    <Пусто/>
</Свойство>
</Объект>
<Объект Нпп="3" Тип="СправочникСсылка.ТипыЭлементовСетиГП" ИмяПравила="ТипыЭлементовСетиГП_ПРедварительныеДанные" НеЗамещать="true"><Ссылка Нпп="3"><Свойство Имя="Наименование" Тип="Строка">
    <Значение>Пересечения</Значение>
</Свойство><Свойство Имя="ЭтоГруппа" Тип="Булево">
    <Значение>false</Значение>
</Свойство>
</Ссылка><Свойство Имя="ПропускаетГаз" Тип="Булево">
    <Значение>false</Значение>
</Свойство><Свойство Имя="Родитель" Тип="СправочникСсылка.ТипыЭлементовСетиГП"><Ссылка Нпп="1"><Свойство Имя="Наименование" Тип="Строка">
    <Значение>Участки газопроводов</Значение>

</Свойство><Свойство Имя="ЭтоГруппа" Тип="Булево">
    <Значение>true</Значение>
</Свойство>
</Ссылка>

</Свойство><Свойство Имя="ИндексКартинки" Тип="Число">
    <Пусто/>
</Свойство>
</Объект>

Файл выгрузки без установленного КлючВыгружаемыхДанных. Выгружено 5 объектов по тем же данным: Объект группа Участки газопроводов выгружается 3 раза: один раз вначале,потом для каждого подчиненного объекта.

<Объект Нпп="1" Тип="СправочникСсылка.ТипыЭлементовСетиГП" ИмяПравила="ТипыЭлементовСетиГП_ПРедварительныеДанные" НеЗамещать="true"><Ссылка><Свойство Имя="Наименование" Тип="Строка">
    <Значение>Участки газопроводов</Значение>
</Свойство><Свойство Имя="ЭтоГруппа" Тип="Булево">
    <Значение>true</Значение>
</Свойство>
</Ссылка><Свойство Имя="ПропускаетГаз" Тип="Булево">
    <Значение>false</Значение>
</Свойство><Свойство Имя="Родитель" Тип="СправочникСсылка.ТипыЭлементовСетиГП">
    <Пусто/>
</Свойство><Свойство Имя="ИндексКартинки" Тип="Число">
    <Значение>13</Значение>
</Свойство>
</Объект>
<Объект Нпп="3" Тип="СправочникСсылка.ТипыЭлементовСетиГП" ИмяПравила="ТипыЭлементовСетиГП_ПРедварительныеДанные" НеЗамещать="true"><Ссылка><Свойство Имя="Наименование" Тип="Строка">
    <Значение>Участки газопроводов</Значение>
</Свойство><Свойство Имя="ЭтоГруппа" Тип="Булево">
    <Значение>true</Значение>
</Свойство>
</Ссылка><Свойство Имя="ИндексКартинки" Тип="Число">
    <Значение>13</Значение>
</Свойство>
</Объект>
<Объект Нпп="2" Тип="СправочникСсылка.ТипыЭлементовСетиГП" ИмяПравила="ТипыЭлементовСетиГП_ПРедварительныеДанные" НеЗамещать="true"><Ссылка><Свойство Имя="Наименование" Тип="Строка">
    <Значение>Преграды</Значение>
</Свойство><Свойство Имя="ЭтоГруппа" Тип="Булево">
    <Значение>false</Значение>
</Свойство>
</Ссылка><Свойство Имя="ПропускаетГаз" Тип="Булево">
    <Значение>false</Значение>
</Свойство><Свойство Имя="Родитель" Тип="СправочникСсылка.ТипыЭлементовСетиГП"><Ссылка><Свойство Имя="Наименование" Тип="Строка">
    <Значение>Участки газопроводов</Значение>
</Свойство><Свойство Имя="ЭтоГруппа" Тип="Булево">
    <Значение>true</Значение>
</Свойство>
</Ссылка>
</Свойство><Свойство Имя="ИндексКартинки" Тип="Число">
    <Пусто/>
</Свойство>
</Объект>
<Объект Нпп="5" Тип="СправочникСсылка.ТипыЭлементовСетиГП" ИмяПравила="ТипыЭлементовСетиГП_ПРедварительныеДанные" НеЗамещать="true"><Ссылка><Свойство Имя="Наименование" Тип="Строка">
    <Значение>Участки газопроводов</Значение>
</Свойство><Свойство Имя="ЭтоГруппа" Тип="Булево">
    <Значение>true</Значение>
</Свойство>
</Ссылка><Свойство Имя="ИндексКартинки" Тип="Число">
    <Значение>13</Значение>
</Свойство>
</Объект>
<Объект Нпп="4" Тип="СправочникСсылка.ТипыЭлементовСетиГП" ИмяПравила="ТипыЭлементовСетиГП_ПРедварительныеДанные" НеЗамещать="true"><Ссылка><Свойство Имя="Наименование" Тип="Строка">
    <Значение>Пересечения</Значение>
</Свойство><Свойство Имя="ЭтоГруппа" Тип="Булево">
    <Значение>false</Значение>
</Свойство>
</Ссылка><Свойство Имя="ПропускаетГаз" Тип="Булево">
    <Значение>false</Значение>
</Свойство><Свойство Имя="Родитель" Тип="СправочникСсылка.ТипыЭлементовСетиГП"><Ссылка><Свойство Имя="Наименование" Тип="Строка">
    <Значение>Участки газопроводов</Значение>
</Свойство><Свойство Имя="ЭтоГруппа" Тип="Булево">
    <Значение>true</Значение>
</Свойство>
</Ссылка>
</Свойство><Свойство Имя="ИндексКартинки" Тип="Число">
    <Пусто/>
</Свойство>
</Объект>


В данном случае, сократить количество выгруженных объектов можно было так же установив у ПКО свойство "Не выгружать объекты свойств источника по ссылкам". При этом, если приемник свойства ссылочный тип то выгружаются только поля для поиска. В этом случае файл выгрузки выглядит так:


<Объект Нпп="1" Тип="СправочникСсылка.ТипыЭлементовСетиГП" ИмяПравила="ТипыЭлементовСетиГП_ПРедварительныеДанные" НеЗамещать="true"><Ссылка><Свойство Имя="Наименование" Тип="Строка">
    <Значение>Участки газопроводов</Значение>
</Свойство><Свойство Имя="ЭтоГруппа" Тип="Булево">
    <Значение>true</Значение>
</Свойство>
</Ссылка><Свойство Имя="ПропускаетГаз" Тип="Булево">
    <Значение>false</Значение>
</Свойство><Свойство Имя="Родитель" Тип="СправочникСсылка.ТипыЭлементовСетиГП">
    <Пусто/>
</Свойство><Свойство Имя="ИндексКартинки" Тип="Число">
    <Значение>13</Значение>
</Свойство>
</Объект>
<Объект Нпп="2" Тип="СправочникСсылка.ТипыЭлементовСетиГП" ИмяПравила="ТипыЭлементовСетиГП_ПРедварительныеДанные" НеЗамещать="true"><Ссылка><Свойство Имя="Наименование" Тип="Строка">
    <Значение>Преграды</Значение>
</Свойство><Свойство Имя="ЭтоГруппа" Тип="Булево">
    <Значение>false</Значение>
</Свойство>
</Ссылка><Свойство Имя="ПропускаетГаз" Тип="Булево">
    <Значение>false</Значение>
</Свойство><Свойство Имя="Родитель" Тип="СправочникСсылка.ТипыЭлементовСетиГП"><Ссылка><Свойство Имя="Наименование" Тип="Строка">
    <Значение>Участки газопроводов</Значение>
</Свойство><Свойство Имя="ЭтоГруппа" Тип="Булево">
    <Значение>true</Значение>
</Свойство>
</Ссылка>

</Свойство><Свойство Имя="ИндексКартинки" Тип="Число">
    <Пусто/>
</Свойство>
</Объект>
<Объект Нпп="4" Тип="СправочникСсылка.ТипыЭлементовСетиГП" ИмяПравила="ТипыЭлементовСетиГП_ПРедварительныеДанные" НеЗамещать="true"><Ссылка><Свойство Имя="Наименование" Тип="Строка">
    <Значение>Пересечения</Значение>
</Свойство><Свойство Имя="ЭтоГруппа" Тип="Булево">
    <Значение>false</Значение>
</Свойство>
</Ссылка><Свойство Имя="ПропускаетГаз" Тип="Булево">
    <Значение>false</Значение>
</Свойство><Свойство Имя="Родитель" Тип="СправочникСсылка.ТипыЭлементовСетиГП"><Ссылка><Свойство Имя="Наименование" Тип="Строка">
    <Значение>Участки газопроводов</Значение>
</Свойство><Свойство Имя="ЭтоГруппа" Тип="Булево">
    <Значение>true</Значение>
</Свойство>
</Ссылка>

</Свойство><Свойство Имя="ИндексКартинки" Тип="Число">
    <Пусто/>
</Свойство>
</Объект>

Вроде похоже на первый вариант (здесь не указан Нпп), но при загрузке будет происходит каждый раз поиск нужного значения по полям поиска, а в первом случае, нужная ссылка будет получаться из соответствия, что значительно быстрее.

Категория: Взаимодействие с другими базами, приложениями и источниками данных | Добавил: leshic (25.11.2022)
Просмотров: 536 | Рейтинг: 0.0/0
Всего комментариев: 0
Имя *:
Email *:
Код *:
Вход на сайт
Поиск
Категории раздела
СКД [48]
Регистры [7]
Формы [40]
Администрирование [34]
Запросы [10]
Объекты конфигурации и типы данных [20]
Взаимодействие с другими базами, приложениями и источниками данных [16]
Программирование [29]
Статистика

Онлайн всего: 1
Гостей: 1
Пользователей: 0