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

21.03.11

Разработка - Универсальные функции

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

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

Основные преимущества по сравнению со стандартными процедурами:

  • проверка не только заполнения реквизитов, но и их существования в структуре метаданных;
  • одна функция для шапки и табличных частей;
  • возможность включать или отключать вывод сообщений о незаполненных реквизитах;
  • возврат булевских значений Истина или Ложь в результате работы функции, вместо модификации переменной Отказ, что позволяет более гибко использовать функцию.

-================-

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

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

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

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

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

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

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

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

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

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

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

        КонецЦикла;

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

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

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

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

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

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

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

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

                КонецЕсли;

            КонецЦикла;

        КонецЦикла;

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

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

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

    КонецЕсли;

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

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

См. также

Вставляем картинку из буфера обмена (платформа 1С 8.3.24)

Универсальные функции Платформа 1С v8.3 Конфигурации 1cv8 Абонемент ($m)

Задача: вставить картинку из буфера обмена на форму средствами платформы 1С.

1 стартмани

18.03.2024    2891    2    John_d    11    

56

GUID в 1С 8.3 - как с ними быть

Универсальные функции Платформа 1С v8.3 Конфигурации 1cv8 Бесплатно (free)

Пришлось помучиться с GUID-ами немного, решил поделиться опытом, мало ли кому пригодится.

12.02.2024    5049    atdonya    22    

51

Переоткрытие внешних обработок

Универсальные функции Платформа 1С v8.3 Бесплатно (free)

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

30.11.2023    4102    ke.92@mail.ru    16    

62

Валидация JSON через XDTO (включая массивы)

WEB-интеграция Универсальные функции Механизмы платформы 1С Платформа 1С v8.3 Конфигурации 1cv8 Бесплатно (free)

При работе с интеграциями рано или поздно придется столкнуться с получением JSON файлов. И, конечно же, жизнь заставит проверять файлы перед тем, как записывать данные в БД.

28.08.2023    9381    YA_418728146    6    

143

Печать непроведенных документов для УТ, КА, ERP. Настройка печати по пользователям, документам и печатным формам

Пакетная печать Печатные формы Адаптация типовых решений Универсальные функции Платформа 1С v8.3 1С:ERP Управление предприятием 2 1С:Управление торговлей 11 1С:Комплексная автоматизация 2.х Россия Абонемент ($m)

Расширение для программ 1С:Управление торговлей, 1С:Комплексная автоматизация, 1С:ERP, которое позволяет распечатывать печатные формы для непроведенных документов. Можно настроить, каким пользователям, какие конкретные формы документов разрешено печатать без проведения документа.

2 стартмани

22.08.2023    2233    25    progmaster    8    

3

Расширение: Быстрые отборы через буфер [Alt+C] Копировать список, [Alt+V] Вставить список, [Ctrl+C] Копировать из файлов

Инструментарий разработчика Универсальные функции Платформа 1С v8.3 Конфигурации 1cv8 1С:Розница 2 1С:ERP Управление предприятием 2 1С:Бухгалтерия 3.0 1С:Управление торговлей 11 1С:Комплексная автоматизация 2.х 1С:Зарплата и Управление Персоналом 3.x Абонемент ($m)

Копирует в буфер значения из списков, из ячеек отчетов, таблиц, настроек списков, других отборов и вставляет в выбранную настройку отбора. Работает с Объект не найден. Работает как в одной так и между разными базами 1С. Использует комбинации [Alt+C] Копировать список, [Alt+V] Вставить список. Также для копирования данных используется стандартная [Ctrl+C] (например из открытого xls, mxl, doc и т.п. файла скопировать список наименований)

1 стартмани

13.10.2022    16355    142    sapervodichka    112    

130

Система контроля ведения учета [БСП]

Универсальные функции Механизмы типовых конфигураций БСП (Библиотека стандартных подсистем) Платформа 1С v8.3 Конфигурации 1cv8 Бесплатно (free)

В данном материале рассмотрим типовой алгоритм подсистемы контроля учета БСП в конфигурациях на примерах.

18.07.2022    7355    quazare    8    

110
Комментарии
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
1. пользователь 14.03.11 16:53
Сообщение было скрыто модератором.
...
2. YVolohov 721 14.03.11 17:03 Сейчас в теме
(1) Не видел. Но это разные вещи. В одном случае единичная функция, в другом целая подсистема с возможностью тонкой настройки и кучей фич. Думаю и тот и другой продукт может быть полезен.
+
15. shoy 19 22.08.14 12:06 Сейчас в теме
(1) Публикация не найдена!

В целом неплохой код и можно использовать. Можно через подписку на события проверять доки, например.
Конечно, код чуть править придётся.
+
3. Ish_2 1104 17.03.11 17:54 Сейчас в теме
Если (ТипЗначенияЯчейкиТЧ = Тип("Число")) и (ЗначениеЯчейкиТЧ = 0) Тогда
ЯчейкаПустая = Истина;
ИначеЕсли (ТипЗначенияЯчейкиТЧ = Тип("Строка")) и (ПустаяСтрока(ЗначениеЯчейкиТЧ)) Тогда
ЯчейкаПустая = Истина;
ИначеЕсли (ТипЗначенияЯчейкиТЧ = Тип("Дата")) и (ЗначениеЯчейкиТЧ = '00010101000000') Тогда
ЯчейкаПустая = Истина;
ИначеЕсли (ТипЗначенияЯчейкиТЧ = Тип("Булево")) Тогда
ЯчейкаПустая = Ложь;
ИначеЕсли (ТипЗначенияЯчейкиТЧ = Тип("Неопределено")) Тогда
ЯчейкаПустая = Истина;


Не понял. Для чего тогда встроенная функция "ЗначениеЗаполнено(ЗначениеЯчейкиТЧ)" ?
Для "хранилища",наверное, проверку можно оставить.
И почему
ИначеЕсли (ТипЗначенияЯчейкиТЧ = Тип("Булево")) Тогда
ЯчейкаПустая = Ложь;

Логичнее результат функции "ЗначениеЗаполнено()" для булевого параметра : если параметр = "ложь" ,то ячейка считается незаполненной .

Через "Попытку" определять заполненность ссылочного значения - это совсем плохо.
YVolohov; +1
4. YVolohov 721 18.03.11 10:08 Сейчас в теме
(3) Не знал про эту функцию. Спасибо за подсказку. В ближайшее время допилю.

А вот булевское значение я тоже думал сначала проверять на "параметр = ложь". Но потом решил этого не делать. Если некий реквизит должен постоянно иметь значение "Истина", то он просто не имеет смысла.
+
5. Ish_2 1104 18.03.11 10:11 Сейчас в теме
(4) Функция ЗначениеЗаполнено() может вызывать ошибку для каких-то типов данных. Сейчас не вспомню.
+
6. YVolohov 721 18.03.11 10:19 Сейчас в теме
(5) Попробую погуглить. А хранилище значения наверное лучше вообще не проверять. Думаю это может повлиять на производительность (если программа извлекает значение из хранилища, чтобы проверить его заполненность).
+
7. Spartan 365 18.03.11 10:23 Сейчас в теме
(5),(6) Для мутабельных...
Lacoste4life; YVolohov; Ish_2; +3
8. YVolohov 721 18.03.11 10:57 Сейчас в теме
Значения примитивных типов и ссылки все не мутабельны. В теории функция должна работать даже с хранилищем значения.
+
9. YVolohov 721 21.03.11 19:34 Сейчас в теме
Обновил публикацию. Теперь для проверки заполнения значения использую встроенную функцию ЗначениеЗаполнено(). Тестирование показало, что эта функция игнорирует значения с типами "Булево" и "ХранилищеЗначения" всегда возвращая в результате их проверки "Истина", что в общем достаточно логично.
+
12. Ish_2 1104 22.03.11 08:14 Сейчас в теме
(9) Ага,в (3) ошибка. В функции "ЗначениеЗаполнено()" для параметра булевого типа выдается только "Истина".
+
13. YVolohov 721 22.03.11 13:18 Сейчас в теме
(12) Нет, ошибки там не будет. Переменная "ЯчейкаПустая" будет всегда принимать значение "Ложь", т.е. всегда будет считаться не пустой, независимо от значения. Сейчас (после обновления) я ипользовал для этого оператор НЕ:

ЯчейкаПустая = НЕ(ЗначениеЗаполнено(ЗначениеЯчейкиТЧ));
+
10. Поручик 4674 21.03.11 19:56 Сейчас в теме
>>> Тестирование показало
Поржало. А в СП заглянуть: Для значений типа Булево всегда возвращается Истина.
+
11. YVolohov 721 21.03.11 20:07 Сейчас в теме
(10) Это в моем характере, не особо вникать в документацию и изобретать велосипеды. Иногда вредно а иногда здорово помагает :D
+
14. igea 41 14.08.12 15:12 Сейчас в теме
пСсылка (ссылка) - ссылка на элемент справочника или плана, документ.
Этот параметр лучше передавать не ссылкой, а через ЭтотОбъект, т.к. при передаче ссылкой, если документ уже был заведен -заполненный зрительно реквизит будет передаваться пустым из процедуры ПередЗаписью. У меня была такая проблема. А так автору респект и большой ПЛЮС.
shoy; YVolohov; +2
Оставьте свое сообщение