8.х ОБМЕН Правила обмена. Синхронизация регистра сведений (независимый, непериодический).

Тема в разделе "Обмен данными в "1С:Предприятие 8"", создана пользователем serpanik, 23 янв 2019.

  1. TopicStarter Overlay
    serpanik
    Offline

    serpanik

    Регистрация:
    17 авг 2011
    Сообщения:
    6
    Симпатии:
    0
    Баллы:
    1
    Имеется две базы с одинаковыми по структуре регистрами сведений (непериодический, независимый). Авторегистрация включена, но срабатывает она после выполнения алгоритма в правилах обмена (никакими другими способами изменения объектов не регистрируются).
    После этого идет синхронизация регистров. Дело в том, что при удалении в источнике, в приемнике никак это удаление не происходит. Может кто пнет относительно начинающего в правилах обмена в нужном направлении?
    Была мысль с помощью ТЗ передавать записи, которые потом в приемнике надо удалить, но пока никак не пойму как это сделать, может влияет то, что в этой ТЗ будут ссылочные данные....
    Была еще мысль каким-то образом переловить регистрацию удаления записи в источнике... Одним словом уже бьюсь долгое время и никак что-то путное в голову не приходит.
    Если не трудно, дайте нужный вектор, может есть какие примеры подобного, но я ничего в инете не нашел, хотя очень старался. :)
    Заранее спасибо.
  2. nomad_irk
    Online

    nomad_irk Гуру в 1С

    Регистрация:
    20 окт 2008
    Сообщения:
    9.542
    Симпатии:
    989
    Баллы:
    204
    Изменения регистра в базе-источнике вы каким образом фиксируете?
  3. TopicStarter Overlay
    serpanik
    Offline

    serpanik

    Регистрация:
    17 авг 2011
    Сообщения:
    6
    Симпатии:
    0
    Баллы:
    1
    В алгоритме присутствует некий запрос, который сравнивает текущие цены (в данном случае) с имеющимися в регистре-источнике. Потом либо удаляет либо перезаписывает в источнике информацию. Та, которая перезаписана, попадает в приемник, а та, которая удалена, никаким образом не фиксируется в приемнике. При изменении и удалении, таким образом, происходит регистрация изменений. Вот я и хочу, чтобы удаленные в источнике наборы записей удалялись и в приемнике соответственно.
    З.Ы. Алгоритм выполняется в обработчике ПередВыгрузкойДанных самой конвертации...
  4. nomad_irk
    Online

    nomad_irk Гуру в 1С

    Регистрация:
    20 окт 2008
    Сообщения:
    9.542
    Симпатии:
    989
    Баллы:
    204
    Добавьте признак у удаляемых записей и вызывайте нужный метод в ПередЗагрузкой данных, удаляя записи регистра в базе-приемнике, и отказываясь от дальнейшей загрузки данных, устанавливая признак Отказ в значение Истина.
  5. TopicStarter Overlay
    serpanik
    Offline

    serpanik

    Регистрация:
    17 авг 2011
    Сообщения:
    6
    Симпатии:
    0
    Баллы:
    1
    "Признак у удаляемых записей" - в ПКС добавить параметр? Я и хотел создать ТЗ, а потом ее передать в приемник с параметрами тех записей, которые должны удаляться. Просто не настолько силен в правилах обмена пока, чтобы с одного предложения понять. :)
  6. nomad_irk
    Online

    nomad_irk Гуру в 1С

    Регистрация:
    20 окт 2008
    Сообщения:
    9.542
    Симпатии:
    989
    Баллы:
    204
    Все верно, в ТЗ, в колонке, далее проверяете значение этой колонки в каждой строке и выполняете соответствующее действие.
  7. TopicStarter Overlay
    serpanik
    Offline

    serpanik

    Регистрация:
    17 авг 2011
    Сообщения:
    6
    Симпатии:
    0
    Баллы:
    1
    Добился того, что сформировалась ТЗ и заполнилась данными, т.е. значениями измерений, для которых нужно в приемнике удалять записи из регистра сведений. В Приемник ТЗ передал, но возникла проблема: в ТЗ присутствовали ссылочные данные, так вот они и не передались. Теперь ищу оптимальный способ передать эту ТЗ, в том числе, чтобы удобно было на стороне приемника с ней работать для отбора нужной записи и удаления её из приемника... Как быть с корректным переносом ТЗ из источника в приемник с учетом того, что в ней имеются ссылочные данные?
  8. nomad_irk
    Online

    nomad_irk Гуру в 1С

    Регистрация:
    20 окт 2008
    Сообщения:
    9.542
    Симпатии:
    989
    Баллы:
    204
    Переносить ссылки в виде строкового представления GUID, либо те значения примитивного типа, по которым ссылки на объекты определяют однозначно в базе-приемнике.
    serpanik нравится это.
  9. TopicStarter Overlay
    serpanik
    Offline

    serpanik

    Регистрация:
    17 авг 2011
    Сообщения:
    6
    Симпатии:
    0
    Баллы:
    1
    Решил свою задачу таким образом (может кому-то пригодится):
    1. В обработчике конвертации ПередВыгрузкойДанных создаю таблицу значений и объявляю ее как параметр.
    Код:
    УдаляемыеЗаписиМаршруты = Новый ТаблицаЗначений;
    УдаляемыеЗаписиМаршруты.Колонки.Добавить("Контрагент", ОбщегоНазначения.ПолучитьОписаниеТиповСтроки(36));
    УдаляемыеЗаписиМаршруты.Колонки.Добавить("ТорговаяТочка", ОбщегоНазначения.ПолучитьОписаниеТиповСтроки(36));
    УдаляемыеЗаписиМаршруты.Колонки.Добавить("ТорговыйАгент", ОбщегоНазначения.ПолучитьОписаниеТиповСтроки(36));
    Параметры.Вставить("УдаляемыеЗаписиМаршруты", УдаляемыеЗаписиМаршруты);
    

    Три колонки имеют тип строковый, чтобы потом туда вставить Уникальный идентификатор объекта, потому что ссылочные типы передать через параметр из источника в приемник не получится.

    2. У меня в Алгоритме происходит обработка регистра сведений, где я либо удаляю оттуда данные, либо добавляю/изменяю. При удалении в алгоритме я заполняю ТЗ:
    Код:
    УдаляемаяЗапись = УдаляемыеЗаписиМаршруты.Добавить();
    УдаляемаяЗапись.Контрагент    = Строка(НаборЗаписей[0].Контрагент.УникальныйИдентификатор());
    УдаляемаяЗапись.ТорговаяТочка = Строка(НаборЗаписей[0].ТорговаяТочка.УникальныйИдентификатор());
    УдаляемаяЗапись.ТорговыйАгент = Строка(НаборЗаписей[0].ТорговыйАгент.УникальныйИдентификатор());
    

    3. В обработчике конвертации ПослеВыгрузкиДанных помещаю ТЗ в хранилище значений и передаю это хранилище в параметры.
    Код:
    ПараметрХранилищеМаршруты = Новый ХранилищеЗначения(Параметры.УдаляемыеЗаписиМаршруты);
    Параметры.Вставить("ПараметрХранилищеМаршруты", ПараметрХранилищеМаршруты);
    ПередатьОдинПараметрВПриемник("ПараметрХранилищеМаршруты", ЗначениеВСтрокуВнутр(ПараметрХранилищеМаршруты));
    
    Здесь можно использовать сжатие, когда помещаем (и потом будем извлекать) в хранилище значений. Я не стал. :)

    4. В обработчике конвертации ПослеЗагрузкиДанных мы извлекаем из Хранилища значений нашу ТЗ и производим удаление в приемнике, используя данные из этой ТЗ:
    Код:
    стрПараметрХранилищеМаршруты = ЗначениеИзСтрокиВнутр(Параметры.ПараметрХранилищеМаршруты);
    пУдаляемыеЗаписиМаршруты = стрПараметрХранилищеМаршруты.Получить();
    Параметры.Вставить("УдаляемыеЗаписиМаршруты", пУдаляемыеЗаписиМаршруты);
    Если Параметры.УдаляемыеЗаписиМаршруты.Количество()>0 Тогда
        Запрос = Новый Запрос;
        Запрос.Текст = "ВЫБРАТЬ
        |    ТЗ.*
        |ПОМЕСТИТЬ ВТ_ТЗ
        |ИЗ
        |    &ТЗ КАК ТЗ
        |;
        |
        |////////////////////////////////////////////////////////////////////////////////
        |ВЫБРАТЬ
        |    ВТ_ТЗ.*
        |ИЗ
        |    ВТ_ТЗ КАК ВТ_ТЗ
        |";
        Запрос.УстановитьПараметр("ТЗ",Параметры.УдаляемыеЗаписиМаршруты);
        Результат = Запрос.Выполнить();
       
        Выборка = Результат.Выбрать();
        Если НЕ Результат.Пустой() Тогда
            Пока Выборка.Следующий() Цикл
                НаборУдаляемыхЗаписей = РегистрыСведений.Маршруты.СоздатьНаборЗаписей();
                НаборУдаляемыхЗаписей.Отбор.Контрагент.Установить(Справочники.Контрагенты.ПолучитьСсылку(Новый УникальныйИдентификатор(Выборка.Контрагент)));
                НаборУдаляемыхЗаписей.Отбор.ТорговаяТочка.Установить(Справочники.ТорговыеТочки.ПолучитьСсылку(Новый УникальныйИдентификатор(Выборка.ТорговаяТочка)));
                НаборУдаляемыхЗаписей.Отбор.ТорговыйАгент.Установить(Справочники.ТорговыеАгенты.ПолучитьСсылку(Новый УникальныйИдентификатор(Выборка.ТорговыйАгент)));
                НаборУдаляемыхЗаписей.Записать();
            КонецЦикла; 
        КонецЕсли; 
    КонецЕсли;
    

    Вот таким образом. Допускаю, что код не оптимальный, но работает.
    Думаю, что можно было бы и без запроса, а просто перебирая в цикле строки ТЗ, но и этот вариант с запросом тоже имеет право на жизнь. ИМХО. ;)

    Хочу выразить особую и искреннюю благодарность за терпение и подсказки nomad_irk