Имя: Пароль:
1C
1С v8
Конвертация данных. Поиск объектов, задание условия.
, , ,
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
Вот так получилось, большое спасибо за подсказку.