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

21.03.11

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

        КонецЦикла;

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

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

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

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

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

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

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

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

                КонецЕсли;

            КонецЦикла;

        КонецЦикла;

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

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

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

    КонецЕсли;

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

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

См. также

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

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

21.05.2024    25037    dimanich70    82    

149

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

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

1 стартмани

18.03.2024    4493    3    John_d    11    

57

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

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

12.02.2024    25304    atdonya    25    

58

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

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

30.11.2023    6053    ke.92@mail.ru    17    

65

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

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

28.08.2023    16511    YA_418728146    8    

170

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

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

2 стартмани

22.08.2023    4247    73    progmaster    10    

4

Инструментарий разработчика Универсальные функции Платформа 1С v8.3 1C:Бухгалтерия 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    19122    180    sapervodichka    112    

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

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


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

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

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

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

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