Выдавать ошибку если поле не заполнено 1с программно

В этой статье я рассмотрю основные механизмы платформы 1С 8.3, которые обеспечивают проверку заполнения реквизитов.

Проверка заполнения реквизита объекта 1С

У любого реквизита объекта 1С можно настроить проверку заполнения, когда нельзя сохранить новый элемент объекта, не заполнив этот реквизит. Выйдет ошибка.

Для того, чтобы у реквизита объекта осуществлялась проверка заполнения, достаточно в свойстве реквизита «Проверка заполнения» указать значение «Выдавать ошибку».

Проверка заполнения реквизита объекта 1С

При таком конфигурировании реквизита, если это реквизит не заполнен, то при попытке записи элемента, выйдет соответствующая ошибка, и запись элемента не будет осуществлена.

Проверка заполнения реквизита объекта 1С

Данная проверка будет осуществляться независимо от того, сгенерирована эта форма платформой 1С 8.3 автоматически, или используется форма созданная разработчиком.

Проверка заполнения табличной части в 1С

Помимо реквизитов у объектов можно проверять заполнение табличной части.  Для этого у табличных частей объектов имеется свойство «Проверка заполнения», в которое также необходимо установить значение «Выдавать ошибку».

Проверка заполнения табличной части в 1С

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

Проверка заполнения табличной части в 1С

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

Проверка заполнения табличной части в 1С

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

Проверка заполнения программно в 1С

Иногда возникает необходимость проверить программно заполнение объекта в 1С. Для этих целей предназначен метод ПроверитьЗаполнение(), который имеется у большинства объектов 1С (справочники, документы и т.д.).

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

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

В этом случае, элемент справочника не будет записан, если у него имеются реквизиты, у которых в свойстве ПроверкаЗаполнения установлено значение «Выдавать ошибку».

Иногда, нужно проверить заполнение реквизита, у которого в свойстве «Проверка заполнения» установлено значение «Не проверять».  Например, у реквизита Артикул справочника Номенклатура.

Проверка заполнения программно в 1С

Если нам нужно осуществлять проверку этого реквизита (например, по какой-то определенной логике), то необходимо в модуле объекта создать метод  ОбработкаПроверкиЗаполнения.

ОбработкаПроверкиЗаполнения в 1С

ОбработкаПроверкиЗаполнения в 1С

У этого метода, который является процедурой, имеется параметр ПроверяемыеРеквизиты. Этот параметр массив, в котором содержится список имен реквизитов, которые нужно проверять. Если в этот список мы добавим название реквизита, то при сохранении элемента будет осуществляться проверка на то, заполнен этот реквизит или нет.

Процедура ОбработкаПроверкиЗаполнения(Отказ, ПроверяемыеРеквизиты)
    ПроверяемыеРеквизиты.Добавить("Артикул");
КонецПроцедуры
Проверка заполнения программно в 1С

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

Например, удалим из проверяемых реквизит ПолноеНаименование.

Процедура ОбработкаПроверкиЗаполнения(Отказ, ПроверяемыеРеквизиты)
    Индекс = ПроверяемыеРеквизиты.Найти("ПолноеНаименование");

    Если Индекс <> 0 Тогда
        ПроверяемыеРеквизиты.Удалить(Индекс);
    КонецЕсли;

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

Тогда мы сможем спокойно записать элемент с незаполненным реквизитом ПолноеНаименование.

Проверка заполнения программно в 1С

Если мы хотим проверить программно, что заполнен реквизит табличной части объекта, то необходимо добавить этот реквизит в массив ПроверяемыеРеквизиты по такому формату: [НазваниеТабличнойЧасти].[НазваниеРеквизита] .

Например:

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

    ПроверяемыеРеквизиты.Добавить("СписокСвойств.НазваниеСвойства");

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

В этом случае, будет осуществляться проверка заполнения реквизита табличной части.

Проверка заполнения программно в 1С

Проверка заполнения формы 1С

Иногда нужно проверить заполнение реквизитов формы.  Разберем небольшую задачу: будем на форме умножать два числа друг на друга, если они заполнены. Создадим на форме реквизиты  с типом Число — Множитель1, Множитель2 и Сумма. У реквизитов Множитель1 и Множитель2 установим в свойство «Проверка заполнения» значение «Выдавать ошибку».

Проверка заполнения реквизита объекта 1С

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

&НаКлиенте
Процедура Посчитать(Команда)

    Если ПроверитьЗаполнение() Тогда

        Сумма = Множетель1 * Множетель2;

    КонецЕсли;

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

Теперь мы не сможем посчитать сумму, если один из множителей не заполнен.

Проверка заполнения реквизита объекта 1С

Более подробно и основательно начальные вопросы программирования в 1С есть вы можете изучить в
Книга «Программировать в 1С за 11 шагов»

Изучайте программирование в 1С в месте с моей книгой «Программировать в 1С за 11 шагов»

Программировать в 1С за 11 шагов

Книга написана понятным и простым языком — для новичка.

  1. Книга посылается на электронную почту в формате PDF. Можно открыть на любом устройстве!
  2. Научитесь понимать архитектуру 1С;
  3. Станете писать код на языке 1С;
  4. Освоите основные приемы программирования;
  5. Закрепите полученные знания при помощи задачника.

О том как разрабатывать под управляемым приложением 1С, читайте в книге Книга «Основы разработки в 1С: Такси»

Отличное пособие по разработке в управляемом приложении 1С, как для начинающих разработчиков, так и для опытных программистов.

Основы разработки в 1С такси
  1. Очень доступный и понятный язык изложения
  2. Книга посылается на электронную почту в формате PDF. Можно открыть на любом устройстве!
  3. Поймете идеологию управляемого приложения 1С
  4. Узнаете, как разрабатывать управляемое приложение;
  5. Научитесь разрабатывать управляемые формы 1С;
  6. Сможете работать с основными и нужными элементами управляемых форм
  7. Программирование под управляемым приложением станет понятным

Промо-код на скидку в 15% — 48PVXHeYu

Эти книги, плюс книга по программированию оперативного учета имеются в едином комплекте: комплект книг по разработке в 1С.
Только для читателей моего блога,
промо-код на скидку в 300 рублей на весь комплект: blog


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

можно оплатить вручную:

Яндекс.Деньги — 410012882996301
Web Money — R955262494655

Вступайте в мои группы:

Вконтакте: https://vk.com/1c_prosto
Фейсбуке: https://www.facebook.com/groups/922972144448119/
ОК: http://ok.ru/group/52970839015518
Твиттер: https://twitter.com/signum2009

Перейти в раздел примеры кода 1С 8.3:

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

Проверка реквизита на заполнение на форме (&НаКлиенте) в 1С 8.3:

&НаКлиенте
Процедура ПримерыПроверкиЗаполнения(Команда)

    Если НЕ

ЗначениеЗаполнено(ВыборБанка) Тогда
       
Сообщить(«Не выбран Банк для загрузки!»);
        Возврат;
    КонецЕсли;

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

Проверка реквизитов табличной части на заполнение на форме (&НаКлиенте) в 1С 8.3:

&НаКлиенте
Процедура Сформировать2(Команда)

    Для Каждого

СтрокаТЧ из ТабЧасть цикл
        Если Не
ЗначениеЗаполнено(СтрокаТЧ.Банк) Тогда//Отказ=Истина; — если например процедура ПриЗаписи
           
сообщить(«Не заполнен Банк в строке «+ СтрокаТЧ. номерстроки);

        КонецЕсли;
    КонецЦикла;

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

Проверка заполнения в табличной части при вводе строки в 1С 8.3:

Процедура ТабличнаяЧасть1ПриНачалеРедактирования(Элемент, НоваяСтрока, Копирование)

   //ЗначениеЗаполнено(Элементыформы.ТабличнаяЧасть1.ТекущаяСтрока.Валюта) — не правильно
   //будет ошибка «Проверка мутабельных значений на заполненность не поддерживается»

   // Заполнение поля Валюта значением по умолчанию.
   Если НоваяСтрока И Не Копирование Тогда
       Если Элементыформы.ТабличнаяЧасть1.ТекущаяСтрока.Валюта = Справочники.Валюты.ПустаяСсылка() Тогда

          Элементыформы.ТабличнаяЧасть1.ТекущаяСтрока.Валюта = ЭтоОсновнаяВалюта;

       КонецЕсли;

   КонецЕсли;

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

Проверка заполнения на форме до выполнения основных процедур в 1С 8.3:

&НаКлиенте
Процедура Сформировать(Команда) // До создания документов и вызова процедурПроверитьЗаполнение();

    Если Не

ПроверитьЗаполнение() Тогда
        Возврат;
    Иначе
       
// Заполнен
        // Продолжение выполнения кода…
   
КонецЕсли;

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

Copyright©, «Программист 1С в г.Минске», 28.04.2020

Перепечатка текста и фотографий разрешена при наличии прямой ссылки на источник

   Timon1405

7 — 12.11.14 — 14:36

// Осуществляет проверку заполненности проверяемых реквизитов.

//

// Параметры:

//         Объект                      — ДокументОбъект, СправочникОбъект — Проверяемый объект.

//         МассивПроверяемыхРеквизитов — Массив — массив проверяемых реквизитов.

//

// Возвращаемое значение:

//         Булево — Истина, если значение хотя бы одного реквизита не заполнено, иначе Ложь

//

Функция ПроверитьЗаполнениеРеквизитовОбъекта(Объект, МассивПроверяемыхРеквизитов) Экспорт

    
    Перем ПроверяемыеРеквизитыТЧ;

    Отказ = Ложь;

    
    // Получение метаданных объекта

    МетаданныеОбъекта = Объект.Ссылка.Метаданные();

    
    // Создание структуры стандартных реквизитов

    СтандартныеРеквизиты = Новый Структура;

    Для Каждого Реквизит Из МетаданныеОбъекта.СтандартныеРеквизиты Цикл

        СтандартныеРеквизиты.Вставить(Реквизит.Имя, ?(ЗначениеЗаполнено(Реквизит.Синоним), Реквизит.Синоним, Реквизит.Имя));

    КонецЦикла;

    
    // Создание структуры для хранения имен табличных частей и проверяемых реквизитов в них.

    //         Ключ —  Имя табличной части

    //         Значение — Массив — Массив строк, реквизитов этой табличной части для проверки

    ТабличныеЧасти = Новый Структура;

    
    // Создание шаблонов сообщений об ошибках не заполненных реквизитов и реквизитов табличных частей

    ШаблонОшибкиРеквизита = НСтр(«ru=’Поле «»%ИмяРеквизита%»» не заполнено'»);

    ШаблонОшибкиТЧ = НСтр(«ru=’Не введено ни одной строки в список «»%ИмяРеквизита%»»‘»);

    ШаблонОшибкиРеквизитаТЧ = НСтр(«ru=’Не заполнена колонка «»%ИмяРеквизита%»» в строке %НомерСтроки% списка «»%ИмяТабличнойЧасти%»»‘»);

    
    // Проверка реквизитов объекта и заполнение структуры по реквизитам табличных частей

    Для Каждого Реквизит Из МассивПроверяемыхРеквизитов Цикл

        
        ПозицияТочки = Найти(Реквизит,».»);

        
        Если ПозицияТочки > 0 Тогда // В случае если указан реквизит табличной части

            
            ДлинаСтроки       = СтрДлина(Реквизит);

            ИмяТабличнойЧасти = Лев(Реквизит, ПозицияТочки-1);

            ИмяРеквизита      = Прав(Реквизит, ДлинаСтроки — ПозицияТочки);

            
            // Сохранение проверяемого реквизита табличной части в структуру

            Если НЕ ТабличныеЧасти.Свойство(ИмяТабличнойЧасти, ПроверяемыеРеквизитыТЧ) Тогда

                ПроверяемыеРеквизитыТЧ = Новый Массив;

                ТабличныеЧасти.Вставить(ИмяТабличнойЧасти, ПроверяемыеРеквизитыТЧ);

            КонецЕсли;

            ПроверяемыеРеквизитыТЧ.Добавить(ИмяРеквизита);

            
        Иначе // В случае если указан реквизит объекта

            
            Если Не ЗначениеЗаполнено(Объект[Реквизит]) Тогда

                
                Если МетаданныеОбъекта.Реквизиты.Найти(Реквизит) <> Неопределено Тогда // Если указано имя реквизита

                    ТекстОшибки = СтрЗаменить(ШаблонОшибкиРеквизита, «%ИмяРеквизита%»,

                        МетаданныеОбъекта.Реквизиты[Реквизит].Синоним);

                ИначеЕсли СтандартныеРеквизиты.Свойство(Реквизит) Тогда // Если указано имя стандартного реквизита

                    ТекстОшибки = СтрЗаменить(ШаблонОшибкиРеквизита, «%ИмяРеквизита%»,

                        СтандартныеРеквизиты[Реквизит]);

                Иначе // Если указано имя табличной части

                    ТекстОшибки = СтрЗаменить(ШаблонОшибкиТЧ, «%ИмяРеквизита%»,

                        МетаданныеОбъекта.ТабличныеЧасти[Реквизит].Синоним);

                КонецЕсли;

                
                ОбщегоНазначенияКлиентСервер.СообщитьПользователю(

                    ТекстОшибки,

                    Объект,

                    Реквизит,

                    ,

                    Отказ);

                
            КонецЕсли;

            
        КонецЕсли;

        
    КонецЦикла;

    
    // Проверка реквизитов в табличных частях

    Для Каждого ТабличнаяЧасть Из ТабличныеЧасти Цикл

        
        ИмяТабличнойЧасти = ТабличнаяЧасть.Ключ;

        ТабличнаяЧастьОбъекта = Объект[ТабличнаяЧасть.Ключ];

        МассивРеквизитов = ТабличнаяЧасть.Значение;

        
        // Цикл по всем строкам табличной части.

        Для НомерСтроки=0 По ТабличнаяЧастьОбъекта.Количество()-1 Цикл

            
            // Цикл по всем проверяемым реквизитам для текущей табличной части.

            Для НомерРеквизита=0 По МассивРеквизитов.Количество()-1 Цикл

                
                ИмяРеквизита = МассивРеквизитов[НомерРеквизита];

                
                Если Не ЗначениеЗаполнено(ТабличнаяЧастьОбъекта[НомерСтроки][ИмяРеквизита]) Тогда

                    
                    ТекстОшибки = СтрЗаменить(ШаблонОшибкиРеквизитаТЧ, «%ИмяРеквизита%», МетаданныеОбъекта.ТабличныеЧасти[ИмяТабличнойЧасти].Реквизиты[ИмяРеквизита].Синоним);

                    ТекстОшибки = СтрЗаменить(ТекстОшибки, «%НомерСтроки%», Формат(НомерСтроки+1, «ЧГ=0»));

                    ТекстОшибки = СтрЗаменить(ТекстОшибки, «%ИмяТабличнойЧасти%», МетаданныеОбъекта.ТабличныеЧасти[ИмяТабличнойЧасти].Синоним);

                    
                    ОбщегоНазначенияКлиентСервер.СообщитьПользователю(

                        ТекстОшибки,

                        Объект,

                        ОбщегоНазначенияКлиентСервер.ПутьКТабличнойЧасти(ИмяТабличнойЧасти, НомерСтроки+1, ИмяРеквизита),

                        ,

                        Отказ);

                    
                КонецЕсли;

                
            КонецЦикла;

            
        КонецЦикла;

        
    КонецЦикла;

    
    МассивПроверяемыхРеквизитов.Очистить();

    
    Возврат Отказ;

    
КонецФункции // ПроверитьЗаполнениеРеквизитовОбъекта()

  

DrZombi

8 — 12.11.14 — 15:11

(0) Используй метод «СообщениеПользователю»

СообщениеПользователю (UserMessage)

СообщениеПользователю (UserMessage)

Свойства:

ИдентификаторНазначения (TargetID)

КлючДанных (DataKey)

Поле (Field)

ПутьКДанным (DataPath)

Текст (Text)

Методы:

Сообщить (Message)

УстановитьДанные (SetData)

Конструкторы:

По умолчанию

Описание:

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

Если сообщение еще не было показано пользователю (такое может быть при работе на стороне сервера, в фоновом задании, внешнем соединении или Web-сервисах), можно получить накопленные сообщения методом ПолучитьСообщенияПользователю.

В управляемых формах, в случае выполнения просмотра сообщения, выполняется следующий механизм обработки:

Если у сообщения свойство КлючДанных заполнено и не совпадает с ключевым значением основного реквизита текущей формы (ссылкой объекта или ключом записи регистра сведений), то:

открывается новая форма объекта, соответствующая значению свойства КлючДанных;

если у сообщения свойство ПутьКДанным не заполнено, то в него проставляется имя основного реквизита открытой формы объекта;

вызывается показ сообщения в только что открытой форме;

выполняется перенос всех соответствующих сообщений из окна первой формы в новую форму (с таким же значением свойств КлючДанных, как у выбранного сообщения). При этом перенесенным сообщениям аналогичным образом проставляется свойство ПутьКДанным, если оно не установлено.

Доступность:

Тонкий клиент, веб-клиент, сервер, толстый клиент, внешнее соединение.

Пример:

Процедура ДействиеСОбъектом(ОбъектДанных)

    …

    Сообщение = Новый СообщениеПользователю();

    Текст = «ru = «»В строке 11 табличной части «»Номенклатура»» не хватает «;»

     + » en = «»In line 11 of tabular section «»Nomenclature»» is missing «;

    Сообщение.Текст = НСтр(Текст)+НедостающееКоличество+» «+ЕдиницаИзмеренияНоменклатуры;

    Сообщение.Поле = «Номенклатура[10].Количество»;

    Сообщение.УстановитьДанные(ОбъектДанных);

    Сообщение.Сообщить();

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

См. также:

Глобальный контекст, метод УстановитьСоответствиеОбъектаИРеквизитаФормы

Глобальный контекст, метод ПолучитьСоответствиеОбъектаИРеквизитаФормы

Глобальный контекст, метод ПолучитьСообщенияПользователю

Механизм проверки заполнения позволяет автоматически проверить, заполнены ли указанные реквизиты объекта. Для этого нужно воспользоваться свойством ПроверкаЗаполнения, которое есть у реквизитов объектов конфигурации.

Если установить это свойство в значение «Выдавать ошибку», поле Поставщик в форме будет помечено как обязательное для заполнения. А при записи накладной платформа будет контролировать заполненность этого реквизита. Если реквизит окажется не заполнен, платформа выдаст автоматическое сообщение и запись накладной будет отменена.

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

  • Одно событие — ОбработкаПроверкиЗаполненияНаСервере — можно обработать в модуле формы.
  • Другое событие — ОбработкаПроверкиЗаполнения — можно обработать в модуле прикладного объекта.

У формы, как правило, есть основной реквизит (редактируемый объект) и могут быть реквизиты, не относящиеся к редактируемому объекту, а являющиеся лишь частью формы:

Поэтому серверное событие формы ОбработкаПроверкиЗаполненияНаСервере предназначено для проверки заполнения тех реквизитов формы, которые не относятся к редактируемому объекту. Это данные только формы, у формы могут быть свои причины и алгоритмы для проверки этих данных.

Напротив, событие объекта ОбработкаПроверкиЗаполнения предназначено для для того, чтобы проверить реквизиты основного реквизита формы.

Обработчики обеих событий имеют параметр ПроверяемыеРеквизиты, в который платформа передает массив имен тех реквизитов, которые подлежат проверке. Если после выхода из обработчика в этом массиве все еще останутся какие-то имена реквизитов — платформа выполнит автоматическую проверку оставшися реквизитов.

Поэтому существует несколько сценариев того, как разработчик может встроить свой алгоритм в механизм проверки заполнения:

  • самостоятельно проверить заполненность всех реквизитов и очистить массив ПроверяемыеРеквизиты, чтобы платформа не выполняла их проверку
  • проверить часть реквизитов самостоятельно, удалить их из массива ПроверяемыеРеквизиты, а оставшиеся оставить на проверку платформе
  • добавить в массив ПроверяемыеРеквизиты какие-то реквизиты, чтобы платформа проверила и их тоже
  • вообще отказаться от проверки заполненности реквизитов, очистив массив

Все эти сценарии реализуются довольно просто. Например, чтобы самостоятельно проверить заполненность реквизитов, можно выполнить следующий код:

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

// Проверка остальных реквизитов
// ..........

// Очистить массив проверяемых реквизитов, чтобы платформа
// не выполняла их автоматическую проверку
ПроверяемыеРеквизиты.Очистить(); 

Чтобы проверить лишь часть реквизитов, можно выполнить такой код:

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

Добавить в массив проверяемых реквизитов еще один реквизит можно следующим образом:

ПроверяемыеРеквизиты.Добавить("Комментарий");

А очистить массив проверяемых реквизитов, чтобы ничего не проверять ни самому, ни платформе, можно так:

ПроверяемыеРеквизиты.Очистить();

Вторым параметром в обработчиках этих событий является параметр Отказ. Если ему присвоить значение Истина, то после выхода из обработчика дальнейшая запись объекта будет отменена. Таким образом этот параметр нужно устанавливать в значение Истина тогда, когда ваш алгоритм приходит к выводу, что реквизит не заполнен. В этом случае запись объекта выполнена не будет.

Справка

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

УправляемаяФорма.ОбработкаПроверкиЗаполненияНаСервере(Отказ, ПроверяемыеРеквизиты)
  • Отказ. Тип: Булево. Признак отказа от записи. Если в теле процедуры-обработчика установить данному параметру значение Истина, то запись выполнена не будет. Значение по умолчанию Ложь.
  • ПроверяемыеРеквизиты. Тип: Массив. Массив путей к реквизитам, для которых будет выполнена проверка заполнения. Массив может быть модифицирован удалением или добавлением путей к необходимым реквизитам.

Вызывается расширением формы при необходимости проверки заполнения реквизитов при записи в форме, а также при выполнении метода ПроверитьЗаполнение(). Для вызова проверки заполнения системой необходимо, чтобы у формы (с которой происходит работа) было установлено свойство ПроверятьЗаполнениеАвтоматически. В этом случае вначале будет вызван данный обработчик, а затем обработчик ОбработкаПроверкиЗаполнения() модуля объекта.

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

Для формы документа, если при конфигурировании для документа свойство Проведение установлено в Разрешить, событие вызывается только при проведении. Если документ не проводится (свойство Проведение установлено в Запретить), то вызывается при записи.

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

ДокументОбъект.ИмяДокумента.ОбработкаПроверкиЗаполнения(Отказ, ПроверяемыеРеквизиты)
  • Отказ. Тип: Булево. Если в теле процедуры-обработчика установить данному параметру значение Истина, то будет выполнен отказ от продолжения работы после выполнения проверки заполнения. Значение по умолчанию Ложь.
  • ПроверяемыеРеквизиты. Тип: Массив. Массив путей к реквизитам, для которых будет выполнена проверка заполнения. Массив может быть модифицирован удалением или добавлением путей к необходимым реквизитам.

Вызывается расширением формы при необходимости проверки заполнения реквизитов при записи или при проведении документа в форме, а также при выполнении метода ПроверитьЗаполнение(). Если для документа при конфигурировании свойство Проведение установлено в Разрешить, то вызывается только при проведении. Если документ не проводится (установлено Запретить), то вызывается при записи.

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

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

    // Проверим заполненность реквизита «Покупатель»
    Покупатель = ПроверяемыеРеквизиты.Найти("Покупатель");

    Если Не ЗначениеЗаполнено(Покупатель) Тогда
        
        // Если он не заполнен, сообщим об этом пользователю
        Сообщение = Новый СообщениеПользователю();
        Сообщение.Текст = "Не указан Покупатель, на которого выписывается товарная накладная!";
        Сообщение.Поле = "Покупатель";
        Сообщение.УстановитьДанные(ЭтотОбъект);
        Сообщение.Сообщить();
            
        // Сообщим платформе, что мы сами обработали проверку заполнения реквизита «Покупатель»
        ПроверяемыеРеквизиты.Удалить(Покупатель);

        // Так как информация не консистентна, то продолжать работу дальше смысла нет
        Отказ = Истина;
            
    КонецЕсли;

    // Сообщим платформе, что мы сами обрабатываем проверку реквизита товар в табличной части «Товары»
    ПроверяемыеРеквизиты.Удалить(ПроверяемыеРеквизиты.Найти("Товары.Товар"));

    // Обходим строки и проверяем заполнение реквизита
    Для Индекс = 0 По Товары.Количество()-1 Цикл
        СтрокаТовар = Товары.Получить(Индекс);
        Если Не ЗначениеЗаполнено(СтрокаТовар.Товар) Тогда
            Сообщение = Новый СообщениеПользователю();
            Сообщение.Текст = "В строке " + Индекс + " не заполнено значение товара";
            Сообщение.Поле = "Товары[" + Индекс + "].Товар";
            Сообщение.УстановитьДанные(ЭтотОбъект);
            Сообщение.Сообщить();
            Отказ = Истина;
        КонецЕсли;
    КонецЦикла;
    
КонецПроцедуры

Поиск:
1С:Предприятие • Обработка проверки заполнения • Проверяемые реквизиты • Реквизит • Управляемая форма

В 1С весь пользовательский интерфейс построен на формах. Для того чтобы наглядно в этом убедиться достаточно открыть любой документ или справочник. Формы создаются в режиме 1С:Конфигуратор. Для их создания необходимо обладать знаниями в области программирования 1С. Очень часто перед обработой данных с формы требуется выполнить проверку на заполненность обязательных полей. Это можно сделать несколькими способами.

Встроенные методы проверки заполнения

Во встроенном языке 1С есть функция для автоматической проверки заполнения полей формы. Функция ПроверитьЗаполнение() проверяет заполнение реквизитов у которых свойство «Проверка заполнения» установлено в значение «Показывать ошибку». Если реквизит не заполнен, то выводится сообщение об ошибке.

Свойство «Проверка заполнения» можно установить в двух местах:

1) В свойствах реквизита формы

Свойство проверка заполнения в реквизите формы


Свойство проверка заполнения в реквизите справочника

2) В свойствах реквизита объекта метаданных (справочника, документа и т.д)

Свойство проверка заполнения в реквизите справочника

Процедура ВыполнитьНажатие()Если НЕ ПроверитьЗаполнение() Тогда
Возврат;
КонецЕсли;//...
//...
//...

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

Программная проверка заполнения

Встроенный язык программирования обладает всеми необходимыми возможностями для того чтобы написать проверку на заполненность полей формы. В основном, для проверки заполнения используется несколько функций. Для проверки ссылочных значений применяется встроенная функция Пустая(), которая вызывается непосредственно из ссылки. Для проверки строковых значений подходит функция ПустаяСтрока(<Строка>). Есть более универсальный метод ЗначениеЗаполнено(<Значение>), он проверяет заполненность значений любых типов. Информацию о том как работает та или иная функция можно найти в синтакс-помощнике.

Процедура ПроверитьЗаполнение()//Проверка ссылочных знаечний
Если Номенкалтура.Пустая() Тогда
Сообщить("Номенлатура пустая ссылка");
КонецЕсли;//Проверка строковых знаечний
Если ПустаяСтрока(Артикул) Тогда
Сообщить("Строка пустая");
КонецЕсли;//Проверка с помощью функции ЗначениеЗаполнено()
//Булево значение всегда заполнено
//Строка не пустая, если в строке есть непробельные символы
//Массив или коллекция не пустая, если в них есть хотя бы 1 элемент
//Неопределено и Null это всегда пустые значения
Если НЕ ЗначениеЗаполнено(Номенкалтура) Тогда
Сообщить("Номенлатура пустая ссылка");
КонецЕсли;Если НЕ ЗначениеЗаполнено(Артикул) Тогда
Сообщить("Строка пустая");
КонецЕсли;КонецПроцедуры

 +1 

   

Распечатать

1С 8.2 УП : Как вывести сообщение, чтобы оно указывало на поле формы, в котором ошибка?

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

Как самому вывести такое же сообщение, если в моей обработке введены неправильные данные?

Для вывода таких сообщений предназначен объект СообщениеПользователю. Такой объект можно создать конструктором и для того, чтобы указать поле, возле которого выводится сообщение, нужно правильно заполнить его свойство Поле.

Например, есть обработка, форма которой содержит реквизит Комментарий:
title

В некоторый момент нужно проверить, заполнено это поле или нет. Если поле не заполнено — выдать сообщение.

Для этого в форме обработки можно использовать такой код:

Код 1C v 8.2 УП

 Если СокрЛП(Комментарий) = "" Тогда
Сообщение = Новый СообщениеПользователю;
Сообщение.Поле = "Комментарий";
Сообщение.Текст = "Нужно написать комментарий.";
Сообщение.Сообщить();
КонецЕсли;

Здесь в свойстве Поле указывается имя реквизита формы. В результате выведенное сообщение будет привязано к тому элементу формы, который связан с этим реквизитом формы:
title

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

Например, так:

Код 1C v 8.2 УП

 МаксимальныйИндекс = Таблица.Количество() - 1;
Для Индекс = 0 По МаксимальныйИндекс Цикл
Если Таблица[Индекс].Количество = 0 Тогда
Сообщение = Новый СообщениеПользователю;
Сообщение.Поле = "Таблица[" + Индекс + "].Количество";
Сообщение.Текст = "Нужно указать количество.";
Сообщение.Сообщить();
КонецЕсли;
КонецЦикла;

В результате сообщение будет привязано именно к той ячейке колонки Количество, в которой содержится значение 0:
title

рубрики: Платформа 8.3 | Дата: 12 июля, 2018

Одной из стандартных задач при работе с формами различных объектов является проверка реквизитов формы на заполненность.
Рассмотрим несколько способов проверки заполненности реквизитов на форме. Рассматривать будем на примере элемента справочника.

Проверка средствами платформы

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

Программная проверка реквизитов с флагом «Выдавать ошибку»

Для реквизитов у которых свойство «Проверка заполнения» установлено в значение «Выдавать ошибку» достаточно легко можно организовать программную проверку буквально одной строчкой кода c помощью метода ПроверитьЗаполнение():


&НаСервере
Процедура ПроверитьРеквизитыНаСервере()

	ПроверитьЗаполнение();

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

В отличие от предыдущего способа (когда проверка происходит в момент записи), мы можем вызвать данную проверку в любом месте своего кода. И точно также как и в предыдущем случае будут выполнены процедуры ОбработкаПроверкиЗаполненияНаСервере() и ОбработкаПроверкиЗаполнения()

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

И конечно же мы всегда можем программно проверить заполненность реквизитов вне зависимости от значения свойства «Проверка заполнения». В самом простейшем случае с помощью метода ЗначениеЗаполнено():


Если НЕ ЗначениеЗаполнено(Поставщик) Тогда

	Сообщение = Новый СообщениеПользователю;
	Сообщение.Текст = "Не заполнен поставщик";
	Сообщение.Сообщить();

КонецЕсли;

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

  • Модуль формы. ПередЗаписью()
  • Модуль формы. ОбработкаПроверкиЗаполненияНаСервере()
  • Модуль объекта. ОбработкаПроверкиЗаполнения()
  • Модуль формы. ПередЗаписьюНаСервере()

Как правило проверка реквизитов выполняется в предопределенной процедуре модуля объекта ОбработкаПроверкиЗаполнения(). По умолчанию она выглядит следующим образом:


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

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

Здесь ПроверяемыеРеквизиты — это массив с именами реквизитов, которые подлежат проверке. Тип элементов массива — строка. Естественно, что платформа автоматически добавляет в этот массив имена реквизитов для которых установлено свойство «Выдавать ошибку». Но мы можем программно добавлять или удалять элементы массива и таким образом менять перечень проверяемых реквизитов:


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

	ПроверяемыеРеквизиты.Добавить("Поставщик");

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

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

Выводы

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

Понравилась статья? Поделить с друзьями:

Не пропустите эти материалы по теме:

  • Яндекс еда ошибка привязки карты
  • Выгонка тюльпанов ошибки
  • Выгодная цена ошибка
  • Выглядел более красивее исправить ошибки
  • Вывод текста ошибки php

  • 0 0 голоса
    Рейтинг статьи
    Подписаться
    Уведомить о
    guest

    0 комментариев
    Старые
    Новые Популярные
    Межтекстовые Отзывы
    Посмотреть все комментарии