Консультация № 181638
27.12.2010, 10:03
58.01 руб.
0 12 1
Здравствуйте, уважаемые эксперты! Прошу Вас ответить на следующий вопрос:
Как с помощью КД 2.1.2.1 перенести между двумя аналогичными слегка доработанными(хотя это в принципе не влияет на суть конкретно данного вопроса) конфигурациями УТ 10.2 записи регистра накопления "Взаиморасчеты с контрагентами", не перенося при этом сами регистраторы, а только ссылки на них? Конкретно сейчас регистраторами будут являться только документы вида"Поступление товаров и услуг"
Я сам пробовал так: сначала автоматически сформировал ПКО и ПВД для регистра "Взаиморасчеты с контрагентами". Затем для каждого реквизита и измерения этого регистра установил флажок "Получать из входящих данных". После этого в ПКО "ПоступлениеТоваровУслуг" в обработчике "при выгрузке" вписал следующий код, приведенный в приложении. В итоге сами документы выгружаются, а при выгрузке регистров происходит "ошибка компиляции кода" и регистр не выгружается. Хотелось бы знать в правильном направлении я вообще двигаюсь и если да, то в чем может быть ошибка?

Приложение:
Запрос = Новый Запрос;

Запрос.ТекстЗапроса = "Выбрать
|Рег.Активность Как Активность,
|Рег.ВидДвижения Как ВидДвижения,
|Рег.ДоговорКонтрагента Как ДоговорКонтрагента,
|Рег.Период Как Период,
|Рег.Сделка Как Сделка,
|Рег.СуммаВзаиморасчетов Как СуммаВзаиморасчетов,
|Рег.СуммаУпр Как СуммаУпр,
|Рег.Регистратор Как Регистратор
|Из РегистрНакопления.ВзаиморасчетыСКонтрагентами Как Рег Где
|Рег.Регистратор = &ДокументСсылка"

Запрос.УстановитьПараметр("ДокументСсылка", Источник.Ссылка);
РезультатЗапроса = Запрос.Выполнить();

Таб = РезультатЗапроса.Выгрузить();

СтрТаб = Таб.Получить("0");
ИсходящиеДанные = Новый Структура("Активность, ВидДвижения, ДоговорКонтрагента, Период, Регистратор, Сделка, СуммаВзаиморасчетов, СуммаУпр");
ИсходящиеДанные.Активность = Таб.Активность;
ИсходящиеДанные.ВидДвижения = Таб.ВидДвижения;
ИсходящиеДанные.ДоговорКонтрагента = Таб.ДоговорКонтрагента;
ИсходящиеДанные.Период = Таб.Период;
ИсходящиеДанные.Регистратор = Таб.Регистратор;
ИсходящиеДанные.Сделка = Таб.Сделка;
ИсходящиеДанные.СуммаВзаиморасчетов = Таб.СуммаВзаиморасчетов;
ИсходящиеДанные.СуммаУпр = Таб.СуммаУпр;

ВыгрузитьПоПравилу(,,ИсходящиеДанные,,"ВзаиморасчетыСКонтрагентами");

Обсуждение

Неизвестный
27.12.2010, 14:34
общий
1. в коде СтрТаб = Таб.Получить("0"); лучше сделать проверку если вообще строки в таблице, может тут ошибка...
2. как это не перенося регистраторы? мне кажется что записи регистров накопления не переносятся КД, переносят регистратор а он уже делает движения
3. если нужно перенести остатки я бы воспользовался документом "Корректировка записей регистров"
Неизвестный
27.12.2010, 15:04
общий
1. Возможно проверка и нужна, но в данном случае строка там есть и в ней само собой соответсвующие данные из регистратора, я проверял через Сообщить.
2. На форумах почитал, говорят что вроде так даже в типовых обменах предусмотрено такое, просто переносится ссылка на регистратор, а в итоге там "Объект не найден", т.е. самого регистратора в базе нет.
3. Переносить нужно регулярно, поэтому разовая корректировка не подойдет.

Кстати у меня еще вопрос: насколько вообще корректно переносить этим способом "Вид движения"? у меня вроде другие реквизиты начинают загружаться, а по этому пишет что тип источника - неорпеделено и на этом моменте встает... И тип данных этого реквизита - Неопределено, насколько я понимаю.
Неизвестный
27.12.2010, 21:26
общий
это ответ
Здравствуйте, Посетитель - 355344!

Я бы рекомендовал:
- сделать выгрузку записей регистра 1 в 1. Для измерений всех ссылочных данных создать соответствующие ПКО (в пко переносить только необходимые реквизиты, например дата, номер, код, наименование и т.д., кучу вспомогательных не тянуть).
- для ПКО "Поступление товаров услуг" установть галочку "при переносе объекта по ссылке не создавать новый объект"
- убедиться, что в правилах выгрузки данных документ "Поступление товаров услуг" не присутсвует иначе эти документы нормально так отмигрируют в базу приемник.
- исходя из строчки "Где|Рег.Регистратор = &ДокументСсылка" в Вашем запросе предположу, что выгружаются строго определенные записи. Если это так, то в правиле выгрузки данных регистра установить произвольный алгоритм получения выборки, и в обработчике "Перед обработкой" этого же правила переопределить параметр ВыборкаДанных. Только не забудьте, что он должен быть типа Набор записей.

И немножко мыслей вслух:

Цитата: 355344
2. На форумах почитал, говорят что вроде так даже в типовых обменах предусмотрено такое, просто переносится ссылка на регистратор, а в итоге там "Объект не найден", т.е. самого регистратора в базе нет.

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

Мне не понятен приведенный кусок кода. По нему складывается ощущение, что выгружается только одна запись регистра. А если взаиморасчеты ведутся в разрезе заказов и заказы указаны в табличной части? документ сформирует несколько строк движений по Взаиморасчетам, а Вы выгрузите только первую. Ну и мне не понятно зачем заморачиваться с исходящими данными?

Цитата: 21212
в коде СтрТаб = Таб.Получить("0"); лучше сделать проверку если вообще строки в таблице, может тут ошибка...

Присоединяюсь. Такую проверку на всякий пожарный нужно обязательно сделать в случае с исходящими данными. Если выгружать 1 в 1, то естественно ничего подобного делать не надо.

Цитата: 355344
Кстати у меня еще вопрос: насколько вообще корректно переносить этим способом "Вид движения"?

Абсолютно корректно. Это внутренее перечисление платформы 1с, так что оно переносится на ура.
Неизвестный
29.12.2010, 16:21
общий
"- исходя из строчки "Где|Рег.Регистратор = &ДокументСсылка" в Вашем запросе предположу, что выгружаются строго определенные записи. Если это так, то в правиле выгрузки данных регистра установить произвольный алгоритм получения выборки, и в обработчике "Перед обработкой" этого же правила переопределить параметр ВыборкаДанных. Только не забудьте, что он должен быть типа Набор записей."
----------------------------------------------------------
действительно мне нужно выгружать строго определенные записи, причем обмен как я уже говорил должен происходить регулярно, в связи с чем мне нужно определять ПараметрВыборки в форме обмена при выгрузке. если я установлю тип ПараметраВыборки - РегистрНакопления.ВзаиморасчетыСКонтрагентами, то как я смогу выбирать только те документы которые мне нужно выгружать? Ведь это не ссылочный тип данных, и отдельные записи вручную не выбираются?
Неизвестный
29.12.2010, 21:51
общий
Посетитель - 355344, а что Вы используете для выгрузки? универсальный обмен данными?
Неизвестный
30.12.2010, 10:21
общий
да, универсальный обмен.
---------------------------------------
я попробовал сделать так: создал аналогичный запрос, который обозвал "Запрос1":
Запрос = Новый Запрос;

Выбрать
Рег.Активность Как Активность,
Рег.ВидДвижения Как ВидДвижения,
Рег.ДоговорКонтрагента Как ДоговорКонтрагента,
Рег.Период Как Период,
Рег.Сделка Как Сделка,
Рег.СуммаВзаиморасчетов Как СуммаВзаиморасчетов,
Рег.СуммаУпр Как СуммаУпр,
Рег.Регистратор Как Регистратор
Из РегистрНакопления.ВзаиморасчетыСКонтрагентами Как Рег Где
Рег.Регистратор = &ДокументСсылка"

Тип ПараметраВыборки установил "ДокументСсылка.ПоступлениеТоваровУслуг", и установил галочку, чтобы можно было указывать данный параметр в диалоге.

Затом в "ПередОбработкой" ПВД регистра накопления Взаиморасчеты с контрагентами прописал такой код:

Запрос1.УстановитьПараметр("ДокументСсылка", ПараметрВыборки);
ВыборкаДанных = Запрос1.Выполнить();

Выгрузка вроде как происходит нормально, в файл обмена выгружаются из запроса как раз те данные которые нужны (я сам файл открывал и смотрел), но вот когда начинаешь загружать в приемник он начинает выдает ошибку смысл которой заключается в том что он пытается записать какой-то объект, но тип данного объекта - Неопределено, и соответственно запись не происходит, и в регистре накопления запись вообще не появляется. Не пойму что это за объект такой? Это сама запись регистра? Или это какое-то отдельное свойство регистра? Может это из-за того что мне пришлось отключить ПКС свойства "ВидДвижения", потому что когда это правило действует он вообще не дает выгружать, и выдает такую ошибку:
ВнешняяОбработка.УниверсальныйОбменДаннымиXML(5864)}: Значение не является значением объектного типа (ПКО)
ПКОСвойств = Менеджеры[ТипЗначения].ПКО;
Неизвестный
30.12.2010, 11:11
общий
Смотрите, в универсальном обмене на странице Выгрузка данных внизу есть два таб. поля: слева это загруженные правила, а справа это отборы.
Соответсвенно, что бы ограничить перечень выгружаемых документов мы можем воспользоваться этими самыми отборами.
В загруженных правилах вы становитесь на ваш регистр взаиморасчетов и в правом поле устанавливаете отбор: Регистратор = Нужный док или регистратор в списке и там нужные доки.
Т.е. делаете все как я говорил: выгрузка 1 в 1, только в этом случае надо в правиле выгрузки сделать стандартную выборку, а не произвольную, как я говорил раньше и естественно не переопределять ее.
Неизвестный
30.12.2010, 11:24
общий
В загруженных правилах вы становитесь на ваш регистр взаиморасчетов и в правом поле устанавливаете отбор: Регистратор = Нужный док или регистратор в списке и там нужные доки.
---------------------------------
Когда я становлюсь на регистр он мне вообще не дает никакие отборы устанавливать. может версия обработки для обмена старая?
Неизвестный
30.12.2010, 11:44
общий
Такс, ну у меня 2.1.2, ну и раньше никаких проблем я с этим не замечал. судя по всему проблема в ПКО, поэтому и отборы не срабатывают. Я полагаю, что Вы выгружаете все таки через входящие данные, а не 1 в 1.
Неизвестный
30.12.2010, 11:54
общий
у меня 2.0.12. может на nivaorg@mail.ru скинете обработку?
Неизвестный
30.12.2010, 14:33
общий
Все равно не работает... Как я понял для регистров накопления стандартная выборка вообще не работает
Неизвестный
02.01.2011, 22:48
общий
Да, с регистрами накопления какая-то непонятка получается. Ведут себя абсолютно не так, как регистры сведений, подчиненные регистратору.
Так что надо использовать другую стратегию с ними =(
Что бы не писать много лучше покажу на примере. Собственно пример в приложении. Обратите внимание на событие "После загрузки" и на настройки ПКО.
Прикрепленные файлы:
c02fb7e5723c32b42967507f9e9c5073.rar
Форма ответа