Конвертация данных 2.1. Создается пустой документ при "Отказ = Истина"

1. Isakov_Artem 11.04.19 11:22 Сейчас в теме
Добрый день!
В обработчике ПКО "После загрузки" документа пишу "Отказ = Истина", не смотря на это, документ создается абсолютно пустой, единственное, что заполнено - номер и дата документа. По логике документ, естественно, создаваться не должен. "Объект.Ссылка" пустая до самого конца обработчика ПКО "После загрузки". В обработчике документ программно не записывается.

В правилах обмена два документа и подчиненные им объекты. Не нашел ничего ссылающегося на документ с "отказом", даже в программном коде закомментировал любые ссылки на этот документ. Для эксперимента ставил галочку для второго документа "Не выгружать объекты свойств источника по ссылкам". Но пустой документ продолжает создаваться.

В чем может быть проблема?
По теме из базы знаний
Вознаграждение за ответ
Показать полностью
Найденные решения
67. Isakov_Artem 12.04.19 15:41 Сейчас в теме
ИТОГ:

То что протестировано и проверено:
1. Если объект выгружается через ПСК, то "Отказ = Истина" в ЛЮБОМ обработчике Загрузки в ПКО, на которое ссылается ПКС создает пустой объект (В моем случае счет).
2. Если объект выгружается напрямую через ПКО, то "Отказ = Истина" в ЛЮБОМ обработчике Загрузки в ПКО предотвращает создание объекта.
3. Для решения проблемы пункта 1 нужно поставить галочку у ПКО, которое создает пустой объект "При переносе объекта по ссылке НЕ создавать новый объект, а только переносить ссылку".


В ПКО "После загрузки":

1 Вариант. С использованием типовой процедуры из БП 3.0. (Минус: будет выводить сообщения для всех документов попавшие в закрытый период, в том числе те, которые выгружаются и есть в базе приемника и ничего с этим не поделать. Плюс: анализ вхождения в закрытый период происходит для каждого документа).

ДатыЗапретаИзменения.ПроверитьДатуЗапретаИзмененияПередЗаписьюДокумента(Объект, Отказ, Истина, Истина);


2. Вариант. Получить например в обработчике "Перед загрузкой данных" Дату закрытого периода, поместить в параметр "ДатаЗапретаИзменения" и работать с параметром. (Минус: если будут сложные закрытия периода, то такой вариант не подойдет. Плюс: Можно вывести сообщения только для документов которые вновь добавляются).

Если ЗначениеЗаполнено(Параметры.ДатаЗапретаИзменения) И Объект.Дата <= Параметры.ДатаЗапретаИзменения Тогда
	Отказ = Истина;
	Если НЕ ОбъектНайден Тогда
		Сообщить("Счет " + Строка(Объект.Номер) + " от " + Строка(Объект.Дата) + " находится в закрытом периоде (" + Строка(Формат(Параметры.ДатаЗапретаИзменения,"ДФ=dd.MM.yyyy")) + "). Счет не создан!!!!!!!!!!!!!!!!");		
	КонецЕсли;	
КонецЕсли;


Я выбрал 2 вариант.
malenushka1; ohyen; user1202361; +3 Ответить
64. insurgut 207 12.04.19 12:28 Сейчас в теме
(62)
можно ли в обработчиках загрузки ПКО отключить или отменить загрузку ПКС?

Может в ПКО галочку поставить "При переносе объекта по ссылке НЕ создавать новый объект, а только переносить ссылку"?
vasvl123; +1 Ответить
Остальные ответы
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
3. user-z99999 67 11.04.19 11:44 Сейчас в теме
(1)
После загрузки

Может он уже создан в этом обработчике?
Нужно раньше проверять (ловить), например Перед загрузкой.
4. Isakov_Artem 11.04.19 11:48 Сейчас в теме
(3) Объект.Ссылка в обработчике "После загрузки" все еще пустая.
68. DrZombi 290 14.04.19 12:55 Сейчас в теме
(1) "После загрузки" - это же ПОСЛЕ того как документ уже загружен :)
Попробуйте перед загрузкой, А лучше перед выгрузкой ;)
69. oleg-x 26 15.04.19 01:24 Сейчас в теме
(68) Документ загружен, но еще не записан. Но проблема в том, что он в любом случае будет записан.
2. Isakov_Artem 11.04.19 11:42 Сейчас в теме
Те документы, которые в "Отказ" не попадают создаются полноценно.
5. alalexmix 25 11.04.19 11:59 Сейчас в теме
В ПКО самого документа "ПередВыгрузкой"

Отказ = Истина;
nestokay; +1 Ответить
8. Isakov_Artem 11.04.19 13:11 Сейчас в теме
(5) Отказ могу поставить только при загрузке, потому что в приемнике получают параметр "ДатаЗапретаИзменения". Отказ зависит от условия "Дата документы <= Даты запрета изменения".
6. oleg-x 26 11.04.19 12:28 Сейчас в теме
Это изменение типовых/написанных кем то другим правила или же Вы сами с нуля пишите их?
Возможно есть несколько ПКО, также смотрите на запись документа, если стоит отказ, но далее есть объект.записать(), то отказ не имеет смысла, все равно будет записан.
Еще возможно еще где то выгружаются эти данные после выгрузки другого объекта.
Галка "Не выгружать объекты свойств источника по ссылкам", означает, что будет выгружена только ссылка (номер и дата), а остальное нет. То есть в любом случае создаст пустой документ/справочник.
7. Isakov_Artem 11.04.19 13:09 Сейчас в теме
(6) Это написанные кем-то правила.
Галку "Не выгружать объекты свойств источника по ссылкам" ставил не в ПКО проблемного документа, а в ПКО других объектов, которые потенциально могли бы ссылаться на этот документ, что бы если есть ссылка на проблемный документ, то его не создавало. Но, как я написал выше, это не помогло.
9. oleg-x 26 11.04.19 13:32 Сейчас в теме
Как вариант, посмотреть визуально сами правила и посмотреть (через поиск) где участвует этот тип документа.
10. Isakov_Artem 11.04.19 14:06 Сейчас в теме
Можно каким-то образом удалить документ После загрузки? При использовании метода Объект.Удалить() выдало ошибку "Ошибка при вызове метода контекста (Удалить): Элемент не выбран!". В принципе и логично, потому что Объект.Ссылка пустая.
11. Isakov_Artem 11.04.19 14:13 Сейчас в теме
по идее механизм приемника (БП 3.0) сам обыгрывает ситуацию. Если документ попадает в закрытый период, то выдается сообщение и документ не загружается. Но при этом процесс загрузки стопорится, остальные документы не загружаются. А нужно что бы загрузка продолжалась.
12. melenaspb 208 11.04.19 14:40 Сейчас в теме
Вы уверены что ваше условие "Дата документы <= Даты запрета изменения" выполняется? Что вы попадаете в то место где устанавливается Отказ = Истина?
13. Isakov_Artem 11.04.19 14:57 Сейчас в теме
(12) 100%. Через Сообщить() все эти переменные перепроверил.
14. Isakov_Artem 11.04.19 15:02 Сейчас в теме
Вот код обработчика после загрузки:
Если ОбъектНайден И Ссылка.Дата < Дата("20180101") Тогда
	Отказ = Истина;
КонецЕсли;

Если (ЗначениеЗаполнено(Параметры.ДатаЗапретаИзменения) И Объект.Дата <= Параметры.ДатаЗапретаИзменения)
	ИЛИ (ЗначениеЗаполнено(Параметры.ДатаЗапретаИзменения) И ОбъектНайден И Ссылка.Дата <= Параметры.ДатаЗапретаИзменения)
	Тогда
	Сообщить("Счет " + Строка(Объект.Номер) + " от " + Строка(Объект.Дата) + " находится в закрытом периоде (" + Строка(Формат(Параметры.ДатаЗапретаИзменения,"ДФ=dd.MM.yyyy")) + "). Счет не создан!!!!!!!!!!!!!!!!");
	Отказ = Истина;
КонецЕсли;

//Сообщить("ОбъектНомер: " + Строка(Объект.Номер)
//		+ " ОбъектДата: " + Строка(Объект.Дата)
//		+ " Объект найден: " + ОбъектНайден
//		+ ?(ОбъектНайден," СсылкаНомер: " + Строка(Ссылка.Номер) + " СсылкаДата: " + Строка(Ссылка.Дата),""));

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


Выводит сообщения такого вида, при этом сам документ создается и пустой как писал выше:
Счет СК000003538 от 18.12.2018 14:27:29 находится в закрытом периоде (31.12.2018). Счет не создан!!!!!!!!!!!!!!!!
59. Kuzya_brаtsk 310 12.04.19 03:25 Сейчас в теме
(14) В конце кода обработчика стоит
Объект.Записать();

Наверное здесь и происходит запись.

Поставь условие:
Если НЕ Отказ Тогда
    Объект.Записать();
КонецЕсли;
zaika007; +1 Ответить
60. DJDUH 17 12.04.19 09:43 Сейчас в теме
(14)
Если ОбъектНайден И Ссылка.Дата < Дата("20180101") Тогда Отказ = Истина; КонецЕсли;


По ходу "Здесь" объекта ещё нет, может так сработает!?

Отказ = НЕ ОбъектНайден; 
15. oleg-x 26 11.04.19 15:07 Сейчас в теме
Делай не ПослеЗагрузки, а ПриЗагрузке. У меня так сделано и проблем нет.

Вот такой код у меня для Бух 3
Если ОбъектНайден Тогда
ДатыЗапретаИзменения.ПроверитьДатуЗапретаИзмененияПередЗаписьюДокумента(Объект,НеЗамещатьОбъект,Истина,Истина);
КонецЕсли;
19. Isakov_Artem 11.04.19 15:34 Сейчас в теме
(15) Как написал (17) alalexmix,
Т.е. если объект не был найден, то при любом значении он будет создан и записан
.
У вас красиво проходит проверка на дату запрета изменения, но отказ от записи не дает, если объект не найден.
20. oleg-x 26 11.04.19 15:41 Сейчас в теме
(19) Перепиши проверку, делов-то. У нас важно именно, что если документ загружен, то не грузить заного в закрытом периоде. А вы можете сделать проверку, даже если объект не найден.
16. Isakov_Artem 11.04.19 15:08 Сейчас в теме
Как я писал выше, есть механизм в конфигурации БП 3.0 который сам проверяет входит ли документ в закрытый период. Если входит, то выводит сообщение и стопорит процесс загрузки. Попытался его обойти вот так, в исключение проваливается, но при этом документ записывается полноценно. В конце обработчика происходит запись в режиме обмена с игнорирование исключений.
Запрос = Новый Запрос;
	Запрос.Текст =
	"ВЫБРАТЬ
	|	ДоговорыКонтрагентов.Ссылка
	|ИЗ
	|	Справочник.ДоговорыКонтрагентов КАК ДоговорыКонтрагентов
	|ГДЕ
	|	ДоговорыКонтрагентов.Владелец = &Контрагент
	|	И ДоговорыКонтрагентов.Организация = &Организация
	|	И ДоговорыКонтрагентов.ВидДоговора = ЗНАЧЕНИЕ(Перечисление.ВидыДоговоровКонтрагентов.СПокупателем)";
	Запрос.УстановитьПараметр("Контрагент", Объект.Контрагент);
	Запрос.УстановитьПараметр("Организация", Объект.Организация);
	Выборка = Запрос.Выполнить().Выбрать();
	КоличествоДоговоров = Выборка.Количество();
	Если КоличествоДоговоров = 1 Тогда
		Выборка.Следующий();
		Объект.ДоговорКонтрагента = Выборка.Ссылка;
	ИначеЕсли КоличествоДоговоров = 0 Тогда
		НовыйДоговор = Справочники.ДоговорыКонтрагентов.СоздатьЭлемент();
		НовыйДоговор.ВалютаВзаиморасчетов = Константы.ВалютаРегламентированногоУчета.Получить();
		НовыйДоговор.Владелец = Объект.Контрагент;
		НовыйДоговор.Организация = Объект.Организация;
		НовыйДоговор.Наименование = "Основной договор с покупателем";
		НовыйДоговор.ВидДоговора = Перечисления.ВидыДоговоровКонтрагентов.СПокупателем;
		НовыйДоговор.Записать();
		Объект.ДоговорКонтрагента = НовыйДоговор.Ссылка;
	КонецЕсли;
	
	Попытка
		Объект.Записать();
	Исключение
		Сообщить("Счет " + Строка(Объект.Номер) + " от " + Строка(Объект.Дата) + " находится в закрытом периоде (" + Строка(Формат(Параметры.ДатаЗапретаИзменения,"ДФ=dd.MM.yyyy")) + "). Счет не создан!!!!!!!!!!!!!!!!");
	КонецПопытки;
Показать
17. alalexmix 25 11.04.19 15:13 Сейчас в теме
Например, следующий код - сам документ не изменяется:

При загрузке:
------------------
	// старая версия объекта
	Если Не НеЗамещатьОбъект Тогда
		ДокументВЗакрытомПериоде = Ложь;
		Выполнить(Алгоритмы.ДокументВЗакрытомПериоде);
		Если ДокументВЗакрытомПериоде Тогда
			НеЗамещатьОбъект = Истина;
		КонецЕсли;
	КонецЕсли;


После загрузки:
---------------------
	// измененная версия объекта
	Если Не Отказ Тогда
		ДокументВЗакрытомПериоде = Ложь;
		Выполнить(Алгоритмы.ДокументВЗакрытомПериоде);
		Если ДокументВЗакрытомПериоде Тогда
			Отказ = Истина;
		КонецЕсли;
	КонецЕсли;


Т.е. если объект не был найден, то при любом значении он будет создан и записан
А вот - чтоб не создался - надо в "Перед загрузкой", но там нужна "Дата" загружаемого документа
18. Isakov_Artem 11.04.19 15:30 Сейчас в теме
(17)
А вот - чтоб не создался - надо в "Перед загрузкой", но там нужна "Дата" загружаемого документа

"Даты" загружаемого документа нет "Перед загрузкой" к сожалению. Этой темы не было если бы "Перед загрузкой" были доступны те же параметры, что и "После загрузки".
Либо создавать какое-то соответствие Документ - Дата. Но к чему подвязаться не понятно. "Нпп - Число. Уникальный порядковый номер объекта в файле." - единственное, что доступно Перед загрузкой.
35. alalexmix 25 11.04.19 16:33 Сейчас в теме
(18) Попробуйте использовать "СвойстваПоиска" и/или "ПараметрыОбъекта" и передавать например через "Параметры"...
36. alalexmix 25 11.04.19 16:36 Сейчас в теме
(35) Вам необходимо в отладчике понять какое событие выполняется первым "ПоляПоиска", в котором есть "СвойстваПоиска" (с признаком "Поиск" если не ошибаюсь читаются всегда и первыми из переданных свойств) и "ПараметрыОбъекта", которые можно передать из источника в приемник и читать их, ну а там по "Параметрам" можно - это как вариант - пробуйте...
52. alalexmix 25 11.04.19 17:26 Сейчас в теме
Попробуйте сначала в "ПередЗагрузкой" выставить флаг Отказ = Истина и если сработает, т.е. документ не создаться, то, как вариант, попробуйте (35)
53. oleg-x 26 11.04.19 17:27 Сейчас в теме
57. acanta 11.04.19 17:35 Сейчас в теме
(52) например ситуация, когда документ в приемнике проверен, проведен и.т.п, т.е. проверка не на закрытый период, а индивидуально. Перед записью необходимо найти в приемнике обьект по переданным данным и проверить какие то свойства. То же самое делает механизм конвертации при поиске объекта, причем поиск может быть достаточно сложным. Логично что отмену загрузки мы делаем после нахождения, но пустая ссылка уже записана, разве не так?
55. alalexmix 25 11.04.19 17:29 Сейчас в теме
Все-таки - попробуйте сначала в "ПередЗагрузкой" выставить флаг Отказ = Истина и если сработает, т.е. документ не создаться, то, как вариант, попробуйте (35)
25. oleg-x 26 11.04.19 15:52 Сейчас в теме
Из сообщения (17) не ясно, а можно просто почитать справку. Или проверить, а не жаловаться, что перед загрузкой все плохо.
28. Isakov_Artem 11.04.19 15:57 Сейчас в теме
(25) У меня на практике создается пустой документ во время отказа.
21. oleg-x 26 11.04.19 15:42 Сейчас в теме
Будет выглядеть так:
ДатыЗапретаИзменения.ПроверитьДатуЗапретаИзмененияПередЗаписьюДокумента(Объект,Отказ,Истина,Истина);
22. Isakov_Artem 11.04.19 15:46 Сейчас в теме
(21) Олег, это сути не меняет. Объект недоступен "Перед Загрузкой", где можно отказаться от записи. В других обработчиках отказ, как я понял из сообщения (17) не работает если объект не был найден в базе.
24. oleg-x 26 11.04.19 15:51 Сейчас в теме
(22) я писал про проверку не ПередЗагрузкой, а приЗагрузке. Это две большие разницы. Так же как и ПриЗагрузки или ПослеЗагрузки.
23. Isakov_Artem 11.04.19 15:49 Сейчас в теме
Вот параметры которые доступны "Перед загрузкой". Боль.
Прикрепленные файлы:
26. oleg-x 26 11.04.19 15:54 Сейчас в теме
Из справки
ПриЗагрузке:
Объект - Произвольный. Загружаемый, модифицируемый объект, созданный по ссылке или найденный в информационной базе. Если способ идентификации объекта в файле не указан (т.е. отсутствует узел "Ссылка"), то параметр содержит значение Неопределено. В этом случае в обработчике возможна произвольная инициализация загружаемого объекта, в противном случае, объект будет создан автоматически.

ПослеЗагрузке:
Объект - Произвольный - загруженный объект.
27. Isakov_Artem 11.04.19 15:56 Сейчас в теме
(26) Это понятно, но При загрузке нет Отказа есть только "НеЗамещатьОбъект" и "ОбъектМодифицирован".
29. Isakov_Artem 11.04.19 16:02 Сейчас в теме
(26) То есть если присвоить Объект = Неопределено При загрузке, он загружен не будет?
30. oleg-x 26 11.04.19 16:09 Сейчас в теме
Да, с отказом это я проглядел. Попробуй Поставить
НеЗамещатьОбъект = Истина
Объект.Ссылка = Неопределено;
А еще такое:
ОбъектМодифицирован = Ложь.
31. oleg-x 26 11.04.19 16:12 Сейчас в теме
А вообще странно, если документ находится в закрытом периоде, то его нельзя записать в любом виде, то есть происходит где то запись в привелигированном модуле
32. Isakov_Artem 11.04.19 16:17 Сейчас в теме
(31) Если явно прописать "После записи" Объект.Записать(), то база ругнется и застопорит процесс загрузки. Если не прописывать явно запись, то запись будет проходить в режиме обмена и походу этот режим игнорирует подобные исключения.
33. oleg-x 26 11.04.19 16:19 Сейчас в теме
Попробуй понять в какой момент делается запись.
В модуле объекта перед записью выдай сообщение ТекущаяДата()
И то же самое в каждом модуле в правилах. Только задержку в 1 секунду поставь, там можно будет понять, в какой момент был записан документ. Может там вообще не в ПКО это действие происходит, а в свойствах правила, там тоже есть куча обработчиков, в который сие действие может выполнятся.
37. Isakov_Artem 11.04.19 16:53 Сейчас в теме
(33) Не понял как через Сообщить(ТекущаяДата()) можно понять когда записан документ? Дата документа же не из текущей даты берется. Да и если просто выводить сообщение в обработчиках тоже ничего не понятно. Нужно проверять ссылку. Но это я уже делал. Или я не понял вашей задумки под вечер?
ПКС все проверил.
44. oleg-x 26 11.04.19 17:07 Сейчас в теме
(37) Ну можно не дату, а числа или текст. Задумка такова. По сообщениям понять в какой момент записан документ в базу.
То есть перед записью написать Сообщить("Документ Записан")
И выдать другие сообщения при конвертации, то может получится что то такое:
Сообщили перед загрузкой
Сообщили при загрузке
Сообщили Документ записали
Сообщили После загрузки.
46. Isakov_Artem 11.04.19 17:15 Сейчас в теме
(44) Хорошая идея. Попробую.
47. alex_bitti 139 11.04.19 17:19 Сейчас в теме
(44) Перед записью сообщение "Документ записан")) Оригинально. Документ записывается в транзакции, сообщение появится а записан он будет позже)
49. Isakov_Artem 11.04.19 17:21 Сейчас в теме
(47) он имеет ввиду модуль объекта документа. Тоже не сразу это понял.
50. oleg-x 26 11.04.19 17:22 Сейчас в теме
(47) Это был как пример, если есть событие перед записью, то и запись будет (если не отказ)
Просто передЗаписью событие есть всегда, а вот призаписи или послезаписи не всегда. А проведение тоже может не работать.
54. alex_bitti 139 11.04.19 17:28 Сейчас в теме
(50) Отказ в конвертации это не совсем Отказ в конфигурации базы, задача обмена сопоставить данные, я уже писал выше, если объект выгружен он будет загружен, при любых вариантах, попробуйте присвоить одинавоые номера разным объектам и сдалать поиск по номеру, при обмене появится сообщение что записать нельзя номер не уникален, однако это сообщение из конфигурации базы, которое не будет соответствовать реальности, вы получите 2 объекта с одинаковыми номерами или кодами как угодно
56. oleg-x 26 11.04.19 17:34 Сейчас в теме
(54) Это я в курсе. Вообще, как это все работает, можно посмотреть в обработке универсальный обмен данными. Так как все действия выполняются там, а это все только текст, который запускается этой самой обработкой.
Но копаться в этой обработке, это надо что бы было "очень надо".
58. alex_bitti 139 11.04.19 17:45 Сейчас в теме
(56) на самом деле данная ситуация описанная автором тупиковая, чуда не произойдет, вариант отсеивать только в Источнике, xml это транспорт, если он нагружен, куда то должен быть выгружен
34. oleg-x 26 11.04.19 16:21 Сейчас в теме
А еще в самой обработке загрузки посмотри галки. Там есть галка, ЗагрузкаВРежимеОбмена.
38. alex_bitti 139 11.04.19 16:54 Сейчас в теме
"Загружать данные в режиме обмена" позволяет игнорировать дату запрета редактирования
39. alex_bitti 139 11.04.19 16:57 Сейчас в теме
Немного другая логика, источником данных являются ПВД, в них нужно разруливать ситуации с загрузкой, в ПКО происходит просто компоновка резульата, по сути в ПКО уже ничего поменять нельзя, только видоизменить
40. Isakov_Artem 11.04.19 17:01 Сейчас в теме
(39) В моем случае проверка на отказ происходит в приемнике, потому что Дату запрета изменения могу получить только в приемнике, а ПВД отрабатывают в источнике.
41. alex_bitti 139 11.04.19 17:04 Сейчас в теме
(40) я это понял, я намекаю на то что нужно менять алгоритм вцелом) по крайней мере мне не известны случаи отмены загрузки в Приемнике тем более в ПКС
43. Isakov_Artem 11.04.19 17:07 Сейчас в теме
(41) Я пытаюсь отменить в ПКО
45. alex_bitti 139 11.04.19 17:10 Сейчас в теме +0.01 $m
(43) я опечатался, ПКО. В конвертации указывается соответствие Один к Одному, ты получил объект из Источника, обмен тебе создает его соответствие в Приемнике, то что ВЫ пытаетесь сделать - нарушить целостность данных. Можно попробовать иначе, в качестве источника использовать набор, или промежуточный объект, хотя легче пересмотреть алгоритм
48. Isakov_Artem 11.04.19 17:20 Сейчас в теме
(45) Но есть же "перед загрузкой" отказ, который должен отменять загрузку. Сообщение (17) очень похоже на правду.
51. oleg-x 26 11.04.19 17:25 Сейчас в теме
(48) Возможно, я так глубоко КД еще не копал. Были подобные проблемы, но все они решались.
В моих случая если документ выгружен, то его не надо загружать только в одном случае, если был загружен и находится в закрытом периоде и подобные варианты.
Но такое еще не делал.
61. maks_20 164 12.04.19 10:22 Сейчас в теме
(51) попробуйте так:
Отказ = Истина;
	ОбъектМодифицирован = Ложь;
в ПослеЗагрузки, тогда
42. alex_bitti 139 11.04.19 17:06 Сейчас в теме
есть длинный путь, механизм регистрации объектов, как это реализовано в типовых
62. Isakov_Artem 12.04.19 11:18 Сейчас в теме
alex_bitti оказался в большей степени прав.
Тесты показали:
Если объект выгружается через ПСК, то "Отказ = Истина" в обработчиках Загрузки в ПКО, на которое ссылается ПКС создает пустой объект (В моем случае счет).
Если объект выгружается напрямую через ПКО, то "Отказ = Истина" в ЛЮБОМ обработчике Загрузки ПКО не создает объект.

Из этого вытекает вопрос: можно ли в обработчиках загрузки ПКО отключить или отменить загрузку ПКС?
64. insurgut 207 12.04.19 12:28 Сейчас в теме
(62)
можно ли в обработчиках загрузки ПКО отключить или отменить загрузку ПКС?

Может в ПКО галочку поставить "При переносе объекта по ссылке НЕ создавать новый объект, а только переносить ссылку"?
vasvl123; +1 Ответить
65. oleg-x 26 12.04.19 13:10 Сейчас в теме
(64) Будет как раз создан документ пустышка.
63. insurgut 207 12.04.19 12:22 Сейчас в теме
Уже давно выложили бы правила. Помимо ПКО есть много глобальных обработчиков. Документ можно записать даже при выполнении поиска объекта по полям поиска.
66. dmitrichenko.ivan 6 12.04.19 14:06 Сейчас в теме
А отладкой загрузки воспользоваться не предлагать?)
67. Isakov_Artem 12.04.19 15:41 Сейчас в теме
ИТОГ:

То что протестировано и проверено:
1. Если объект выгружается через ПСК, то "Отказ = Истина" в ЛЮБОМ обработчике Загрузки в ПКО, на которое ссылается ПКС создает пустой объект (В моем случае счет).
2. Если объект выгружается напрямую через ПКО, то "Отказ = Истина" в ЛЮБОМ обработчике Загрузки в ПКО предотвращает создание объекта.
3. Для решения проблемы пункта 1 нужно поставить галочку у ПКО, которое создает пустой объект "При переносе объекта по ссылке НЕ создавать новый объект, а только переносить ссылку".


В ПКО "После загрузки":

1 Вариант. С использованием типовой процедуры из БП 3.0. (Минус: будет выводить сообщения для всех документов попавшие в закрытый период, в том числе те, которые выгружаются и есть в базе приемника и ничего с этим не поделать. Плюс: анализ вхождения в закрытый период происходит для каждого документа).

ДатыЗапретаИзменения.ПроверитьДатуЗапретаИзмененияПередЗаписьюДокумента(Объект, Отказ, Истина, Истина);


2. Вариант. Получить например в обработчике "Перед загрузкой данных" Дату закрытого периода, поместить в параметр "ДатаЗапретаИзменения" и работать с параметром. (Минус: если будут сложные закрытия периода, то такой вариант не подойдет. Плюс: Можно вывести сообщения только для документов которые вновь добавляются).

Если ЗначениеЗаполнено(Параметры.ДатаЗапретаИзменения) И Объект.Дата <= Параметры.ДатаЗапретаИзменения Тогда
	Отказ = Истина;
	Если НЕ ОбъектНайден Тогда
		Сообщить("Счет " + Строка(Объект.Номер) + " от " + Строка(Объект.Дата) + " находится в закрытом периоде (" + Строка(Формат(Параметры.ДатаЗапретаИзменения,"ДФ=dd.MM.yyyy")) + "). Счет не создан!!!!!!!!!!!!!!!!");		
	КонецЕсли;	
КонецЕсли;


Я выбрал 2 вариант.
malenushka1; ohyen; user1202361; +3 Ответить
Оставьте свое сообщение

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