Проверка пустых значений методом "ПроверитьЗаполнение()"

Публикация № 614273

Программирование - Практика программирования

7
Или как можно разделить контекст проверки при интерактивной работе пользователя.

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

  • считывание данных источника
  • запись данных  в базу

Порядок действий пользователя:

  1. Указать параметры чтения внешнего источника. Это может быть путь к адресу внешнего файла, или отборы на форме - например надо указать организацию для чтения остатков
  2. Нажатие на кнопку "Заполнить". При этом заполняются данные для загрузки в базу - например пользователь загрузил цены по товарам.
  3. Интерактивная обработка загруженных данных. Пользователь решил изменить некоторые значения цен из загруженных
  4. Нажатие на кнопку "Записать". При этом данные с одобрения пользователя попадают в базу. 

И тут перед операцией №2 ("Заполнить") надо проверить заполненность поля "АдресИсточника", а перед операцией №4 ("Записать") надо проверить корректность загруженных данных. Например - что в табличной части "Цены" - заполнен по всем строкам реквизит "Номенклатура", ну и сама табличная часть разумеется не должна быть пустой. 

Неоднократно встречается код такого содержания:

Если ЗначениеЗаполнено(АдресИсточника) Тогда
    ЗагрузитьЦены();
КонецЕсли; 

//

Если Цены.Количество() > 0 Тогда
    // Тут еще иногда встречается код по проверке заполненности строк табличной части...
	
    ЗаписатьЦены();	
КонецЕсли; 

С точки зрения "все что не запрещено - то разрешено" - все нормально. С точки зрения - как сделать быстро, универсально и самое главное - понятно другим, надо использовать метод "ПроверитьЗаполнение". Несколько слов о нем с ИТС: Программная обработка проверки заполнения.

  • Это быстро - и с точки зрения разработки, и с точки зрения производительности  - проверка на пустоту происходит автоматически средствами платформы
  • Это универсально - потому что весь код по проверке заполнения находится в одном месте, и если понадобилось для нескольких операций выполнять сходные действия, настройка будет более удобней
  • Это понятно другим - потому что все проверки находятся в одном месте, и сразу виден весь контекст - не надо заходить отдельно в обработчик "Заполнить" или "Записать", чтобы увидеть что там происходит.

Но возникает такой нюанс: перед записью - надо проверить корректность данных цен, а перед заполнением надо проверить только адрес к источнику... Как тут быть?

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

  • если это идентификатор операции "Заполнить", то в массив проверяемых реквизитов добавляем только путь к переменной "АдресИсточника"
  • если это идентификатор операции "Записать", то в массив проверяемых реквизитов добавляем только пути к табличной части и необходимым ее реквизитам.

Это концепция. Как показывает практика весьма удобно реализуются такие проверки с помощью программных перечислений. Ниже пример для управляемого режима.

Код формы:
#Область ОбработчикиКомандФормы

&НаКлиенте
Процедура Заполнить(Команда)
    
    Объект.ТекущаяОперация = "Заполнить";
    Если НЕ ПроверитьЗаполнение() Тогда
        Возврат;        
    КонецЕсли; 
    
    ЗаполнитьНаСервере();
        
КонецПроцедуры

&НаКлиенте
Процедура Записать(Команда)
    
    Объект.ТекущаяОперация = "Записать";    
    Если НЕ ПроверитьЗаполнение() Тогда
        Возврат;        
    КонецЕсли; 

    ЗаписатьНаСервере();
    
КонецПроцедуры

#КонецОбласти

#Область СлужебныеПроцедурыИФункции

Процедура ЗаполнитьНаСервере()
    РеквизитФормыВЗначение("Объект").Заполнить();        
    
КонецПроцедуры

Процедура ЗаписатьНаСервере()
    РеквизитФормыВЗначение("Объект").Записать();            
        
КонецПроцедуры
 
#КонецОбласти
Код модуля объекта:
#Область ОписаниеПеременных

Перем мСтруктураКэшДанных;

#КонецОбласти 

#Область ПрограммныйИнтерфейс

Процедура Заполнить() Экспорт
    Сообщить("Заполнение на сервере...");
    
КонецПроцедуры

Процедура Записать() Экспорт
    Сообщить("Запись на сервере...");  
	
КонецПроцедуры 

#КонецОбласти 

#Область ОбработчикиСобытий

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

    ПроверяемыеРеквизиты.Очистить();
	
    Если ЭтотОбъект.ТекущаяОперация = КомандыФормы().Заполнить Тогда        
        ПроверяемыеРеквизиты.Добавить("Адрес");
        
    ИначеЕсли ЭтотОбъект.ТекущаяОперация = КомандыФормы().Записать Тогда        
        ПроверяемыеРеквизиты.Добавить("Цены");
        ПроверяемыеРеквизиты.Добавить("Цены.Товар");        
        
    КонецЕсли;     
    
КонецПроцедуры

#КонецОбласти 

#Область СлужебныеПроцедурыИФункции

////////////////////////////////////////////////////////////////////////////////
// Кэш, программные перечисления

Функция КомандыФормы()
    
    Если НЕ мСтруктураКэшДанных.Свойство("КомандыФормы") Тогда        
        СтруктураКомандыФормы = Новый Структура;
        СтруктураКомандыФормы.Вставить("Заполнить", "Заполнить");
        СтруктураКомандыФормы.Вставить("Записать", "Записать");
        
        мСтруктураКэшДанных.Вставить("КомандыФормы", Новый ФиксированнаяСтруктура(СтруктураКомандыФормы));
        
    КонецЕсли; 
    
    Возврат мСтруктураКэшДанных.КомандыФормы;
    
КонецФункции
 
#КонецОбласти 

#Область Инициализация

мСтруктураКэшДанных = Новый Структура;

#КонецОбласти

Обработку на всякий случай прилагаю. 

Добавлю, что не всегда возможно выполнять именно платформенную проверку. Допустим - в табличной части на форме добавлена колонка "Загружать", типа "Булево", и пользователь перед загрузкой отмечает какие именно строки ему необходимо загрузить. В таких случаях  платформа будет проверять все строки, а в этом нет смысла  - ведь загружаются только некоторые из них, и необходима реализация собственного алгоритма проверки. Но - реализовывать его надо именно в обработке проверки заполнения, по соответствующему событию.

7

Скачать файлы

Наименование Файл Версия Размер
Пример "Загрузка цен"
.epf 11,21Kb
28.04.17
0
.epf 11,21Kb Скачать

См. также

Специальные предложения

Избранное Подписка Сортировка: Древо
В этой теме еще нет сообщений.
Оставьте свое сообщение