Как заполнять реквизит документа перед записью, но не заполнять в процессе перепроведения документов

1. Anjut-ka4 13.02.18 16:53 Сейчас в теме
Здравствуйте, подскажите, пожалуйста, требуется при изменении документов заполнять реквизит. Для этого я создала подписку на событие. Сейчас заметила, что. когда запускаешь проведение документов, подписка отрабатывает - реквизит заполняется, а мне надо заполнять этот реквизит только при интерактивном изменении документа пользователем. Как это сделать?
+
По теме из базы знаний
Ответы
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
3. Ziggurat 50 13.02.18 17:50 Сейчас в теме
(1) Очевидно надо делать обработчик в форме.
Xershi; +1
7. spacecraft 13.02.18 21:11 Сейчас в теме
(1) модуль формы документа:
&НаСервере
Процедура ПередЗаписьюНаСервере(Отказ, ТекущийОбъект, ПараметрыЗаписи)
	ТекущийОбъект.ДополнительныеСвойства.Вставить("ЗаписьИзФормы", Истина);
КонецПроцедуры


модуль объекта документа:
Процедура ПередЗаписью(Отказ, РежимЗаписи, РежимПроведения)
	ЗаписьИзФормы = Неопределено;
	ЭтотОбъект.ДополнительныеСвойства.Свойство("ЗаписьИзФормы", ЗаписьИзФормы);
	Если ЗаписьИзФормы = Неопределено Тогда
		// запись не из формы
	Иначе
		// запись из формы
	КонецЕсли;
КонецПроцедуры
Показать
t.v.s.; +1
12. dandykry 9 14.02.18 09:08 Сейчас в теме
(1)
Как же все-таки отделить обработку проведения документов от интерактивного изменения документа?


Если РежимЗаписи = РежимЗаписиДокумента.проведение и ЭтаФорма.Модифицированность и Объект.Ссылка.Проведен Тогда

Что-то вроде этого, но немного оптимизировать. Проверяет проведение это или нет, модифицировали форму или просто тыкают провести закрыть и смотрит был проведен или нет. Можно еще условие на Объект.Ссылка.пустая(). Под рукой конфигуратора нет, так бы написал.

Это только в модуле формы. проведение может быть не интеррактивным, а так же из формы списка, поэтому модуль объекта я бы не трогал, а ограничился только формой документа.
+
2. VZyryanov 13.02.18 17:40 Сейчас в теме
Можно определить, что это новый объект "Если Источник.Ссылка.Пустая() ". Если запускать проведение документа могут не все пользователи, то можно принять решение по текущему пользователю или по доступной роли.
+
4. t.v.s. 111 13.02.18 20:06 Сейчас в теме
(2) метод УстановитьСсылкуНового() с вами категориччески не согласен
+
8. VZyryanov 14.02.18 06:46 Сейчас в теме
(4) А зачем ее устанавливать?
+
9. t.v.s. 111 14.02.18 07:22 Сейчас в теме
(8) Ситуации бывают разные
+
5. Anjut-ka4 13.02.18 20:38 Сейчас в теме
смысл реквизита в том, чтобы запоминать последнего, кто редактировал документ, поэтому документ может быть, как новым, так и не новым. А проводить документы (для восстановления последовательности, например) может любой, но при этом не надо заполнять нужный мне реквизит в документах.
Обработчик формы тоже не поможет, потому что, когда отрабатывает проведение документов, процедуры "перед записью" отрабатывают так же, как и когда пользователь нажимает "Записать".
Как же все-таки отделить обработку проведения документов от интерактивного изменения документа?
+
6. Xershi 1484 13.02.18 20:44 Сейчас в теме
(5) вы не правы! Когда вы запускаете обработку, то форма не открывается! А когда запустили форму, то это уже явно не восстановление!
+
10. user700035_6550355 29 14.02.18 07:41 Сейчас в теме
Перед записью на форме прописать код по изменению реквизита, а обработка она использует модуль объекта
+
11. VZyryanov 14.02.18 08:22 Сейчас в теме
Процедура УстановитьДатыСозданияИзмененияОбъекта(ЭтотОбъект) Экспорт	
	ТекущийПользователь=ТекущийПользователь();
	Если ЭтотОбъект.Ссылка.Пустая() Тогда
		Если ЕстьРеквизит(ЭтотОбъект,"Создал") И ЕстьРеквизит(ЭтотОбъект,"ДатаСоздания") Тогда
			ЭтотОбъект.Создал=ТекущийПользователь;
			ЭтотОбъект.ДатаСоздания=ТекущаяДата();
		КонецЕсли;
		Если ЕстьРеквизит(ЭтотОбъект,"Изменил") И ЕстьРеквизит(ЭтотОбъект,"ДатаИзменения") Тогда
			ЭтотОбъект.Изменил=ЭтотОбъект.Создал;
			ЭтотОбъект.ДатаИзменения=ЭтотОбъект.ДатаСоздания;
		КонецЕсли;
	ИначеЕсли ЭтотОбъект.Модифицированность() Тогда
		Если ЕстьРеквизит(ЭтотОбъект,"Изменил") И ЕстьРеквизит(ЭтотОбъект,"ДатаИзменения") Тогда
			Если (Не КФСервер.ЭтоПрограммист(ТекущийПользователь) ИЛИ ЭтотОбъект.ДатаИзменения='00010101') Тогда
				ЭтотОбъект.Изменил=ТекущийПользователь;
				ЭтотОбъект.ДатаИзменения=ТекущаяДата();
			КонецЕсли;
		КонецЕсли;
	КонецЕсли;
КонецПроцедуры	

//Обработчик подписки
Процедура КФПередЗаписьюОбъекта(Источник, Отказ) Экспорт
	Если Отказ ИЛИ Источник.ОбменДанными.Загрузка Тогда
		Возврат;
	КонецЕсли;
	УстановитьДатыСозданияИзмененияОбъекта(Источник);
КонецПроцедуры
Показать


Возможно, когда обработкой выполняется перепроведение не устанавливается Модифицированность.
+
Внимание! Тема сдана в архив

Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот