Задача: При смене статуса документа (реквизит "статус") с "в пути" на "доставлено" должна добавиться запись в регистр сведений со статусом "доставлено" и датой. Старая запись не должна удалиться при перепроведении.

В итоге должны быть 2 записи в регистре. Например,
Дата: 12.10.2020 | Статус: В пути
Дата: 15.10.2020 | Статус: Доставлено

Как реализовать подобное?
---
Решил все гораздо проще, надо было отвлечься и идея пришла сама. Пришлось выбрать немного иной путь, чтобы сохранить привязку к регистратору.

Вот само решение, если кому пригодится

```1c
    Процедура ОбработкаПроведения(Отказ, Режим)

    // Проверка
    Если ПоискРаспоряженийНаДоставку(Распоряжение.Ссылка) Тогда
    Отказ = Истина;
    Сообщить("По данному документу доставка не требуется!", СтатусСообщения.Внимание);
    Возврат;
    КонецЕсли;

    // регистр од_РаспоряженияНаДоставку
    Движения.од_РаспоряженияНаДоставку.Записывать = Истина;
    Движение = Движения.од_РаспоряженияНаДоставку.Добавить();

    Движение.Период = Дата;
    Движение.Партнер = Партнер;
    Движение.СуммаДокумента = СуммаДокумента;
    Движение.Распоряжение = Распоряжение;
    Движение.Адрес = Адрес;
    Движение.Транспорт = Транспорт;
    Движение.СтатусДоставки = СтатусДоставки;
    Движение.ДатаС = Дата;

    Если СтатусДоставки = Перечисления.од_СтатусыДоставки.Доставлено Тогда

    Движение.ДатаПо = ТекущаяДата();

    КонецЕсли;

    КонецПроцедуры
```
---
Регистр готовый, или с нуля надо создать? Что будет происходить в случае отмены проведения в этом регистре - какие записи должны удаляться?
---
обе записи должны удалиться при отмене проведения.
Дата: 12.10.2020 | Статус: В пути
Дата: 15.10.2020 | Статус: Доставлено
---
А на первый вопрос ответить?

Необходим независимый периодический регистр с измерением "Документ" и ресурсом "Статус". Актуализация записей регистра в обработчике модуля объекта (документа) "ПриЗаписи()"
---
А при записи как будет работать? Разве без проведения запись так не добавится?
---
В обработчике документа ПриЗаписи() анализируйте состояние записанного документа. Проведен или не проведен. В зависимости от этого состояния обрабатываете свой регистр.
---
Вот сам регистр. Дата - дата документа (на данный момент). "в пути" еще не реализовано
---
Подчинение регистратору - не очень хорошая идея. В этом случае вам придется изменять логику проведения документа в ОбработкаПроведения(). То есть вам придется считать предыдущие движения документа, анализировать их, и на их основании формировать собственные.
Возникает опять же вопрос - откуда вы будете брать даты для статусов? Из даты документа не предлагать. Напрашивается дата фактического проведения документа, но тоже так себе достоверность.
---
регистр же на дату пишется, даты-разные. не должны другие статусы удаляться.
---
Ой-ли? Всегда?
---
Вообще все просто. Периодический регистр с измерением - ссылкой на Ваш документ. ПередЗаписью Проверяете старый статус:

```1c
    СтарыйСтатус = ОбщегоНазначения.ЗначениеРеквизитаОбъекта(Ссылка,"Статус");
    Если Статус <> СтарыйСтатус;
    ДополнительныеСвойства.Вставить("СтатусИзменен",Истина);
    КонецЕсли;
```

Потом ПриЗаписи проверяете этот признак и записываете статус:

```1c
    Если ДополнительныеСвойства.Свойство("СтатусИзменен") И ДополнительныеСвойства.СтатусИзменен Тогда
    Запись = РегистрыСведений.од_РаспоряжениеНаДоставку.СоздатьМенеджерЗаписи();
    Запись.Распоряжение = Ссылка;
    Запись.Период = ТекущаяДата();
    Запись.СтатусДоставки = Статус;
    //заполняем остальное
    Запись.Записать();
    КонецЕсли;
```

Наверное статус документа тоже нужно отслеживать таким же способом.
---
Подчинение регистратору уберите
---
а с регистратором не получится?
---
а зачем? бессмысленно с точки зрения архитектуры. Имело бы смысл если бы у Вас был документ типа "перемещение товара", который указанным в ТЧ товарам менял бы статус.
---
у меня просто на основании заказа создается документ Накладная по доставке, которая и добавляет записи в регистр. Это не будет проблемой при написании отчетов в будущем? Я же не смогу отследить ссылку на документ (это заказ или накладная по доставке).

Плюс нужно, чтобы нельзя было создать эти записи вручную и при отмене проведения удалялись все записи по данному документу.
---
то есть на один заказ несколько накладных, тогда да, регистратор имеет смысл. Тогда получается статус - это реквизит накладной и запись регистра делать как обычно через Движения. Реквизит Статус у заказа тогда не нужен.
---
У заказа реквизит статус может принять только значения "Требуется" и "Не требуется". Использую для вывода в отчет "Реестр заявок", чтобы менеджер или администратор мог увидеть список заявок и распределить их между водителями.
---
Вы имеете ввиду, что на форме заказа для выбора доступны только два значения статусов из всего списка? При этом сам реквизит статуса в заказе отсутствует и всегда хранится только в регистре сведений. В тот же регистр сведений свои значения статусов для данного заказа могут писать документы доставки.
Я правильно понял?
---
На форме заказа да, доступны для выбора только 2 эти значения реквизита.
Сам реквизит в заказе тоже присутствует и ссылается на перечисление со статусами доставки.
И да, из заказа тоже добавляется запись в регистр. Вот скрин того что есть сейчас
---
Ок. Вопрос. При проведении накладной на доставку - в заказе изменяется статус и он перепроводится с новым статусом "В пути"? Или как вы собираетесь совмещать хранение статусов в самом документе, и в регистре?
---
В заказе может требоваться или нет доставка. На основании создается накладная на доставку со статусом "В пути" или "Доставлено". И по срезу последних по этому распоряжению (измерение) выводится актуальный статус
---
Ну ёлы палы, какой же это СТАТУС заказа? Это обычный булевый флаг - требуется что-то или нет. И к статусу самой операции доставки "Готовится", "Отправлено", "Доехало" или "Своровали по дороге" - этот флаг не имеет никакого отношения. Не надо пытаться их компоновать в единый микс.
---
Все-таки пока не вижу смысла в регистраторе для записи периодического регистра сведений. Пока не будет описания всех возможных статусов и их событийной модели - о регистраторе говорить не приходится. Вполне возможно, что некоторые статусы могут изменяться с помощью обработок без изменения самого заказа или документа доставки.
---
Ну он для отчета и целостности данных нужен, человек же написал. Самый простой способ - это реквизит у накладной "новый статус", который пойдет в запись РС. В заказе "Статус" (не надо было его также называть) - это вообще не связанный реквизит, зачем он в регистре сведений не понятно, ибо меняться по логике не должен и может быть получен по ссылке. На форме заказа выводить статус доставки из среза последних и/или сделать переход на историю статусов. На форме списка выводить тоже статус из среза последних.
---
При перепроведении изменяется старая запись, новая не добавляется. Что я делаю не так? Или это из-за регистратора?

```1c
    Процедура ПередЗаписью(Отказ, РежимЗаписи, РежимПроведения)

    СтарыйСтатус = ОбщегоНазначения.ЗначениеРеквизитаОбъекта(ЭтотОбъект.Ссылка, "СтатусДоставки");
    Если СтатусДоставки <> СтарыйСтатус Тогда
    ДополнительныеСвойства.Вставить("СтатусИзменен", Истина);
    КонецЕсли;

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

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

    Если ДополнительныеСвойства.Свойство("СтатусИзменен") И ДополнительныеСвойства.СтатусИзменен Тогда

    // регистр од_РаспоряженияНаДоставку
    Движения.од_РаспоряженияНаДоставку.Записывать = Истина;
    Движение = Движения.од_РаспоряженияНаДоставку.Добавить();
    Движение.Период = ТекущаяДата();
    Движение.Партнер = Партнер;
    Движение.Транспорт = Транспорт;
    Движение.Распоряжение = Распоряжение;
    Движение.СтатусДоставки = СтатусДоставки;
    Движение.Адрес = Адрес;
    Движение.СуммаДокумента = СуммаДокумента;

    КонецЕсли;

    КонецПроцедуры
```
---
Потому что при перепроведении очищаются предыдущие движения. Именно поэтому я вам и говорил не использовать регистратор, потому что это повлечет сложную настройку и логику проведения документа в части этого регистра.

Можете, конечно, перед записью в допсвойства сохранять и текущие движения документа. Но на мой взгляд это не та задача, где нужна такая тяжелая артиллерия.
---
Тогда будут проблемы в другом Я же не смогу отследить ссылку на документ (это заказ или накладная по доставке).

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

А если в одной записи? Например "дата с" и дата по". При проведении со статусом "в пути" Дата С бы записалась, а при изменении статуса поменялось бы значение статуса в регистре на "доставлено" и заполнилась бы еще Дата По. Так тоже не получится с регистратором?
---
1. Чего вы отследить не сможете. Что такое "документ или накладная"? Выражайтесь точнее.
2. Еще хуже.
---
хотя создам реквизит "регистратор" вручную и буду передавать ссылку на передаваемый объект. А как быть с автоудалением всех движений при отмене проведения тогда?
---
1. Наконец-то...
2. Там же. ПриЗаписи(). Для проведенных записи формируются, для непроведенных очищаются.
---
При записи не работает.
1) После отмены проведения записи не удаляются.
2) Если документ был записан и только после провели в том же статусе, в котором он был записан, то запись в регистр не добавится
---
Решил все гораздо проще, надо было отвлечься и идея пришла сама. Пришлось выбрать немного иной путь, чтобы сохранить привязку к регистратору.

Вот само решение, если кому пригодится

```1c
    Процедура ОбработкаПроведения(Отказ, Режим)

    // Проверка
    Если ПоискРаспоряженийНаДоставку(Распоряжение.Ссылка) Тогда
    Отказ = Истина;
    Сообщить("По данному документу доставка не требуется!", СтатусСообщения.Внимание);
    Возврат;
    КонецЕсли;

    // регистр од_РаспоряженияНаДоставку
    Движения.од_РаспоряженияНаДоставку.Записывать = Истина;
    Движение = Движения.од_РаспоряженияНаДоставку.Добавить();

    Движение.Период = Дата;
    Движение.Партнер = Партнер;
    Движение.СуммаДокумента = СуммаДокумента;
    Движение.Распоряжение = Распоряжение;
    Движение.Адрес = Адрес;
    Движение.Транспорт = Транспорт;
    Движение.СтатусДоставки = СтатусДоставки;
    Движение.ДатаС = Дата;

    Если СтатусДоставки = Перечисления.од_СтатусыДоставки.Доставлено Тогда

    Движение.ДатаПо = ТекущаяДата();

    КонецЕсли;

    КонецПроцедуры
```
---
Ничего хорошего в этом решении нет. Ну ок, каждый на своих граблях учится.
---
а почему ничего хорошего? При создании или перезаписи создается всего одна запись с датой С, если перепровести или сразу провести со статусом Доставлено, то и Дата По заполняется. И нет кучи проблем, которые я описывал выше. Возможно это не лучшее решение, но тут решения получше я не нашел
---
Привет, столкнулся с аналогичной проблемой, но даже с твоим кодом сделать не получилось. Можно ли тебе скинуть, чтобы ты посмотрел?
---
Если ДополнительныеСвойства.Свойство("СтатусИзменен") И ДополнительныеСвойства.СтатусИзменен подскажите, а почему два раза? Они разве не одно и то же значение выводят?
---
Почитайте описание метода Свойство() у коллекции "Структура". Это не одно и то же.
Первое - это наличие такой "строки с ключом" в самой структуре. Второе - непосредственное значение "строки с ключом".
---
А если в документе добавить табличную часть для хранения всех статусов с датами, первично писать изменения в нее, а уже по ней делать записи в регистр. Тогда при перепроведении точно так же все статусы из этой табличной части запишутся в регистр.
---
Руки оторву!!! А зачем тогда регистр?
---
такого я еще не видел))
---
Сообщение было скрыто модератором.
---
Интересное решение, не догадался бы никогда
---
В БП3 для этого есть регистр "СтатусыДокументов".