1с проверка заполнения реквизита на клиенте

Содержание:

1.       Свойство 1С «Проверка заполнения»

2.       Процесс проверки заполнения реквизита

Приветствую, коллеги! В данной статье я расскажу, как проводить программную проверку заполнения реквизита в режиме конфигуратора в 1С. Для начала мы рассмотрим общие понятия, после чего будет показан пример программного кода с комментариями. Также я расскажу, как проводить проверку на заполнение реквизита при помощи специального свойства и в каком случае это работает лучше, чем программная проверка. Всё описанное будет проиллюстрировано на вполне конкретном примере.  

1.    Свойство 1С «Проверка заполнения»

Чтобы проверить заполнение реквизита в 1С используется специальное свойство – Проверка заполнения. Для всех объектов метаданных, которые имеют типы, а также для реквизитов, которые выступают в стандартном формате, и таблиц, которые обязательно должны быть заполнены, для свойства «Проверка заполнения» должно быть определено значение «Выдавать ошибку».

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

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

Стоит отметить, что не нужно создавать противоположную схему: когда свойство «Проверка заполнения» установлено в «Не проверять», а в обработчике «ОбработкаПроверкиЗаполнения» дописаны некоторые проверки по заполнению, так как подобный план станет лишь путать логику в работе в режиме конфигурации 1С.  

2.    Процесс проверки заполнения реквизита

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

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

Для проверки необходимо запустить модуль документа «ОказаниеУслуги» и поместить в него следующую процедуру:


Рис. 1 Осуществление проверки заполнения реквизита в 1С

Теперь рассмотрим, что именно происходит в данной процедуре.

В начале нам нужно найти и получить реквизит из части таблицы «НаборСвойств», которая находится в массиве «ПроверяемыеРеквизиты». Данный массив будет передан к самому обработчику – в нём и содержатся те реквизиты, которые подлежат проверке. Для всех реквизитов внутри данного реквизита нужно выставить свойство «Проверка заполнения» для значения «Выдавать ошибку». В случае, если он будет распознан и найден, нужно будет удалить его, ведь проверка заполнения реквизитов будет выполняться полностью вручную.

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

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

Также вместо «ПереченьНоменклатуры» и «ВидНоменклатуры» можно использовать запросы.

Специалист компании «Кодерлайн»

Айдар Фархутдинов

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Справка

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Как вызвать стандартную проверку заполнения реквизитов?

Код 1C v 8.2 УП

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

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

Тип: Булево. Истина — ошибок не обнаружено, Ложь — в противном случае.

Описание:

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

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

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

Код 1C v 8.2 УП

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

Обработчик проверки заполнения

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

Код 1C v 8.2 УП

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

Здесь параметр Отказ (тип Булево) отвечает за возможность дальнейшей работы программы после проверки заполнения, а в параметре ПроверяемыеРеквизиты(тип Массив) содержатся реквизиты объекта, которые система будет проверять на заполненность. Напомним, что в версии 1С Предприятие 8.2 появилось возможность на уровне свойств реквизитов объекта устанавливать свойство Проверка заполнения. Так вот в массив ПроверяемыеРеквизиты по умолчанию система помещает реквизиты с установленным свойством «Выдавать ошибку». Однако разработчик может сам некоторые реквизиты добавить в массив или удалить из него в зависимости от каких-либо условий:

Код 1C v 8.2 УП

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

Клиент = ПроверяемыеРеквизиты.Найти("Контрагент");

Если Клиент<>Неопределено тогда

ПроверяемыеРеквизиты.Удалить(Клиент);

конецесли;

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

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

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

Код 1C v 8.2 УП

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

Если Контрагент.ПометкаУдаления Тогда

Отказ = Истина;

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

Сообщение.Текст = "Нельзя указывать контрагента, помеченного на удаление!";

Сообщение.Поле = "Контрагент";

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

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

КонецЕсли;

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

Далее рассмотрим, когда вызывается данный обработчик. Это зависит от типа объекта и его свойств. Так для, например, для справочника обработчик вызывается перед записью объекта; для документа: если разрешено проведение — при проведении, иначе при записи; для обработки : при вызове стандартных команд «OK», Да». Подробно это описано во встроенной справке. Но также есть возможность вызвать данный обработчик в произвольный момент, используя метод объекта ПроверитьЗаполнение(). Например, определить команду Проверить в форме документа:

Код 1C v 8.2 УП

 &НаКлиенте

Процедура Проверить(Команда)

ПроверитьНаСервере();

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

&НаСервере

Процедура ПроверитьНаСервере()

Документ = РеквизитФормыВЗначение("Объект");

Документ.ПроверитьЗаполнение();

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

Автор: Борис Захаров


Код 1C v 8.х

  //СписокРеквизитов - список значений. Элемент списка значений - имена реквизитов для проверки через запятую. 
//Если представление заполнено - считается, что передаются реквизиты табличной части. Пример:
СписокРеквизитовДляПроверки=Новый СписокЗначений;
СписокРеквизитовДляПроверки.Добавить("Контрагент,МестоХранения,ВидОперации");
СписокРеквизитовДляПроверки.Добавить("Номенклатура,Единица,Цена,Количество","ПолнаяТаблица");
СписокРеквизитовДляПроверки.Добавить("ВидОтклонений,Номенклатура,Единица,Серия,Цена,Количество","ТаблицаОтклонений");

Если Не глРеквизитыОбъектаЗаполнены(Источник,СписокРеквизитовДляПроверки) Тогда
Отказ=Истина;
Возврат;
КонецЕсли;

Функция глРеквизитыОбъектаЗаполнены(Объект,СписокРеквизитов) Экспорт
МетаданныеОбъекта=Объект.Метаданные();
МетаданныеТабличныеЧасти=МетаданныеОбъекта.ТабличныеЧасти;

РеквизитыЗаполнены=Истина;

СтрокаДляВыполнения="";

Для каждого НаборРеквизитов Из СписокРеквизитов Цикл
НаименованиеТаблицы=НаборРеквизитов.Представление;
РеквизитыДляПроверки=СтрЗаменить(НаборРеквизитов.Значение,",",Символы.ПС);

ДлинаСпискаРеквизитов=СтрЧислоСтрок(РеквизитыДляПроверки);

Если НаименованиеТаблицы<>"" Тогда
МетаданныеТаблица=МетаданныеТабличныеЧасти[НаименованиеТаблицы];
МетаданныеРевизитыТаблицы=МетаданныеТаблица.Реквизиты;

ТаблицаОбъекта=Объект[НаименованиеТаблицы];

Для СчетчикСтрокРевизитов=1 По ДлинаСпискаРеквизитов Цикл
ИдентРеквизита=СтрПолучитьСтроку(РеквизитыДляПроверки,СчетчикСтрокРевизитов);

МетаданныеРеквизит=МетаданныеРевизитыТаблицы[ИдентРеквизита];
ОписаниеТиповРеквизита=МетаданныеРеквизит.Тип;
ТипыЗначенийРеквизита=ОписаниеТиповРеквизита.Типы();

СтрокаПоиска=ТаблицаОбъекта.Найти(глПолучитьПустоеЗначениеТипа(ТипыЗначенийРеквизита[0]),ИдентРеквизита);
Если СтрокаПоиска=Неопределено Тогда
Продолжить;
КонецЕсли;

Возврат глВозвратЛожьССообщением("Не заполнен реквизит """+МетаданныеРеквизит.Синоним+""" Табличная часть строка "+СтрокаПоиска.НомерСтроки);
КонецЦикла;
Иначе
Для СчетчикСтрокРевизитов=1 По ДлинаСпискаРеквизитов Цикл
ИдентРеквизита=СтрПолучитьСтроку(РеквизитыДляПроверки,СчетчикСтрокРевизитов);

Если Не ЗначениеЗаполнено(Объект[ИдентРеквизита]) Тогда
МетаданныеРевизитыШапки=МетаданныеОбъекта.Реквизиты;
Попытка
Возврат глВозвратЛожьССообщением("Не заполнен реквизит """+МетаданныеРевизитыШапки[ИдентРеквизита].Синоним+"""");
Исключение
Возврат глВозвратЛожьССообщением("Не заполнен реквизит """+ИдентРеквизита+"""");
КонецПопытки;
КонецЕсли;
КонецЦикла;
КонецЕсли;
КонецЦикла;

Возврат Истина;
КонецФункции


Код 1C v 8.х

 // Ярослав Волохов aka YVolohov
// Функция проверяет заполнение шапки или табличной части справочника, документа или плана, бизнес-процесса, задачи
// Параметры:
// пИмяТаблицы (строка) - имя табличной части объекта, если не указано то будет проверятся шапка объекта
// пИменаПолей (массив строк) - имена проверяемых реквизитов объекта
// пВыводитьСообщения - если это свойство установлено в "Истина" то будут выводится сообщения в табло о
// незаполненных реквизитах таблицы, если не установлено - то не будут
// пСсылка (ссылка) - ссылка на элемент справочника или плана, документ, по которому будет произведена проверка
// Возвращаемое значение:
// Истина - если все реквизиты найдены и заполнены
// Ложь - если хоть один реквизит не заполнен, табличная часть не найдена
// или хоть один реквизит не найден

Функция ПроверитьЗаполнениеТаблицыОбъекта(пИмяТаблицы = Неопределено,
пИменаПолей, пВыводитьСообщения = Истина, пСсылка) Экспорт

МассивСообщений = Новый Массив;
ЗначениеВозврата = Истина;
МетаданныеОбъекта = пСсылка.Метаданные();

Если НЕ(пИмяТаблицы = Неопределено) Тогда
МетаданныеТаблицы = МетаданныеОбъекта.ТабличныеЧасти.Найти(пИмяТаблицы);
Иначе
МетаданныеТаблицы = МетаданныеОбъекта;
КонецЕсли;

// Проверка существования табличной части
Если НЕ(МетаданныеТаблицы = Неопределено) Тогда

МассивМетаданныхРеквизитов = Новый Массив;
МетаданныеРеквизитов = МетаданныеТаблицы.Реквизиты;

// Проверка существования полей
Для Каждого ИмяПоля Из пИменаПолей Цикл

МетаданныеРеквизита = МетаданныеРеквизитов.Найти(ИмяПоля);

Если НЕ(МетаданныеРеквизита = Неопределено) Тогда
МассивМетаданныхРеквизитов.Добавить(МетаданныеРеквизита);
Иначе

Если пИмяТаблицы = Неопределено Тогда
МассивСообщений.Добавить("Реквизит шапки с именем '" + ИмяПоля + "' не найден !!!");
Иначе
МассивСообщений.Добавить("Реквизит табличной части '" + пИмяТаблицы + "' с именем '" +
ИмяПоля + "' не найден !!!");
КонецЕсли;

ЗначениеВозврата = Ложь;
КонецЕсли;

КонецЦикла;

// Проверка заполнения полей
КоличествоСтрокТаблицы = ?(НЕ(пИмяТаблицы = Неопределено), пСсылка[пИмяТаблицы].Количество(), 1);
КоличествоСтрокТаблицы = ?(МассивМетаданныхРеквизитов.Количество() > 0, КоличествоСтрокТаблицы, 0);

// Обход строк таблицы
Для НомерСтрокиТаблицы = 1 По КоличествоСтрокТаблицы Цикл

СтрокаТаблицы = ?(НЕ(пИмяТаблицы = Неопределено),
пСсылка[пИмяТаблицы].Получить(НомерСтрокиТаблицы - 1), пСсылка);

// Обход списка проверяемых реквизитов
Для Каждого ЭлементМетаданныхРеквизитов Из МассивМетаданныхРеквизитов Цикл

// Получение значения ячейки и проверка ее заполнения
ЗначениеЯчейкиТЧ = СтрокаТаблицы[ЭлементМетаданныхРеквизитов.Имя];
ЯчейкаПустая = НЕ(ЗначениеЗаполнено(ЗначениеЯчейкиТЧ));

// Если значение пустое, добавляем сообщение в массив сообщений
Если ЯчейкаПустая Тогда

Если пИмяТаблицы = Неопределено Тогда
МассивСообщений.Добавить("Реквизит шапки с именем '" + ЭлементМетаданныхРеквизитов.Имя + "' не заполнен !!!");
Иначе
МассивСообщений.Добавить("В строке № " + НомерСтрокиТаблицы + " табличной части '" +
пИмяТаблицы + "' не заполнен реквизит с именем '" + ЭлементМетаданныхРеквизитов.Имя + "' !!!");
КонецЕсли;

ЗначениеВозврата = Ложь;

КонецЕсли;

КонецЦикла;

КонецЦикла;

Иначе
МассивСообщений.Добавить("Табличная часть с именем '" + пИмяТаблицы + "' не найдена !!!");
ЗначениеВозврата = Ложь;
КонецЕсли;

// Здесь выводим все сообщения
Если пВыводитьСообщения Тогда

Для Каждого ТекстСообщения Из МассивСообщений Цикл
Сообщить(ТекстСообщения, СтатусСообщения.Важное);
КонецЦикла;

КонецЕсли;

Возврат ЗначениеВозврата;

КонецФункции

Перейти в раздел примеры кода 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

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

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

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

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

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

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

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


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

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

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

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

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

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

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

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

Проверка заполненности ЭЛЕМЕНТА управляемой формы

Я
   sbabay

03.05.11 — 10:54

Управляемое приложение.

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

Как это сделать?

Как вообще можно достать значение Элемента?

  

Партнерская программа EFSOL Oblako

   Defender aka LINN

Модератор

1 — 03.05.11 — 10:55

В Элементах, если что, указаны РЕКВИЗИТЫ.

   Stepa86

2 — 03.05.11 — 10:58

Курим ПроверитьЗаполнение, Обработку проверки заполнения и различные свойства на реквизитах

   sbabay

3 — 03.05.11 — 11:00

Ну вот, например, у меня есть два реквизита формы: Контрагент (справочник.Контрагенты) и Примечание (Строка 100)

И на форме два элемента: ИмяКонтрагента (ПутькДанным = Контрагент.Наименование) и Примечание (ПутьКДанным = Примечание).

В общий модуль я могу форму (ЭтаФорма). Как поступать дальше? Что я там смогу с этим сделать?

   sbabay

4 — 03.05.11 — 11:03

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

   unf13

5 — 03.05.11 — 11:13

(4) а зачем писать «в каждой форме» ? у тебя какая-то нестандартная обработка проверки заполнения? Просто протыкал в конфигураторе нужные реквизиты, свойство «проверка заполнения — выдавать ошибку», и все.

   sbabay

6 — 03.05.11 — 11:16

(5) Тут немного другой механизм предполагается.

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

   bsd2008

7 — 03.05.11 — 11:23

Если Не ЗначениеЗаполнено(Объект.Ссылка) Тогда

   Defender aka LINN

Модератор

8 — 03.05.11 — 11:25

(6) и чО? Для проверки заполнения событие имеется.

   sbabay

9 — 03.05.11 — 11:36

(8) по примеру из (3) я должен буду написать примерно такое:

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

 Если Не ЗначениеЗаполнено(Контрагент.Наименование) Тогда

   Сообщить(«Не заполнено имя контра!»);

 КонецЕсли

 Если Не ЗначениеЗаполнено(Примечание) Тогда

   Сообщить(«Не заполнено примечание!»);

 КонецЕсли

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

Так?

Я же не хочу писать один и тот же код во всех формах, а хочу вызвать так:

МойОбщийМодуль.ПроверитьЗаполненностьРеквизитов( ПроверяемаяФорма, СписокПроверяемыхПолей);

   sbabay

10 — 03.05.11 — 11:36

(7) это к чему?

   Defender aka LINN

Модератор

11 — 03.05.11 — 11:42

(9) Нет. Такого писать не надо.

«Я же не хочу писать один и тот же код во всех формах, а хочу вызвать так» — покажи пальцем — кто тебе мешает?

   sbabay

12 — 03.05.11 — 11:51

(11)

В этом общем модуле пишем:

&НаКлиенте

Функция ПроверитьЗаполненностьРеквизитов( ПроверяемаяФорма, СписокПроверяемыхПолей)

   Для каждого текИмяПроверяемогоЭлемента Из СписокПроверяемыхПолей Цикл

       текЭлемент = ПроверяемаяФорма.Элементы[текИмяПроверяемогоЭлемента.Значение];

       //!!! КАК кот тут проверить заполненность?

   КонецЦикла;

КонецФункции

   Вовчик

13 — 03.05.11 — 11:59

(12)

а НЕ ЗначениеЗаполнено(текЭлемент) не канает?

   sbabay

14 — 03.05.11 — 12:02

текЭлемент — это Элемент (не реквизит) формы, поэтому нет, не канает.

   Defender aka LINN

Модератор

15 — 03.05.11 — 12:03

(12) «СписокПроверяемыхПолей» — тебя ни на какие мысли не наводит?

И в общих модулях &НаКлиенте, &НаСервере и прочее — не используется.

   Вовчик

16 — 03.05.11 — 12:06

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

   Defender aka LINN

17 — 03.05.11 — 12:07

(16) ЗначениеЗаполнено(ПолеВвода)? И что ж оно должно сообщить?

   sbabay

18 — 03.05.11 — 12:07

(15) а на что может натолкнуть «СписокПроверяемыхПолей»? Честно, не понимаю. Там хранятся строки — имена элементов формы. И все.

А НаСервере и НаКлиенте в общих модулях используется, если стоят галки «Клиент» и «Сервер» (у меня именно такой)

   sbabay

19 — 03.05.11 — 12:08

(16) а это как раз-таки и есть мутабельное значение. Сейчас попробовал.

   Defender aka LINN

Модератор

20 — 03.05.11 — 12:24

(18) ЗАБУДЬ, пеляйт, про элементы формы. Нет их, не существует, пеляйт. Там хранятся имена РЕКВИЗИТОВ (еще раз обрати, пеляйт, внимание — НЕ ЭЛЕМЕНТОВ, а РЕКВИЗИТОВ) для проверки. Есть элемент в этом массиве — реквизит (не элемент формы, ты помнишь, да?) будет проверяться. нет элемента — не будет. Дальше сам додумаешься?

   Вовчик

21 — 03.05.11 — 12:30

(20) не так он не поймет надо носом ткнуть)))

sbabay убери в (12) точку и слово «Элементы»

   sbabay

22 — 03.05.11 — 12:57

Давайте еще раз.

Есть обработка, в которой должно происходить проверка заполнения. У этой формы есть два реквизита:  Контрагент (справочник.Контрагенты) и Примечание (Строка 100)

И на форме два элемента: ИмяКонтрагента (ПутькДанным = Контрагент.Наименование) и Примечание (ПутьКДанным = Примечание).

После того как админ установил обязательность заполнения элементов, сохранился СписокПроверяемыхПолей, который состоит из 2-х элементов-строк: «ИмяКонтрагента» и «Примечание»

Теперь в общем модуле вы советуете сделать проверку вот так:

&НаКлиенте

Функция ПроверитьЗаполненностьРеквизитов( ПроверяемаяФорма, СписокПроверяемыхПолей)

   Для каждого текИмяПроверяемогоЭлемента Из СписокПроверяемыхПолей Цикл

       Если НЕ ЗначениеЗаполнено(пФорма[текЭлемент.текИмяПроверяемогоЭлемента.Значение]) Тогда

Сообщить(«Не заполнено!»)

КонецЕсли;

КонецЦикла;

КонецФункции

Но такое пройдет только для «Примечания», для элемента «ИмяКонтрагента» такое не пройдет, т.к. данные хранятся в реквизите «Контрагент.Наименование»

   sbabay

23 — 03.05.11 — 13:09

(20) Я кажется понял, что ты имеешь ввиду.

Если я буду использовать:

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

то про «ПроверяемыеРеквизиты» откуда у меня возьмутся? У меня есть только то, что заполнил СуперПользователь — а он отметил те ЭЛЕМЕНТЫ формы, которые должны быть заполнены.

   sbabay

24 — 03.05.11 — 13:10

(21) Да, ткни, пожалуйста.

   Вовчик

25 — 03.05.11 — 13:39

(24) данные храняться в реквизите Контрагент, а если у тебя элемент формы ИмяКонтрагента связан с Контрагент.Наименование то пользователь все равно его ввести не может.

Короче тыкаю пальцем. В модуле формы

&НаКлиенте

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

   МассивРеквизитов = Новый Массив;

   МассивРеквизитов.Добавить(Реквизит1);

   МассивРеквизитов.Добавить(Объект.Клиент);

   РаботаСДокументами.ПроверкаЗаполнения(МассивРеквизитов,Отказ);

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

В общем модуле

Процедура ПроверкаЗаполнения СтруктураРеквизитов,Отказ)Экспорт

   Для каждого элемент из Структурареквизитов Цикл

   Если НЕ ЗначениеЗаполнено(элемент) тогда

       Отказ = Истина;

   КонецЕсли;

   КонецЦикла

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

Короче форму даже передавать не надо, простопередаешь список реквизитов

   sbabay

26 — 03.05.11 — 13:49

(25) Почему это не сможет ввести ИмяКонтрагента?

Контрагент — основной реквизит обработки. Я раскрываю это дерево и перетаскиваю в элементы формы «Контрагент.Наименование» и обзываю его «ИмяКонтрагента»

Про твой код. И где тут универсальность? Я ж говорил, что у меня есть только список Имен элементов. Как на основе этого напишу:

МассивРеквизитов.Добавить(Объект.Клиент);

?

   Вовчик

27 — 03.05.11 — 13:58

(26) ты пробовар редактировать ИмяКонтрагента в режиме предприятия? только убедись что в свойствах, путь к данным у тебя именно Объект.Контрагент.наименование.

Я твоей структуры не знаю, в каком виде у тебя храниться список? Но блин неужли не сообразишь,

да хотя бы если у тебя хранится только наименование реквизита, то используй

Выполнить(«МассивРеквизитов.Добавить(«+ИмяТвоегоРеквизита+»);»

   Вовчик

28 — 03.05.11 — 14:00

+ (27)в конце еще );

   acsent

29 — 03.05.11 — 14:08

Я так и не понял зачем САМОМУ проверять заполнение реквизитов.

УправляемаяФорма (ManagedForm)

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

Синтаксис:

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

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

Тип: Булево. Истина — ошибок не обнаружено, Ложь — в противном случае.

Описание:

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

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

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

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

Примечание:

Выполнение метода приводит к возникновению события ОбработкаПроверкиЗаполненияНаСервере.

   acsent

30 — 03.05.11 — 14:10

Но правильнее вызывать проверку объекта, а не формы

   sbabay

31 — 03.05.11 — 14:17

(29) для этого надо в конфигураторе проставлять «Показывать ошибку» в реквизитах формы. К тому же к полю, путь к данным которого = «Контрагент.Наименование» так не подступишься, не залазея в справочник «Контрагенты».

Вот сделал обработку для УТ 11 с 3 реквизитами на форме и парой  строк кода. http://webfile.ru/5298763

Как проверить хотя бы в этой форме, зная только имена элементов?

   sbabay

32 — 03.05.11 — 14:18

+(29) обязательный реквизит или нет будут решать СуперПользователи в режиме предприятия

   acsent

33 — 03.05.11 — 14:18

(31) В чем проблема програмно проставить флаг у реквизитов?

   sbabay

34 — 03.05.11 — 14:20

(33) Как для элемента «ИмяКонтрагента» это сделать? (путьКДанным = «Контрагент.Наименование»)

   Axel2009

35 — 03.05.11 — 14:21

(33) и гендира обучать как эти флажки ставить-снимать?

   Axel2009

36 — 03.05.11 — 14:22

(34) а не проще в контрагенте проверять заполненность этого поля?

   sbabay

37 — 03.05.11 — 14:24

(35) ну не ген. дир, а админ

(36) нет. Некоторым обязательные поля — одни, другим — другие.

   Sarmen

38 — 03.05.11 — 14:26

Почему бы не заполнять ‘СписокПроверяемыхПолей’ не именами полей, а строковыми представлениями данных?

Например поле: ‘Наименование’ (Путь к данным: «Контрагент.Наименование»). Тогда проверять что-то типа: Если ЗначениеЗаполнено(«Контрагент.Наименование») Тогда ….

   Вовчик

39 — 03.05.11 — 14:29

(38) не трать силы, ему это твердят почти с самого начала.

   sbabay

40 — 03.05.11 — 14:39

(39) в посте (31) я положил обработку для УТ. там 6 строчек кода. Можешь подсказать как и что мне надо поменять? Крайне желательно делать всё без «Выполнить».

   Вовчик

41 — 03.05.11 — 14:58

&НаКлиенте

Процедура Проверить(Команда)

   МассивПроверяемыхЭлементов = Новый Массив;

   МассивПроверяемыхЭлементов.Добавить(«Примечание»);

   МассивПроверяемыхЭлементов.Добавить(«Контрагент.Наименование»);

   
   ПроверитьСервер(МассивПроверяемыхЭлементов);

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

&НаСервере

Процедура ПроверитьСервер(МассивПроверяемыхЭлементов)

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

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

           Сообщить(«Не заполнено поле!!!»);

       КонецЕсли;

       КонецЦикла;

КонецПроцедуры    //ПроверитьСервер

   Axel2009

42 — 03.05.11 — 14:59

(41) порадовал =)

   acsent

43 — 03.05.11 — 14:59

(41) Брехня

   Вовчик

44 — 03.05.11 — 15:02

мляяяяя в массив передавать без кавычек

   sbabay

45 — 03.05.11 — 15:03

(41) И при каких условиях у тебя выйдет сообщение?

   Вовчик

46 — 03.05.11 — 15:04

(42) (43) ошибка не моя, просто не проверил сразу

   Вовчик

47 — 03.05.11 — 15:05

(45) возьми да попробуй, сообщение выходит если тыоставишь пустым ИмяКонтрагента и Примечание

   Вовчик

48 — 03.05.11 — 15:09

+(47) или только пробелами заполнишь

   Axel2009

49 — 03.05.11 — 15:10

(46) у вас там разделение обязанностей? =) один форум читает, другой ответы ищет? =))

   sbabay

50 — 03.05.11 — 15:13

(44), (46)

Да, если передавать не строки, то всё пройдет нормально. Но я не знаю как их достать именно в таком виде.

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

Потом на основе этих данных и происходит проверка. Т.е. в целевой форме я могу поиметь только ИмяЭлемента и ПутьКДанным — а это строки

   sbabay

51 — 03.05.11 — 15:14

(47) В том виде как ты ответил и пробовать не надо. Поэтому и спросил

   sbabay

52 — 03.05.11 — 15:17

+ Изначально я так и описывал свою проблему. На входе имею только имена проверяемых элементов и Форму. Выполняется всё в общем модуле.

Как проверить реквизиты на заполненность я знаю.

   Вовчик

53 — 03.05.11 — 15:26

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

   acsent

54 — 03.05.11 — 15:27

(53) Он типа хочет супер мега универсальную хрень сделать

   acsent

55 — 03.05.11 — 15:27

Которая нах никому не нужна

   Вовчик

56 — 03.05.11 — 15:32

Что то сомневаюсь я в ее универсальности. Она таки как раз будет совсем не универсальна.

   sbabay

57 — 03.05.11 — 15:33

(53) Будет создаваться новый элемент справочника «контрагенты»

   Вовчик

58 — 03.05.11 — 15:38

Ну так создай новый реквизит ИмяКонтрагента, именно реквизит и присваивай потом Контрагент.Наименование = ИмяКонтрагента. И без проблем проверяй потом Форма[«ИмяКонтрагента»].

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

   sbabay

59 — 03.05.11 — 15:46

У меня как раз-таки Контрагент — основной реквизит формы

   sbabay

60 — 03.05.11 — 16:36

Мегаумные модераторы чё-т притихли.

На этом форуме даже у модераторов цель — обос-ать вопрошающего?

   Axel2009

61 — 03.05.11 — 16:40

(60) у фсех

  

sbabay

62 — 04.05.11 — 09:09

апну. Может сегодня у кого-нибудь будут новые идеи.

Понравилась статья? Поделить с друзьями:
  • 125466 почтовое отделение часы работы адрес
  • 1с расширение не видит добавленный реквизит
  • Яндекс это чья компания российская или нет
  • 143500 почтовое отделение адрес часы работы
  • 1с расширение проверка заполнения реквизита