Имя: Пароль:
1C
1С v8
Странность при записи регистра сведений
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, спасибо ещё раз! Все возможные варианты ещё не протестировал, но по-моему это то что нужно