Имя: Пароль:
1C
1С v8
К вопросу удаления записей из регистра сведений по регистратору
,
0 ArturR
 
24.09.16
16:46
Привет!
Разъяснения прошу.
Задача вроде как простая, но никак не пойму сути.
Суть: Есть документ который в табличной части ссылается на элемент справочника. До тех пор пока документ не проведен этот элемент справочника заблокирован (что бы его не использовали в других документах).
Для этого я сделал регистр Блокировка. С одним измерением - Номенклатура.
1. При записи документа - создается запись

Движения.Блокировка.Записывать=Истина;
Движение = Движения.Блокировка.Добавить();
Движение.Номенклатура = ТекСтрока.Номенклатура;

2. При проведении документа эта запись должна удаляться, т.е. из регистра Блокировка удалится должны записи у которых регистратор этот документ.

Поиск в Интернете дал такой код:
----------------------------------------------
Запрос = Новый Запрос;
Запрос.Текст = "
|ВЫБРАТЬ
|ЦеныНоменклатурыКонтрагентов.Регистратор
|ИЗ
|РегистрСведений.ЦеныНоменклатурыКонтрагентов КАК ЦеныНоменклатурыКонтрагентов";
Результат = Запрос.Выполнить();
Выборка = Результат.Выбрать();
НаборЗаписей = РегистрыСведений.ЦеныНоменклатурыКонтрагентов.СоздатьНаборЗаписей();
Пока Выборка.Следующий() Цикл
НаборЗаписей.Отбор.Регистратор.Установить(Выборка.Регистратор);
НаборЗаписей.Записать();    
КонецЦикла;  
----------------------------------------------

НО! Я никак не пойму как он работает. Где в этом коде есть ссылка на нужный мне регистратор?
5 PR2
 
24.09.16
16:53
(0) Волосы встали дыбом. Что это за мрак?
Что мешает смотреть не в регистр сведений, а в сам документ, нахрена нужен регистр сведений?
6 PR2
 
24.09.16
16:54
+(5) Это уж не говоря о том, что за движения у непроведенного документа обычно пристреливают сразу без разбирательств.
7 jsmith
 
24.09.16
16:55
Во-во
8 ArturR
 
24.09.16
16:58
(6)(5) Согласен. Но как мне заблокировать элемент справочника что бы его по ошибке не использовали в другом.
9 PR2
 
24.09.16
17:00
(8) Блин, так же как и сейчас.
Только смотреть не в регистр сведений, а в документ.
10 ArturR
 
24.09.16
17:03
(9) Значит мне нужно при проведении удалить записи регистра Блокировка. И я так понял, что это делается просто.
Может кто подскажет как?
11 PR2
 
24.09.16
17:07
(10) Рукалицо
Удали нахрен вообще свой регистр сведений
Смотри сразу в документ и анализируй, проведен он или нет
12 ArturR
 
24.09.16
17:12
Дело не в анализе документа.
Задача состоит в том, что бы элемент справочника был заблокирован от использования до тех пор пока документ ждет своего проведения. И только после проведения документа снимается блокировка с элемента.

Пробовал вот это.
НаборЗаписей = РегистрыСведений.Блокировка.СоздатьНаборЗаписей();
НаборЗаписей.Отбор.Регистратор.Установить(ЭтотОбъект.Ссылка);
НаборЗаписей.Записать();


не работает.
13 lEvGl
 
гуру
24.09.16
17:13
зачем нужно такое ограничение?

Задача состоит в том, что бы элемент справочника был заблокирован от использования до тех пор пока документ ждет своего проведения. И только после проведения документа снимается блокировка с элемента.
14 Chameleon1980
 
24.09.16
17:13
(11)
читай
"...Суть: Есть документ который в табличной части ссылается на элемент справочника. До тех пор пока документ не проведен этот элемент справочника заблокирован (что бы его не использовали в других документах). ..."

а рс для скорости. А так он за какой период будет непроведенные документы искать по номенклатуре.

а так он заглянул в рс. посмотрел есть ли там записи.

проанализировал есть ли там номенклатура из нового документа.

я так, например, смысл понял
15 jsmith
 
24.09.16
17:15
Документ сделать измерением.
16 Chameleon1980
 
24.09.16
17:16
(15) предлагал в (1)
17 ArturR
 
24.09.16
17:17
(13)
Этот документ - Акт модернизации.
Сначала программно создаю печатную версию Акта. Потом он подписывается комиссией. Потом в регистрируется и только когда есть номер и дата по журналу учета - документ проводится по базе данных.
И пока документ ждет своей подписи - номенклатура, которая там используется, не должна попасть в другие акты. Это для того что бы не было двойного использования.
18 jsmith
 
24.09.16
17:17
И чо, при событии ПриОкончанииРедактирования, при ПослеУдаления надо будет регистр колошматить?
А, еще надо документ записывать перед операциями с ТЧ.
19 Chameleon1980
 
24.09.16
17:18
+ а что, если пометили на удаление документ?
нужно тоже об удалении записей позаботиться.
+ а что, если сняли пометку на удаления ранее помеченного документ? Но пока не провели. Записи опять писать?

если что просто не забудь про этот нюанс.

А вообще может по-другому как-то обойти?
20 ArturR
 
24.09.16
17:18
(15) А зачем? Этот документ - регистратор.
21 ArturR
 
24.09.16
17:19
(19) Правильно, все. Я тоже про это думал. Не могу пока придумать красивое решение. Хотя бы так хочу сделать.
22 Chameleon1980
 
24.09.16
17:20
(20) и прямо в обработке проведения будешь записи убивать?

а ты смогешь не в обработке проведения записать в РС подчиненный регистратору?
23 jsmith
 
24.09.16
17:20
Хотя не. Проще без РС. Просто блокировка только на элементы в записанном документе, и контроль при записи.
24 Chameleon1980
 
24.09.16
17:21
(23) чет не понял с первого зачитывания?
25 Chameleon1980
 
24.09.16
17:22
записанных документов может быть не один.
с разной номенклатурой.

вот вся эта номенклатура аккуратно и сложится в РС.

при проведении и пометке на удаление записи убиваем.
26 ArturR
 
24.09.16
17:22
(22) да прямо в обработке проведения
27 jsmith
 
24.09.16
17:23
Чет вы гоните.
28 Chameleon1980
 
24.09.16
17:23
+ (25) все записи в рс по данному регистратору.
тут и заморачиваться не нужно про удаленные или вновь добавленные строки.

отбор по данному документу (но по измерению) и убитие этих записей в нужный момент и обратное
29 ArturR
 
24.09.16
17:23
(25)все правильно. В том то и вопрос - как убить записи.
30 jsmith
 
24.09.16
17:24
Берем документ. При записи контроль на то, что есть такие же элементы в другом непроведенном доке - отказ.
При редактировании элемента такой же запрос - отказ.
Или я не так понял задачу.
31 Chameleon1980
 
24.09.16
17:24
(27) кому жто?
32 Лефмихалыч
 
24.09.16
17:25
(5) В РС есть смысл. Чем больше документов будет появляться в базе, тем более ресурсоемкой будет задача определить доступность номенклатуры. Даже при включении индекирования. Регистр при проведении документа очищается, то есть в нем ни когда не будет много записей и с течением времени он не будет расти.
33 PR2
 
24.09.16
17:25
Я как в дурдом попал.

А что, нахождение элемента справочника в каком-то регистре сведений сразу запрещает его использование где-либо?
34 ArturR
 
24.09.16
17:25
(28) т.е. нужно документ именно в измерение загнать?
35 Лефмихалыч
 
24.09.16
17:26
(34) нет
36 ArturR
 
24.09.16
17:27
(33) нет конечно. :) Просто если элемент в РС есть, то значит при проверке на запись документа я дам Отказ=Истина.
37 Лефмихалыч
 
24.09.16
17:27
(33) напряги воображение, Рома
38 PR2
 
24.09.16
17:28
(32) Я как бы в курсе.
Но вот незадача.
Ради этой сомнительной выгоды мы совершает просто вопиющий акт вандализма, просто вообще руки вырвать и выкинуть.
А если уж зайдет речь про объем данных, а я на 1000 процентов уверен, что в (0) и рядом не пахнет каким-нить мало-мальски значимым объемом данных, то тогда нужно в справочник добавлять реквизит "НеТрогатьАТоРукиВырву" и его уже обрабатывать.
39 lEvGl
 
гуру
24.09.16
17:28
странная ситуация, мне кажется, что решение больше организационное. Технически: при печати добавили в не подчиненный регистр запись с номенклатурой, при проведении удалили, а при печати (в момент попытки создания нового документа с такой номенклатурой) проверять регистр и не давать печатать. Ситуации с отменой/удалением документа в базе нужно исключить, так как будет несоответствие базы журналу учета (он я так понимаю - первичен).
пс. странно, что после проведения документа номенклатуру можно использовать снова.
40 ArturR
 
24.09.16
17:29
(37) :) Да напрягаю, напрягаю. Тока видать так напряг что сам себя боюсь
41 PR2
 
24.09.16
17:30
(37) Да я как бы напряг, я просто ТС на (36) спровоцировал, чтобы у него мозг начал работать и наконец сообразил, что не один ли хрен, что обрабатывать, регистр сведений, документ или справочник.
А если нет разницы, то _нахрена_ вся эта свинопляска с регистром сведений и дебильным переставлением проведения с ног на уши?
42 Лефмихалыч
 
24.09.16
17:30
(38) ты можешь быть уверен в чем угодно
43 PR2
 
24.09.16
17:31
(40) Он не тебе, он мне
44 PR2
 
24.09.16
17:31
(42) Я в курсе
45 ArturR
 
24.09.16
17:34
Пацаны. Далеко от темы ушли. Чем впрочем грешат форумы. Вернемся к сути вопроса.
Дано.
1. Регистр и в нем движения.
2. Документ который эти движения сделал.

Задача. Удалить движения которые сделал этот документ.
46 PR2
 
24.09.16
17:37
(45) Рукалицо

Движения.Блокировка.Прочитать();
Движения.Блокировка.Очистить();

Не говори, пожалуйста, что это я тебе подсказал.
Пацаны не поймут.
47 lEvGl
 
гуру
24.09.16
17:39
пацаны обсудили, что им интересно и уже разошлись)
48 ArturR
 
24.09.16
17:42
(46) Спасибо.
49 PR2
 
24.09.16
17:42
(48) Тссс, мы же договорились
50 Web00001
 
24.09.16
17:43
(45)Ты ерундой страдаешь потому что.
Узнать использовалась ли это номенклатура в проведенных документах:

ВЫБРАТЬ
    ЧекККМТовары.Ссылка
ИЗ
    Документ.ЧекККМ.Товары КАК ЧекККМТовары
ГДЕ
    ЧекККМТовары.Ссылка.Проведен
    И ЧекККМТовары.Номенклатура = &Номенклатура

Удалить все движения в указанном регистре по регистратору
НаборВРегистр = РегистрыСвдений.ТвойРегистр.СоздатьНаборЗаписей();
НаборВРегистр.Отбор.Регистратор.Значение = НужныйДок;
НаборВРегистр.Записать(Истина);
Я не пробовал этот код, но вроде как он не может не работать.
51 Chameleon1980
 
24.09.16
17:47
(50) запрос-то на х?

мы в обработке проведения удаляем записи т.е. у нас есть сссылка уже.
52 ArturR
 
24.09.16
17:52
Все нормально. Все работает. Тока не понимаю как. :(

Как этот код написанный в ОбработкеПроведения  "Движения.Блокировка" понимает что нужно выбрать именно по этому документу.
53 PR2
 
24.09.16
17:54
(52) Не парься, я тоже не понимаю, вообще мало кто это понимает.
Бытует легенда, что это потому, что код находится в модуле конкретного документа, но, скорее всего, это просто древняя красивая легенда.
54 Chameleon1980
 
24.09.16
17:56
блин, а мне не понятно - кому что здесь не понятно?
55 PR2
 
24.09.16
17:58
(54) Мне непонятно. Нахрена здесь регистр сведений?
56 ArturR
 
24.09.16
17:59
(53)(54) Ладно пацаны. Хоре лохать меня :) Спасибо за помощь.
(55) По другому я не придумал. Вроде как ничего идейка. Есть пару тонких моментов (19).
57 PR2
 
24.09.16
18:01
(56) По-другому (5) или (38)
58 Chameleon1980
 
24.09.16
18:02
(55) все нормально и с РС ну или с добавлением реквизита номенклатуре.
59 Chameleon1980
 
24.09.16
18:03
+(58) в рс и правда, думаю записей не так много будет. все операции по поиску будут быстрее, чем другие варианты (ИМХО). Вот хотя бы по-этому мне с РС больше нравится вариант.
60 PR2
 
24.09.16
18:03
(58) С РС нормально, допустим.
Ненормально с движениями у непроведенного документа.
61 PR2
 
24.09.16
18:04
(59) Хочешь оптимизировать, пиши в справочник, че
62 Chameleon1980
 
24.09.16
18:05
(60) а чего бы и нет.

Если рс сделать не подчиненным (говорилось не раз выше), а через измерение.
63 Злопчинский
 
24.09.16
18:06
Мне непонятно
Почему нельзя в номенклатуре тупо возводить или снимать флажок ? Без всяких рс?
64 Chameleon1980
 
24.09.16
18:06
(61) с фига ли из справочника быстрее найдется что заблокировано, а что нет?

в рс только конкретные записи про блокировку.

в ситуации со справочником запрос (на больших объемах справочника) будет дольше.
65 PR2
 
24.09.16
18:06
(62) Да в принципе можно и унитаз на кухне прикрутить, ничего такого, в принципе
66 Chameleon1980
 
24.09.16
18:07
(63) потому-что (64)
67 PR2
 
24.09.16
18:07
(63) Мне тоже непонятно. Табу, наверное или комплексы какие-то.
68 PR2
 
24.09.16
18:08
(64) Из какого справочника, ты издеваешься?
Я при обращении к конкретному элементу справочника уже сразу получу инфу, заблокирован он или нет, даже лезть никуда не нужно.
69 Chameleon1980
 
24.09.16
18:08
+(64) потом жеж ненужные записи из рс уйдут когда документ двинувший рс проведется.
и соответственно РС вообще ничтожный будет
70 Chameleon1980
 
24.09.16
18:09
(68) не прав - извиняюсь
71 Chameleon1980
 
24.09.16
18:09
(70) видать в душ пора и спать
72 Chameleon1980
 
24.09.16
18:10
видать и в правду я зациклился на рс просто
73 Злопчинский
 
24.09.16
18:12
Чуден и удивителен мир снеговик

Многия возможности порождают многия печали
74 PR2
 
24.09.16
18:13
(72) Бывает :))
Заметил, частенько кто-нить вкинет в (0) бредятину и ее потом двести постов перетирают, как оптимизировать, вместо того, чтобы задать вопрос, а нахрена вообще она такая нужна.
И потом еще, когда все-таки кто-нить это спросит, полста стыдливо-умно-важных постов на тему того, как нехорошо менять объекты вместо того, чтобы делать новые, как потом сложно обновлять базу будет, какие разные бывают задачи и случаи и как не все сразу однозначно понятно с первого взгляда и прочее бла-бла-бла.
75 Chameleon1980
 
24.09.16
18:13
стоп. а как мы соотнесем потом документ и номенклатуру?

если у нас только флаг будет в номенклатуре?

или просто не давать добавлять в новый документ позиции с уже возведенным флагом.

а при проведении записанного, но не проведенного документа тупо снимать флаг со всех присутвтующих в документе позиций
76 Chameleon1980
 
24.09.16
18:14
а если позиция заблокирована - тупо открыта кем-то - мы запишем программно флаг при этом?
77 PR2
 
24.09.16
18:14
(75) Никак. А есть такая задача? Если нужно, тогда реквизит будет не булево, а ссылка на документ блокировки.
78 PR2
 
24.09.16
18:15
(76) Если не получится записать программно, то говорим, что жизнь не удалась и отказ при записи документа.
79 Chameleon1980
 
24.09.16
18:16
(78)а групповое перепроведение кстати что у нас будет ?
80 PR2
 
24.09.16
18:17
(79) То же самое. Мы же не предупреждение выдаем, а сообщить.
81 Chameleon1980
 
24.09.16
18:18
тупо по всем ошибочным выдать сообщения.

ну там на юзере будет ответственность за проведение не проведенных.

с рс же блокировки такой вероятность меньше.

короче я в душ
82 PR2
 
24.09.16
18:25
(81) Меньше, да, потому что регистр все-таки служебный, в отличие от справочника.
Но если уж совсем делать по уму, то нужно плясать как минимум от (19).
Берешь ты документ, пометил на удаление, у тебя справочник заблокирован, потом хренак и удалил документ физически.
И все, элемент заблокирован навечно.
Поэтому совсем по-правильному делать только через проверку запросом наличия документа-блокировки.
Или (если это правильно логически) как минимум при пометке документа на удаление разблокировать элемент.
И помним, что при этом остается как некрасивый момент непосредственное удаление.
83 Web00001
 
24.09.16
18:29
это прям реально чушь, вот документов много и искать он в проведенных документах будет вечность. Умиляют оптмизитаторы несуществующей нагрузки. У меня в справочнике с несколькими миллионами записей поиск происходит мгновенно. Так на хрена регистры городить, если вопрос только один есть ли номенклатура в проведенных документах или нет? Пусть запрос и ответит на этот вопрос а не регистр сведений.
84 jsmith
 
24.09.16
18:30
Вы еще тут обсуждаете что ли.
85 PR2
 
24.09.16
18:31
(83) +1
Особенно поиск по индексированному реквизиту прямо обнапрягается, чувствую.
86 PR2
 
24.09.16
18:31
(84) А ты из магазина вернулся?
87 ArturR
 
24.09.16
18:33
А вот идея с реквизитом элемента справочника мне в голову приходила. Только вот не хотел реквизит лишний заводить.
(82) придется проверку делать.

(83) мне не нужно лопатить проведенные документы.

По замыслу в регистре максимум 10-15 записей будет.
88 PR2
 
24.09.16
18:34
(87) LOL
Ну да, лучше лишний регистр сделать :))
89 PR2
 
24.09.16
18:34
(87) >>придется проверку делать
Какую?
90 ArturR
 
24.09.16
18:34
(89) ПередУдалением(Отказ)
91 PR2
 
24.09.16
18:35
(87) >>По замыслу в регистре максимум 10-15 записей будет
_Срочно_ регистр, вдруг 1С не справится :))
92 PR2
 
24.09.16
18:35
(90) Ты издеваешься?
93 Фрэнки
 
24.09.16
18:36
если еще раздумья, как сделать лучше, еще не закончены, то предлагаю прекратить мусолить состояние документа только по признаку Проведен или НеПроведен, а добавить ему Статус и  перепроводить документ при установке нового нового статуса. Даже в типовых уже есть применение статусов. Ну или вместо статуса документа можно определять наличие значений в реквизите НомерПоЖурналу А если смена статуса удаляет - Очистить() движение регистра, то все это уже есть и выше об этом сказано
94 ArturR
 
24.09.16
18:37
(88) а что на самом деле лучше? Лишний регистр и или реквизит?
(наверно реквизит)

(90) нет. А что не так?
95 PR2
 
24.09.16
18:38
(94) Зависит от ситуации. В твоем случае однозначно реквизит.
96 PR2
 
24.09.16
18:38
(94) ПередУдалением(Отказ) — это проверка?

https://www.youtube.com/watch?v=d1vRLfuF-wM
97 ArturR
 
24.09.16
18:42
(93) а вот это идея! Т.е. по факту получится что нужно два раза провести. А статусы: НаПодписи, Зарегистрирован.

Нужно обмозговать. Спасибо за идею.
98 ArturR
 
24.09.16
18:42
(96) звука нету. На работе гляну.
99 ArturR
 
24.09.16
18:43
(96) хотя и так понятно :))
100 PR2
 
24.09.16
18:46
(97) Извини, отходил ненадолго, из глав кровь пошла, ходил умываться
101 PR2
 
24.09.16
18:47
+(100) Пойду за попкорном и успокоительным что ли схожу
102 ArturR
 
24.09.16
18:50
(100)(101) Да ладно тебе.

Думаю вопрос закрыт. Всем еще раз спасибо!
103 PR2
 
24.09.16
18:53
(102) Как? А (93) обсудить? Шикарная же идея, но столько нюансов.
104 DrZombi
 
гуру
24.09.16
19:13
(0) Движения.Блокировка.Записывать=Истина;
Движение = Движения.Блокировка.Добавить();
Движение.Номенклатура = ТекСтрока.Номенклатура;

...
Я тебя удивлю, но если перепровести проведенный документ, то записей станет больше. Если не удалять предыдущие записи :)