Как вызвать стандартную проверку заполнения реквизитов?
1 |
ПроверитьЗаполнение() |
Возвращаемое значение:
Тип: Булево. Истина — ошибок не обнаружено, Ложь — в противном случае.
Описание:
Проверяет заполнение реквизитов. Для реквизитов, у которых свойство "Проверка заполнения" установлено в значение "Показывать ошибку" и реквизит не заполнен, будет сформировано сообщение об ошибке.
Доступность:
Тонкий клиент, веб-клиент, сервер, толстый клиент.
1 2 3 4 5 6 7 8 |
&НаКлиенте Процедура СформироватьБезСКД(Команда) // Проверим заполнение обязательных реквизитов Если Не ПроверитьЗаполнение() Тогда Возврат; КонецЕсли; СформироватьСервер(); КонецПроцедуры |
У прикладных объектов на платформе 1С Предприятие 8.2 появился новый обработчик события ОбработкаПроверкиЗаполнения, где теперь рекомендуется делать все проверки на заполненность реквизитов объекта. Рассмотрим работу с этим обработчиком. Обработчик должен быть расположен в модуле объекта (для констант в модуле менеджера значений) и имеет следующий синтаксис:
1 2 |
Процедура ОбработкаПроверкиЗаполнения(Отказ, ПроверяемыеРеквизиты) КонецПроцедуры |
Здесь параметр Отказ (тип Булево) отвечает за возможность дальнейшей работы программы после проверки заполнения, а в параметре ПроверяемыеРеквизиты(тип Массив) содержатся реквизиты объекта, которые система будет проверять на заполненность. Напомним, что в версии 1С Предприятие 8.2 появилось возможность на уровне свойств реквизитов объекта устанавливать свойство Проверка заполнения. Так вот в массив ПроверяемыеРеквизиты по умолчанию система помещает реквизиты с установленным свойством «Выдавать ошибку». Однако разработчик может сам некоторые реквизиты добавить в массив или удалить из него в зависимости от каких-либо условий:
1 2 3 4 5 6 7 8 9 10 11 12 13 |
Процедура ОбработкаПроверкиЗаполнения(Отказ, ПроверяемыеРеквизиты) Клиент = ПроверяемыеРеквизиты.Найти("Контрагент"); Если Клиент<>Неопределено тогда ПроверяемыеРеквизиты.Удалить(Клиент); конецесли; ПроверяемыеРеквизиты.Добавить("Склад"); КонецПроцедуры |
Как видно из примера в качестве элементов массива выступают строковые наименование реквизитов, как они заданы в конфигураторе. Для того чтобы полностью отказаться от системной проверки, необходимо очистить массив. При этом разработчик может проводить проверку реквизитов по произвольным алгоритмам, система же проверяет только на заполненность/незаполненность:
Процедура ОбработкаПроверкиЗаполнения(Отказ, ПроверяемыеРеквизиты)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
ПроверяемыеРеквизиты.Очистить(); Если Контрагент.ПометкаУдаления Тогда Отказ = Истина; Сообщение = Новый СообщениеПользователю; Сообщение.Текст = "Нельзя указывать контрагента, помеченного на удаление!"; Сообщение.Поле = "Контрагент"; Сообщение.УстановитьДанные(ЭтотОбъект); Сообщение.Сообщить(); КонецЕсли; КонецПроцедур |
Далее рассмотрим, когда вызывается данный обработчик. Это зависит от типа объекта и его свойств. Так для, например, для справочника обработчик вызывается перед записью объекта; для документа: если разрешено проведение — при проведении, иначе при записи; для обработки : при вызове стандартных команд "OK", Да". Подробно это описано во встроенной справке. Но также есть возможность вызвать данный обработчик в произвольный момент, используя метод объекта ПроверитьЗаполнение(). Например, определить команду Проверить в форме документа:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
&НаКлиенте Процедура Проверить(Команда) ПроверитьНаСервере(); КонецПроцедуры &НаСервере Процедура ПроверитьНаСервере() Документ = РеквизитФормыВЗначение("Объект"); Документ.ПроверитьЗаполнение(); КонецПроцедуры |
Автор: Борис Захаров
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 |
//СписокРеквизитов - список значений. Элемент списка значений - имена реквизитов для проверки через запятую. //Если представление заполнено - считается, что передаются реквизиты табличной части. Пример: СписокРеквизитовДляПроверки=Новый СписокЗначений; СписокРеквизитовДляПроверки.Добавить("Контрагент,МестоХранения,ВидОперации"); СписокРеквизитовДляПроверки.Добавить("Номенклатура,Единица,Цена,Количество","ПолнаяТаблица"); СписокРеквизитовДляПроверки.Добавить("ВидОтклонений,Номенклатура,Единица,Серия,Цена,Количество","ТаблицаОтклонений"); Если Не глРеквизитыОбъектаЗаполнены(Источник,СписокРеквизитовДляПроверки) Тогда Отказ=Истина; Возврат; КонецЕсли; Функция глРеквизитыОбъектаЗаполнены(Объект,СписокРеквизитов) Экспорт МетаданныеОбъекта=Объект.Метаданные(); МетаданныеТабличныеЧасти=МетаданныеОбъекта.ТабличныеЧасти; РеквизитыЗаполнены=Истина; СтрокаДляВыполнения=""; Для каждого НаборРеквизитов Из СписокРеквизитов Цикл НаименованиеТаблицы=НаборРеквизитов.Представление; РеквизитыДляПроверки=СтрЗаменить(НаборРеквизитов.Значение,",",Символы.ПС); ДлинаСпискаРеквизитов=СтрЧислоСтрок(РеквизитыДляПроверки); Если НаименованиеТаблицы<>"" Тогда МетаданныеТаблица=МетаданныеТабличныеЧасти[НаименованиеТаблицы]; МетаданныеРевизитыТаблицы=МетаданныеТаблица.Реквизиты; ТаблицаОбъекта=Объект[НаименованиеТаблицы]; Для СчетчикСтрокРевизитов=1 По ДлинаСпискаРеквизитов Цикл ИдентРеквизита=СтрПолучитьСтроку(РеквизитыДляПроверки,СчетчикСтрокРевизитов); МетаданныеРеквизит=МетаданныеРевизитыТаблицы[ИдентРеквизита]; ОписаниеТиповРеквизита=МетаданныеРеквизит.Тип; ТипыЗначенийРеквизита=ОписаниеТиповРеквизита.Типы(); СтрокаПоиска=ТаблицаОбъекта.Найти(глПолучитьПустоеЗначениеТипа(ТипыЗначенийРеквизита[0]),ИдентРеквизита); Если СтрокаПоиска=Неопределено Тогда Продолжить; КонецЕсли; Возврат глВозвратЛожьССообщением("Не заполнен реквизит """+МетаданныеРеквизит.Синоним+""" Табличная часть строка "+СтрокаПоиска.НомерСтроки); КонецЦикла; Иначе Для СчетчикСтрокРевизитов=1 По ДлинаСпискаРеквизитов Цикл ИдентРеквизита=СтрПолучитьСтроку(РеквизитыДляПроверки,СчетчикСтрокРевизитов); Если Не ЗначениеЗаполнено(Объект[ИдентРеквизита]) Тогда МетаданныеРевизитыШапки=МетаданныеОбъекта.Реквизиты; Попытка Возврат глВозвратЛожьССообщением("Не заполнен реквизит """+МетаданныеРевизитыШапки[ИдентРеквизита].Синоним+""""); Исключение Возврат глВозвратЛожьССообщением("Не заполнен реквизит """+ИдентРеквизита+""""); КонецПопытки; КонецЕсли; КонецЦикла; КонецЕсли; КонецЦикла; Возврат Истина; КонецФункции |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 |
// Ярослав Волохов aka YVolohov // Функция проверяет заполнение шапки или табличной части справочника, документа или плана, бизнес-процесса, задачи // Параметры: // пИмяТаблицы (строка) - имя табличной части объекта, если не указано то будет проверятся шапка объекта // пИменаПолей (массив строк) - имена проверяемых реквизитов объекта // пВыводитьСообщения - если это свойство установлено в "Истина" то будут выводится сообщения в табло о // незаполненных реквизитах таблицы, если не установлено - то не будут // пСсылка (ссылка) - ссылка на элемент справочника или плана, документ, по которому будет произведена проверка // Возвращаемое значение: // Истина - если все реквизиты найдены и заполнены // Ложь - если хоть один реквизит не заполнен, табличная часть не найдена // или хоть один реквизит не найден Функция ПроверитьЗаполнениеТаблицыОбъекта(пИмяТаблицы = Неопределено, пИменаПолей, пВыводитьСообщения = Истина, пСсылка) Экспорт МассивСообщений = Новый Массив; ЗначениеВозврата = Истина; МетаданныеОбъекта = пСсылка.Метаданные(); Если НЕ(пИмяТаблицы = Неопределено) Тогда МетаданныеТаблицы = МетаданныеОбъекта.ТабличныеЧасти.Найти(пИмяТаблицы); Иначе МетаданныеТаблицы = МетаданныеОбъекта; КонецЕсли; // Проверка существования табличной части Если НЕ(МетаданныеТаблицы = Неопределено) Тогда МассивМетаданныхРеквизитов = Новый Массив; МетаданныеРеквизитов = МетаданныеТаблицы.Реквизиты; // Проверка существования полей Для Каждого ИмяПоля Из пИменаПолей Цикл МетаданныеРеквизита = МетаданныеРеквизитов.Найти(ИмяПоля); Если НЕ(МетаданныеРеквизита = Неопределено) Тогда МассивМетаданныхРеквизитов.Добавить(МетаданныеРеквизита); Иначе Если пИмяТаблицы = Неопределено Тогда МассивСообщений.Добавить("Реквизит шапки с именем '" + ИмяПоля + "' не найден !!!"); Иначе МассивСообщений.Добавить("Реквизит табличной части '" + пИмяТаблицы + "' с именем '" + ИмяПоля + "' не найден !!!"); КонецЕсли; ЗначениеВозврата = Ложь; КонецЕсли; КонецЦикла; // Проверка заполнения полей КоличествоСтрокТаблицы = ?(НЕ(пИмяТаблицы = Неопределено), пСсылка[пИмяТаблицы].Количество(), 1); КоличествоСтрокТаблицы = ?(МассивМетаданныхРеквизитов.Количество() > 0, КоличествоСтрокТаблицы, 0); // Обход строк таблицы Для НомерСтрокиТаблицы = 1 По КоличествоСтрокТаблицы Цикл СтрокаТаблицы = ?(НЕ(пИмяТаблицы = Неопределено), пСсылка[пИмяТаблицы].Получить(НомерСтрокиТаблицы - 1), пСсылка); // Обход списка проверяемых реквизитов Для Каждого ЭлементМетаданныхРеквизитов Из МассивМетаданныхРеквизитов Цикл // Получение значения ячейки и проверка ее заполнения ЗначениеЯчейкиТЧ = СтрокаТаблицы[ЭлементМетаданныхРеквизитов.Имя]; ЯчейкаПустая = НЕ(ЗначениеЗаполнено(ЗначениеЯчейкиТЧ)); // Если значение пустое, добавляем сообщение в массив сообщений Если ЯчейкаПустая Тогда Если пИмяТаблицы = Неопределено Тогда МассивСообщений.Добавить("Реквизит шапки с именем '" + ЭлементМетаданныхРеквизитов.Имя + "' не заполнен !!!"); Иначе МассивСообщений.Добавить("В строке № " + НомерСтрокиТаблицы + " табличной части '" + пИмяТаблицы + "' не заполнен реквизит с именем '" + ЭлементМетаданныхРеквизитов.Имя + "' !!!"); КонецЕсли; ЗначениеВозврата = Ложь; КонецЕсли; КонецЦикла; КонецЦикла; Иначе МассивСообщений.Добавить("Табличная часть с именем '" + пИмяТаблицы + "' не найдена !!!"); ЗначениеВозврата = Ложь; КонецЕсли; // Здесь выводим все сообщения Если пВыводитьСообщения Тогда Для Каждого ТекстСообщения Из МассивСообщений Цикл Сообщить(ТекстСообщения, СтатусСообщения.Важное); КонецЦикла; КонецЕсли; Возврат ЗначениеВозврата; КонецФункции |