Форум 1С
Программистам, бухгалтерам, администраторам, пользователям
Задай вопрос - получи решение проблемы
21 ноя 2024, 20:47

Перенос данных справочника в рамках одной базы

Автор Иванъ Юрьевичъ, 28 мар 2018, 12:08

0 Пользователей и 1 гость просматривают эту тему.

Иванъ Юрьевичъ

Здравствуйте, нужна подсказка, являюсь новичком, задача такая, данные справочника физические лица с сохранением иерархии перенести в справочник физические лица новые в рамках одной базы, то есть создать синхронизацию при этом чтобы данные не дублировались, обработку вывести в интерфейс и создать кнопку синхронизация. Каким способом можно создать подобный перенос данных? какой код прописывать в обработке, подскажите пожалуйста. 8.3

alex0402

1) Нужно определиться с реквизитами для синхронизации.
2) Запрос левым соединением по эти реуизитам
3) условие НовыйСправочник.Ссылка is null
4) Выборка. и в цикле создать недостающие элементы и группы нового справочника.
Спасибо за Сказать спасибо

alexandr_ll

С помощью запроса по справочнику "Физические лица" сформировать таблицу элементов с необходимыми реквизитами. Затем циклом по полученной таблице сравнить по уникальному идентификатору (по коду, наименованию или еще по чему-нибудь) со справочником "Физические лица новые", если дубли отсутствуют, добавлять элементы в новый справочник

andrig

Цитата: alex0402 от 28 мар 2018, 12:25
1) Нужно определиться с реквизитами для синхронизации.
2) Запрос левым соединением по эти реуизитам
3) условие НовыйСправочник.Ссылка is null
4) Выборка. и в цикле создать недостающие элементы и группы нового справочника.

Скажите пожалуйста. Копирует без дублей, но если новая группа то копирует,а если новый элемент
то выдает ошибку:
{Обработка.Синхронизировать.Форма.Форма.Форма(51)}: Значение не является значением объектного типа (Ссылка)
            ТРодитель = НоваяГруппа.Ссылка;   

&НаКлиенте
Процедура СинхронизироватьСправочник(Команда)
    СинхронизироватьСправочникНаСервере();
КонецПроцедуры
&НаСервере
Процедура СинхронизироватьСправочникНаСервере()
       
    Запрос = Новый Запрос;
    Запрос.Текст =
        "ВЫБРАТЬ
        |   ФизическиеЛица.Ссылка,
        |   ФизическиеЛица.Родитель,
        |   ФизическиеЛица.ЭтоГруппа КАК ЭтоГруппа,
        |   ФизическиеЛица.Наименование КАК Наименование,
        |   ФизическиеЛица.ДатаРождения,
        |   ФизическиеЛица.Пол,
        |   ФизическиеЛица.ИНН
        |ИЗ
        |   Справочник.ФизическиеЛица КАК ФизическиеЛица
        |       ЛЕВОЕ СОЕДИНЕНИЕ Справочник.ФизическиеЛицаНовые КАК ФизическиеЛицаНовые
        |       ПО ФизическиеЛица.Наименование = ФизическиеЛицаНовые.Наименование
        |           И ФизическиеЛица.ЭтоГруппа = ФизическиеЛицаНовые.ЭтоГруппа
        |ГДЕ
        |   ФизическиеЛицаНовые.Наименование ЕСТЬ NULL
        |АВТОУПОРЯДОЧИВАНИЕ";
   
    РезультатЗапроса = Запрос.Выполнить();
   
   
  Выборка = РезультатЗапроса.Выбрать();
    Пока Выборка.Следующий() Цикл
       
        Если Выборка.ЭтоГруппа Тогда
           
            НоваяГруппа = Справочники.ФизическиеЛицаНовые.СоздатьГруппу();
           
            НоваяГруппа.Наименование = Выборка.Наименование;
                     НоваяГруппа.Записать();   

           
        иначе
            НовыйЭлемент = Справочники.ФизическиеЛицаНовые.СоздатьЭлемент();
           
            ТРодитель = НоваяГруппа.Ссылка;       
            ЗаполнитьЗначенияСвойств(НовыйЭлемент,Выборка);
           
             Если ЗначениеЗаполнено(Выборка.Родитель) Тогда
            НовыйЭлемент.Родитель = ТРодитель;   
           
         
            КонецЕсли;
                 
                   НовыйЭлемент.Записать();
        КонецЕсли;
       
    КонецЦикла;
   
КонецПроцедуры

alex0402

Цитата: andrig от 03 апр 2018, 14:29Если Выборка.ЭтоГруппа Тогда
В Этой ветке  НоваяГруппа определяется.
в этой
Цитата: andrig от 03 апр 2018, 14:29иначе

скорее всего Неопределено. С этим нужно что-то делать.
Спасибо за Сказать спасибо

andrig

Цитата: alex0402 от 03 апр 2018, 15:28скорее всего Неопределено. С этим нужно что-то делать.
А как можно очистить справочник перед записью?

alex0402

Цитата: andrig от 05 апр 2018, 08:54А как можно очистить справочник перед записью?

Выборка = Справочники.Имя.Выбрать();
Пока Выборка.Следующий() Цикл
    Объект = Выборка.ПолучитьОбъект();
    Объект.Удалить();
КонецЦикла


но это слишком затратно каждый раз переписывать весь справочник. Лучше отладить синхронизацию...
Спасибо за Сказать спасибо

andrig

Цитата: alex0402 от 05 апр 2018, 10:32но это слишком затратно каждый раз переписывать весь справочник. Лучше отладить синхронизацию...

Согласен с Вами.
Но почему проблема  с ссылкой возникает только при записи нового элемента, а при записи в пустой справочник - нет.

alex0402

Цитата: andrig от 05 апр 2018, 10:38а при записи в пустой справочник - нет.

потому что, когда справочник пустой всегда отрабатывает сначала
Если Тогда
Потом Иначе

а если справочник заполнен, то Если Тогда не отрабатывает, а сразу Иначе.

И тут встает вопрос: а все ли элементы попадают в свои папки?

предлагаю строку
Цитата: andrig от 03 апр 2018, 14:29ТРодитель = НоваяГруппа.Ссылка

заменить на
    ТРодитель = Выборка.Родитель;
Спасибо за Сказать спасибо

andrig

Цитата: alex0402 от 05 апр 2018, 12:01
заменить на
   
Код: [Выделить]
ТРодитель = Выборка.Родитель;
Записывает все элементы без групп.

Теги:

Похожие темы (5)

Рейтинг@Mail.ru

Поиск