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

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

букашка

25.06.13

15:33

Здравствуйте!

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

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

Простой вопрос, но у меня мало времени, чтобы самой разбираться… Вот и прошу вашей помощи.

1

Mitriy

25.06.13

15:35

в обработчике модуля объекта удалить реквизит из ПроверяемыеРеквизиты…

2

Mitriy

25.06.13

15:35

в УниверсальныеПодборИОбработкаОбъектов

3

Mitriy

25.06.13

15:36

тьфу ты, не то скопипастил… ОбработкаПроверкиЗаполнения

4

Mitriy

25.06.13

15:38

или в модуле формы ОбработкаПроверкиЗаполненияНаСервере, если выдать ошибку выбрано у реквизита формы…

5

букашка

25.06.13

15:40

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

6

Mitriy

25.06.13

15:44

(5) в обработке проверки заполнения анализируй, надо проверять или не надо, и действуй соответствующе…

7

букашка

25.06.13

16:12

спасибо, разобралась!!!

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

Отключить возможность проверки заполненности реквизита можно двумя способами:

  1. Установить для свойства реквизита Проверка заполнения значение Не проверять.
  2. Изменить перечень проверяемых реквизитов программно в процедуре ОбработкаПроверкиЗаполнения в модуле объекта.

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

  1. Нужно создать расширение конфигурации и добавить в него нужный объект.
  2. В модуле объекта в расширении создаем процедуру обработки проверки заполнения вместо стандартной.

    &Вместо(«ОбработкаПроверкиЗаполнения»)

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

    // Вставить содержимое обработчика.

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

  3. ременной ПроверямыеРеквизиты находится массив с обязательными для заполнения реквизитами. Находим там элемент с именем реквизита, проверку которого нужно отменить, и удаляем его. Допустим, мы хотим отменить проверку реквизита Контрагент. Код будет выглядеть так:

    &Вместо(«ОбработкаПроверкиЗаполнения»)

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

    ИндексЭлемента = ПроверяемыеРеквизиты.Найти(«Контрагент»);

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

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

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

    &Вместо(«ОбработкаПроверкиЗаполнения»)

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Справка

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Доброго дня, коллеги!

Далеко не все свойства реквизитов документа являются расширяемыми. В качестве альтернативного варианта можно рассмотреть программное изменение значений свойств в расширении. Именно такой вариант тренер предложил слушателю в рамках темы “Доработка управляемых форм в расширениях” курса «Разработка расширений и технологии доработки конфигураций 1С без снятия с поддержки».

Вопрос

Здравствуйте, вопрос следующий. В документе в табличной части есть реквизит Характеристика со свойством “Проверка заполнения”, значение которого установлено как “Выдавать ошибку”. Перенес этот реквизит в расширение, но свойства этого реквизита не доступны для редактирования. Хотел для него в расширении проставить значение “Не проверять”.

Ответ

Добрый день! Вы не сможете поменять свойство “Проверка заполнения” в расширении у заимствованного реквизита, но можете изменить обработку ОбработкаПроверкиЗаполнения() в модуле объекта через расширение, так чтобы реквизит, даже не заимствованный, не проверялся. Вот пример кода:

ИндексПоляПоставщик = ПроверяемыеРеквизиты.Найти("ДенежныеСредства.Касса");
Если ИндексПоляПоставщик <> Неопределено Тогда
    ПроверяемыеРеквизиты.Удалить(ИндексПоляПоставщик);
КонецЕсли;

xDD,

УправляемаяФорма (ManagedForm)
ОбработкаПроверкиЗаполненияНаСервере (FillCheckProcessingAtServer)
Синтаксис:

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

<Отказ>

Тип: Булево.
Признак отказа от записи. Если в теле процедуры-обработчика установить данному параметру значение Истина, то запись выполнена не будет.
Значение по умолчанию: Ложь.
<ПроверяемыеРеквизиты>

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

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

// Проверим заполненность реквизита «Покупатель»
Если Не ЗначениеЗаполнено(Покупатель) Тогда

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

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

        КонецЕсли;

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

Примечание:

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

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

Интересное по теме:

  • 1с проверка заполнения выдавать ошибку не работает
  • 1с привязать ошибку к полю
  • 1с при редактировании текста модуля произошла внутренняя ошибка
  • 1с при работе формы произошла системная ошибка
  • 1с при проверке заполненности данных произошли ошибки

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

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