Зарегистрировать документ к обмену программно

1. Vida 18 26.12.24 17:46 Сейчас в теме
Здравствуйте
Документ приходит, при загрузке заполняется в процедуре ОбработкаПроверкиЗаполнения
и хочу его отправить обратно без участия человека.
Узел = ПланыОбмена.ОбменУправлениеНебольшойФирмойБухгалтерия30.НайтиПоКоду("80");
ПланыОбмена.ЗарегистрироватьИзменения(Узел, ЭтотОбъект.Ссылка);

Узел находит, но в зарегистрированных к отправке документа нет.
По теме из базы знаний
Вознаграждение за ответ
Показать полностью
Ответы
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
22. victorree 27 11.02.25 17:01 Сейчас в теме
(1) Подскажите зачем Вы его обратно хотите отправить? 1С делает все чтобы такого не происходило - подобное поведение нарушает логику обмена данными.
25. Vida 18 04.04.25 09:00 Сейчас в теме
(22) Мне просто нужно забрать некие данные из БП, на основе данных из УНФ. Дальнейшая работа с документом будет в УНФ.
52. victorree 27 16.05.25 19:54 Сейчас в теме
(25) Смущает конечно, что у Вас заполнение происходит в ОбработкаПроверкиЗаполнения которая только для проверки предназначена, ладно закрою на это глаза :)
Если документ регистрируется интерактивно то проблем зарегистрировать его при получении нет. Как я и говорил в типовом механизме предусмотрена защита от эхо регистрации, поэтому документы полученные обменом в норме не регистрируются обратно. За это отвечают дополнительные свойства объекта. Создайте подписку на событие ПередЗаписью для Вашего документа. В ней пропишите:
	Если Источник.ОбменДанными.Загрузка Тогда 
		Если ТипЗнч(Источник.ОбменДанными.Отправитель) = Тип("ПланОбменаСсылка.<ИмяПланаОбмена>") Тогда
			Источник.ДополнительныеСвойства.Вставить("РегистрироватьОбъектНаУзлеОтправителе", Истина);
			Если Источник.ДополнительныеСвойства.Свойство("ОтключитьМеханизмРегистрацииОбъектов") Тогда 
				Источник.ДополнительныеСвойства.Удалить("ОтключитьМеханизмРегистрацииОбъектов");	
			КонецЕсли;
			ОбменДаннымиСобытия.МеханизмРегистрацииОбъектовПередЗаписьюДокумента("<ИмяПланаОбмена>", Источник, Отказ, РежимЗаписи, РежимПроведения);
		КонецЕсли;
	КонецЕсли;
Показать

<ИмяПланаОбмена> замените на имя Вашего плана обмена, как оно задано в конфигураторе. У Вас будет ОбменУправлениеНебольшойФирмойБухгалтерия30 как я понял
VyacheslavShilov; +1 Ответить
2. user2107191 26.12.24 17:48 Сейчас в теме
А записать? (грустный смайлик)
3. Vida 18 26.12.24 17:51 Сейчас в теме
(2) Записать документ до попытки регистрации? В какой процедуре?
Подойдет ОбработкаПроверкиЗаполнения?
4. user2107191 26.12.24 18:07 Сейчас в теме
(3) А откуда возьмется ссылка у незаписанного документа?

Записывать надо в том месте, в котором и создаётся.
5. user2107191 26.12.24 18:33 Сейчас в теме
(4) А если у объекта снять ОбменДанными.Загрузка - то он автоматом зарегается. Правда, и контроли все с проведением сработают.
6. polax 26.12.24 22:48 Сейчас в теме
(1) Открывай Общий модуль ОбменДаннымиСобытия. Там есть процедуры в которых определяются массивы узлов в которых регистрируются измененные объекты: имена процедур начинаются с "ОпределитьМассивУзлов.... " (их там то ли 4 то ли 5)
Ставь там точку останова (в каждой процедуре, в какой-то обязательно будет определяться массив узлов для нужного дока), смотри КАК регистрируется нужный док, справочник, любой объект и регистрируется ли (если в массиве узлов нет нужного узла - нет регистрации) Ну и решай как зарегистрировать.
7. o.kovalev 125 27.12.24 08:24 Сейчас в теме
Записывать ничего не надо !

Вот мой рабочий код: ПланыОбмена.ЗарегистрироватьИзменения(Объект.УзелОбмена.Ссылка,ОбрабатываемыйОбъект);

Обрабатываемый объект должен быть типом Объект

Узел обмена - узел другой базы

В план обмена объект такого типа должен быть включен, авторегистрация не обязательна


Но вполне возможно у вас есть где то где то отмена регистрации:

ОбрабатываемыйОбъект.ДополнительныеСвойства.Вставить("ОтключитьМеханизмРегистрацииОбъектов",Истина);
VyacheslavShilov; Vida; +2 Ответить
8. user2107191 27.12.24 08:43 Сейчас в теме
(7) Зарегистрировать ссылку нового незаписанного объекта? Ну-ну...
orakool; Vida; +2 Ответить
9. o.kovalev 125 27.12.24 09:17 Сейчас в теме
(8) Обьект у него записан, пришел в базу, читайте внимательно.
10. user2107191 27.12.24 09:24 Сейчас в теме
(9) Где??? Где тут про "записан в базу"?
Документ приходит, при загрузке заполняется в процедуре ОбработкаПроверкиЗаполнения

А если еще и учесть, что имеются попытки регистрировать документ в обработке заполнения (которая используется только для создания новых документов), то как бы другая картина вырисовывается...
Ах, да! И вот это еще...
Записать документ до попытки регистрации?


Всё говорит о том, что "объект записан в базу". Прям даже кричит, я бы сказал!
orakool; Vida; +2 Ответить
11. o.kovalev 125 27.12.24 09:27 Сейчас в теме
(10) Если не записан то говорить о том что пришел преждевременно, (0) Автор так пришел документ или не пришел ?
12. Vida 18 27.12.24 11:05 Сейчас в теме
(10)
(11)
Охх...
Документ при загрузке в базу проводится
Перед проведением запускается процедура ОбработкаПроверкиЗаполнения (она не для новых, а запускается при каждом проведении)
В ней дозаполняются данные.
Я так понимаю что к этому моменту док не записан или как минимум не записаны новые данные
Посмотрю в отладчике

В обычном варианте, если пользователь заходит и проводит то док регистрируется без проблем. Задача освободить пользователя
13. user2107191 27.12.24 11:08 Сейчас в теме
(12)
она не для новых, а запускается при каждом проведении
Сорян, визуально спутал с ОбработкаЗаполнения
14. o.kovalev 125 27.12.24 11:09 Сейчас в теме
(12) Если еще не записан то и нечему регистрироваться. Поставьте регистрацию после записи.
15. Vida 18 27.12.24 11:09 Сейчас в теме
(7)
А этот ваш рабочий код в какой процедуре?
16. o.kovalev 125 27.12.24 11:10 Сейчас в теме
(15) Если запускать регистрацию обработкой (просто в обработке)
VyacheslavShilov; Vida; +2 Ответить
17. o.kovalev 125 27.12.24 11:11 Сейчас в теме
(15) А можно вообще это все это реализовать в подписке на событие.
VyacheslavShilov; Vida; +2 Ответить
18. Vida 18 27.12.24 12:09 Сейчас в теме
Попробовала в разных комбинациях, не поддается:
ЭтотОбъект.Записать(,);
ЭтотОбъект.ОбменДанными.Загрузка = Ложь;
Узел = ПланыОбмена.ОбменУправлениеНебольшойФирмойБухгалтерия30.НайтиПоКоду("80");
ПланыОбмена.ЗарегистрироватьИзменения(Узел, ЭтотОбъект.Ссылка);	

Еще и точки останова не срабатывают при загрузке.
19. user2107191 27.12.24 12:12 Сейчас в теме
(18) А этот документ вообще подлежит регистрации?
Если подлежит - то достаточно просто поменять первые две строчки местами.
ЭтотОбъект.ОбменДанными.Загрузка = Ложь;
Этот параметр интересен системе только в момент записи объекта.
На ручную регистрацию ссылки он никак не влияет.
VyacheslavShilov; Vida; +2 Ответить
20. Vida 18 27.12.24 12:21 Сейчас в теме
(19) попробовала, успеха нет

В обычном варианте, если пользователь заходит и проводит то док регистрируется без проблем. Задача освободить пользователя

может нельзя зарегистрировать при получении...

буду копать тему подписок на событие
21. Vida 18 10.02.25 09:54 Сейчас в теме
Актуально, прошу подсказок.
23. M_Salakh 11.02.25 17:13 Сейчас в теме
(21) Попробуйте перенести вашу регистрацию из процедуры "ОбработкаПроверкиЗаполнения" в процедуру "ПриЗаписи". Должно все получиться.
24. Vida 18 04.04.25 08:52 Сейчас в теме
(23) Флаг _Отправить_ меняет и больше ничего, не регистрирует.

Процедура ПриЗаписи(Отказ) 
	
	Если ЭтотОбъект.ОбменДанными.Загрузка Тогда 
		ЭтотОбъект.ОбменДанными.Загрузка = Ложь; 
		ЭтотОбъект.Отправить = Истина;
		ЭтотОбъект.Записать(,);
		Узел = ПланыОбмена.ОбменУправлениеНебольшойФирмойБухгалтерия30.НайтиПоКоду("80");
		ПланыОбмена.ЗарегистрироватьИзменения(Узел, ЭтотОбъект.Ссылка);  
	КонецЕсли;
	
КонецПроцедуры 
Показать
26. Linrock 08.04.25 16:25 Сейчас в теме
(24)
НайтиПоКоду("80");
Может код не тот?
29. Vida 18 17.04.25 09:58 Сейчас в теме
(26)
(28)
Код верный. Может в каких-то параметрах запятая?
Прикрепленные файлы:
30. LavinVladik 219 17.04.25 10:02 Сейчас в теме
(29) условие по наименованию ищите или код цифровой возможно
31. Vida 18 17.04.25 10:18 Сейчас в теме
(30)
Запрос написала в консоле просто справочно.
Вам кажется что результат запроса лучше чем НайтиПоКоду?
Вот результат из точки останова. Верный ли тип?
Прикрепленные файлы:
32. LavinVladik 219 17.04.25 10:21 Сейчас в теме
(31) можно и так, для проверки на форму выведите выбор узла и по этому реквизиту сделайте пометку для выгрузки
33. Vida 18 17.04.25 10:24 Сейчас в теме
(31)
Кажется тип нормальный:

ПланыОбменаМенеджер (ExchangePlansManager)
ЗарегистрироватьИзменения (RecordChanges)
Синтаксис:
ЗарегистрироватьИзменения(<Узлы>, <Данные>)
Параметры:
<Узлы> (обязательный)
Тип: ПланОбменаСсылка.<Имя плана обмена>, Массив.
Одиночное значение типа ПланОбменаСсылка.<Имя плана обмена> или массив таких значений, показывающие для пересылки в какие узлы регистрируются изменения.
<Данные> (необязательный)
Тип: Метаданные, Неопределено, УдалениеОбъекта, Массив; <Данные>.
VyacheslavShilov; +1 Ответить
35. nomad_irk 82 17.04.25 10:46 Сейчас в теме
(33) Правила Регистрации Объектов используются? Если да, то проверяйте, начиная с события ПередЗаписью.
37. Vida 18 17.04.25 11:09 Сейчас в теме
(35) Скорее да, используются. Сейчас посмотрю что в них.
А что проверять?
38. nomad_irk 82 17.04.25 11:16 Сейчас в теме
(37) при каких условиях регистрируются документы этого типа.
41. Vida 18 17.04.25 11:31 Сейчас в теме
(38) при обычном интерактивном проведении документ регистрируется. Поэтому думаю что правила регистрации не мешают?
42. nomad_irk 82 17.04.25 11:35 Сейчас в теме
(41) В качестве фантазий вариант: при интерактивном проведении в ДополнительныеСвойства помещается какой-либо флаг, по его наличию происходит регистрация, если флага нет, то и не регистрируется ничего.
39. nomad_irk 82 17.04.25 11:23 Сейчас в теме
(31) правила обмена с помощью чего написаны: КД2.х или КД3.х?
40. Vida 18 17.04.25 11:30 Сейчас в теме
43. nomad_irk 82 17.04.25 11:36 Сейчас в теме
(40) вариант доработки правил рассматриваете?
44. Vida 18 17.04.25 11:53 Сейчас в теме
(43) да могу (попробовать)
а что там доработать?
45. nomad_irk 82 17.04.25 11:56 Сейчас в теме
(44) в ПослеЗагрузки для объекта сделать

Объект.ОбменДанными.Загрузка = Ложь;
Объект.Записать();

Это вызовет принудительную запись документа как в интерактивном режиме.

Минусы: запись документа будет происходить дважды.
48. Vida 18 17.04.25 12:25 Сейчас в теме
(45)
Это в правилах выгрузки, верно?
Прикрепленные файлы:
49. nomad_irk 82 17.04.25 13:04 Сейчас в теме
50. Vida 18 18.04.25 08:20 Сейчас в теме
(49) Не получилось. Добавила там же изменение флага - флаг поменялся, значит код отработал. Но ни в отправленных, ни в зарегистрированных нету.
51. nomad_irk 82 18.04.25 10:22 Сейчас в теме
(50) видимо, только полная отладка происходящих процессов даст понимание
у меня пока вариантов объяснения странностей нет.
46. Vida 18 17.04.25 12:00 Сейчас в теме
(43) верно! в правилах регистрации отсутствует этот документ
сейчас добавлю
(и как только регистрируется при интерактивном)
47. nomad_irk 82 17.04.25 12:03 Сейчас в теме
(46) не, стоп. Если в правилах регистрации нет объекта, то он регистрируется без условий, хоть авторегистрацией, хоть программно.
27. LavinVladik 219 09.04.25 05:14 Сейчас в теме
(24)

у меня так отрабатывает

 ПланыОбмена.ЗарегистрироватьИзменения(УзелОбменаСсылка, Объект.Ссылка); 


Регистрация изменений в плане обмена, универсальный подбор объектов (ЗУП, БП, ERP, УАТ)
Vida; VyacheslavShilov; +2 Ответить
28. LavinVladik 219 09.04.25 05:57 Сейчас в теме
(24)

Для "УзелОбменаСсылка" сделай так

Запрос = Новый Запрос;

Запрос.Текст = "
|ВЫБРАТЬ
|	СинхронизацияДанныхЧерезУниверсальныйФормат.Ссылка КАК Ссылка
|ИЗ
|	ПланОбмена.СинхронизацияДанныхЧерезУниверсальныйФормат КАК СинхронизацияДанныхЧерезУниверсальныйФормат
|ГДЕ СинхронизацияДанныхЧерезУниверсальныйФормат.Наименование ПОДОБНО &Наименование
|";

Запрос.УстановитьПараметр("Наименование","%1С:ERP Управление предприятием 2.0%");

Выборка = Запрос.Выполнить().Выбрать();

Если Выборка.Следующий() ТОгда 
	УзелОбменаСсылка = Выборка.Ссылка;
КонецЕсли;

Сообщить(УзелОбменаСсылка);

Показать
Vida; VyacheslavShilov; +2 Ответить
34. tusv 212 17.04.25 10:32 Сейчас в теме
(24) В ПриЗаписи Записать()? Сильно
Достаточно
Процедура ПриЗаписи(Отказ) 
        Узел = ПланыОбмена.ОбменУправлениеНебольшойФирмойБухгалтерия30.НайтиПоКоду("80");
	ЭтотОбъект.ОбменДанными.Получатели.Добавить(Узел);
КонецПроцедуры
VyacheslavShilov; Vida; +2 Ответить
36. Vida 18 17.04.25 11:05 Сейчас в теме
(34)
Вначале так и было.
Это уже от отчаяния, всякую ересь надобавляла.
53. Avatarzorro 70 20.05.25 02:24 Сейчас в теме
блин я чуть не умер от кринжа пока читал топик.

Короче ниже база.

Есть платформенный метод

ПланыОбмена.ЗарегистрироватьИзменения(Узел, Ссылка);

поидее тут все просто и понятно.

Однако есть еще способ.

У объекта есть штатный реквизит ОбменДанными.Получатели

У него есть метод Добавить(), в параметр кидается ссылка узла. Т.е. полная конструкция выглядит так
Объект(Документ, Справочник, ПВХ и тд).Получатели.Добавить(Узел);

Сюда можно воткнуть регу прям в объекте например "ПередЗаписью". Именно этим способом и регаются на обмен объекты в типовом механизме по подписке.

Однако. Оба механизма работают только если объект в конечном итоге записывается.
54. Vida 18 21.05.25 19:48 Сейчас в теме
(53)
    Узел = ПланыОбмена.ОбменУправлениеНебольшойФирмойБухгалтерия30.НайтиПоКоду("80");		
	ЭтотОбъект.ОбменДанными.Получатели.Добавить(Узел);

Не работает. Может я не там проверяю регистрацию\отправку? Смотрю в "Регистрации изменений для обмена". И там "нет изменений" те ни зарегистрированных ни отправленных.
55. Avatarzorro 70 22.05.25 06:49 Сейчас в теме
(54)
варианта 2:
1) узел по коду не находит
2) документ не записался.
3) по подписке рега снимается

надо по отладке бежать. МОжет у тебя там исключение выходит, а сквозь фоновые ты его не видишь.
57. Vida 18 22.05.25 17:14 Сейчас в теме
(55) 1 и 2 точно нет
3 не поняла

отладку еще погоняю
включаю отладку в фоне, она работает
56. HanterVol 9 22.05.25 09:29 Сейчас в теме
Проверки в обработчике ОбработкаПроверкиЗаполнения выполняются вне транзакции записи объекта, поэтому скорее всего вы пытаетесь зарегистрировать для обмена "ПустуюСсылку".
58. Vida 18 22.05.25 17:24 Сейчас в теме
(56) отказалась от обработчика, при записи тоже не регистрирует

Процедура ПриЗаписи(Отказ) 
    Узел = ПланыОбмена.ОбменУправлениеНебольшойФирмойБухгалтерия30.НайтиПоКоду("80");        
    ЭтотОбъект.ОбменДанными.Получатели.Добавить(Узел);
КонецПроцедуры
59. Avatarzorro 70 22.05.25 18:42 Сейчас в теме
(57) там есть подписка пометки удаления. По ней рега снимается. надо проверить отрабатывает она или нет
(58) короче 1с не твое... ты знаешь в какой момент срабатывает призаписи? ну там типо ctrl+f1 пробовала вызывать?
61. Vida 18 31.05.25 12:45 Сейчас в теме
(59) Когда срабатывает:
После того, как данные объекта были записаны в базу данных, но до того, как завершится транзакция записи.
62. Avatarzorro 70 31.05.25 15:55 Сейчас в теме
63. Vida 18 31.05.25 23:47 Сейчас в теме
(62) транзакция записи заканчивается после проведения
тогда перенести попытки регистрации в
ПослеЗаписиНаСервере(<ТекущийОбъект>, <ПараметрыЗаписи>)
?
64. Avatarzorro 70 02.06.25 04:11 Сейчас в теме
(63) не правильный вывод. Давай попробуем еще раз?
Вывод?

тогда перенести попытки регистрации в
ПослеЗаписиНаСервере(<ТекущийОбъект>, <ПараметрыЗаписи>)


звучит как дичь, но в целом сделать можно. Хотя судя по контексту в первом посте, когда ты вернешься с ошибкой при реализации этого можно будет сделать еще 1 вывод.

Опыт - сын ошибок трудных (с)
60. user2148000 29.05.25 20:38 Сейчас в теме
Для отправки сообщения требуется регистрация/авторизация

Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот