helpf.pro
Регистрация

v8: Работа с регистром

Ermak
12.10.2015 10:10Прочитано: 8199

Встала такая задача при каждом изменении реквизита Статус и сохранении документа нужно создавать новый Регистр сведений. Вот я сделал процедуру

Код 1C v 8.х
 Процедура СтатусПриИзменении(Элемент)
    Движение = РегистрыСведений.СтатусЗаявокЕдиноеОкно.СоздатьНаборЗаписей();
    Движение.Отбор.Регистратор.Установить(Ссылка);
    Движение.Прочитать();
    НоваяЗапись = Движение.Добавить();
    НоваяЗапись.Период = ТекущаяДата();
    НоваяЗапись.ДатаЗаявки = Дата;
    НоваяЗапись.ДатаСтатуса = ТекущаяДата();
    НоваяЗапись.ЛицевойСчет = ЛицевойСчет;
    НоваяЗапись.ТипЗаявки = ТипЗаявки;
    НоваяЗапись.Причина = Причина;
    НоваяЗапись.Статус = Статус;
    НоваяЗапись.Заявка = Ссылка;
    Движение.Записать();
КонецПроцедуры

Но почему то он переписывает существующую запись, как исправить?

Yandex
Возможно, вас также заинтересует
Реклама на портале
IBReiter
12.10.2015 10:14Ответ № 1

Какие измерения в регистре?

IBReiter
12.10.2015 10:16Ответ № 2

Ну и еще должно быть Движение.Записать(Ложь), чтобы не замещались предыдущие записи

Ermak
12.10.2015 10:18Ответ № 3

что то я не понял. Сделал Движение.Записать(Ложь); и добавил в Процедура ПриЗаписи(Отказ) выдает ошибку что запись с такими полями уже существует и не сохраняет

Ermak
12.10.2015 10:20Ответ № 4

Изменения Реквизита Статус. По задумки статус может постоянной менять, при изменении статуса создается новый регистр с новой датой

IBReiter
12.10.2015 10:21Ответ № 5

Вам нужно еще одно измерение, скорее всего ДатаСтатуса

IBReiter
12.10.2015 10:24Ответ № 6

Не новый регистр, а новая запись регистра

IBReiter
12.10.2015 10:24Ответ № 7

В регистре не может быть две записи с одинаковыми измерениями

Ermak
12.10.2015 10:28Ответ № 8

я создал новое измерение ДатаСтатуса

Ermak
12.10.2015 10:33Ответ № 9

Вот я добавил в процедуру

Код 1C v 8.х
 Процедура ПриЗаписи(Отказ)
Движение = РегистрыСведений.СтатусЗаявокЕдиноеОкно.СоздатьНаборЗаписей();
Движение.Отбор.Регистратор.Установить(Ссылка);
Движение.Прочитать();
НоваяЗапись = Движение.Добавить();
НоваяЗапись.Период = ТекущаяДата();
НоваяЗапись.ДатаЗаявки = Дата;
НоваяЗапись.ДатаСтатуса = ТекущаяДата();
НоваяЗапись.ЛицевойСчет = ЛицевойСчет;
НоваяЗапись.ТипЗаявки = ТипЗаявки;
НоваяЗапись.Причина = Причина;
НоваяЗапись.Статус = Статус;
НоваяЗапись.Заявка = Ссылка;
Движение.Записать();
КонецПроцедуры

Когда я меняю статус, создает регистр Номер строки 2, где меняется Дата статуса, а сам статус принимает одинаковое значение в Номере строки 1 и 2, по задумки Статус должен быть разный.

Ermak
12.10.2015 10:36Ответ № 10

Ermak
12.10.2015 10:52Ответ № 11

Выдает ошибку{Документ.ЗаявкаЕдиноеОкно.Форма.ФормаДокумента.Форма(23)}: Ошибка при вызове метода контекста (Записать)

Движение.Записать(Ложь);

по причине:

Запись с такими ключевыми полями существует! : СтатусЗаявокЕдиноеОкно: 12.10.2015 0:00:00, Заявка единое окно 000000003 от 12.10.2015 0:00:00, 12.10.2015 0:00:00, Заявка единое окно 000000003 от 12.10.2015 0:00:00, 102 100 012, Ремонт плиты, фыфафа, 12.10.2015 0:00:00 (Регистр сведений: Статус заявок единое окно; Номер строки: 3)

IBReiter
12.10.2015 11:04Ответ № 12

Вы отладчиком посмотрите, в какой момент статус меняется

IBReiter
12.10.2015 11:05Ответ № 13

А период разный почему у записей? Может его нужно как дата документа устанавливать, а не тек дата?

Ermak
12.10.2015 11:10Ответ № 14

Период исправил на дату документа, почему больше двух не создается?

IBReiter
12.10.2015 11:11Ответ № 15

Больше двух чего? и в какой момент?

Ermak
12.10.2015 11:14Ответ № 16

На счет почему меняется Статус во всех записях регистра мне не понятно, может что то не так я в коде сделал

Код 1C v 8.х
 Процедура ОбработкаПроведения(Отказ, Режим)
Движение = Движения.СтатусЗаявокЕдиноеОкно.Добавить();
Движение.Период = НачалоДня(Дата);
Движение.ДатаСтатуса = НачалоДня(Дата); 
Движение.ДатаЗаявки = НачалоДня(Дата);
Движение.ЛицевойСчет = ЛицевойСчет;
Движение.ТипЗаявки = ТипЗаявки;
Движение.Причина = Причина;
Движение.Статус = Статус;
Движение.Заявка = Ссылка;
КонецПроцедуры

и второй код когда я записываю в регистр сведений

Код 1C v 8.х
 Процедура ПриЗаписи(Отказ)
Движение = РегистрыСведений.СтатусЗаявокЕдиноеОкно.СоздатьНаборЗаписей();
Движение.Отбор.Регистратор.Установить(Ссылка);
Движение.Прочитать();
НоваяЗапись = Движение.Добавить();
НоваяЗапись.Период = Дата;
НоваяЗапись.ДатаЗаявки = Дата;
НоваяЗапись.ДатаСтатуса = ТекущаяДата();
НоваяЗапись.ЛицевойСчет = ЛицевойСчет;
НоваяЗапись.ТипЗаявки = ТипЗаявки;
НоваяЗапись.Причина = Причина;
НоваяЗапись.Статус = Статус;
НоваяЗапись.Заявка = Ссылка;
Движение.Записать(Истина);
КонецПроцедуры
Ermak
12.10.2015 11:15Ответ № 17

Больше двух записей в регистре сведений не создается, а задумка должна создаваться запись в регистре сведений при изменении статуса, тем самым записей может быть около 5

Ermak
12.10.2015 11:31Ответ № 18

Статус добавлен в регистр сведений в Ресурсы, может я тут что то не правильно сделал?

IBReiter
12.10.2015 11:39Ответ № 19

Да с ресурсом это нормально...

Уберите из обработки проведения код для этого регистра

Ermak
12.10.2015 11:48Ответ № 20

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

Я исправил на Движение.Записать(Ложь);, и все равно переписывает.

Ermak
12.10.2015 11:49Ответ № 21

Убрав код обработки проведения при создании нового документа не записывает в регистр

IBReiter
12.10.2015 12:08Ответ № 22

Скрин сделайте развернутого регистра

Ermak
12.10.2015 14:23Ответ № 23

IBReiter
12.10.2015 15:17Ответ № 24

Так вроде все норм

Только лишние данные: заявка - это регистратор, ДатаЗаявки - это период, можно убрать лишние измерения

Вы ПриЗаписи проследите отладчиком, что с набором записей происходит, чего гадать-то.

Начиная от Прочитать - что в него попало, потом добавили - каким стал набор, потом записался - еще раз шифтф9 нажмите, там же будет видно

Либо у вас еще где-то регистр пишется - может у регистра в модуле менеджера или подписки на события, вариантов еще тьма, на самом деле

Ermak
12.10.2015 15:21Ответ № 25

Я так понимаю код у меня правильный для создания новой записи регистра при изменении Статуса?

Ermak
12.10.2015 15:27Ответ № 26

Я так понимаю чтобы мой код работал нужно Записать(Ложь);

IBReiter
12.10.2015 15:50Ответ № 27

У вас все там правильно, и с истиной должно все работать, потому что вы добавляете запись к набору

Ermak
12.10.2015 16:07Ответ № 28

я решил по пробовать другим способом, я сделал регистр Независимым, создал форму в нем. Прописал код при изменении Статус

Код 1C v 8.х
 Процедура СтатусПриИзменении(Элемент)
НоваяЗапись = РегистрыСведений.СтатусЗаявокЕдиноеОкно.СоздатьМенеджерЗаписи();
    НоваяЗапись.Период = ТекущаяДата();
    НоваяЗапись.ДатаСтатуса = ТекущаяДата();
    НоваяЗапись.ЛицевойСчет = ЛицевойСчет;
    НоваяЗапись.ТипЗаявки = ТипЗаявки;
    НоваяЗапись.Причина = Причина;
    НоваяЗапись.Статус = Статус;
    НоваяЗапись.Записать();
КонецПроцедуры

Когда изменяю статус создается новая запись в регистре, когда сохраняю регистр, то все созданные ранее записи переписывают значение Статуса на последнее, как запретить переписывать значение у ранее созданных записей?

IBReiter
12.10.2015 16:19Ответ № 29

Давай cf, так  хз

IBReiter
12.10.2015 16:20Ответ № 30

Тот, где еще набор записей был

Ermak
12.10.2015 16:35Ответ № 31

Вот cf файл. Регистр сведений СтатусЗаявокЕдиноеОкно http://zalil.su/704219

IBReiter
12.10.2015 17:09Ответ № 32

В обработке проведения у вас там пипец просто...я ж вам говорю, уберите все из нее, что касается регистра

Вы там чего сделать пытаетесь? При записи в форме у вас уже пишется этот регистр, причем независимый...какие там могут быть еще движения?

Ermak
12.10.2015 17:14Ответ № 33

Я же писал выше что переделал регистр сведений. В документе я наворотил спору нет. Подскажите как правильно сделать

IBReiter
12.10.2015 17:22Ответ № 34

Убирайте из обработки проведения все, в форме пусть пишется ПриЗаписи, там же все правильно сделано

Ermak
12.10.2015 17:33Ответ № 35

Убрал все из обработки проведения, документ создает при помощи обработки. Теперь когда создаю документ в регистр запись не создается.

Ermak
12.10.2015 17:36Ответ № 36

Не создает новые записи а переписывает существующую

IBReiter
13.10.2015 09:18Ответ № 37

Нужно вернуть подчинение регистратору для РС

В модуле формы все убрать - оставить только это (записи будут при каждом изменении статуса документа)

Код 1C v 8.х
 

Процедура ПередЗаписью(Отказ, РежимЗаписи, РежимПроведения)
Дата=НачалоДня(Дата);
Если Модифицированность() Тогда
Если НЕ ЭтоНовый() Тогда
Редактор=ПараметрыСеанса.ТекущийПользователь;
КонецЕсли;
КонецЕсли;   
КонецПроцедуры


Процедура ПриЗаписи(Отказ)


КонецПроцедуры


Процедура СтатусПриИзменении(Элемент)

Движение = РегистрыСведений.СтатусЗаявокЕдиноеОкно.СоздатьНаборЗаписей();
Движение.Отбор.Регистратор.Установить(Ссылка);
Движение.Прочитать();
НоваяЗапись = Движение.Добавить();
НоваяЗапись.Период = Дата;
НоваяЗапись.ДатаСтатуса = ТекущаяДата();
НоваяЗапись.ЛицевойСчет = ЛицевойСчет;
НоваяЗапись.ТипЗаявки = ТипЗаявки;
НоваяЗапись.Причина = Причина;
НоваяЗапись.Статус = Статус;
Движение.Записать();

КонецПроцедуры

В модуле объекта все проверьте, чтобы этот регистр нигде не упоминался

Ermak
13.10.2015 16:54Ответ № 38

Сделал как написали. При создании документа в РС запись не создалась, при изменении статуса создается запись в РС, когда сохраняю документ запись в РС удаляется.

IBReiter
13.10.2015 16:59Ответ № 39

Процедура ПриЗаписи в модуле объекта, пишется там регистр?

Процедура ОбработкаПроведения, пишется там регистр?

Вам зачем при записи документа в регистр писать? вы при изменении статуса все пишете

А при создании какой у него статус должен быть? в этом случае можно проверить, при изменении, если набор записей пустой, тогда добавить первую запись в набор с нужным вам статусом для нового документа

IBReiter
13.10.2015 17:00Ответ № 40

Ну или при открытии формы, если ЭтоНовый, вызовите процедуру при изменении

Ermak
13.10.2015 17:02Ответ № 41

Процедура ПриЗаписи в модуле объекта, пишется там регистр?  НЕТ, ВСЕ УДАЛИЛ

Процедура ОбработкаПроведения, пишется там регистр?   ННЕТ, ВСЕ УДАЛИЛ

IBReiter
13.10.2015 17:03Ответ № 42

ПриЗаписи в форме?

Ermak
13.10.2015 17:03Ответ № 43

Что то я запутался. Почему он не создает при каждом изменении статуса новую запись в РС

Ermak
13.10.2015 17:04Ответ № 44

ПриЗаписи в форме ВСЕ УДАЛИЛ

Ermak
13.10.2015 17:05Ответ № 45

13102015.zip  Вот cf файл

IBReiter
13.10.2015 17:23Ответ № 46

Свойство документа "Удаление движений" поставьте - "Не удалять"

Ermak
13.10.2015 17:26Ответ № 47

Это где находится Свойство документа "Удаление движений"

IBReiter
13.10.2015 17:27Ответ № 48

Встаете на документе в дереве конфигурации и Alt+Enter

Ermak
13.10.2015 17:35Ответ № 49

Я как сделать теперь чтобы при создании документа появлялась запись, а то процедура обработка проведения на данный РС нет кода

IBReiter
13.10.2015 17:47Ответ № 50

При создании она не появится, нужно записывать документ сначала, чтобы ссылка у регистратора была

Можно поставить проверку при изменении статуса - если это новый -  тогда отказ - уведомить пользователя и попросить записать документ

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

Ermak
14.10.2015 12:25Ответ № 51

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

IBReiter
14.10.2015 13:53Ответ № 52
Код 1C v 8.2 УП
 

Если ЭтоНовый() Тогда
Предупреждение("Запишите документ!"), 10);
Возврат;
КонецЕсли;
Ermak
14.10.2015 16:52Ответ № 53

Я сделал так

Код 1C v 8.х
 Процедура ОбработкаПроведения(Отказ, Режим)

Если ЭтоНовый() Тогда
Движение = Движения.СтатусЗаявокЕдиноеОкно.Добавить();
Движение.Период = Дата;
Движение.ДатаСтатуса = ТекущаяДата(); 
Движение.ЛицевойСчет = ЛицевойСчет;
Движение.ТипЗаявки = ТипЗаявки;
Движение.Причина = Причина;
Движение.Статус = Статус;
Возврат;
КонецЕсли;
КонецПроцедуры

Но не работает, почему?

IBReiter
14.10.2015 17:30Ответ № 54

Движения без регистра вы не запишете, а вы как раз и пытаетесь это сделать, пока документ новый, у него нет ссылки и соответственно нет регистратора

Из обработки проведения убирайте это все дело

Код 1C v 8.х
 

Процедура СтатусПриИзменении(Элемент)
Если ЭтоНовый() Тогда
Предупреждение("Запишите документ!"), 10);
Возврат;
КонецЕсли;
.....................
Движение.Прочитать();
Если Движение.Количество() = 0 Тогда
НоваяЗапись = Движение.Добавить();
НоваяЗапись.Статус = Ссылка.Статус;
.............
Остальнгое, также как и для других записей
КонецЕсли;
...................
IBReiter
15.10.2015 08:26Ответ № 55

Вот эту строку после условия нужно поставить, это тот код, который и был у вас уже

Остальнгое, также как и для других записей

Ermak
15.10.2015 10:03Ответ № 56

Это получается не корректно, так как Дата статуса будет одинакова, что у Открытого что у Выполненного статуса, а мне надо отследить дату открытого статуса и дату когда выполнился статус

IBReiter
15.10.2015 11:06Ответ № 57

Ну сделайте переменную в модуле, которая запомнит момент создания документа

Ermak
15.10.2015 11:36Ответ № 58

Дак у меня переменная дата статуса, и что вы имеете ввиду.

Как мне эту переменную запись в регистр, мне что то не понятно чем отличается переменная от даты статуса?

IBReiter
15.10.2015 11:40Ответ № 59

Переменных может быть очень много... Вот что я имел ввиду:

Перем ДатаСозданияДокумента;

В форме событие, например, перед открытием:

ДатаСозданияДокумента = ТекущаяДата();

Потом, в том месте при изменении статуса в условии, где проверили на количество записей в РС, вам нужно у добавленной записи ДатаСтатуса = ДатаСозданияДокумента, а не ТекДата

Ermak
15.10.2015 14:11Ответ № 60

Спасибо большое! Все получилось

Ermak
22.10.2015 11:54Ответ № 61

При тестировании появились вопросы, подскажите как быть, сейчас при изменении Статуса в каждый раз добавляется РС, но это не правильно, в РС должен добавляться запись если изменили Статус и сохранили или записали документ. Вот мне не понятно как это сделать. Я сделал в процедуре ОбработкаПроведения

Код 1C v 8.х
 Процедура ОбработкаПроведения(Отказ, Режим)
Движение = РегистрыСведений.СтатусЗаявокЕдиноеОкно.СоздатьНаборЗаписей();
Движение.Отбор.Регистратор.Установить(Ссылка);
Движение.Прочитать();
Если Движение.Количество() > 0 Тогда
НоваяЗапись = Движение.Добавить();
НоваяЗапись.Период = Дата;
НоваяЗапись.ДатаСтатуса = ТекущаяДата();
НоваяЗапись.ЛицевойСчет = ЛицевойСчет;
НоваяЗапись.ТипЗаявки = ТипЗаявки;
НоваяЗапись.Причина = Причина;
НоваяЗапись.Статус = Ссылка.Статус;
КонецЕсли;
Движение.Записать();


КонецПроцедуры
Код 1C v 8.х
    

Но тут не проверяется изменился статус или нет, постоянно создает запись если сохранять документ а мне надо если статус изменился и сохранил документ то создалась запись в РС

IBReiter
22.10.2015 12:58Ответ № 62

Нужно сравнить Статус и Ссылка.Статус

Ermak
22.10.2015 14:44Ответ № 63

А как это сделать, можете подсказать начала а дальше я сам

IBReiter
22.10.2015 15:19Ответ № 64

Начало уже давно у вас есть...тут вопрос в конце

Зачем вот это: Если Движение.Количество() > 0 Тогда ?

Вы теперь только в обработке проведения пишете? или также при изменении? Что происходит с регистром сейчас при проведении? Сохраняется история изменения статусов или нет?

IBReiter
22.10.2015 15:27Ответ № 65

А условие будет Если Статус <> Ссылка.Статус Тогда Делаете запись в регистр КонецЕсли

Ermak
22.10.2015 15:28Ответ № 66

Сейчас история сохраняется при каждом сохранении документа и если документ новый то сохраняет с ДатаСозданияДок

Ermak
22.10.2015 15:29Ответ № 67

Мне не понятно как сделать если я изменяю Статус и сохраняю документ то появляется новая запись в РС

IBReiter
22.10.2015 15:31Ответ № 68

А при изменении не появляется?

Ermak
22.10.2015 15:41Ответ № 69

Я отключил при изменении статуса, так как при каждом изменении статуса создается новая запись в РС хотя документ еще не сохранен, вот такой код бы

Код 1C v 8.х
 	Движение = РегистрыСведений.СтатусЗаявокЕдиноеОкно.СоздатьНаборЗаписей();
Движение.Отбор.Регистратор.Установить(Ссылка);
Движение.Прочитать();
НоваяЗапись = Движение.Добавить();
НоваяЗапись.Период = Дата;
НоваяЗапись.ЛицевойСчет = ЛицевойСчет;
НоваяЗапись.ТипЗаявки = ТипЗаявки;
НоваяЗапись.Причина = Причина;
НоваяЗапись.Статус = Статус;
НоваяЗапись.ДатаСтатуса = ТекущаяДата();
Движение.Записать();

Но мне нужно код статус изменили и сохранили документ, после этого появилась запись в РС, а не при каждом изменении статуса как сейчас

IBReiter
22.10.2015 16:17Ответ № 70

Тогда этот код нужно поместить при записи, и перед началом этого кода добавить условие Если Статус <> Ссылка.Статус Тогда

Ermak
22.10.2015 16:24Ответ № 71

Вообще не создает новую запись в РС при изменении статуса

Код 1C v 8.х
 Процедура ПриЗаписи(Отказ)

Если Статус <> Ссылка.Статус Тогда
Движение = РегистрыСведений.СтатусЗаявокЕдиноеОкно.СоздатьНаборЗаписей();
Движение.Отбор.Регистратор.Установить(Ссылка);
Движение.Прочитать();
НоваяЗапись = Движение.Добавить();
НоваяЗапись.Период = Дата;
НоваяЗапись.ЛицевойСчет = ЛицевойСчет;
НоваяЗапись.ТипЗаявки = ТипЗаявки;
НоваяЗапись.Причина = Причина;
НоваяЗапись.Статус = Статус;
НоваяЗапись.ДатаСтатуса = ТекущаяДата();
Движение.Записать();
КонецЕсли;
КонецПроцедуры
Ermak
22.10.2015 16:30Ответ № 72

В отладчике посмотрел это условие Статус <> Ссылка.Статус не срабатывает 

IBReiter
22.10.2015 17:16Ответ № 73

А вы меняете статус?

Ermak
22.10.2015 17:29Ответ № 74

да, конечно меняю

Ermak
22.10.2015 17:29Ответ № 75

Статус и Ссылка.Статус принимает одинаковое значение

IBReiter
23.10.2015 08:40Ответ № 76

Ссори...перед записью, в при записи они уже совпадают, т.к. запись уже состоялась

Ermak
23.10.2015 09:12Ответ № 77

Спасибо большое! Работает

Ermak
23.10.2015 09:48Ответ № 78

Пытаюсь сохранить значения табличного поля в РС, т.е если в ТП 2 строки с данными то в РС будет 2 записи, но у меня почему то записывает только первую строку, хотя стоит цикл, что не так

Код 1C v 8.х
 	Для Каждого Строка Из ТабОтветственных Цикл		
Движение = РегистрыСведений.СтатусОтветственных.СоздатьНаборЗаписей();
Движение.Отбор.Регистратор.Установить(Ссылка);
Движение.Прочитать();
Если Движение.Количество() = 0 Тогда
НоваяЗапись = Движение.Добавить();
НоваяЗапись.Период = Дата;
НоваяЗапись.ДатаСтатуса = ДатаСозданияДок;
НоваяЗапись.ЛицевойСчет = ЛицевойСчет;
НоваяЗапись.ФИО = Строка.ФИО; 
НоваяЗапись.Статус = Строка.Статус;
НоваяЗапись.Должность = Строка.Должность;
КонецЕсли;
Движение.Записать();
КонецЦикла;
IBReiter
23.10.2015 10:34Ответ № 79

Первую только и будет, у вас условие на кол-во записей, добавляется запись только тогда, когда набор пустой.

Условие уберите или измените

Ermak
23.10.2015 11:47Ответ № 80

Спасибо, все получилось!

Пишу условие такое, при изменении статуса в ТЧ на Отменено или Выполнено после чего статус документа принимает значение Выполнено. Сейчас я меняю статус в любой строке ТЧ сразу же меняется статус документа, но это не правильно

Вот код

Код 1C v 8.х
 Процедура ТабОтветственныхСтатусПриИзменении(Элемент)

Для Каждого Строка Из ТабОтветственных Цикл
Если Строка.Статус=Перечисления.СтатусЕдиноеОкно.Выполнена ИЛИ Строка.Статус=Перечисления.СтатусЕдиноеОкно.Отменена Тогда
Статус = Перечисления.СтатусЕдиноеОкно.Выполнена;
Иначе
КонецЕсли;
КонецЦикла;

КонецПроцедуры
IBReiter
23.10.2015 12:31Ответ № 81

Не понимаю, что вам нужно...

Если неправильно, значит по-другому делайте

Ermak
23.10.2015 15:13Ответ № 82

Не понятно почему статус документа меняется сразу же после изменения статус в одной из строки табличной части , нужно чтобы в табличной части изменил статус во всех строчках после чего изменился статус в документа

IBReiter
23.10.2015 15:49Ответ № 83

Потому что обработчик ТабОтветственныхСтатусПриИзменении на строке висит, вот и меняется

У вас цикл проверяет, если хотя бы для одной строки условие выполняется, тогда изменить статус документа

Если так нужно, тогда после изменения статуса в строке, нужно проверить, скорее всего на равенство его статусам в остальных строках и тогда уже менять статус документа

Ermak
23.10.2015 17:01Ответ № 84

Можете на примере показать

IBReiter
23.10.2015 17:20Ответ № 85
Код 1C v 8.3
 
Процедура ТабОтветственныхСтатусПриИзменении(Элемент)

НовоеЗначениеСтатуса = Истина;

Для Каждого Строка Из ТабОтветственных Цикл
Если НЕ (Строка.Статус=Перечисления.СтатусЕдиноеОкно.Выполнена ИЛИ Строка.Статус=Перечисления.СтатусЕдиноеОкно.Отменена) Тогда
НовоеЗначениеСтатуса = Ложь;
КонецЕсли;
КонецЦикла;


Если НовоеЗначениеСтатуса Тогда
Статус = Перечисления.СтатусЕдиноеОкно.Выполнена;
КонецЕсли;

КонецПроцедуры
dyuha
25.10.2015 06:28Ответ № 86

Предлагаю статус документа и историю статусов хранить отдельно. Статус для списков, а историю, если понадобится для отчетов по срокам исполнения... У документа в конкретный момент времени может быть только один статус. Когда документов станет очень много, система офигеет перебирать по всей истории последнее значение.Вероятно, статус документа может поменять некий другой документ (например, регистрирующий факт исполнения заявки). В связи с этим регистратор не равно заявка.Измерения не ссылочного типа - зло, крадущее поля для индекса виртуальной таблицы. По этому дата смены статуса - период. И больше ни каких дат не надо.

Ermak
26.10.2015 10:22Ответ № 87

Спасибо большое, все получилось

Ermak
02.11.2015 12:04Ответ № 88

НЕ могу понять что случилось, почему не работает условие. Не записывает в РС когда добавляем новую строку в ТЧ  ТабОтветственных

Код 1C v 8.х
 	СтрокаТЧ = ЭлементыФормы.ТабОтветственных.ТекущиеДанные;
Если Статус <> Ссылка.Статус или СтрокаТЧ.Статус <> Ссылка.Статус Тогда
Движение = РегистрыСведений.СтатусЗаявокЕдиноеОкно.СоздатьНаборЗаписей();
Движение.Отбор.Регистратор.Установить(Ссылка);
Движение.Прочитать();
ДвижениеО = РегистрыСведений.СтатусОтветственных.СоздатьНаборЗаписей();
ДвижениеО.Отбор.Регистратор.Установить(Ссылка);
ДвижениеО.Прочитать();
НоваяЗапись = Движение.Добавить();
НоваяЗапись.Период = Дата;
НоваяЗапись.ЛицевойСчет = ЛицевойСчет;
НоваяЗапись.ТипЗаявки = ТипЗаявки;
НоваяЗапись.Причина = Причина;
НоваяЗапись.Статус = Статус;
НоваяЗапись.ДатаСтатуса = ТекущаяДата();
Движение.Записать();
Для Каждого Строка Из ТабОтветственных Цикл
НоваяЗаписьО = ДвижениеО.Добавить();
НоваяЗаписьО.Период = Дата;
НоваяЗаписьО.ДатаСтатуса = ТекущаяДата();
НоваяЗаписьО.ЛицевойСчет = ЛицевойСчет;
НоваяЗаписьО.ФИО = Строка.ФИО; 
НоваяЗаписьО.Статус = Строка.Статус;
НоваяЗаписьО.Должность = Строка.Должность;
ДвижениеО.Записать();
КонецЦикла;
КонецЕсли;
Подсказка: Для быстрого перемещения к последнему ответу или к вопросу используйте или .
Вы не можете отправить комментарий анонимно, пожалуйста войдите или зарегистрируйтесь.