Запись в регистр сведений при смене статуса документа

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

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

Как реализовать подобное?
По теме из базы знаний
Найденные решения
37. ciddex 16.09.20 00:50 Сейчас в теме
(36) Решил все гораздо проще, надо было отвлечься и идея пришла сама. Пришлось выбрать немного иной путь, чтобы сохранить привязку к регистратору.

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

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

	// Проверка
	Если ПоискРаспоряженийНаДоставку(Распоряжение.Ссылка) Тогда
		Отказ = Истина;
		Сообщить("По данному документу доставка не требуется!", СтатусСообщения.Внимание);
		Возврат;
	КонецЕсли;
	
	// регистр од_РаспоряженияНаДоставку
	Движения.од_РаспоряженияНаДоставку.Записывать = Истина;
	Движение = Движения.од_РаспоряженияНаДоставку.Добавить();
	
	Движение.Период = Дата;
	Движение.Партнер = Партнер;
	Движение.СуммаДокумента = СуммаДокумента;
	Движение.Распоряжение = Распоряжение;
	Движение.Адрес = Адрес;
	Движение.Транспорт = Транспорт;
	Движение.СтатусДоставки = СтатусДоставки;
	Движение.ДатаС = Дата;
	
	Если СтатусДоставки = Перечисления.од_СтатусыДоставки.Доставлено Тогда
		
		Движение.ДатаПо = ТекущаяДата();
		
	КонецЕсли;	
	
КонецПроцедуры
Показать
Остальные ответы
В избранное Подписаться на ответы Сортировка: Древо развёрнутое
Свернуть все
4. FatPanzer 15.09.20 13:40 Сейчас в теме
(1) Регистр готовый, или с нуля надо создать? Что будет происходить в случае отмены проведения в этом регистре - какие записи должны удаляться?
5. ciddex 15.09.20 13:42 Сейчас в теме
(4) обе записи должны удалиться при отмене проведения.
Дата: 12.10.2020 | Статус: В пути
Дата: 15.10.2020 | Статус: Доставлено
6. FatPanzer 15.09.20 13:48 Сейчас в теме
(5) А на первый вопрос ответить?

Необходим независимый периодический регистр с измерением "Документ" и ресурсом "Статус". Актуализация записей регистра в обработчике модуля объекта (документа) "ПриЗаписи()"
8. ciddex 15.09.20 13:55 Сейчас в теме
(6) А при записи как будет работать? Разве без проведения запись так не добавится?
10. FatPanzer 15.09.20 14:00 Сейчас в теме
(8)В обработчике документа ПриЗаписи() анализируйте состояние записанного документа. Проведен или не проведен. В зависимости от этого состояния обрабатываете свой регистр.
7. ciddex 15.09.20 13:52 Сейчас в теме
(4) Вот сам регистр. Дата - дата документа (на данный момент). "в пути" еще не реализовано
Прикрепленные файлы:
11. FatPanzer 15.09.20 14:05 Сейчас в теме
(7) Подчинение регистратору - не очень хорошая идея. В этом случае вам придется изменять логику проведения документа в ОбработкаПроведения(). То есть вам придется считать предыдущие движения документа, анализировать их, и на их основании формировать собственные.
Возникает опять же вопрос - откуда вы будете брать даты для статусов? Из даты документа не предлагать. Напрашивается дата фактического проведения документа, но тоже так себе достоверность.
2. Vladisa 38 15.09.20 13:39 Сейчас в теме
регистр же на дату пишется, даты-разные. не должны другие статусы удаляться.
3. FatPanzer 15.09.20 13:39 Сейчас в теме
9. zarankony 304 15.09.20 13:59 Сейчас в теме
Вообще все просто. Периодический регистр с измерением - ссылкой на Ваш документ. ПередЗаписью Проверяете старый статус:
СтарыйСтатус = ОбщегоНазначения.ЗначениеРеквизитаОбъекта(Ссылка,"Статус");
Если Статус <> СтарыйСтатус;
ДополнительныеСвойства.Вставить("СтатусИзменен",Истина);
КонецЕсли;

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

Наверное статус документа тоже нужно отслеживать таким же способом.
12. zarankony 304 15.09.20 14:06 Сейчас в теме
(9)Подчинение регистратору уберите
13. ciddex 15.09.20 14:16 Сейчас в теме
(12) а с регистратором не получится?
14. zarankony 304 15.09.20 14:39 Сейчас в теме
(13)а зачем? бессмысленно с точки зрения архитектуры. Имело бы смысл если бы у Вас был документ типа "перемещение товара", который указанным в ТЧ товарам менял бы статус.
15. ciddex 15.09.20 15:04 Сейчас в теме
(14) у меня просто на основании заказа создается документ Накладная по доставке, которая и добавляет записи в регистр. Это не будет проблемой при написании отчетов в будущем? Я же не смогу отследить ссылку на документ (это заказ или накладная по доставке).

Плюс нужно, чтобы нельзя было создать эти записи вручную и при отмене проведения удалялись все записи по данному документу.
16. zarankony 304 15.09.20 15:21 Сейчас в теме
(15)то есть на один заказ несколько накладных, тогда да, регистратор имеет смысл. Тогда получается статус - это реквизит накладной и запись регистра делать как обычно через Движения. Реквизит Статус у заказа тогда не нужен.
17. ciddex 15.09.20 15:27 Сейчас в теме
(16) У заказа реквизит статус может принять только значения "Требуется" и "Не требуется". Использую для вывода в отчет "Реестр заявок", чтобы менеджер или администратор мог увидеть список заявок и распределить их между водителями.
19. FatPanzer 15.09.20 15:38 Сейчас в теме
(17) Вы имеете ввиду, что на форме заказа для выбора доступны только два значения статусов из всего списка? При этом сам реквизит статуса в заказе отсутствует и всегда хранится только в регистре сведений. В тот же регистр сведений свои значения статусов для данного заказа могут писать документы доставки.
Я правильно понял?
21. ciddex 15.09.20 15:45 Сейчас в теме
(19) На форме заказа да, доступны для выбора только 2 эти значения реквизита.
Сам реквизит в заказе тоже присутствует и ссылается на перечисление со статусами доставки.
И да, из заказа тоже добавляется запись в регистр. Вот скрин того что есть сейчас
Прикрепленные файлы:
23. FatPanzer 15.09.20 15:48 Сейчас в теме
(21) Ок. Вопрос. При проведении накладной на доставку - в заказе изменяется статус и он перепроводится с новым статусом "В пути"? Или как вы собираетесь совмещать хранение статусов в самом документе, и в регистре?
24. ciddex 15.09.20 16:04 Сейчас в теме
(23) В заказе может требоваться или нет доставка. На основании создается накладная на доставку со статусом "В пути" или "Доставлено". И по срезу последних по этому распоряжению (измерение) выводится актуальный статус
26. FatPanzer 15.09.20 16:09 Сейчас в теме
(24) Ну ёлы палы, какой же это СТАТУС заказа? Это обычный булевый флаг - требуется что-то или нет. И к статусу самой операции доставки "Готовится", "Отправлено", "Доехало" или "Своровали по дороге" - этот флаг не имеет никакого отношения. Не надо пытаться их компоновать в единый микс.
22. FatPanzer 15.09.20 15:45 Сейчас в теме
(16) Все-таки пока не вижу смысла в регистраторе для записи периодического регистра сведений. Пока не будет описания всех возможных статусов и их событийной модели - о регистраторе говорить не приходится. Вполне возможно, что некоторые статусы могут изменяться с помощью обработок без изменения самого заказа или документа доставки.
25. zarankony 304 15.09.20 16:05 Сейчас в теме
(22)Ну он для отчета и целостности данных нужен, человек же написал. Самый простой способ - это реквизит у накладной "новый статус", который пойдет в запись РС. В заказе "Статус" (не надо было его также называть) - это вообще не связанный реквизит, зачем он в регистре сведений не понятно, ибо меняться по логике не должен и может быть получен по ссылке. На форме заказа выводить статус доставки из среза последних и/или сделать переход на историю статусов. На форме списка выводить тоже статус из среза последних.
30. ciddex 15.09.20 17:53 Сейчас в теме
(16) При перепроведении изменяется старая запись, новая не добавляется. Что я делаю не так? Или это из-за регистратора?
Процедура ПередЗаписью(Отказ, РежимЗаписи, РежимПроведения)
	
	СтарыйСтатус = ОбщегоНазначения.ЗначениеРеквизитаОбъекта(ЭтотОбъект.Ссылка, "СтатусДоставки");
	Если СтатусДоставки <> СтарыйСтатус Тогда
		ДополнительныеСвойства.Вставить("СтатусИзменен", Истина);
	КонецЕсли;

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

Процедура ПриЗаписи(Отказ)
	
	Если ДополнительныеСвойства.Свойство("СтатусИзменен") И ДополнительныеСвойства.СтатусИзменен Тогда
		
		// регистр од_РаспоряженияНаДоставку
		Движения.од_РаспоряженияНаДоставку.Записывать = Истина;
		Движение = Движения.од_РаспоряженияНаДоставку.Добавить();
		Движение.Период = ТекущаяДата();
		Движение.Партнер = Партнер;
		Движение.Транспорт = Транспорт;
		Движение.Распоряжение = Распоряжение;
		Движение.СтатусДоставки = СтатусДоставки;
		Движение.Адрес = Адрес;
		Движение.СуммаДокумента = СуммаДокумента;
		
	КонецЕсли;
	
КонецПроцедуры
Показать
31. FatPanzer 15.09.20 18:09 Сейчас в теме
(30) Потому что при перепроведении очищаются предыдущие движения. Именно поэтому я вам и говорил не использовать регистратор, потому что это повлечет сложную настройку и логику проведения документа в части этого регистра.

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

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

А если в одной записи? Например "дата с" и дата по". При проведении со статусом "в пути" Дата С бы записалась, а при изменении статуса поменялось бы значение статуса в регистре на "доставлено" и заполнилась бы еще Дата По. Так тоже не получится с регистратором?
33. FatPanzer 15.09.20 18:27 Сейчас в теме
(32) 1. Чего вы отследить не сможете. Что такое "документ или накладная"? Выражайтесь точнее.
2. Еще хуже.
34. ciddex 15.09.20 18:36 Сейчас в теме
(33) хотя создам реквизит "регистратор" вручную и буду передавать ссылку на передаваемый объект. А как быть с автоудалением всех движений при отмене проведения тогда?
35. FatPanzer 15.09.20 18:39 Сейчас в теме
(34)
1. Наконец-то...
2. Там же. ПриЗаписи(). Для проведенных записи формируются, для непроведенных очищаются.
36. ciddex 16.09.20 00:00 Сейчас в теме
(35) При записи не работает.
1) После отмены проведения записи не удаляются.
2) Если документ был записан и только после провели в том же статусе, в котором он был записан, то запись в регистр не добавится
37. ciddex 16.09.20 00:50 Сейчас в теме
(36) Решил все гораздо проще, надо было отвлечься и идея пришла сама. Пришлось выбрать немного иной путь, чтобы сохранить привязку к регистратору.

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

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

	// Проверка
	Если ПоискРаспоряженийНаДоставку(Распоряжение.Ссылка) Тогда
		Отказ = Истина;
		Сообщить("По данному документу доставка не требуется!", СтатусСообщения.Внимание);
		Возврат;
	КонецЕсли;
	
	// регистр од_РаспоряженияНаДоставку
	Движения.од_РаспоряженияНаДоставку.Записывать = Истина;
	Движение = Движения.од_РаспоряженияНаДоставку.Добавить();
	
	Движение.Период = Дата;
	Движение.Партнер = Партнер;
	Движение.СуммаДокумента = СуммаДокумента;
	Движение.Распоряжение = Распоряжение;
	Движение.Адрес = Адрес;
	Движение.Транспорт = Транспорт;
	Движение.СтатусДоставки = СтатусДоставки;
	Движение.ДатаС = Дата;
	
	Если СтатусДоставки = Перечисления.од_СтатусыДоставки.Доставлено Тогда
		
		Движение.ДатаПо = ТекущаяДата();
		
	КонецЕсли;	
	
КонецПроцедуры
Показать
38. FatPanzer 16.09.20 01:07 Сейчас в теме
(37) Ничего хорошего в этом решении нет. Ну ок, каждый на своих граблях учится.
39. ciddex 16.09.20 02:18 Сейчас в теме
(38) а почему ничего хорошего? При создании или перезаписи создается всего одна запись с датой С, если перепровести или сразу провести со статусом Доставлено, то и Дата По заполняется. И нет кучи проблем, которые я описывал выше. Возможно это не лучшее решение, но тут решения получше я не нашел
42. Sp1ke666 11.05.21 18:19 Сейчас в теме
(37) Привет, столкнулся с аналогичной проблемой, но даже с твоим кодом сделать не получилось. Можно ли тебе скинуть, чтобы ты посмотрел?
18. ciddex 15.09.20 15:29 Сейчас в теме
(9)
Если ДополнительныеСвойства.Свойство("СтатусИзменен") И ДополнительныеСвойства.СтатусИзменен
подскажите, а почему два раза? Они разве не одно и то же значение выводят?
20. FatPanzer 15.09.20 15:41 Сейчас в теме
(18) Почитайте описание метода Свойство() у коллекции "Структура". Это не одно и то же.
Первое - это наличие такой "строки с ключом" в самой структуре. Второе - непосредственное значение "строки с ключом".
27. kiser 15.09.20 16:20 Сейчас в теме
А если в документе добавить табличную часть для хранения всех статусов с датами, первично писать изменения в нее, а уже по ней делать записи в регистр. Тогда при перепроведении точно так же все статусы из этой табличной части запишутся в регистр.
28. FatPanzer 15.09.20 16:23 Сейчас в теме
(27) Руки оторву!!! А зачем тогда регистр?
29. ciddex 15.09.20 16:30 Сейчас в теме
(27) такого я еще не видел))
40. пользователь 23.09.20 11:17
Сообщение было скрыто модератором.
...
41. slasher777 28.09.20 20:03 Сейчас в теме
Интересное решение, не догадался бы никогда
43. COMPER 340 24.06.21 10:44 Сейчас в теме
В БП3 для этого есть регистр "СтатусыДокументов".
Оставьте свое сообщение
Вакансии
1С аналитик
Москва
зарплата от 210 000 руб.
Полный день

Руководитель направления 1С
Москва
зарплата от 350 000 руб.
Полный день

1С Программист
Москва
зарплата от 180 000 руб.
Полный день

Программист 1С
Москва
зарплата от 180 000 руб. до 220 000 руб.
Полный день

Аналитик 1С / Бизнес-аналитик
Нижний Новгород
зарплата от 100 000 руб. до 250 000 руб.
Временный (на проект)