v8-code-style icon indicating copy to clipboard operation
v8-code-style copied to clipboard

Добавить проверку, что перед программной записью объекта вызывается ПроверитьЗаполнение(). Исключение - запись в режиме обмена.

Open DmitryShvaika opened this issue 3 years ago • 4 comments

Описание проблемы

Перед программной записью объекта всегда должен идти вызов процедуры проверки заполнения (исключение - режим обмена). Часто забывают вызвать проверку заполнения. В результате в базу записываются некорректные данные.

Описание решения проблемы

Предлагаю проверять, что непосредственно перед записью объекта (Набор записей - то же объект) вызывается метод ПроверитьЗаполнение(), если запись идет без флажка Объект.ОбменДанными.Загрузка = Истина;

Дополнительная информация

No response

DmitryShvaika avatar Feb 08 '22 11:02 DmitryShvaika

а что делать если проверка не прошла?

может быть примеры кода привести?

marmyshev avatar Feb 09 '22 08:02 marmyshev

Если проверка заполнения не прошла, документ не записывается, выдается диагностическое сообщение:

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

ДокументОбъект.Записать(РежимЗаписиДокумента.Проведение);

d-hurricane avatar Feb 11 '22 08:02 d-hurricane

или так

Если ДокументОбъект.ПроверитьЗаполнение() Тогда

       ДокументОбъект.Записать(РежимЗаписиДокумента.Проведение);

Иначе
	
	ОбщегоНазначенияклиентСервер.СообщитьПользователю(НСтр("ru = 'Не удалось провести документ. По причине: документ не прошел проверку заполнения.'"));
	
КонецЕсли;

Исключение - режим обмена. В нем запись документа в режиме проведения запрещена. Тем не менее Записать() можно использовать и без параметров как в режиме обмена так и при обычной записи и если документ проведен, то Записать() без параметров снова проведет документ. Режим обмена же указывается в свойстве ОбменДанными.Загрузка объекта:

       ДокументОбъект.Обменданными.Загрузка = Истина;
       ДокументОбъект.Записать(РежимЗаписиДокумента.Запись);

При такой записи - проверка заполнения как правило не делается.

DmitryShvaika avatar Feb 11 '22 10:02 DmitryShvaika

при обычной записи и если документ проведен, то Записать() без параметров снова проведет документ.

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

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

d-hurricane avatar Feb 11 '22 11:02 d-hurricane