Имя: Пароль:
1C
 
Периодический независимый РС. сравнение полей
0 NordMad
 
21.08.18
16:42
В общем то нужно проверять перед записью МенеджерЗаписи на наличие аналогичной по всем измерениям записи в регистре, но с другим периодом. короче не записывать запись если уже есть такая же запись, но с другим периодом. периодичность - день. можно ли как то сделать без запроса с условием где будут все поля перечислены кроме периода?..
1 saaken
 
21.08.18
16:45
какое-то патологическое неприятие запросов по темам прослеживается
2 Михаил Козлов
 
21.08.18
16:47
А чем запрос плох?
Можно прочитать набор записей с нужными отборами и посмотреть в нем.
Выходит, что период Вам не нужен, тогда зачем периодичность в регистре?
3 NordMad
 
21.08.18
16:47
(1) громоздко. может есть способ компактнее
4 NordMad
 
21.08.18
16:48
(2) а если там 20 измерений. это будет условие на 20 сравнений по каждому. нужен, просто не нужно записывать каждый день одно и то же если остальные поля не изменны могут быть 20-30 дней.. а могут по каким то наборам каждый день меняться. я вот о чем
5 NordMad
 
21.08.18
16:50
(2) хотел использовать
            ПроверкаЗапись.Прочитать();
            Если ПроверкаЗапись.Выбран() тогда
                продолжить;
            КонецЕсли;
это было бы компактно, но период так же ключевое поле, и такой вариант в моем случае не проходит.
6 Вафель
 
21.08.18
16:55
ты просто еще не видел громоздкого кода
7 Numerus Mikhail
 
21.08.18
16:57
(3) напиши запрос в одну строку
8 NordMad
 
21.08.18
16:58
(6) в общем я правильно понимаю что это самый оптимальный вариант, делать запрос с условием по всем полям регистра кроме периода?
9 unregistered
 
21.08.18
16:59
Альтернативы только две - запросом или методом ПолучитьПоследнее().
С точки зрения платформы разницы почти никакой т.к. метод будет точно так же делать запрос к БД. С точки зрения изящности кода, то ИМХО, запрос - понятнее и правильнее.
10 Numerus Mikhail
 
21.08.18
16:59
(8) в (2) самый удобный и простой способ
11 NordMad
 
21.08.18
17:00
(10) примерно так получается:
ВЫБРАТЬ
                                  |    TEL_Transactions.Период КАК Период,
                                  |    TEL_Transactions.Customer КАК Customer,
                                  |    TEL_Transactions.Supplier КАК Supplier,
                                  |    TEL_Transactions.VersionId КАК VersionId,
                                  |    TEL_Transactions.TransferCurrency КАК TransferCurrency,
                                  |    TEL_Transactions.EXW КАК EXW,
                                  |    TEL_Transactions.IsObsolete КАК IsObsolete,
                                  |    TEL_Transactions.TransactionStatus КАК TransactionStatus,
                                  |    TEL_Transactions.ArchivingDate КАК ArchivingDate,
                                  |    TEL_Transactions.TransferPrice КАК TransferPrice
                                  |ИЗ
                                  |    РегистрСведений.TEL_Transactions КАК TEL_Transactions
                                  |ГДЕ
                                  |    TEL_Transactions.Customer = &Customer
                                  |    И TEL_Transactions.Supplier = &Supplier
                                  |    И TEL_Transactions.VersionId = &VersionId
                                  |    И TEL_Transactions.TransferCurrency = &TransferCurrency
                                  |    И TEL_Transactions.EXW = &EXW
                                  |    И TEL_Transactions.IsObsolete = &IsObsolete
                                  |    И TEL_Transactions.TransactionStatus = &TransactionStatus
                                  |    И TEL_Transactions.ArchivingDate = &ArchivingDate
12 unregistered
 
21.08.18
17:08
МетаданныеTEL_Transactions = Метаданные.РегистрыСведений.TEL_Transactions;
Отбор = Новый Структура();
Для Каждого Измерение Из МетаданныеTEL_Transactions.Измерения Цикл
   Отбор.Вставить(Измерение.Имя);
КонецЦикла;
ЗаполнитьЗначенияСвойств(Отбор, МенеджерЗаписи);
СуществующиеДанные = РегистрыСведений.TEL_Transactions.ПоулчитьПоследнее(НужнаяДата, Отбор);
Если ЗначениеЗаполнено(СуществующиеДанные.КакойНибудьИзРеквизитов КоторыйОбязательноДолженБытьНеПустымЕслиЗаписьСуществуетВБазе) Тогда
   Сообщить("Такая запись есть");
КонецЕсли;
13 Михаил Козлов
 
21.08.18
17:08
(4) Виноват, ступил насчет периодичности.
14 unregistered
 
21.08.18
17:13
*(12) Поправка: "СуществующиеДанные.КакойНибудьИзРеквизитов КоторыйОбязательноДолженБытьНеПустымЕслиЗаписьСуществуетВБазе" читать как "СуществующиеДанные.КакойНибудьИзРесурсовКоторыйОбязательноДолженБытьНеПустымЕслиЗаписьСуществуетВБазе"
15 NordMad
 
21.08.18
17:16
(14) спасибо. тоже конечно не пара строк типа Прочитать() и Выбран(). но определенно красивее такого запроса как я привел
16 unregistered
 
21.08.18
17:18
А вообще я чего-то не понял саму постановку задачи...

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

Что должно произойти?
17 Малыш Джон
 
21.08.18
17:20
(3) (15) то есть я правильно понимаю: приоритет - не скорость выполнения, а уложиться в минимальное количество строк?
18 NordMad
 
21.08.18
17:20
(17) а запрос будет быстрее?
19 NordMad
 
21.08.18
17:21
(16) там специфика в том что ресурс один, и он однозначно не поменяется сам по себе без изменениям измерений.
20 NordMad
 
21.08.18
17:22
(16) а чисто теориетически да, будет жопа.. потеря данных
21 Малыш Джон
 
21.08.18
17:25
(18) запрос прочитает один раз, а в (12) сначала ПолучитьПоследнее() прочитает регистр один раз, а потом ещё и менеджер записи перед записью тоже регистр разок прочитает.
Так что да, запрос + набор записей будет быстрее.
22 Малыш Джон
 
21.08.18
17:27
+(21) даже без запроса.
чем не нравится завести набор записей, установить все отборы, по которым нужно проверить, прочитать, далее - если есть в наборе запись - работаешь с ними, нет - доавляешь свежую
23 NordMad
 
21.08.18
17:30
(22) тем что если я не вобью туда период, он вернет мне пустой набор. я бы так и сделал изначально
24 vde69
 
21.08.18
17:35
(23) так тебе не нужен период в измерении, а нужна дата в реквизите?
25 Малыш Джон
 
21.08.18
17:36
(23) как это "вернет пустой набор"? если ты вобъешь все нужные измерения, то тебе вернуться все записи у которых значения измерений подходят под отбор. Не укажешь период - значит вернутся все нужные записи со всеми периодами.
26 Малыш Джон
 
21.08.18
17:38
+(25) "Не укажешь период - значит вернутся все нужные записи со всеми периодами." - т.е. если не установишь отбор по периоду, то в набор попадут все записи подходящие под отбор, независимо, какой у записи будет период
27 Малыш Джон
 
21.08.18
17:39
+(26) собственно, это будет идентично запросу из (11)
28 NordMad
 
21.08.18
17:41
(27)
            ЗаполнитьЗначенияСвойств(записьПроверка,НаборЗаписей);
            записьПроверка.Прочитать();
            если записьПроверка.Выбран() тогда
                продолжить;
            КонецЕсли;
            НаборЗаписей.Период = ТекущаяДата();
            попытка
                НаборЗаписей.Записать(ложь);
            исключение
                Сообщить(ОписаниеОшибки());
            КонецПопытки;

такая конструкция не работает. или ты не это имеешь ввиду?
29 Sasha_H
 
21.08.18
17:45
(0) в упор не понимаю на кой Х регистр периодический и котролить запись по периоду!!!!
30 Малыш Джон
 
21.08.18
17:48
(28) ёопамать...

НаборЗаписей = РегистрыСведений.ТвойРегистр.СоздатьНаборЗаписей();
НаборЗаписей.Отбор.Измерение1.Установить(Значение1);
НаборЗаписей.Отбор.Измерение2.Установить(Значение2);
// и т.д., можно для краткости как в (12) в цикле из какой-нибудь структуры отборы ставить
//...
НаборЗаписей.Прочитать()
Если НаборЗаписей.Количество()>0 Тогда
  НужнаяЗапись = НаборЗаписей[0];
  //ну или опять-таки в цикле перебирать, если их не одна
Иначе
  НужнаяЗапись = НаборЗаписей.Добавить();
  НужнаяЗапись.Измерение1 = Значение1;
  //и т.д.
КонецЕсли;
НаборЗаписей.Записать();
31 NordMad
 
21.08.18
17:48
(29) ну данные прилетают ежедневно, в подавляющем большинстве они не меняются (скажем 80% позиций нет смысла писать) но какие то позы могут меняться каждый день. вот собственно хотел делать проверку, что писать, а что нет необходимости
32 Бухгалтер76
 
21.08.18
17:49
(29) элементарно, чтобы лишние записи не плодить с одинаковыми значениями! ) здесь килобайт, тут килобайт, смотришь база не 100 гигов, а 99 к концу года
33 Малыш Джон
 
21.08.18
17:50
(32) "Вот на эти 2 рубля они и живут" )))
34 NordMad
 
21.08.18
17:50
(30) а чем тебе
ЗаполнитьЗначенияСвойств(записьПроверка,НаборЗаписей);
не подходит то? вместо этого перебора то?
35 unregistered
 
21.08.18
17:51
(19) > ресурс один, и он однозначно не поменяется сам по себе без изменениям измерений.

Тогда почему это ресурс, а не измерение?....
Какая-то мутная структура у вашего регистра и не совсем ясна суть периодичности.
36 Малыш Джон
 
21.08.18
17:54
(34) если НаборЗаписей - это набор записей, то боюсь, что вот на это:

НаборЗаписей.Период = ТекущаяДата();

оно немножко поругается
37 NordMad
 
21.08.18
17:54
(35) ну а куда ещё цену то пихать? в ресурс.. зачем она в измерении то нужна. да почему муть то? в один период могут по всем записям изменения пройтись скажем за неделю, и это всё надо фиксировать по дням, в другой период, скажем 2 неделе изменения коснутся только 20% записей. зачем мне остальные 80% каждый день дублировать? какой в этом стратегический смысл
38 NordMad
 
21.08.18
17:55
(36) почему это? регистр то независимый. ставлю какой хочу период. зачем ругаться.. всё пишет как надо
39 Малыш Джон
 
21.08.18
17:56
(38) у набора  записи нет периода, туда могут входит записи с разными периодами
40 NordMad
 
21.08.18
17:57
(39) блин.. сорри... это название.. по факту это менеджер записи, просто этот кусок кода я не предоставил здесь, отсюда и путанница вышла.
41 Малыш Джон
 
21.08.18
17:59
(38) но в принципе, я тебя понял, (39) - непринципиально, можно и записям набора период устанавливать

просто вместо НаборЗаписей.Прочитать();

ты делаешь ЗаполнитьЗначенияСвойств(МенеджерЗаписи, ЗаписьНабораЗаписей);
МенеджерЗАписи.Проверить();
42 Малыш Джон
 
21.08.18
17:59
(40) я так и понял)
43 NordMad
 
21.08.18
18:01
(41) да и вот в этом случае выдает пустую запись, а вот если перед прочитать указать конкретный период, то всё ок. но это же не то. яж не знаю какой период проверять. вот если бы он давал бы первую попавшуюся запись с каким то периодом, тогда подошел бы вариант и я бы и тему это не завел
44 NordMad
 
21.08.18
18:02
в общем всем спасибо за содействие "странная задача" решена:)
45 Sasha_H
 
21.08.18
18:02
круто если оно еще в цикле
46 Малыш Джон
 
21.08.18
18:09
(43) потому что это менеджер записи, он работает так
набор записей - работает по-другому

Плюс, судя по "продолжить;" из (28) ты это ещё и в цикле делаешь...

Тогда тут точно: по _всему массиву данных_ делается запрос, который выдает таблицу тех записей, которые _реально_ нужно  добавить(т.е. которых нет независимо от того какой у них период) и тогда  _только_ по ним делается цикл
47 Малыш Джон
 
21.08.18
18:09
(46) ах, черт, здесь подчеркивание не работает, да?
48 Михаил Козлов
 
21.08.18
21:27
(46) Присоединяюсь: запросом получить значения измерений и ресурсов, которые нужно записать.
49 dem0sphen
 
21.08.18
22:00
(0) ОтборСтруктура = Новый Структура("Измерение1, Измерение2", ЗначениеИзмерения1, ЗначениеИзмерения2);
ЗначенияРесурсов = Регистрысведений.КурсыВалют.ПолучитьПоследнее(ТекущаяДата(), ОтборСтруктура);
Если ЗначениеЗаполнено(ЗначенияРесурсов["ТвойРесурс"]) Тогда
    // отбой...
КонецЕсли;