|
Конвертация данных. Поиск объектов, задание условия. | ☑ | ||
---|---|---|---|---|
0
Saruman
15.03.12
✎
14:07
|
Добрый день.
Передаю объект "документ" из УТ в объект "справочник" в БП. Ищу по полям поиска. Хочу, чтобы при соблюдении условия: Год(Источник.Дата) был равен Год(НайденныйОбъект.Дата) В ином случае создавал бы новый элемент. В каком обработчике можно задать такое условие, или как это осуществить. |
|||
1
Saruman
15.03.12
✎
14:23
|
up
|
|||
2
Defender aka LINN
15.03.12
✎
14:26
|
Поля поиска тебе на что?
|
|||
3
Saruman
15.03.12
✎
14:32
|
Поля поиска я задал, а где мне условие это записать?
Номера документов уникальны в пределах периода. У документа изменилась дата. Если она в том же году что и Год(НайденныйОбъект.Дата), тогда мы 100 проц нашли тот самый элемент справочника.Если нет, то создаем новый объект. |
|||
4
Defender aka LINN
15.03.12
✎
14:37
|
(3) Есть специально обученный обработчик в ПКО
|
|||
5
Лирик
15.03.12
✎
14:50
|
(4) Имхо ты не прав. По его задаче F(ДатаИсточника) = F(ДатаПриемника) , а поля поиска сравниваются на равенство ДатаИсточника = ДатаПриемника. Или я чего не знаю про КД?
|
|||
6
Defender aka LINN
15.03.12
✎
14:52
|
(5) Не знаешь. Рекомендую справку по обработчику, там все написано.
|
|||
7
acsent
15.03.12
✎
14:53
|
(5) поля поиска ничего не сравнивают
|
|||
8
Лирик
15.03.12
✎
15:02
|
(6) открыта перед глазами, пример кода, если не сложно
(7) не придирайтесь к словам, сударь. Значение переданное из источника должно быть РАВНО значению приемника. По имени поля поиска. То есть если из источника в поле "ДатаСравнения" передана дата, например 13.01.2001, то в базе приемника совпадение по полю поиска "ДатаСравнения" будет Истинным если Реквизит "Датаприемника" объекта-приемника тоже равен 13.01.2001. |
|||
9
Saruman
15.03.12
✎
15:07
|
Да, действительно в ПКО есть замечательный обработчик: "При загрузке"
там параметры: вроде бы все что надо, только нет доступа к данным Источника, либо я просто не знаю как их получить. В том и вопрос ,что здесь имеется все параметры нужные кроме Источник.Дата. ОбъектНайден - Булево. Если значение параметра равно Ложь, то объект не идентифицирован, то есть не найден в информационной базе Объект - Произвольный. Загружаемый, модифицируемый объект, созданный по ссылке или найденный в информационной базе. Если способ идентификации объекта в файле не указан (т.е. отсутствует узел "Ссылка"), то параметр содержит значение Неопределено. В этом случае в обработчике возможна произвольная инициализация загружаемого объекта, в противном случае, объект будет создан автоматически. НеЗамещатьОбъект - Булево - Если установить значение Истина, то существующий объект информационной базы не будет изменен. ОбъектМодифицирован – Булево. Флажок указывает на то, что в обработчике объект был модифицирован. По умолчанию содержит значение Истина. То есть обработка загрузки считает, что если выполнялся какой-либо обработчик, то объект мог быть модифицирован, и его необходимо записать в информационную базу. Параметр относится только к текущему обработчику и только к найденным объектам. Если объект не был найден, то при любом значении он будет создан и записан. Только для платформы 1С:Предприятие 8. |
|||
10
Defender aka LINN
15.03.12
✎
15:10
|
(9) В ПКО есть замечательный обработчик "Поля поиска". Понимаю, по названию довольно тяжело догадаться, что поиск происходит именно в нем, да...
|
|||
11
Лирик
15.03.12
✎
15:12
|
(10) Поля поиска не решают его задачу.
|
|||
12
Saruman
15.03.12
✎
15:17
|
Параметры:
НомерВариантаПоиска - число. Номер попытки поиска. Попыток поиска может быть не больше 10. СвойстваПоиска -соотвествие в котором хранятся текущие значения реквизитов поиска ПрекратитьПоиск - булево. Если Истина, то поиск объекта прекращается, в зависимости от того СсылкаНаОбъект заполнена или нет создается новый объект. СсылкаНаОбъект - ссылка на результирующий объект. Если в обработчике установить данную ссылку (не пустую) то программа ее запомнит и поиск на этом будет считать успешно завершенным УстанавливатьУОбъектаВсеСвойстваПоиска - булево. Определяет нужно ли после удачного завершения поиска установить объекту все реквизиты поиска. Объект может быть найден по части реквизитов. Этот флаг определяет нужно оставшиеся реквизиты, которые не участвовали в поиске (но по которым поиск возможен) установить объекту или нет. Значение по умолчанию: Истина. НастройкаПоиска - строка. Выбранный пользователем вариант сопоставления объектов. В ПКО есть таблица Варианты настроек полей поиска - с возможными вариантами настроек полей поиска для пользователя. Разработчик правил определяет возможные комбинации полей поиска, которые пользователь может выбирать при настройке обмена. Все настройки указанные разработчиком правил должны быть отработаны в коде обработчика "Поля поиска". Переменная НастройкаПоиска в обработчике определяет выбранный пользователем вариант сопоставления (ИмяНастройкиДляАлгоритма из соответствующей строки таблицы). Если пользователь не выбрал ни один вариант сопоставления, или ему ни один вариант не был предложен, то НастройкаПоиска - пустая строка. СтрокаИменСвойствПоиска – строка в которой задаются ключевые поля варианта поиска. Могут быть указаны только те свойства, для которых при настройке правил обмена был выставлен флаг поиска. |
|||
13
Saruman
15.03.12
✎
15:21
|
Вот код моего обработчика:
Если СвойстваПоиска["ЭтоГруппа"] Тогда СтрокаИменСвойствПоиска = "Наименование, Владелец, ЭтоГруппа"; Иначе Если НомерВариантаПоиска = 1 тогда СтрокаИменСвойствПоиска = "ЭтоГруппа,Владелец,ВидДоговора,Номер,Дата"; Если НомерВариантаПоиска = 2 тогда СтрокаИменСвойствПоиска = "ЭтоГруппа,Владелец,ВидДоговора,Номер"; КОнецЕсли; КонецЕсли; Здесь нельзя сравнить значение Источник.Дата с тем что он нашел, потому что мы здесь еще ничего не нашли, а только командуем по каким полям искать. |
|||
14
Defender aka LINN
15.03.12
✎
15:22
|
(11) В моих руках решают, что характерно.
|
|||
15
Defender aka LINN
15.03.12
✎
15:22
|
(13) СсылкаНаОбъект - ссылка на результирующий объект. Если в обработчике установить данную ссылку (не пустую) то программа ее запомнит и поиск на этом будет считать успешно завершенным.
Дальше продолжать? |
|||
16
Saruman
15.03.12
✎
15:26
|
Как мне сравнить Год(СсылкаНаОбъект.Дата) с Год(Источник.Дата), если здесь нет параметра "Источник"
|
|||
17
Defender aka LINN
15.03.12
✎
15:28
|
(16) Зато есть поля поиска. Или даже не так - Есть ПоляПоиска.
|
|||
18
Лирик
15.03.12
✎
15:29
|
Свой алгоритм и СвойстваПоиска (14) согласен. Поля поиска нафиг не нужны.
|
|||
19
Defender aka LINN
15.03.12
✎
15:31
|
+(17) СвойстваПоиска, конечно же.
|
|||
20
Defender aka LINN
15.03.12
✎
15:31
|
(18) Они тоже нужны. Иначе в обработчике их значений не будет
|
|||
21
Лирик
15.03.12
✎
15:33
|
Я про "СтрокаИменСвойствПоиска"
|
|||
22
Defender aka LINN
15.03.12
✎
15:37
|
(21) Эти - да. Не нужны.
|
|||
23
Saruman
15.03.12
✎
16:59
|
Если Год(СвойстаПоиска["Дата"]) = Год(СсылкаНаОбъект.Дата) Тогда
СтрокаИменСвойствПоиска = "ЭтоГруппа,Владелец,ВидДоговора,Номер"; Иначе СтрокаИменСвойствПоиска = "ЭтоГруппа,Владелец,ВидДоговора,Номер,Дата"; КонецЕсли; |
|||
24
Saruman
15.03.12
✎
16:59
|
Что то типа того????
|
|||
25
Saruman
15.03.12
✎
17:11
|
up
|
|||
26
Defender aka LINN
15.03.12
✎
17:59
|
(23) Ссылку ты должен сам найти
|
|||
27
Saruman
15.03.12
✎
18:09
|
Я немного не понимаю, как?
Я должен найти ссылку на объект? Прямо здесь? То есть я должен уже здесь что-то начать искать? Я немного не понимаю... |
|||
28
Saruman
15.03.12
✎
18:30
|
up
|
|||
29
Лирик
15.03.12
✎
18:37
|
В этом обработчике ты должен написать код на втроенном языке 1С 8 который в конечном итоге сводиться к получению искомой ссылки. Значения для поиска содержатся в соответствии "СвойстваПоиска".
Заканчиваться твой поиск должен так: СсылкаНаОбъект = <ТоЧтоЯНашелСвоимКодом> |
|||
30
Saruman
16.03.12
✎
18:56
|
Если СвойстваПоиска["ЭтоГруппа"] Тогда
СтрокаИменСвойствПоиска = "Наименование, Владелец, ЭтоГруппа"; Иначе СтрокаИменСвойствПоиска = "ЭтоГруппа,Владелец,ВидДоговора,Номер,Дата"; Запрос=Новый Запрос; Запрос.Текст="ВЫБРАТЬ |ДоговорыКонтрагентов.Ссылка |ИЗ | Справочник.ДоговорыКонтрагентов КАК ДоговорыКонтрагентов |ГДЕ | ДоговорыКонтрагентов.Владелец = &Владелец | И ДоговорыКонтрагентов.Номер = &Номер | И ДоговорыКонтрагентов.ВидДоговора = &ВидДоговора | И ДоговорыКонтрагентов.Дата = &Дата | И ДоговорыКонтрагентов.ЭтоГруппа = ЛОЖЬ"; Запрос.УстановитьПараметр("Владелец", СвойстваПоиска["Владелец"]); Запрос.УстановитьПараметр("Номер", СвойстваПоиска["Номер"]); Запрос.УстановитьПараметр("ВидДоговора", СвойстваПоиска["ВидДоговора"]); Запрос.УстановитьПараметр("Дата", СвойстваПоиска["Дата"]); Сообщить(СвойстваПоиска["Владелец"]+СвойстваПоиска["Номер"]+СвойстваПоиска["ВидДоговора"]+СвойстваПоиска["Дата"]); Результат=Запрос.Выполнить(); Выборка=Результат.Выбрать(); Если Выборка.Количество()=0 Тогда Запрос2=Новый Запрос; Запрос2.Текст="ВЫБРАТЬ |ДоговорыКонтрагентов.Ссылка |ИЗ | Справочник.ДоговорыКонтрагентов КАК ДоговорыКонтрагентов |ГДЕ | ДоговорыКонтрагентов.Владелец = &Владелец | И ДоговорыКонтрагентов.Номер = &Номер | И ДоговорыКонтрагентов.ВидДоговора = &ВидДоговора //| И ДоговорыКонтрагентов.Дата = &Дата | И ДоговорыКонтрагентов.ЭтоГруппа = ЛОЖЬ"; Запрос2.УстановитьПараметр("Владелец", СвойстваПоиска["Владелец"]); Запрос2.УстановитьПараметр("Номер", СвойстваПоиска["Номер"]); Запрос2.УстановитьПараметр("ВидДоговора",СвойстваПоиска["ВидДоговора"]); //Запрос2.УстановитьПараметр("Дата",СвойстваПоиска["Дата"]); Результат=Запрос.Выполнить(); Выборка=Результат.Выбрать(); Если Выборка.Количество()=0 Тогда //Показываем,что объект не найден и его нужно создать. //СсылкаНаОбъект=Неопределено; Иначе Пока Выборка.Следующий() Цикл ПромежуточнаяСсылкаНаОбъект=Выборка.Ссылка; КонецЦикла; Если Год(ПромежуточнаяСсылкаНаОбъект.Дата)=Год(СвойстваПоиска["Дата"]) Тогда СсылкаНаОбъект= ПромежуточнаяСсылкаНаОбъект; КонецЕсли; КонецЕсли; Иначе Пока Выборка.Следующий() Цикл СслыкаНаОбъект=Выборка.Ссылка; КонецЦикла; КонецЕсли; КонецЕсли; |
|||
31
Saruman
16.03.12
✎
18:57
|
Вот так получилось, большое спасибо за подсказку.
|
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |