"Номер отправленного" перед обменом

1. 13.01.22 09:01 Сейчас в теме
Доброго времени суток!

Во вкладке "регистрация изменений для объекта" у объекта есть колонка "номер отправленного" (см. фото), так вот вопрос можно ли в ПРО в обработчиках событий "перед обработкой" (см. фото) отловить наличие или отсутствие номера и соответственно разрешить или запретить обмен этого объекта? (Возможно это делается по другому)

Для чего это делается: Если номер отправленного есть, значит объект ранее выгружался, значит его заново выгружать не нужно, если номера нет, значит объект подлежит выгрузке.

На последнем скриншоте я написал небольшой код, как суть написанного.

Всем заранее благодарен за советы!

P.S. Только знакомлюсь с обменами и всем прочим.
Прикрепленные файлы:
Вознаграждение за ответ
Показать полностью
Ответы
В избранное Подписаться на ответы Сортировка: Древо развёрнутое
Свернуть все
2. nomad_irk 58 13.01.22 09:15 Сейчас в теме
(1)это работает не так. Номер служит для разделения "версий" измененных данных и разрешения коллизий при обмене.

какую цель преследуете?
3. user1500067 13.01.22 09:18 Сейчас в теме
(2) Цель заключается в следующем: если объект ранее выгружался, то снова его выгружать не надо. Как "обозначить" для 1С что такой-то документ уже ранее был выгружен и больше его трогать не надо?
4. nomad_irk 58 13.01.22 09:22 Сейчас в теме
(3)хм, а какие условия для его выгрузки?
5. user1500067 13.01.22 09:25 Сейчас в теме
(4) Условия (если я правильно понял):
Прикрепленные файлы:
6. nomad_irk 58 13.01.22 09:32 Сейчас в теме
(5)документ не будет зарегистрирован как измененный, если СуммаОплатыЗаявки <> 0.

Если документ уже передавался, СуммаОплатыЗаявки = 0, но при этом документ изменили, его точно передавать не нужно?
7. user1500067 13.01.22 09:38 Сейчас в теме
(6) Да, точно. У меня чёткий критерий: если передавался, то больше передавать не нужно, в случае, если объект передавался и был потом изменён он будет в ручную регистрироваться.
8. user1500067 13.01.22 09:40 Сейчас в теме
(7) Т.е. хочется, чтобы 1С автоматически НЕ регистрировала к отправке те документы, что уже были отправлены ранее
9. nomad_irk 58 13.01.22 09:42 Сейчас в теме
(7)Лично мне ничего не приходит в голову, кроме как завести регистр сведений для хранения переданных документов и проверять наличие документа в нем перед регистрацией.
10. user1500067 13.01.22 09:48 Сейчас в теме
(9)Получается, что встроенных механизмов нет?
11. nomad_irk 58 13.01.22 09:52 Сейчас в теме
(10)встроенных механизмов нет.
12. user1500067 13.01.22 09:56 Сейчас в теме
(11) А можно ли в принципе отловить наличие или отсутствие "номер отправленного"? И если да, то как это можно реализовать?
15. nomad_irk 58 13.01.22 10:06 Сейчас в теме
(12)Отловить можно, но смысла в этом нет, т.к. значение номера не отражает факт передачи документа.
14. STELEICE 13.01.22 10:05 Сейчас в теме
(1) Подобное я реализовал подпиской на событие при записи в нужных метаданных. Если условия соблюдены просто не ставится регистрация для обмена. Без внесения изменений в сами правила.
13. user1203706 13.01.22 10:01 Сейчас в теме
(1)
в перед обработкой в правилах регистрации пишешь:

Запрос = новый Запрос("ВЫБРАТЬ
	ТвойДокументИзменения.НомерСообщения КАК НомерСообщения
ИЗ
	Документы.ТвойДокумент.Изменения КАК ТвойДокументИзменения
ГДЕ
	ТвойДокументИзменения.Узел = &Узел
	И ТвойДокументИзменения.НомерСообщения >0
	И ТвойДокументИзменения.Ссылка = &Ссылка");
Запрос.УстановитьПараметр("Узел",Параметры.Узел);
Запрос.УстановитьПараметр("ССылка",Объект.ССылка);
Отказ = НЕ Запрос.Выполнить().Пустой();
Показать


Узел обмена пихаешь в параметры. Если план обмена один, например, узел обмена можешь выкинуть из текста запроса.
16. user1500067 13.01.22 10:15 Сейчас в теме
(13) Не работает, при перепроведении пишет "невозможно провести документ"

Запрос = новый Запрос("ВЫБРАТЬ
    Договор.НомерСообщения КАК НомерСообщения
ИЗ
    Документы.Договор.Изменения КАК Договор
ГДЕ
    Договор.Узел = &Узел
    И Договор.НомерСообщения >0
    И Договор.Ссылка = &Ссылка");
Запрос.УстановитьПараметр("Узел",Параметры.Узел);
Запрос.УстановитьПараметр("ССылка",Объект.ССылка);
Отказ = НЕ Запрос.Выполнить().Пустой();
Показать
17. user1203706 13.01.22 10:17 Сейчас в теме
(16) с какой ошибкой то ?
И этот запрос, надеюсь, в правилах регистрации прописал ?
И параметры задал для узла ?

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


ЗЫ: ну и нельзя же копипастить код бездумно.
18. user1500067 13.01.22 10:37 Сейчас в теме
(17) Та же ошибка
Прикрепленные файлы:
19. user1203706 13.01.22 10:46 Сейчас в теме
(18) ";" отсутствует между операторами в первой строке

ЗЫ: если что: Ctrl+C - копировать, Ctrl+V - Вставить
20. user1500067 13.01.22 10:47 Сейчас в теме
(19) Это уже исправлено, было, когда запускал
24. user1500067 13.01.22 10:50 Сейчас в теме
(20)
Если Не Выгрузка Тогда //только при новой регистрации делаем отмену
    Запрос = новый Запрос;
	Запрос.Текст = 
	"ВЫБРАТЬ
    |     Договор.НомерСообщения КАК НомерСообщения
    |ИЗ
    |    Документы.Договор.Изменения КАК Договор
    |   ГДЕ
    |    // Договор.Узел = &Узел
    |    Договор.НомерСообщения >0
    |    И Договор.Ссылка = &Ссылка";
       //Запрос.УстановитьПараметр("Узел",Параметры.Узел);
      Запрос.УстановитьПараметр("Ссылка",Объект.Ссылка);
      Отказ = НЕ Запрос.Выполнить().Пустой();
КонецЕсли;
Показать
21. user1203706 13.01.22 10:48 Сейчас в теме
(20) если ремишь весь код, проводится ?
22. user1500067 13.01.22 10:49 Сейчас в теме
23. user1203706 13.01.22 10:50 Сейчас в теме
(22)
Псевдоним поменяй в тексте запроса хотя бы. Ну или открой его конструктором запросов. Он отругает тебя, если есть неоднозначность в имени Договор.
25. user1203706 13.01.22 10:57 Сейчас в теме
(22) так, хотя бы

Если Не Выгрузка Тогда //только при новой регистрации делаем отмену
    Запрос = новый Запрос;
    Запрос.Текст = 
    "ВЫБРАТЬ
    |     ДоговорИзменения.НомерСообщения КАК НомерСообщения
    |ИЗ
    |    Документы.Договор.Изменения КАК ДоговорИзменения 
    |   ГДЕ
    |    // Договор.Узел = &Узел
    |    ДоговорИзменения.НомерСообщения >0
    |    И ДоговорИзменения.Ссылка = &Ссылка";
       //Запрос.УстановитьПараметр("Узел",Параметры.Узел);
      Запрос.УстановитьПараметр("Ссылка",Объект.Ссылка);
      Отказ = НЕ Запрос.Выполнить().Пустой();
КонецЕсли;
Показать
26. user1500067 13.01.22 11:22 Сейчас в теме
(25)Да, уже переделал так, теперь проводится документ, ошибок нет, но если установить "номер отправленного", например, на 1 и снова провести, то документ перепроводится и также остаётся в списке на регистрацию изменений
27. user1203706 13.01.22 11:33 Сейчас в теме
(26) он не будет регистрировать новые изменения. если был хоть один отправленный пакет.
В самом плане обмена установи номер отправленного сообщения отличный. от 1 ..и проверяй.

ЗЫ: можешь еще убрать условие на Выгрузка в коде, тогда вообще не будет регить, ни при выгрузке, ни при сохранении
28. nomad_irk 58 13.01.22 11:57 Сейчас в теме
(27)
В самом плане обмена установи номер отправленного сообщения отличный. от 1 ..и проверяй.

Это что за прикол такой? ну установлю 2, потом верну в 0 и чего? Какой смысл завязываться на номер отправленного сообщения для определения факта отправки какого-то одного документа?
29. user1203706 13.01.22 12:00 Сейчас в теме
(28) факт отправки чего-либо можно проверив только наличием номера сообщения, иначе никак.
Поменяв номер сообщения в плане обмена, нужно только для проверки, что данный объект никогда больше регится не будет и соответственно в изменениях никогда не будет объекта с новым номером сообщения при выгрузке.
Только и всего лишь
30. nomad_irk 58 13.01.22 12:05 Сейчас в теме
(29)я надеюсь, вы понимаете, что нужный объект(передачу и регистрацию к передачи которого мы "мониторим") может быть отправлен с любым номером сообщения?
какой смысл проверки номера отправленного сообщения вообще для определения факта отправки какого-либо объекта?
31. user1203706 13.01.22 12:10 Сейчас в теме
(30) Только один раз. Дальше он регистрироваться не будет , никогда.
32. nomad_irk 58 13.01.22 12:22 Сейчас в теме
(31)так как определить-то этот 1 раз, когда регистрация таки нужна?
33. user1203706 13.01.22 12:27 Сейчас в теме
(32) номера сообщения не будет в табличке изменений объекта
34. nomad_irk 58 13.01.22 12:33 Сейчас в теме
(33)вы вот сейчас серьезно? если механизм обмена не подразумевает использование номеров сообщений, то это не значит, то этот номер нельзя указать вручную, например.
Если номера сообщений не используются, то там будет 0 всегда. Предлагаете однажды установить значение 1 вручную и забыть?
35. user1203706 13.01.22 12:35 Сейчас в теме
(34) В данный момент, мы решаем задачу автора из (0).
Ответ я предоставил.
И у автора, обмен сообщениями по номерам.
37. nomad_irk 58 13.01.22 12:52 Сейчас в теме
(35)В данный момент вы решаете задачу так, как ее решение видит автор, а не как она решается.
Из его сообщения вообще не понятно, используются номера сообщений или нет.
Если номера таки используются, как понять, для какого номера сообщения нужно выполнить таки регистрацию, а для какого выполнять не нужно?

Простой пример:
Когда объект появился, был номер сообщения скажем 100, нужно выполнять регистрацию объекта?
Допустим, объект передали в сообщении 140, объект опять поменяли при номере сообщения 200, нужно выполнять регистрацию объекта?
36. user1203706 13.01.22 12:45 Сейчас в теме
А так. Проще в ПКО выставить галку "не замещать объект приёмника, а только создавать новый", если выгрузка по правилам и не парится с правилами регистрации и номерами пакетов
38. nomad_irk 58 13.01.22 12:54 Сейчас в теме
(36)это не решает задачи НЕ ПЕРЕДАВАТЬ, это решает задачу - НЕ ЗАГРУЖАТЬ.
Скажем так: изменили 1М номенклатуры, все это дело содержит 1 новый элемент, согласно вашей логике, мы весь 1М передадим, а принимающая сторона сама разберется, какой 1 элемент записать.
39. user1203706 13.01.22 12:57 Сейчас в теме
(37)
В момент регистрации номер сообщения 0. Номер сообщения ставится в момент отправки сообщения. При первой отправки запрос будет пустой, будет не нулевой номер сообщения в регистрации изменений.
Дальнейшей регистрации объекта не будет, ибо присвоен номер пакета отправки и результат запроса будет не пустой. Соответственно, в новых пакетах никогда не будет этого объекта. Так понятнее ?
40. nomad_irk 58 13.01.22 13:19 Сейчас в теме
(39)а ничего, что после успешной загрузки данных удаленной стороной, таблица изменений очищается и нет данных о том, с каким номером сообщения объект был передан и он будет заново регистрироваться с номером сообщения 0?
41. user1203706 13.01.22 13:23 Сейчас в теме
(40) я прям ждал этого вопроса.
Это решаемо.
42. nomad_irk 58 13.01.22 13:24 Сейчас в теме
(41)каким чудесным образом?
43. user1203706 13.01.22 13:40 Сейчас в теме
(42) в коде из (13) зарегить этот же объект по другому узлу, который ни с кем не обменивается в момент выгрузки. Усё.
Если прилетит ответ с узла, затрётся только его регистрация, код из (13) будет проверять регистрацию по всем узлам, которая останется.

если нужно будет ручками отправить объект, то снимаем регистрацию с "фиктовного" узла
44. user1203706 13.01.22 13:41 Сейчас в теме
Можно даже хранить это в другом плане обмена, в котором снята авторегистрация объекта, короче, есть варианты .
45. nomad_irk 58 13.01.22 14:18 Сейчас в теме
(44)Так это ничем не отличается от способа, предложенного мной в (9) и к номерам сообщений привязываться не нужно вообще, просто проверить наличие записи в регистре.
46. user1203706 13.01.22 14:19 Сейчас в теме
(45) заводить отдельный регистр, когда и так всё есть ?
47. nomad_irk 58 13.01.22 14:21 Сейчас в теме
(46)заводить отдельный план обмена/узел.......
48. user1203706 13.01.22 14:22 Сейчас в теме
(47) И ? Это не то же самое, что завести регистр в конфу. Тут конфу вообще не трогаем. Просто добавить новый узел в план обмена и всё разрулить правилами регистрации объекта.
49. user1203706 13.01.22 14:25 Сейчас в теме
Код чуть подправит на привязку к конкретному узлу + проверка изменений на узле - "пустышке, который только копит". И усё
50. 1cmailru 4 18.01.22 05:53 Сейчас в теме
А почему никто не предлагает посмотреть в регистры сведений:
"Соответствие объектов для обмена"
"Соответствия объектов информационных баз"
"Публичные идентификаторы как то там"

В зависимости от версии БСП, там используется какой то один из этих регистров, но в общем смысл в том, что если объект хоть раз был выгружен в другую базу, то в регистре создается запись соответствия Объекта в текущей базе и идентификатора в другой базе.
Значит смотрим версию БСП, смотрим какой регистр используется и в запросе ищем запись в нужном регистре, если запрос пустой - регистрируем к обмену объект.

В первом приближении к задаче как-то так.
51. user1203706 19.01.22 11:34 Сейчас в теме
(50) они используются при загрузке. ТС нужно при выгрузке. При выгрузке, эти РС бесполезны.
Оставьте свое сообщение
Вопросы с вознаграждением
Вакансии
Аналитик 1С
Санкт-Петербург
зарплата до 150 000 руб.
Полный день

Программист 1С
Москва
зарплата от 150 000 руб. до 220 000 руб.
Полный день

1С Программист по 1С:Управление торговлей
Кострома
зарплата от 100 000 руб. до 110 000 руб.
Полный день

Руководитель отдела разработки
Москва
зарплата от 200 000 руб. до 230 000 руб.
Полный день

Программист 1С
Москва
зарплата от 150 000 руб. до 150 000 руб.
Полный день