|
Странность при записи регистра сведений | ☑ | ||
---|---|---|---|---|
0
Антиквар
04.10.13
✎
14:42
|
Всем привет!
Имеется 1С 8.1. В модуле набора записей регистра сведений сделал процедуры ПередЗаписью() и ПриЗаписи(). В каждой процедуре анализируется условие: "Если ЭтотОбъект.Количество()=0 Тогда ..." Это я проверяю, пустой набор записей передается, или нет. Почему-то при ручной корректировке регистра, при любом изменении записи сначала эти две процедуры ПередЗаписью() и ПриЗаписи() прогоняются с пустым набором (т.е. срабатывает моё условие), а потом ещё раз прогоняются уже с нормальным набором, в котором находится редактируемая мной запись. Почему при интерактивной корректировке регистра прямо из списка проходит два цикла процедур ПередЗаписью() и ПриЗаписи()? Я понимаю, когда программно, там в коде может быть какая-то перезапись и всё такое, но когда интерактивно, то ничего не должно быть кроме одного вызова этих процедур. Но самое главное - почему при первом вызове передается пустой набор? |
|||
1
Ненавижу 1С
гуру
04.10.13
✎
14:43
|
сначала очищается, потом пишется новый
|
|||
2
shuhard
04.10.13
✎
14:47
|
(0) так было, есть и будет
|
|||
3
Антиквар
04.10.13
✎
15:09
|
(1),(2) ааа, понятно, спасибо. А как же тогда отследить удаление записи?
Я проверял, есть ли записи в наборе, чтобы в случае, если запись удаляется, то удалить записи из других регистров сведений, с ней связанных. Удаление записи у меня возможно только с обменом из другой базы. Дак вот в случае удаления записи в другой базе с обменом приходит пустой набор по нужному отбору измерений. Я это и использовал как признак удаления. Может просто счетчик срабатывания сделать? В модуле регистра сделать переменную, которая равна нулю изначально, а при каждом входе в ПередЗаписью() увеличивать на единицу? И когда эта переменная равна 2, то и делать свои проверки. |
|||
4
Поросенок Петр
04.10.13
✎
15:10
|
Нефиг делать один регистр зависимым от другого.
|
|||
5
Ненавижу 1С
гуру
04.10.13
✎
15:12
|
(4) правильно, загоняй, загоняй всех в загон для свиней, ибо не смей и думать, что 1С ущербна!
|
|||
6
Поросенок Петр
04.10.13
✎
15:14
|
(5) Теорию БД надо было в школе учить. А 1С тут ни причем.
|
|||
7
Ненавижу 1С
гуру
04.10.13
✎
15:17
|
(6) в школах стали учить теорию БД на примере 1С? тогда понятно откуда это поколение
|
|||
8
Поросенок Петр
04.10.13
✎
15:23
|
(7) Если считать, что нормально связывать две таблицы по составному ключу, любая СУБД будет ущербной.
|
|||
9
Ненавижу 1С
гуру
04.10.13
✎
15:31
|
(8) откуда ты знаешь, как он связывает?
кстати вот подумываю про то, что документ пишет данные в регистр ТоварыНаСкладах, а тот уже сам распределяет по партиям и пишет в регистр ПартииТоваровНаСкладах таким образом центром ответственности распределения по партиям является одна точка - модуль набора записей ТоварыНаСкладах |
|||
10
Поросенок Петр
04.10.13
✎
15:37
|
(9) А как ещё можно связать два регистра сведений? По полному набору измерений одного из них. Желание сделать такое зачастую бывает, когда у записи РС хочется сделать нечто вроде табличной части.
|
|||
11
Ненавижу 1С
гуру
04.10.13
✎
15:40
|
(10) а вот думай ))
|
|||
12
Поросенок Петр
04.10.13
✎
15:41
|
(9) ОбщийМодуль.ВыполнитьДвижухуПартий(Регистратор, ДвиженияПоТоварамНаСкладах) - вот тебе одна точка.
(11) А чо думать? Если у чего-то есть табличная часть, то это заслуживает собственной ссылки. |
|||
13
Антиквар
04.10.13
✎
16:01
|
Вот это понаписали :)
(4) В чем проблема? Есть товар, у него есть аналоги. Все аналоги прописываются в регистре сведений, и каждый блок аналогов имеет уникальный ключ (ID). В этом регистре сведений также прописываются значения, характеризующие только аналог. Не каждый товар является аналогом и соответственно имеет их. Кроме того, не каждый аналог есть в справочнике номенклатуры, т.е. в регистре необязательно ссылки на справочник. Некоторые свойства задаются для группы аналогов целиком, а не для каждого товара, в связи с этим есть несколько регистров, у которых для ID группы аналогов заданы реквизиты. Хотите сказать, что в этом случае структура БД неверная? |
|||
14
Антиквар
04.10.13
✎
16:03
|
(8) С чего Вы взяли, что я связываю по составному ключу? Связываю по полю ID.
|
|||
15
Антиквар
04.10.13
✎
16:08
|
(10) >> А как ещё можно связать два регистра сведений? По полному набору измерений одного из них.
Это ещё почему? Полный набор измерений в данном случае не при чем. Нужно лишь объединять записи регистра в группу и делать некоторые операции с целой группой, а также хранить для этой группы различные характеристики. Короче, что-то Вы много всего наговорили, но не по моему вопросу. |
|||
16
Поросенок Петр
04.10.13
✎
16:11
|
(14) "Связываю по полю ID." Т.е. придумал для РС "ссылку". Эмуляция справочника. А сразу справочник пользовать не сутба?
|
|||
17
Ненавижу 1С
гуру
04.10.13
✎
16:40
|
(16) а зачем? у справочника нет такого прекрасного понятия как составной уникальный ключ, а у РС есть - набор измерений
|
|||
18
Антиквар
04.10.13
✎
16:43
|
(16) Не вижу особого смысла в справочнике.
Во-первых, в регистре автоматический контроль уникальности измерений. Во-вторых, регистр - это необъектыне данные, мне не нужна ссылка. В-третьих, вся работа с регистром строится намного проще, редактирование с любым отбором прямо в списке, удаление записей... В общем, свои плюсы и минусы есть у каждого способа, гланое где больше того или другого. У меня лишь возникла вышеописанная проблема - определение удаления записи. Тут возможно слабое место. |
|||
19
hhhh
04.10.13
✎
16:45
|
(18) там запись по-любому удаляется. Всегда.
|
|||
20
Антиквар
04.10.13
✎
16:46
|
(16) Да и вообще справочник - объект тяжелый.
Вы запустите обработку по удалению например тысячи записей справочника, и то же самое с регистром. Увидите разницу. |
|||
21
Антиквар
04.10.13
✎
16:48
|
(19) Да, я понял, прежний набор очищается, новый записывается. Но вот если с обменом пришло удаление записи, как понять, удалится запись или просто исправится.
|
|||
22
Зойч
04.10.13
✎
16:48
|
(21) никак
|
|||
23
kiruha
04.10.13
✎
16:52
|
Как как - обычный запрос
В отборе все есть |
|||
24
Антиквар
04.10.13
✎
18:22
|
(23) В отборе вроде бы нет информации, удаляется запись или нет.
|
|||
25
kiruha
04.10.13
✎
19:16
|
В отборе есть информация по ключу записи
По ключу можешь получить что было и сравнить с тем что кладется Если В новом наборе нет записи из старого - значит удаляется Если есть с другими ресурсами - меняется Нет - добавляется |
|||
26
Антиквар
04.10.13
✎
22:59
|
(25) спасибо, понятно
|
|||
27
Антиквар
07.10.13
✎
10:26
|
(25) Думал с Пн возьмусь, но что-то то ли мысль потерял, то ли Ваш метод не сработает.
>> "По ключу можешь получить что было и сравнить с тем что кладется" А как узнать, что кладется? Ведь в том и проблема у меня, что в первом срабатывании ПередЗаписью() и ПриЗаписи() передается пустой набор (очищается), а уже при втором срабатывании набор с данными. И если у меня срабатывает это условие: "Если ЭтотОбъект.Количество()=0 Тогда ..." то я и не могу понять, что кладется |
|||
28
hhhh
07.10.13
✎
10:30
|
(27) Отбор смотрите
|
|||
29
Антиквар
07.10.13
✎
10:52
|
(28) Я смотрю отбор, но в нем лишь значения измерений регистра (ключ). Но сам то отбор при этом пустой. Т.е. я не знаю, он удаляется, или запишется с новыми значениями ресурсов/реквизитов. А вот при втором срабатывании процедуры ПередЗаписью() в отборе передается уже не пустой набор записей, передается уже именно моя запись с новыми значениями ресурсов/реквизитов.
|
|||
30
kiruha
07.10.13
✎
11:22
|
Ну добавь переменную ЭтоРучноеИзменение Экспорт.
В форме записи ПередЗаписью ЭтоРучноеИзменение=Истина В формезаписи ПриЗаписи ЭтоРучноеИзменение=Ложь //тут обработка для случая записи Т.к. в форме эти события по одному разу |
|||
31
kiruha
07.10.13
✎
11:25
|
В модуле набора убрать модификацию если ручная запись
|
|||
32
hhhh
07.10.13
✎
11:32
|
(29) первая ПередЗаписью всегда удаление. Вторая ПередЗаписью добавление
|
|||
33
Антиквар
07.10.13
✎
11:39
|
(32) Это я понял, но вот как их друг от друга отличить. Глобальную переменную вводить для этого не хочется.
И кстати в случае, если запись удаляется, будет ли второй запуск ПередЗаписью() с пустым набором? Если нет, то тогда вообще не определить, удаляется запись или нет, т.к. в первом запуске ПередЗаписью() всегда пустой набор, а второго запуска ПередЗаписью() при удалении не будет. Но это я проверю опытным путем. |
|||
34
Антиквар
07.10.13
✎
11:41
|
(30) kiruha, не понял про переменную, как она поможет понять, удаляется запись регистра или нет, если в ПередЗаписью() переменная всегда Истина, а в ПриЗаписи() всегда Ложь.
|
|||
35
kiruha
07.10.13
✎
11:47
|
(34)
Она только флаг ручного изменения. Удаляется/добавляется - как раньше делал кроме ручного изменения А вот как обойтись без общей переменной - пока не приходит в голову |
|||
36
kiruha
07.10.13
✎
12:05
|
Вместо глоб перем еще можно завести реквизит ЭтоРучноеИзменение - ставить в Истину для ручных изменений. Может кстати пригодиться для отчетов
|
|||
37
sirsp
07.10.13
✎
12:07
|
(34) ЕМНИП при записи пустого набора в ПередЗаписью Модифицированность() ИСТИНА в случае чистого удаления, и ЛОЖЬ в случае замещения (второй вызов будет)
|
|||
38
Антиквар
07.10.13
✎
12:30
|
(37) спасибо, поэкспериментирую
Кстати, оказалось, что когда запись регистра приходит с обменом, не важно добавляется она, изменяется или удаляется, всё проходит за 1 раз, двойных вызовов процедуры ПередЗаписью() нет. Двойной вызов только когда редактируешь регистр в текущей базе. Вот почему у меня и всплыла такая проблема, раньше у нас нельзя было этот регистр редактировать, только через обмен. |
|||
39
Антиквар
07.10.13
✎
14:36
|
(37) sirsp, спасибо ещё раз! Все возможные варианты ещё не протестировал, но по-моему это то что нужно
|
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |