Имя: Пароль:
1C
1С v8
Изменение записей в регистре сведений подчиненных регистратору
0 LivingStar
 
24.09.13
13:54
Есть регистр сведений, в который в разные периоды помещается набор записей. Регистр подчиненный регистратору, периодичность по позиции документа. В регистре актуальным должен быть один набор записей. То есть при проведении документа предыдущие значения должны ставиться в значение ложь. Как лучше это сделать??? На дату проводимого документа все что есть в регистре записывать в ложь? Как то не совсем дойду... Подскажите кому не трудно?!!!
1 Maxus43
 
24.09.13
13:55
При проведении документа набор записей будет перезаписан, старые "удалены"
2 LivingStar
 
24.09.13
13:57
(1) А если новые документы создаются? Старые остаются, поместившие данные в регистр со значением истина.
3 LivingStar
 
24.09.13
13:58
(2+) Нужно это что бы потом отбирая записи, выявлять какие на текущую дату, дату выборки актуальны имеют значение истина! Или какие были актуальны в прошлые периоды, фиксируется это все документом.
4 Maxus43
 
24.09.13
13:59
последние записи (актуальные) - СрезПоследних у регистра, другие записи трогать не надо
5 catena
 
24.09.13
14:29
Нельзя в обработке проведения одного документа исправлять движения другого. Регистра сведений обслуживает указанные нужды без всяких дополнительных телодвижений.
6 LivingStar
 
25.09.13
05:22
(5) Приведу пример:

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

Отчетом нужно смотреть какой был фокусный ассортимент у номенклатуры в любой из выбранных месяцев. То есть при вводе фокусного ассортимента, нужно при обработке проведения отменять предыдущий. Делать это предварительно перепроводя предыдущий документ со значением ложь для номенклатуры? Или в донном случае не нужно для регистра задавать регистратор? Документ нужен в люббом случае. Как лучше сделать?
7 LivingStar
 
25.09.13
05:28
(4) Так видите в чем дело? Я записываю в регистр фокусный ассортимент номенклатуры:
|
// Запись в регистр сведений текущей таблицы документа (установка номенклатуры фокусным ассортиментом)
    НаборЗаписей = РегистрыСведений.ФокусныйАссортимент.СоздатьНаборЗаписей();
    НаборЗаписей.Отбор.Регистратор.Установить(ЭтотОбъект.Ссылка);
    Для каждого Стр Из ФокусныйАссортимент Цикл
        НоваяЗапись              = НаборЗаписей.Добавить();
        НоваяЗапись.Период       = Дата;        
        НоваяЗапись.Номенклатура = Стр.Номенклатура;
        НоваяЗапись.ФА           = Стр.ФА;
    КонецЦикла;
    НаборЗаписей.Записать();
// ---------------------------------------------------------------------------------------------------
Получается что он и будет там храниться со значением истина, а следующим документом я помещаю туда новый фокусный ассортимент, соответственно предыдущий нужно установить в значение ложь. А так получается что вся номенклатура там будет со значением истина лежать. Как отчеты то делать потом?
8 LivingStar
 
25.09.13
05:30
Не совсем понимаю тогда необходимость регистра для этой задачи, можно и документами просто ограничиться...
9 LivingStar
 
25.09.13
06:00
Решение в данном случае, - в обработке проведения документа, полшучать предыдущий документ, устанавливать номенклатуру в его табличной части в значение ложь и перепроводить его, будет верно?
10 catena
 
25.09.13
06:02
(9)Нет. Верно будет так спроектировать регистр, чтобы не патчить все документы при проведении. Ты подумал, что произойдет, если какой-нить жутко умный пользователь в сентябре перепроведет например январь?

У регистра есть период, есть периодичность - этого недостаточно для получения необходимых данных?
11 LivingStar
 
25.09.13
06:09
(10) Получая данные на любуюу дату в выборку будут попадать вся номенклатура из регистра, так как у неё ФА=Истина у всей, так она попадает в регистр. Нужно как то устанавливать значение ФА=Ложь, это будет актуальная номенклатура на текущую дату... Что было актуальной в предыдущие периоды можно будет выбирать из документов.

В документе можно поставить запрет перепроведения если есть последующие документы.

Пока не соображу как правильно сделать. Период и периодичность в этом случае наверное не помогут, важно значение ФА (булево) номенклатуры, табличной части документа.
12 LivingStar
 
25.09.13
06:11
(11) То есть что в регистре ФА=Истина - это актуальный фокусный ассортимент номенклатуры. Он может меняться из периода в период.
13 LivingStar
 
25.09.13
06:29
Подчинение регистратору в данном случае наверное не подойдет.
Думаю сделать регистр с периодичностью день например. И записывать в него каждый раз 2 тч, 1- ФА=истина (Текущий фокусный ассортимент), 2- ФА=ложь (Предыдущий фокусный ассортимент) все на дату документа!
14 catena
 
25.09.13
06:34
Тут куча вариантов.

Можно в том же документе садить проводки по всей остальной номенклатуре со значением ложь.

Можно выбирать записи только максимального периода.

Забудь про запросы по документам. Либо уж делай всё на документах и не парься с регистрами.
15 LivingStar
 
25.09.13
06:39
(14) Решил делать так:

Регистр независимый, периодичность день.

Документ 2 Тч.
1Тч актуальный фокусный ассортимент на дату документа.
2Тч Предыдущий фокусный ассортимент для установки в ложь на дату документа.

При проведении одна номенклатура устанавливается ФА=Истина на дату документа. Другая в ФА=Ложь, предыдущая не актуальная номенклатура на дату докумнета. Но она остается актуальной в предыдущем периоде для истории.
16 mikeA
 
25.09.13
06:41
(15) открой для себя цены номенклатуры
17 anaed
 
25.09.13
06:42
Что мешает при проведении документа поискать последний из предыдущих и его табличную часть записать в РС с ложью?
18 LivingStar
 
25.09.13
06:52
(17) Так примерно и собираюсь делать. При открытии табличную часть последнего из предыдущих занеся в Тч "ОтменяемыйФА".
19 anaed
 
25.09.13
07:39
В эту ТЧ обязательно кто-нибудь залезет и исправит. Да и зачем ее хранить в доке?
20 LivingStar
 
25.09.13
07:42
(19) неактивной сделать, или вообще не показывать, ищу решения, встречаются неправильные и не совсем правильные
21 LivingStar
 
25.09.13
07:44
При движении нужно же устанавливать отбор не только на период, но и на номенклатуру??? А то что то криво работает (((

    НаборЗаписей = РегистрыСведений.ФокусныйАссортимент.СоздатьНаборЗаписей();
    НаборЗаписей.Отбор.Период.Установить(Дата);
    Для каждого Стр Из ОтменяемыйФокусныйАссортимент Цикл
        НоваяЗапись              = НаборЗаписей.Добавить();
        НоваяЗапись.Период       = Дата;        
        НоваяЗапись.Номенклатура = Стр.Номенклатура;
        НоваяЗапись.ФА           = Ложь;
    КонецЦикла;
    НаборЗаписей.Записать();
22 LivingStar
 
25.09.13
07:47
можно ли установить отбор на табличную часть?
23 LivingStar
 
25.09.13
08:06
Подскажите если периодичность регистра в пределах дня. И я выбираю номенклатуру для отмены фокусного ассортимента, это нужно брать тогда не на дату документа, как туда правильнее передать дату?
24 LivingStar
 
25.09.13
08:31
почему при таком проведении:

Процедура ОбработкаПроведения(Отказ, РежимПроведения)
// Запись в регистр сведений текущей таблицы документа ОтменяемыйФокусныйАссортимент (отмена номенклатуры фокусным ассортиментом)
    НаборЗаписей = РегистрыСведений.ФокусныйАссортимент.СоздатьНаборЗаписей();
    НаборЗаписей.Отбор.Период.Установить(Дата);
    Для каждого Стр Из ОтменяемыйФокусныйАссортимент Цикл
        НоваяЗапись              = НаборЗаписей.Добавить();
        НоваяЗапись.Период       = Дата;        
        НоваяЗапись.Номенклатура = Стр.Номенклатура;
        НоваяЗапись.ФА           = Ложь;
    КонецЦикла;
    НаборЗаписей.Записать();
// Запись в регистр сведений текущей таблицы документа УстанавливаемыйФокусныйАссортимент (установка номенклатуры фокусным ассортиментом)
    НаборЗаписей = РегистрыСведений.ФокусныйАссортимент.СоздатьНаборЗаписей();
    НаборЗаписей.Отбор.Период.Установить(Дата);
    Для каждого Стр Из УстанавливаемыйФокусныйАссортимент Цикл
        НоваяЗапись              = НаборЗаписей.Добавить();
        НоваяЗапись.Период       = Дата;        
        НоваяЗапись.Номенклатура = Стр.Номенклатура;
        НоваяЗапись.ФА           = Истина;
    КонецЦикла;
    НаборЗаписей.Записать();
КонецПроцедуры


я не вижу в регистре записей с ФА=Ложь, соответственно они потом все по новой и отбираются в Тч?!!!
25 catena
 
25.09.13
09:07
(24)Один раз делай Записать()
26 Мимохожий Однако
 
25.09.13
09:41
Если фокусный ассортимент действует только месяц, в котором сделан документ, а предыдущие месяцы не учитываются, то хватит табличной части документа без всяких движений в регистрах. Очень похоже на документ инвентаризации. Он фиксирует состояние, но движений не делает. При таком подходе не надо думать о закрытии данных в регистрах сведений при переходе на очередной период.
27 anaed
 
25.09.13
09:45
И создавать набор не надо 2 раза.

    НаборЗаписей = РегистрыСведений.ФокусныйАссортимент.СоздатьНаборЗаписей();
    НаборЗаписей.Отбор.Период.Установить(Дата);
    Для каждого Стр Из ОтменяемыйФокусныйАссортимент Цикл
        НоваяЗапись              = НаборЗаписей.Добавить();
        НоваяЗапись.Период       = Дата;        
        НоваяЗапись.Номенклатура = Стр.Номенклатура;
        НоваяЗапись.ФА           = Ложь;
    КонецЦикла;
    Для каждого Стр Из УстанавливаемыйФокусныйАссортимент Цикл
        НоваяЗапись              = НаборЗаписей.Добавить();
        НоваяЗапись.Период       = Дата;        
        НоваяЗапись.Номенклатура = Стр.Номенклатура;
        НоваяЗапись.ФА           = Истина;
    КонецЦикла;
    НаборЗаписей.Записать();
28 LivingStar
 
25.09.13
09:57
спасибо!
29 LivingStar
 
25.09.13
10:33
(27) У меня проблема в том что ФА в "Ложь" не устанавливается вообще ((( Всегда "Истина". Почему такое может быть?
30 Ненавижу 1С
 
гуру
25.09.13
10:34
(29) неудачник, код покажи
31 LivingStar
 
25.09.13
10:35
А, или вот вижу стал ставить, а то реально сидел, везде истину пишет и все!!! Когда на (27) исправил наверное помогло!!!!
32 LivingStar
 
25.09.13
10:52
А как обойти такой момент, на который сейчас наткнулся:

Январь,  ставлю 7 ФА, отменять нечего
Феврать, ставлю 4 ФА, отменяю 7
Март,    ставлю 5 ФА, а к отмене 11 (а должно быть 4)

это как вижу...
33 LivingStar
 
25.09.13
10:55
(32) При открытии когда формирую таблицу для ОтменыФокусногоАссортимента, видимо оперировать нужно только с предыдущим месяцем!!! А в периодическом регистре сведений только один период? Нужно тогда от даты документа захватывать предыдущий месяц.
34 LivingStar
 
25.09.13
11:32
можно ли делать выборку по регистру сведений передавая не период, а НачДата и КонДата ?
35 LivingStar
 
25.09.13
11:38
up!!!!
36 LivingStar
 
25.09.13
11:42
видимо только если условие накладывать не на регистр а на УСЛОВИЕ выборки, я правильно рассуждаю?
37 Мимохожий Однако
 
25.09.13
11:44
Повторяю. Откажись от регистров. Достаточно документа в месяце.
38 LivingStar
 
25.09.13
11:44
вот так на !!!

ВЫБРАТЬ
    ФокусныйАссортиментСрезПоследних.Период КАК Период,
    ФокусныйАссортиментСрезПоследних.Номенклатура,
    ФокусныйАссортиментСрезПоследних.ФА
ИЗ
    РегистрСведений.ФокусныйАссортимент.СрезПоследних(, ФА = ИСТИНА) КАК ФокусныйАссортиментСрезПоследних
ГДЕ
    ФокусныйАссортиментСрезПоследних.Период МЕЖДУ &НачДата И &КонДата

УПОРЯДОЧИТЬ ПО
    Период
39 LivingStar
 
25.09.13
11:45
(37) Понял!!!! И выборки потом по документам делать? Делать по ним соединения?
40 LivingStar
 
25.09.13
11:46
(37) Согласен, а то что то крутящееся не понятно для чего получается. Оставлю так, пусть будет!!!
41 Мимохожий Однако
 
25.09.13
11:47
(40)Не понял, но согласен.
42 LivingStar
 
25.09.13
11:54
(41) Да мож регистр пригодится!!! В отчеты из регистров же нужно брать данные. Вот и на это опираюсь....
43 bard666
 
25.09.13
11:55
(24) Не забывай Читать наборы, а то перезапишешь весь регистр, а потом возвращать из бэкапов

НаборЗаписей = РегистрыСведений.ФокусныйАссортимент.СоздатьНаборЗаписей();
    НаборЗаписей.Отбор.Период.Установить(Дата);
НаборЗаписей.Прочитать();
44 Мимохожий Однако
 
25.09.13
11:56
Сначала разберись какие отчеты нужны и что нужно для них. Только потом проектируй регистры и движения по ним. Программирование "на всякий случай" - это твоё ноу-хау?
45 LivingStar
 
25.09.13
11:59
(43) то есть (24) работает но не корректно???
нужно делать НаборЗаписей.Прочитать(); ?
46 LivingStar
 
25.09.13
12:01
(44) Так задачи ставятся, нужно то то, то то. Ну а я типа услышав, сразу увидел правильное решение и воплотил его. Было бы так !!! Отчет где отображается то, является ли выведенная номенклатура фокусным вссортиментом?! На дату выборки. Это может пригодяться или потребоваться в любом отчете....
47 bard666
 
25.09.13
12:04
(45) Да, это может отработать некорректно. У меня было такое, когда новый документ перезаписывал весь регистр, стирая записи по предыдущим документам. Пришлось восстановить бэкап и оттуда восстанавливать регистр.
48 LivingStar
 
25.09.13
12:07
(47) Нужно 100% делать НаборЗаписей.Прочитать(); и все будет Ок? Спасибо, учту!!!
49 LivingStar
 
25.09.13
12:22
(27) А если в наборе в первом цикле номенклатура устанавливается в ложь, а во втором в истину??? У меня сейчас выдает ошибку на это, если видимо 2 раза создавать то не ругалась бы???
50 LivingStar
 
25.09.13
12:26
Как исключить такую ошибку?

шибка при выполнении обработчика - 'ОбработкаПроведения'
по причине:
{Документ.УстановкаФокусногоАссортимента(25)}: Ошибка при вызове метода контекста (Записать)

по причине:
Запись с такими ключевыми полями существует! : ФокусныйАссортимент: 01.03.2013, Номенколатура шт. (Регистр сведений: Фокусный ассортимент; Номер строки: 6)
51 LivingStar
 
25.09.13
12:28
Видимо выкинуть предварительно из таблицы ОтменаФокусногоАссортимента то что есть в таблице УстановкаФокусногоАссортимента?!!
52 LivingStar
 
25.09.13
12:32
такое название процедуры ниначто негативно не повлияет?

Процедура УборИзУстановкиТогоЧтоЕстьВОтмене()
КонецПроцедуры
53 Мимохожий Однако
 
25.09.13
12:42
Уже поздно. Повлияло.
54 Enders
 
25.09.13
12:43
Может вместо того что бы думать что-то с регистром, проще было бы отчет правильно написать?
А регистр оставить подчинённый регистратору и периодический?)
Тогда бы просто брали бы срез последний на нужную дату и период>НачалоПериода(НужнаяДата,Месяц)
55 Enders
 
25.09.13
12:44
Только в вашем случае не "Месяц", а квартал)
56 LivingStar
 
25.09.13
12:45
(54) А если скажут что а одном месяце может быть несколько смен фокусных ассортиментов? Когда внедрится это в работу и будут видны все минусы или плюсы, той или иной постановки, там и можно будет править.
57 LivingStar
 
25.09.13
12:46
Была бы Функция УборИзОтменыТогоЧтоЕстьВУстановке(Отмена, Установка)
58 Enders
 
25.09.13
12:51
(56) ну как я понял,то у вас не в одном месяце, а в квартале могут быть несколько ФА, на следующий квартал, прошлые не актуальны.
По-этому мы:
а) берём срез на дату, и получаем последние данные согласно вашим измерениям
б) обрезаем данные условием по периоду НачалоПериода(НужнаяДата,Квартал). И то что было введено до квартала в котором вы хотите посмотреть не попадает в отчет.
59 LivingStar
 
25.09.13
12:54
Это так передается параметров в период регистра сведений НачалоПериода(НужнаяДата,Квартал)? Возможно вы правы, но я двигаюсь по своему алгоритму, так как сторонний мне не совсем понятен. Хотя вижу что ваш более адекватен и прозрачен. Я работаю как могу. делаю вот так как делаю. Сейчас я пытаюсь решить ту задачу когда из одной таблицы значений нужно выборочно удалить записи.
60 LivingStar
 
25.09.13
12:55
(59) Нужно мне это для того, что бы я не мог записать одно и тоже значение на одну и туже дату в разные.
61 Enders
 
25.09.13
13:03
(59)
Запрос выглядит примерно так
"Выбрать
*
Из РегистрСведений.ВашРегистр.СрезПоследних(&ВыбраннаяДата) как Регистр
Где Регистр.Период>=НачалоПериода(ВыбраннаяДата,Квартал)"
62 Enders
 
25.09.13
13:05
(60)
То есть типо если  сентябре было введено ФА1, то в октябре нельзя ввести это же ФА1, так как один и тот же квартал?
63 Enders
 
25.09.13
13:06
(62)Вернее ошибочка)
Ведь октябрь и сентябрь в разных кварталах)
Если в Августре было введено ФА1, то в сентябре нельзя ввести это же ФА1, так как один и тот же квартал?
64 LivingStar
 
25.09.13
13:08
(62) Это уберет из Тз1 то что есть в Тз2 ?


Процедура УборИзОтменыТогоЧтоЕстьВУстановке(Тз1, Тз2)
    Для Каждого Стр1 Из Тз1 Цикл
        Для Каждого Стр2 Из Тз2 Цикл
            Если Стр1.Номенклатура = Стр2.Номенклатура Тогда
                Тз1.Удалить(Стр1.НомерСтроки);    
            КонецЕсли;
        КонецЦикла;
    КонецЦикла;
КонецПроцедуры
65 LivingStar
 
25.09.13
13:10
(63) говорю требования точные не ясны, может быть как угодня, завтра только точно узнаю и буду обновлять рабочую базу на регистр и документ. У меня там и в номенклатуре выводится флажек, фокусный это ассортимент или нет. Посмотрю как это все увяжится.
66 Мимохожий Однако
 
25.09.13
13:13
Добавил бы реквизит Фокусный и обработкой прогонял установку признака, если не нужна история.
(65)Пока нет точных требований, приступать к кодированию опрометчиво.
67 LivingStar
 
25.09.13
13:14
(66) Ну а что делать приходится. Требования есть, но в процессе возникает куча вопросов. Человека который на них бы ответил сейчас нет, вот и делаю как понимаю, как вижу... Все же можно исправить переписать. Пока вот как понял делаю.
68 Мимохожий Однако
 
25.09.13
13:17
ОК. Во всяком случае тебе никто не мешает делать пустую работу.
69 LivingStar
 
25.09.13
13:22
Подскажите как добиться (64) ? Что бы правильно удалить строки?????
70 LivingStar
 
25.09.13
13:34
обощел это следующим образом

    Для каждого Стр Из ТзОтменаФА Цикл
        Если ТзУстановкаФА.Найти(Стр.Номенклатура, "Номенклатура") = Неопределено Тогда
            НоваяЗапись              = НаборЗаписей.Добавить();
            НоваяЗапись.Период       = Дата;        
            НоваяЗапись.Номенклатура = Стр.Номенклатура;
            НоваяЗапись.ФА           = Ложь;
        КонецЕсли;
    КонецЦикла;
    Для каждого Стр Из ТзУстановкаФА Цикл
        НоваяЗапись              = НаборЗаписей.Добавить();
        НоваяЗапись.Период       = Дата;        
        НоваяЗапись.Номенклатура = Стр.Номенклатура;
        НоваяЗапись.ФА           = Истина;
    КонецЦикла;
    НаборЗаписей.Записать();
71 Enders
 
25.09.13
13:56
(65)"говорю требования точные не ясны"
Это пять)))программировать без точных требований и ТЗ, да вы, батенька, знаете толк в извращениях.
72 LivingStar
 
25.09.13
13:56
(71) я просиживаю штаны сижу, увлекаюсь программированием!!!
73 LivingStar
 
26.09.13
08:55
(63) ФА будет изменяться раз в квартал
74 LivingStar
 
01.10.13
11:10
(37) То есть можно просто вводить раз в квартал документ где в табличной части будет фокусный ассортимент и все этоадекватно помещать в отчеты при формировании в разные квартала тот фокусный ассортимент что установлен в документах, не нужны для этого регистры????
75 LivingStar
 
09.10.13
12:30
(63) Может и можно, если его задают ФА, то хоть каждый квартал думаю ....