В процессе разработки часто возникает задача сделать проверку реквизитов гибкой. Стандартный механизм платформы 1С:Предприятие автоматически формирует список обязательных к заполнению полей на основе настроек в Конфигураторе. Однако, если логика вашего бизнеса требует пропуска проверки при определенных условиях (например, если скидка составляет 100%, то заполнение суммы не является обязательным), стандартного функционала недостаточно. Давайте разберем, как грамотно управлять списком ПроверяемыеРеквизиты.
Перед тем как приступать к написанию кода, важно уяснить, что ПроверяемыеРеквизиты — это массив строк, который передается в процедуру ОбработкаПроверкиЗаполнения. Платформа анализирует этот массив и, если находит там имя реквизита, вызывает проверку на заполненность. Если реквизита в массиве нет, проверка для него пропущена.
Важно помнить, что проверка может выполняться в нескольких местах:
ОбработкаПроверкиЗаполненияНаСервере).ОбработкаПроверкиЗаполнения).Для надежности реализации рекомендуем выполнять эту логику именно в модуле объекта, так как это гарантирует работу проверки не только при интерактивной записи, но и при программном проведении или записи документа.
Основная ошибка при работе с этим массивом заключается в попытке удаления элемента без проверки его существования. Метод Удалить() требует индекс (число), а если передать туда Неопределено (когда реквизит не найден), система выдаст ошибку «Несоответствие типов». Давайте рассмотрим правильный подход к модификации массива.
Создадим процедуру, которая безопасно удаляет переданный список реквизитов из массива проверяемых. Это позволит избежать ошибок и сделает код легко читаемым.
Процедура УдалитьНепроверяемыеРеквизитыИзМассива(МассивРеквизитов, МассивНепроверяемыхРеквизитов) Экспорт
Для Каждого ЭлементМассива Из МассивНепроверяемыхРеквизитов Цикл
// Ищем индекс реквизита в основном массиве
ПорядковыйНомер = МассивРеквизитов.Найти(ЭлементМассива);
// Удаляем только в том случае, если реквизит был найден
Если ПорядковыйНомер <> Неопределено Тогда
МассивРеквизитов.Удалить(ПорядковыйНомер);
КонецЕсли;
КонецЦикла;
КонецПроцедуры
Теперь эту логику мы можем вызвать в процедуре ОбработкаПроверкиЗаполнения вашего документа. Рассмотрим пример использования:
Процедура ОбработкаПроверкиЗаполнения(Отказ, ПроверяемыеРеквизиты)
// Условие, при котором мы хотим исключить реквизиты из проверки
Если РольДоступна("Бухгалтер") Тогда
НепроверяемыеРеквизиты = Новый Массив;
НепроверяемыеРеквизиты.Добавить("Артикул");
НепроверяемыеРеквизиты.Добавить("Поставщик");
// Вызываем нашу вспомогательную процедуру
УдалитьНепроверяемыеРеквизитыИзМассива(ПроверяемыеРеквизиты, НепроверяемыеРеквизиты);
КонецЕсли;
КонецПроцедуры
Если вам нужно отключить проверку конкретной строки табличной части (а не всей колонки), то удаление из ПроверяемыеРеквизиты не поможет, так как этот массив работает на уровне всего реквизита целиком. В таком случае рекомендуется:
ОбработкаПроверкиЗаполнения или ПередЗаписью.Пример ручной проверки в цикле:
Для Каждого СтрокаТЧ Из Объект.Товары Цикл
Если СтрокаТЧ.ПроцентАвтоматическойСкидки <> 100 И НЕ ЗначениеЗаполнено(СтрокаТЧ.Сумма) Тогда
// Добавляем сообщение пользователю
Сообщить("В строке " + СтрокаТЧ.НомерСтроки + " не заполнена сумма!");
Отказ = Истина;
КонецЕсли;
КонецЦикла;
Подводя итог нашей работы, выделим главные правила:
ПроверяемыеРеквизиты через метод Найти() перед выполнением удаления.ПроверяемыеРеквизиты в модуле объекта.Отказ = Истина.