Усовершенствованная проверка заполнения реквизитов
Так ли удобны стандартные процедуры проверки заполнения шапки и табличных частей в 1С 8.1, 8.2 (в режиме обычного интерфейса)? Можно ли их усовершенствовать? Попробую ответить на этот вопрос.
- Описание
- Подробнее
Описание
Небольшая функция, код которой приведен ниже, является усовершенствованным вариантом проверки заполнения шапки и табличных частей справочников, документов, планов, бизнес-процесов и задач.
Основные преимущества по сравнению со стандартными процедурами:
- проверка не только заполнения реквизитов, но и их существования в структуре метаданных;
- одна функция для шапки и табличных частей;
- возможность включать или отключать вывод сообщений о незаполненных реквизитах;
- возврат булевских значений Истина или Ложь в результате работы функции, вместо модификации переменной Отказ, что позволяет более гибко использовать функцию.
-================-
// Функция проверяет заполнение шапки или табличной части справочника, документа или плана, бизнес-процесса, задачи
// Параметры:
// пИмяТаблицы (строка) — имя табличной части объекта, если не указано то будет проверятся шапка объекта
// пИменаПолей (массив строк) — имена проверяемых реквизитов объекта
// пВыводитьСообщения — если это свойство установлено в «Истина» то будут выводится сообщения в табло о
// незаполненных реквизитах таблицы, если не установлено — то не будут
// пСсылка (ссылка) — ссылка на элемент справочника или плана, документ, по которому будет произведена проверка
// Возвращаемое значение:
// Истина — если все реквизиты найдены и заполнены
// Ложь — если хоть один реквизит не заполнен, табличная часть не найдена
// или хоть один реквизит не найден
Функция ПроверитьЗаполнениеТаблицыОбъекта(пИмяТаблицы = Неопределено,
пИменаПолей, пВыводитьСообщения = Истина, пСсылка) Экспорт
МассивСообщений = Новый Массив;
ЗначениеВозврата = Истина;
МетаданныеОбъекта = пСсылка.Метаданные();
Если НЕ(пИмяТаблицы = Неопределено) Тогда
МетаданныеТаблицы = МетаданныеОбъекта.ТабличныеЧасти.Найти(пИмяТаблицы);
Иначе
МетаданныеТаблицы = МетаданныеОбъекта;
КонецЕсли;
// Проверка существования табличной части
Если НЕ(МетаданныеТаблицы = Неопределено) Тогда
МассивМетаданныхРеквизитов = Новый Массив;
МетаданныеРеквизитов = МетаданныеТаблицы.Реквизиты;
// Проверка существования полей
Для Каждого ИмяПоля Из пИменаПолей Цикл
МетаданныеРеквизита = МетаданныеРеквизитов.Найти(ИмяПоля);
Если НЕ(МетаданныеРеквизита = Неопределено) Тогда
МассивМетаданныхРеквизитов.Добавить(МетаданныеРеквизита);
Иначе
Если пИмяТаблицы = Неопределено Тогда
МассивСообщений.Добавить(«Реквизит шапки с именем ‘» + ИмяПоля + «‘ не найден !!!»);
Иначе
МассивСообщений.Добавить(«Реквизит табличной части ‘» + пИмяТаблицы + «‘ с именем ‘» +
ИмяПоля + «‘ не найден !!!»);
КонецЕсли;
ЗначениеВозврата = Ложь;
КонецЕсли;
КонецЦикла;
// Проверка заполнения полей
КоличествоСтрокТаблицы = ?(НЕ(пИмяТаблицы = Неопределено), пСсылка[пИмяТаблицы].Количество(), 1);
КоличествоСтрокТаблицы = ?(МассивМетаданныхРеквизитов.Количество() > 0, КоличествоСтрокТаблицы, 0);
// Обход строк таблицы
Для НомерСтрокиТаблицы = 1 По КоличествоСтрокТаблицы Цикл
СтрокаТаблицы = ?(НЕ(пИмяТаблицы = Неопределено),
пСсылка[пИмяТаблицы].Получить(НомерСтрокиТаблицы — 1), пСсылка);
// Обход списка проверяемых реквизитов
Для Каждого ЭлементМетаданныхРеквизитов Из МассивМетаданныхРеквизитов Цикл
// Получение значения ячейки и проверка ее заполнения
ЗначениеЯчейкиТЧ = СтрокаТаблицы[ЭлементМетаданныхРеквизитов.Имя];
ЯчейкаПустая = НЕ(ЗначениеЗаполнено(ЗначениеЯчейкиТЧ));
// Если значение пустое, добавляем сообщение в массив сообщений
Если ЯчейкаПустая Тогда
Если пИмяТаблицы = Неопределено Тогда
МассивСообщений.Добавить(«Реквизит шапки с именем ‘» + ЭлементМетаданныхРеквизитов.Имя + «‘ не заполнен !!!»);
Иначе
МассивСообщений.Добавить(«В строке № » + НомерСтрокиТаблицы + » табличной части ‘» +
пИмяТаблицы + «‘ не заполнен реквизит с именем ‘» + ЭлементМетаданныхРеквизитов.Имя + «‘ !!!»);
КонецЕсли;
ЗначениеВозврата = Ложь;
КонецЕсли;
КонецЦикла;
КонецЦикла;
Иначе
МассивСообщений.Добавить(«Табличная часть с именем ‘» + пИмяТаблицы + «‘ не найдена !!!»);
ЗначениеВозврата = Ложь;
КонецЕсли;
// Здесь выводим все сообщения
Если пВыводитьСообщения Тогда
Для Каждого ТекстСообщения Из МассивСообщений Цикл
Сообщить(ТекстСообщения, СтатусСообщения.Важное);
КонецЦикла;
КонецЕсли;
Возврат ЗначениеВозврата;
КонецФункции

