Зарегистрировать документ к обмену программно
Здравствуйте
Документ приходит, при загрузке заполняется в процедуре ОбработкаПроверкиЗаполнения
и хочу его отправить обратно без участия человека.
Узел находит, но в зарегистрированных к отправке документа нет.
Документ приходит, при загрузке заполняется в процедуре ОбработкаПроверкиЗаполнения
и хочу его отправить обратно без участия человека.
Узел = ПланыОбмена.ОбменУправлениеНебольшойФирмойБухгалтерия30.НайтиПоКоду("80");
ПланыОбмена.ЗарегистрироватьИзменения(Узел, ЭтотОбъект.Ссылка);Узел находит, но в зарегистрированных к отправке документа нет.
По теме из базы знаний
- Регистрация документов в последовательностях при работе с обменом данными
- Обсудим планы обмена. Способы регистрации объектов к обмену
- Загрузка чеков из ФНС в документы 1С:БП, УНФ, Розница, ERP, КА и УТ
- Гарантированное проведение документов (подключаемое расширение)
- Ускорение переноса остатков на примере из УПП в ERP
Ответы
Подписаться на ответы
Инфостарт бот
Сортировка:
Древо развёрнутое
Свернуть все
(25) Смущает конечно, что у Вас заполнение происходит в ОбработкаПроверкиЗаполнения которая только для проверки предназначена, ладно закрою на это глаза :)
Если документ регистрируется интерактивно то проблем зарегистрировать его при получении нет. Как я и говорил в типовом механизме предусмотрена защита от эхо регистрации, поэтому документы полученные обменом в норме не регистрируются обратно. За это отвечают дополнительные свойства объекта. Создайте подписку на событие ПередЗаписью для Вашего документа. В ней пропишите:
<ИмяПланаОбмена> замените на имя Вашего плана обмена, как оно задано в конфигураторе. У Вас будет ОбменУправлениеНебольшойФирмойБухгалтерия30 как я понял
Если документ регистрируется интерактивно то проблем зарегистрировать его при получении нет. Как я и говорил в типовом механизме предусмотрена защита от эхо регистрации, поэтому документы полученные обменом в норме не регистрируются обратно. За это отвечают дополнительные свойства объекта. Создайте подписку на событие ПередЗаписью для Вашего документа. В ней пропишите:
Если Источник.ОбменДанными.Загрузка Тогда
Если ТипЗнч(Источник.ОбменДанными.Отправитель) = Тип("ПланОбменаСсылка.<ИмяПланаОбмена>") Тогда
Источник.ДополнительныеСвойства.Вставить("РегистрироватьОбъектНаУзлеОтправителе", Истина);
Если Источник.ДополнительныеСвойства.Свойство("ОтключитьМеханизмРегистрацииОбъектов") Тогда
Источник.ДополнительныеСвойства.Удалить("ОтключитьМеханизмРегистрацииОбъектов");
КонецЕсли;
ОбменДаннымиСобытия.МеханизмРегистрацииОбъектовПередЗаписьюДокумента("<ИмяПланаОбмена>", Источник, Отказ, РежимЗаписи, РежимПроведения);
КонецЕсли;
КонецЕсли; Показать<ИмяПланаОбмена> замените на имя Вашего плана обмена, как оно задано в конфигураторе. У Вас будет ОбменУправлениеНебольшойФирмойБухгалтерия30 как я понял
(1) Открывай Общий модуль ОбменДаннымиСобытия. Там есть процедуры в которых определяются массивы узлов в которых регистрируются измененные объекты: имена процедур начинаются с "ОпределитьМассивУзлов.... " (их там то ли 4 то ли 5)
Ставь там точку останова (в каждой процедуре, в какой-то обязательно будет определяться массив узлов для нужного дока), смотри КАК регистрируется нужный док, справочник, любой объект и регистрируется ли (если в массиве узлов нет нужного узла - нет регистрации) Ну и решай как зарегистрировать.
Ставь там точку останова (в каждой процедуре, в какой-то обязательно будет определяться массив узлов для нужного дока), смотри КАК регистрируется нужный док, справочник, любой объект и регистрируется ли (если в массиве узлов нет нужного узла - нет регистрации) Ну и решай как зарегистрировать.
Записывать ничего не надо !
Вот мой рабочий код: ПланыОбмена.ЗарегистрироватьИзменения(Объект.УзелОбмена.Ссылка,ОбрабатываемыйОбъект);
Обрабатываемый объект должен быть типом Объект
Узел обмена - узел другой базы
В план обмена объект такого типа должен быть включен, авторегистрация не обязательна
Но вполне возможно у вас есть где то где то отмена регистрации:
ОбрабатываемыйОбъект.ДополнительныеСвойства.Вставить("ОтключитьМеханизмРегистрацииОбъектов",Истина);
Вот мой рабочий код: ПланыОбмена.ЗарегистрироватьИзменения(Объект.УзелОбмена.Ссылка,ОбрабатываемыйОбъект);
Обрабатываемый объект должен быть типом Объект
Узел обмена - узел другой базы
В план обмена объект такого типа должен быть включен, авторегистрация не обязательна
Но вполне возможно у вас есть где то где то отмена регистрации:
ОбрабатываемыйОбъект.ДополнительныеСвойства.Вставить("ОтключитьМеханизмРегистрацииОбъектов",Истина);
(9) Где??? Где тут про "записан в базу"?
А если еще и учесть, что имеются попытки регистрировать документ в обработке заполнения (которая используется только для создания новых документов), то как бы другая картина вырисовывается...
Ах, да! И вот это еще...
Всё говорит о том, что "объект записан в базу". Прям даже кричит, я бы сказал!
Документ приходит, при загрузке заполняется в процедуре ОбработкаПроверкиЗаполнения
А если еще и учесть, что имеются попытки регистрировать документ в обработке заполнения (которая используется только для создания новых документов), то как бы другая картина вырисовывается...
Ах, да! И вот это еще...
Записать документ до попытки регистрации?
Всё говорит о том, что "объект записан в базу". Прям даже кричит, я бы сказал!
(10)
(11)
Охх...
Документ при загрузке в базу проводится
Перед проведением запускается процедура ОбработкаПроверкиЗаполнения (она не для новых, а запускается при каждом проведении)
В ней дозаполняются данные.
Я так понимаю что к этому моменту док не записан или как минимум не записаны новые данные
Посмотрю в отладчике
В обычном варианте, если пользователь заходит и проводит то док регистрируется без проблем. Задача освободить пользователя
(11)
Охх...
Документ при загрузке в базу проводится
Перед проведением запускается процедура ОбработкаПроверкиЗаполнения (она не для новых, а запускается при каждом проведении)
В ней дозаполняются данные.
Я так понимаю что к этому моменту док не записан или как минимум не записаны новые данные
Посмотрю в отладчике
В обычном варианте, если пользователь заходит и проводит то док регистрируется без проблем. Задача освободить пользователя
Попробовала в разных комбинациях, не поддается:
Еще и точки останова не срабатывают при загрузке.
ЭтотОбъект.Записать(,);
ЭтотОбъект.ОбменДанными.Загрузка = Ложь;
Узел = ПланыОбмена.ОбменУправлениеНебольшойФирмойБухгалтерия30.НайтиПоКоду("80");
ПланыОбмена.ЗарегистрироватьИзменения(Узел, ЭтотОбъект.Ссылка); Еще и точки останова не срабатывают при загрузке.
(18) А этот документ вообще подлежит регистрации?
Если подлежит - то достаточно просто поменять первые две строчки местами.
Этот параметр интересен системе только в момент записи объекта.
На ручную регистрацию ссылки он никак не влияет.
Если подлежит - то достаточно просто поменять первые две строчки местами.
ЭтотОбъект.ОбменДанными.Загрузка = Ложь;На ручную регистрацию ссылки он никак не влияет.
(19) попробовала, успеха нет
В обычном варианте, если пользователь заходит и проводит то док регистрируется без проблем. Задача освободить пользователя
может нельзя зарегистрировать при получении...
буду копать тему подписок на событие
В обычном варианте, если пользователь заходит и проводит то док регистрируется без проблем. Задача освободить пользователя
может нельзя зарегистрировать при получении...
буду копать тему подписок на событие
(23) Флаг _Отправить_ меняет и больше ничего, не регистрирует.
Процедура ПриЗаписи(Отказ)
Если ЭтотОбъект.ОбменДанными.Загрузка Тогда
ЭтотОбъект.ОбменДанными.Загрузка = Ложь;
ЭтотОбъект.Отправить = Истина;
ЭтотОбъект.Записать(,);
Узел = ПланыОбмена.ОбменУправлениеНебольшойФирмойБухгалтерия30.НайтиПоКоду("80");
ПланыОбмена.ЗарегистрироватьИзменения(Узел, ЭтотОбъект.Ссылка);
КонецЕсли;
КонецПроцедуры
Показать
(31)
Кажется тип нормальный:
Кажется тип нормальный:
ПланыОбменаМенеджер (ExchangePlansManager)
ЗарегистрироватьИзменения (RecordChanges)
Синтаксис:
ЗарегистрироватьИзменения(<Узлы>, <Данные>)
Параметры:
<Узлы> (обязательный)
Тип: ПланОбменаСсылка.<Имя плана обмена>, Массив.
Одиночное значение типа ПланОбменаСсылка.<Имя плана обмена> или массив таких значений, показывающие для пересылки в какие узлы регистрируются изменения.
<Данные> (необязательный)
Тип: Метаданные, Неопределено, УдалениеОбъекта, Массив; <Данные>.
ЗарегистрироватьИзменения (RecordChanges)
Синтаксис:
ЗарегистрироватьИзменения(<Узлы>, <Данные>)
Параметры:
<Узлы> (обязательный)
Тип: ПланОбменаСсылка.<Имя плана обмена>, Массив.
Одиночное значение типа ПланОбменаСсылка.<Имя плана обмена> или массив таких значений, показывающие для пересылки в какие узлы регистрируются изменения.
<Данные> (необязательный)
Тип: Метаданные, Неопределено, УдалениеОбъекта, Массив; <Данные>.
(44) в ПослеЗагрузки для объекта сделать
Это вызовет принудительную запись документа как в интерактивном режиме.
Минусы: запись документа будет происходить дважды.
Объект.ОбменДанными.Загрузка = Ложь;
Объект.Записать();Это вызовет принудительную запись документа как в интерактивном режиме.
Минусы: запись документа будет происходить дважды.
(24)
Для "УзелОбменаСсылка" сделай так
Для "УзелОбменаСсылка" сделай так
Запрос = Новый Запрос;
Запрос.Текст = "
|ВЫБРАТЬ
| СинхронизацияДанныхЧерезУниверсальныйФормат.Ссылка КАК Ссылка
|ИЗ
| ПланОбмена.СинхронизацияДанныхЧерезУниверсальныйФормат КАК СинхронизацияДанныхЧерезУниверсальныйФормат
|ГДЕ СинхронизацияДанныхЧерезУниверсальныйФормат.Наименование ПОДОБНО &Наименование
|";
Запрос.УстановитьПараметр("Наименование","%1С:ERP Управление предприятием 2.0%");
Выборка = Запрос.Выполнить().Выбрать();
Если Выборка.Следующий() ТОгда
УзелОбменаСсылка = Выборка.Ссылка;
КонецЕсли;
Сообщить(УзелОбменаСсылка);
Показать
(24) В ПриЗаписи Записать()? Сильно
Достаточно
Достаточно
Процедура ПриЗаписи(Отказ)
Узел = ПланыОбмена.ОбменУправлениеНебольшойФирмойБухгалтерия30.НайтиПоКоду("80");
ЭтотОбъект.ОбменДанными.Получатели.Добавить(Узел);
КонецПроцедуры
блин я чуть не умер от кринжа пока читал топик.
Короче ниже база.
Есть платформенный метод
поидее тут все просто и понятно.
Однако есть еще способ.
У объекта есть штатный реквизит ОбменДанными.Получатели
У него есть метод Добавить(), в параметр кидается ссылка узла. Т.е. полная конструкция выглядит так
Объект(Документ, Справочник, ПВХ и тд).Получатели.Добавить(Узел);
Сюда можно воткнуть регу прям в объекте например "ПередЗаписью". Именно этим способом и регаются на обмен объекты в типовом механизме по подписке.
Однако. Оба механизма работают только если объект в конечном итоге записывается.
Короче ниже база.
Есть платформенный метод
ПланыОбмена.ЗарегистрироватьИзменения(Узел, Ссылка);поидее тут все просто и понятно.
Однако есть еще способ.
У объекта есть штатный реквизит ОбменДанными.Получатели
У него есть метод Добавить(), в параметр кидается ссылка узла. Т.е. полная конструкция выглядит так
Объект(Документ, Справочник, ПВХ и тд).Получатели.Добавить(Узел);
Сюда можно воткнуть регу прям в объекте например "ПередЗаписью". Именно этим способом и регаются на обмен объекты в типовом механизме по подписке.
Однако. Оба механизма работают только если объект в конечном итоге записывается.
(53)
Не работает. Может я не там проверяю регистрацию\отправку? Смотрю в "Регистрации изменений для обмена". И там "нет изменений" те ни зарегистрированных ни отправленных.
Узел = ПланыОбмена.ОбменУправлениеНебольшойФирмойБухгалтерия30.НайтиПоКоду("80");
ЭтотОбъект.ОбменДанными.Получатели.Добавить(Узел);
Не работает. Может я не там проверяю регистрацию\отправку? Смотрю в "Регистрации изменений для обмена". И там "нет изменений" те ни зарегистрированных ни отправленных.
Проверки в обработчике ОбработкаПроверкиЗаполнения выполняются вне транзакции записи объекта, поэтому скорее всего вы пытаетесь зарегистрировать для обмена "ПустуюСсылку".
(56) отказалась от обработчика, при записи тоже не регистрирует
Процедура ПриЗаписи(Отказ)
Узел = ПланыОбмена.ОбменУправлениеНебольшойФирмойБухгалтерия30.НайтиПоКоду("80");
ЭтотОбъект.ОбменДанными.Получатели.Добавить(Узел);
КонецПроцедуры
(63) не правильный вывод. Давай попробуем еще раз?
Вывод?
звучит как дичь, но в целом сделать можно. Хотя судя по контексту в первом посте, когда ты вернешься с ошибкой при реализации этого можно будет сделать еще 1 вывод.
Опыт - сын ошибок трудных (с)
Вывод?
тогда перенести попытки регистрации в
ПослеЗаписиНаСервере(<ТекущийОбъект>, <ПараметрыЗаписи>)
ПослеЗаписиНаСервере(<ТекущийОбъект>, <ПараметрыЗаписи>)
звучит как дичь, но в целом сделать можно. Хотя судя по контексту в первом посте, когда ты вернешься с ошибкой при реализации этого можно будет сделать еще 1 вывод.
Опыт - сын ошибок трудных (с)
Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот
