Вход | Регистрация
 

Почему данный код удаляет изменения из плана обмена?

Почему данный код удаляет изменения из плана обмена?
Я
   DTX 4th
 
30.01.20 - 18:50
[1c]    ПланыОбмена.ЗарегистрироватьИзменения(Узел, Группа);
    Выборка = ПланыОбмена.ВыбратьИзменения(Узел, НомерСообщения);
    Сч = 0;
    Пока Выборка.Следующий() Цикл
        Сч = Сч + 1;
        Сообщить(Выборка.Получить());
    КонецЦикла;
    Сообщить("Всего: "+Сч);
    ПланыОбмена.УдалитьРегистрациюИзменений(Узел, НомерСОобщения - 1);
[/1c]

Выдержка из СП:
Если в качестве первого параметра указан одиночный узел, то в параметре может быть указан номер сообщения. В этом случае метод УдалитьРегистрациюИзменений удаляет из всех таблиц регистрации изменений все записи относящиеся к указанному узлу, у которых номер сообщения меньше или равен значению второго параметра.
 
 
   fisher
 
1 - 30.01.20 - 18:58
Почему метод УдалитьРегистрациюИзменений() удаляет изменения? Ну, как бы это сказать... Карма у него такая.
   DTX 4th
 
2 - 30.01.20 - 19:01
(1) Чукча не читатель?

НомерСообщения БОЛЬШЕ (НомерСообщения - 1)

Что противоречит описанию: "метод УдалитьРегистрациюИзменений удаляет из всех таблиц регистрации изменений все записи относящиеся к указанному узлу, у которых номер сообщения меньше или равен значению второго параметра."
   Волшебник
 
Модератор
3 - 30.01.20 - 19:05
(2) Какие Ваши доказательства?
https://www.youtube.com/watch?time_continue=1&v=l4XTAwu668M&feature=emb_title
   DTX 4th
 
4 - 30.01.20 - 19:18
(3) Код:
[1с]
    Если НомерСообщения % 2 = 0 Тогда
        ПланыОбмена.ЗарегистрироватьИзменения(Узел, Группа);
        Сообщить("Регистрируем");
    КонецЕсли;
    Выборка = ПланыОбмена.ВыбратьИзменения(Узел, НомерСообщения);
    Сч = 0;
    Пока Выборка.Следующий() Цикл
        Сч = Сч + 1;
        Сообщить(Выборка.Получить());
    КонецЦикла;
    Сообщить("Всего: "+Сч);
    //ПланыОбмена.УдалитьРегистрациюИзменений(Узел, НомерСОобщения - 1);
    
    Если НомерСообщения % 3 = 0 Тогда
        ПланыОбмена.УдалитьРегистрациюИзменений(Узел, НомерСОобщения - 1);
        Сообщить("Удаляем регистрацию");
        
    КонецЕсли;
    Сообщить(НомерСОобщения);
    Сообщить(Узел);
[/1с]

Служебные сообщения:
[1с]
Регистрируем
Номенклатура1
Всего: 1
8
Розница2

Номенклатура1
Всего: 1
Удаляем регистрацию
9
Розница2

Всего: 0
Удаляем регистрацию
9
Розница2
[/1с]
   Волшебник
 
Модератор
5 - 30.01.20 - 19:48
Дык ты проверь после вызова метода, может регистрация осталась
   DTX 4th
 
6 - 31.01.20 - 01:28
(5) Вторая и третья итерации:
НомерСообщения = 9
Во второй после ПланыОбмена.ВыбратьИзменения(Узел, 9) получаем 1 запись: "Всего: 1"
Потом удаляем регистрацию:
ПланыОбмена.УдалитьРегистрациюИзменений(Узел, 9 - 1 = 8);

И в третьей видим, что ПланыОбмена.ВыбратьИзменения(Узел, 9)  возвращает уже 0 записей
   alkov
 
7 - 31.01.20 - 06:44
Поставьте выборку (а лучше запрос) после удаления регистрации изменений и убедитесь, что не удаляет. Кто знает, что у Вас там между итерациями происходит
   hhhh
 
8 - 31.01.20 - 08:30
(6) вообще-то 9%2 = 1, а у вас регистрируется только НомерСообщения % 2 = 0

Похоже вы нам сюда какой-то левый кусок программы постите.
   Фрэнки
 
9 - 31.01.20 - 08:47
Возможно, что сейчас начнут кричать, что все на самом деле работает у всех как нужно, что все исключительно надежно...
Но я сталкивался неоднократно ранее и принял для себя за истину, что строчка кода с любым значением НомерСОобщения

ПланыОбмена.УдалитьРегистрациюИзменений(Узел, НомерСОобщения);

Удаляет по указанному узлу регистрацию всех объектов. Просто регистрация объектов удаляется и повторная попытка прочитать зарегистристрованные изменения после этого вызова по узлу вернет пустую выборку.
   Папа Гапа
 
10 - 31.01.20 - 09:25
(8) Одинэс все же сделала чтобы можно было левый и правый учет вести одновременно?
(0) В правом коде посмотри, может по белой удаляет.
   fisher
 
11 - 31.01.20 - 10:23
Выбрать...() - всегда выбирает ВСЕ изменения. Номер сообщения, который ты туда передаешь - это просто тот номер который, при этом проставляется для изменений в таблице изменений в качестве номера пакета, с которым они отправляются.
Но если эти изменения уже числятся в отправленных (уже стоит какой-то номер пакета, с которым они выгружались и он меньше указанного), то он вероятно меняться не будет. Это было бы логично. Может, в этом дело?
ЗЫ. Почему ты не пользуешься запросами для получения промежуточных данных таблиц изменений? Это самый простой путь понять, что на самом деле происходит.
   fisher
 
12 - 31.01.20 - 10:30
Да и изначально ты тестируешь странный сценарий. Предполагается, что в Удалить...() ты передаешь номер пакета из квитанции (подтверждения другой стороной, что пакет с этим номером она загрузила).
Если чистить изменения сразу при отправке, то нет никакого смысла играться с номерами пакетов, ибо потеря любого пакета ведет к нарушению целостности обмена.
   fisher
 
13 - 31.01.20 - 10:37
Стандартный сценарий обмена - сначала чистишь таблицы регистрации по номеру пакета из квитанции (так как уже есть гарантии, что эти изменения загружены), а ПОСЛЕ этого выгружаешь оставшиеся (свежие) изменения из таблиц регистрации.
   DTX 4th
 
14 - 31.01.20 - 14:11
(8) Рабочий кусок кода, ничего не меня.

Я ввел НомерСообщения = 8
Нажал Выполнить. Вывелось:
Регистрируем
Номенклатура1
Всего: 1
8
Розница2


Ввел НомерСообщения = 9, два раза нажал Выполнить. Вывелось:
Номенклатура1
Всего: 1
Удаляем регистрацию
9
Розница2

Всего: 0
Удаляем регистрацию
9
Розница2

   DTX 4th
 
15 - 31.01.20 - 14:19
(10) Ничего не понял

(11) >Номер сообщения, который ты туда передаешь - это просто тот номер который, при этом проставляется для изменений в таблице изменений в качестве номера пакета, с которым они отправляются.
Это я понимаю
>то он вероятно меняться не будет
В этом что-то есть. Подумаю. Подумал. Нет) Регистрирую изменения, выбираю для номера 9, удаляю для 8 - удаляются все (даже для 9)

Запросами тоже смотрел. Кусок кода взял из обработка обмена

(12) Я понимаю. Просто после прочтения мне надо удалить регистрацию прочтенных данных. Но они удалятся все.

(13) Так вроде получается, что удалятся данные, которые были зареганы после отправки сообщения. Запутался
   МимохожийОднако
 
16 - 31.01.20 - 14:23
Попробуй увеличить номер сообщения. Сам же привёл СП в (0)
   DTX 4th
 
17 - 31.01.20 - 14:45
(11) >Но если эти изменения уже числятся в отправленных (уже стоит какой-то номер пакета, с которым они выгружались и он меньше указанного), то он вероятно меняться не будет. Это было бы логично. Может, в этом дело?

Да, ты прав.

Если я выбираю изменения, которые уже были выбраны, номер сообщения не меняется. Было бы проще, если бы в СП была об этом пометка)

И да, с запросом и правда проще оказалось)

========
Выводим регистрацию: Розница2
-------------
Регистрируем
Выводим регистрацию: Розница2
Сообщение №: 1
-------------
Номенклатура2
Всего: 1
Выводим регистрацию: Розница2
Сообщение №8: 1
-------------
НомерСообщения: 8
========
Выводим регистрацию: Розница2
Сообщение №8: 1
-------------
Номенклатура2
Всего: 1
Выводим регистрацию: Розница2
Сообщение №8: 1
-------------
Удаляем регистрацию
Выводим регистрацию: Розница2
-------------
НомерСообщения: 9




Процедура Кнопка1Нажатие(Элемент)
    Сообщить("========");
    ВывестиРегистрациюУзла(Узел);
    Если НомерСообщения % 2 = 0 Тогда
        ПланыОбмена.ЗарегистрироватьИзменения(Узел, Группа);
        Сообщить("Регистрируем");
        ВывестиРегистрациюУзла(Узел);
    КонецЕсли; 
    
    Выборка = ПланыОбмена.ВыбратьИзменения(Узел, НомерСообщения);
    Сч = 0;
    Пока Выборка.Следующий() Цикл
        Сч = Сч + 1;
        Сообщить(Выборка.Получить());
    КонецЦикла; 
    Сообщить("Всего: "+Сч);

    
    ВывестиРегистрациюУзла(Узел);
    Если НомерСообщения % 3 = 0 Тогда
        ПланыОбмена.УдалитьРегистрациюИзменений(Узел, НомерСОобщения - 1);
        Сообщить("Удаляем регистрацию");
        ВывестиРегистрациюУзла(Узел);
    КонецЕсли;
    Сообщить("НомерСообщения: "+НомерСОобщения);
КонецПроцедуры

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


Всем спасибо!

Список тем форума
Рекламное место пустует  Рекламное место пустует
ВНИМАНИЕ! Если вы потеряли окно ввода сообщения, нажмите Ctrl-F5 или Ctrl-R или кнопку "Обновить" в браузере.