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


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

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


Служебные сообщения:

Регистрируем
Номенклатура1
Всего: 1
8
Розница2

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

Всего: 0
Удаляем регистрацию
9
Розница2
5 Волшебник
 
модератор
30.01.20
19:48
Дык ты проверь после вызова метода, может регистрация осталась
6 DTX 4th
 
31.01.20
01:28
(5) Вторая и третья итерации:
НомерСообщения = 9

Во второй после ПланыОбмена.ВыбратьИзменения(Узел, 9) получаем 1 запись: "Всего: 1"
Потом удаляем регистрацию:
ПланыОбмена.УдалитьРегистрациюИзменений(Узел, 9 - 1 = 8);

И в третьей видим, что ПланыОбмена.ВыбратьИзменения(Узел, 9)  возвращает уже 0 записей
7 alkov
 
31.01.20
06:44
Поставьте выборку (а лучше запрос) после удаления регистрации изменений и убедитесь, что не удаляет. Кто знает, что у Вас там между итерациями происходит
8 hhhh
 
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) В правом коде посмотри, может по белой удаляет.
11 fisher
 
31.01.20
10:23
Выбрать...() - всегда выбирает ВСЕ изменения. Номер сообщения, который ты туда передаешь - это просто тот номер который, при этом проставляется для изменений в таблице изменений в качестве номера пакета, с которым они отправляются.
Но если эти изменения уже числятся в отправленных (уже стоит какой-то номер пакета, с которым они выгружались и он меньше указанного), то он вероятно меняться не будет. Это было бы логично. Может, в этом дело?
ЗЫ. Почему ты не пользуешься запросами для получения промежуточных данных таблиц изменений? Это самый простой путь понять, что на самом деле происходит.
12 fisher
 
31.01.20
10:30
Да и изначально ты тестируешь странный сценарий. Предполагается, что в Удалить...() ты передаешь номер пакета из квитанции (подтверждения другой стороной, что пакет с этим номером она загрузила).
Если чистить изменения сразу при отправке, то нет никакого смысла играться с номерами пакетов, ибо потеря любого пакета ведет к нарушению целостности обмена.
13 fisher
 
31.01.20
10:37
Стандартный сценарий обмена - сначала чистишь таблицы регистрации по номеру пакета из квитанции (так как уже есть гарантии, что эти изменения загружены), а ПОСЛЕ этого выгружаешь оставшиеся (свежие) изменения из таблиц регистрации.
14 DTX 4th
 
31.01.20
14:11
(8) Рабочий кусок кода, ничего не меня.

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


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

Всего: 0
Удаляем регистрацию
9
Розница2
15 DTX 4th
 
31.01.20
14:19
(10) Ничего не понял

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

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

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

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

(13) Так вроде получается, что удалятся данные, которые были зареганы после отправки сообщения. Запутался
16 Мимохожий Однако
 
31.01.20
14:23
Попробуй увеличить номер сообщения. Сам же привёл СП в (0)
17 DTX 4th
 
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", Выборка.НомерСообщения, Выборка.Ссылка));
    КонецЦикла;           
    Сообщить("-------------");
КонецПроцедуры


Всем спасибо!
Компьютеры — это как велосипед. Только для нашего сознания. Стив Джобс