Как проверить что реквизит табличная часть

Содержание:

1.      Когда возникает необходимость проверить наличие реквизита 1С?

2.      Как можно получить метаданные объекта 1С?  

1.    Когда возникает необходимость проверить наличие реквизита 1С

Потребность проверки наличия реквизита обычно возникает при написании общих, универсальных процедур или функций, к примеру, когда необходимо выполнить ряд однообразных действий, проверить заполнение перед проведением, при этом реквизитный состав обрабатываемых объектов метаданных отличается незначительно (например, в документе, отражающем продажу товара, есть реквизит Склад, а в документе, отражающем перемещение товара – реквизиты Склад-отправитель и Склад-получатель).

В ряде типовых конфигураций 1С предлагается стандартная функция проверки наличия реквизита в объекте (расположена в модуле “ОбщегоНазначения”)

Функция ЕстьРеквизитОбъекта(ИмяРеквизита, МетаданныеОбъекта) Экспорт

            Возврат НЕ (МетаданныеОбъекта.Реквизиты.Найти(ИмяРеквизита) = Неопределено);

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

2. Как можно получить метаданные объекта 1С

Однако написать свою функцию также не представляет труда. В первую очередь необходимо получить метаданные объекта 1С одним из способов:

через функцию Метаданные() объекта

пример синтаксиса: СправочникСсылка.Метаданные()

                                    ДокументСсылка.Метаданные()

через свойство глобального контекста Метаданные

пример синтаксиса: Метаданные.Справочники.[ИмяСправочника]

                                    Метаданные.Документы.[ИмяДокумента]

Далее через свойство “Реквизиты” использовать функцию Найти(). В случае, если реквизит не найден, возвращается значение Неопределено.

Пример 1

Метаданные = Контрагент.Метаданные();

Если Метаданные.Реквизиты.Найти(«Ответственный») = Неопределено Тогда

            Возврат Ложь;

Иначе

            Возврат Истина;

КонецЕсли;

Пример 2

Функция ПолучитьОрганизацию(Контрагент, Пользователь)

            Если Метаданные.Справочники.Контрагенты.Реквизиты.Найти(«Организация») <> Неопределено Тогда

                        Возврат Контрагент.Организация;

            Иначе

                        Возврат Пользователь.Организация;

            КонецЕсли;

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

Описанный алгоритм подходит для случаев проверки наличия реквизита шапки. Но что делать, когда возникает необходимость определить, существует ли реквизит в табличной части 1С (справочника или документа)? Для этого используется следующая конструкция:

Метаданные.Справочники.<ИмяСправочника>.ТабличныеЧасти.Реквизиты.Найти(<ИмяОбъектаПоиска>).

При обработке таблиц значений также возможно выполнить проверку существования колонки – в этом случае применяется метод Свойство(), с помощью которого, помимо основной функции – получения значения элемента по указанному имени, можно проверить, имеется ли указанного свойство.

Пример синтаксиса:

Если НЕ ТекущаяСтрока.Свойство(«Исключить») ИЛИ НЕ ТекущаяСтрока.Исключить Тогда

            ЗаполнитьЗначенияСвойств(ТаблицаЗагрузки.Добавить(); ТекущаяСтрока);

КонецЕсли;

Специалист компании ООО «Кодерлайн»

Кондренко Анна Сергеевна

Как проверить есть ли табличная часть?

Я
   CalvinKlein

20.05.11 — 10:38

Как можно проверить, есть ли табличная часть в документе?

Делаю так,не работает:

Если (Результат.Регистратор.Услуги = Неопределено ) тогда

пишет поле объекта не обнаружено

  

Партнерская программа EFSOL Oblako

   Мыш

1 — 20.05.11 — 10:40

(0) Через метаданные проверять надо.

   Ненавижу 1С

2 — 20.05.11 — 10:41

Регистратор.Метаданные().ТабличныеЧасти.Найти(«Услуги»)=Неопределено

   aleks-id

3 — 20.05.11 — 10:41

Функция ЕстьРеквизитОбъекта(ИмяРеквизита, Объект) Экспорт

           
           МетаданныеОбъекта = Объект.Метаданные();

   Если МетаданныеОбъекта.Реквизиты.Найти(ИмяРеквизита) = Неопределено Тогда

       Возврат Ложь;

   Иначе

       Возврат Истина;

   КонецЕсли;

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

   CalvinKlein

4 — 20.05.11 — 10:41

(1) Можешь пример показать?

   Mitriy

5 — 20.05.11 — 10:41

(1) можно и без метаданных…

   Mitriy

6 — 20.05.11 — 10:42

(5)+ и без попытки…

   Мыш

7 — 20.05.11 — 10:43

(5) Можно, наверное. Но правила хорошего тона рекомендуют именно так. :)

   Ненавижу 1С

8 — 20.05.11 — 10:44

(5) поделишься?

   pavig

9 — 20.05.11 — 10:47

(8) +1

   Mitriy

10 — 20.05.11 — 10:49

УИ = Новый УникальныйИдентификатор();

СтруктураПроверки = Новый Структура(«Услуги», УИ);

ЗаполнитьЗначенияСвойств(Результат.Регистратор);

Если СтруктураПроверки.Услуги = УИ Тогда

Сообщить(«Нет такой табчасти/реквизита»);

КонецЕсли;

в какой-то типовой давно уже подсмотрел, если честно ))

   Mitriy

11 — 20.05.11 — 10:50

(10)+ для проверки реквизитов форм хорошо продходит…

   Mitriy

12 — 20.05.11 — 10:50

(11) или экспортных переменных…

   pavig

13 — 20.05.11 — 10:53

ЗаполнитьЗначенияСвойств(Результат.Регистратор);

что это?

   Рэйв

14 — 20.05.11 — 10:54

   pavig

15 — 20.05.11 — 10:55

я про то что там как минимум два обязательных параметра

Глобальный контекст

ЗаполнитьЗначенияСвойств (FillPropertyValues)

Синтаксис:

ЗаполнитьЗначенияСвойств(<Приемник>, <Источник>, <Список свойств>, <Исключая свойства>)

Параметры:

<Приемник> (обязательный)

Тип: Произвольный. Значение, чьи свойства будут заполнены значениями соответствующих свойств <Источника>.

<Источник> (обязательный)

Тип: Произвольный. Значения свойств данного объекта будут установлены в соответствующие свойства <Приемника>.

   Ненавижу 1С

16 — 20.05.11 — 10:55

(10)

Недостаточно фактических параметров (ЗаполнитьЗначенияСвойств)

<<?>>ЗаполнитьЗначенияСвойств(Регистратор);

мне кажется через метаданные будет попроще как-то

   Рэйв

17 — 20.05.11 — 10:56

(16)Да он просто СтруктураПроверки  вставить в параметры забыл:)

   pavig

18 — 20.05.11 — 10:57

(17) позже сам уже догадался :-)

просто как бы пример с ошибкой

   Ненавижу 1С

19 — 20.05.11 — 10:57

(17) все равно сложноватенько

   pavig

20 — 20.05.11 — 10:57

хотя, тоже вариант вполне уместный

насколько конкурентен с Метаданными?

   Ненавижу 1С

21 — 20.05.11 — 10:59

в 8.2 не прокатит, нужен другой тип данных

тип УникальныйИдентификатор может быть у реквизита

   Mitriy

22 — 20.05.11 — 11:00

(17) ну да ))

   Mitriy

23 — 20.05.11 — 11:00

(21) такой же? О_О

   Ненавижу 1С

24 — 20.05.11 — 11:02

(23) ну теоретически может быть

специально пустой хранят

   Mitriy

25 — 20.05.11 — 11:08

(24) УИ = Новый УникальныйИдентификатор() пустым не будет никогда…

   Mitriy

26 — 20.05.11 — 11:08

(15)+ ты же сравниваешь не типы, а значения…

   Ненавижу 1С

27 — 20.05.11 — 11:10

(25) туплю же

  

CalvinKlein

28 — 20.05.11 — 12:26

Спасибо!

 0 

   

Распечатать

Как определить какие реквизиты имеются в табличной части документа

Код 1C v 8.х

 ПоступлениеТовара = Метаданные.Документы.ПоступлениеТовара;
Реквизиты = ПоступлениеТовара.ТабличныеЧасти.Товары.Реквизиты;
Для каждого наим из Реквизиты Цикл
Сообщить("Имя реквизита " + наим.Имя +
"; тип реквизита " + наим.Тип);
КонецЦикла;
// Результат:
// Имя реквизита Наименование; тип реквизита Справочник ссылка: Номенклатура
// Имя реквизита Количество; тип реквизита Число
// Имя реквизита Цена; тип реквизита Число
// Имя реквизита Сумма; тип реквизита Число
Код 1C v 8.х

 ПоступлениеТовара = Метаданные.Документы.ПоступлениеТовара;
      
Реквизиты = ПоступлениеТовара.ТабличныеЧасти.Товары.Реквизиты;
Для каждого наим из Реквизиты Цикл
Сообщить("Имя реквизита " + наим.Имя +
"; тип реквизита " + наим.Тип);
КонецЦикла;
// Результат:
// Имя реквизита Наименование; тип реквизита Справочник ссылка: Номенклатура
// Имя реквизита Количество; тип реквизита Число
// Имя реквизита Цена; тип реквизита Число
// Имя реквизита Сумма; тип реквизита Число

Информация взята с сайта http://helpf.pro

Подпишитесь на нашу рассылку новостей

Хотите узнать больше по этому вопросу?

Подпишитесь на нашу рассылку новостей

Подписаться

Чтобы задать вопрос или предложить тему статьи, нажмите на кнопку ниже:

Предложить статью

В этой статье я рассмотрю основные механизмы платформы 1С 8.3, которые обеспечивают проверку заполнения реквизитов.

Проверка заполнения реквизита объекта 1С

У любого реквизита объекта 1С можно настроить проверку заполнения, когда нельзя сохранить новый элемент объекта, не заполнив этот реквизит. Выйдет ошибка.

Для того, чтобы у реквизита объекта осуществлялась проверка заполнения, достаточно в свойстве реквизита «Проверка заполнения» указать значение «Выдавать ошибку».

Проверка заполнения реквизита объекта 1С

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

Проверка заполнения реквизита объекта 1С

Данная проверка будет осуществляться независимо от того, сгенерирована эта форма платформой 1С 8.3 автоматически, или используется форма созданная разработчиком.

Проверка заполнения табличной части в 1С

Помимо реквизитов у объектов можно проверять заполнение табличной части.  Для этого у табличных частей объектов имеется свойство «Проверка заполнения», в которое также необходимо установить значение «Выдавать ошибку».

Проверка заполнения табличной части в 1С

Если в этом случае мы попытаемся записать элемент, в котором будет табличная часть без строк, то выйдет ошибка, и записать элемент не получится.

Проверка заполнения табличной части в 1С

В тоже время, мы спокойно сможем записать элемент, у которого имеется строка табличной части с пустыми полями.

Проверка заполнения табличной части в 1С

Если мы хотим проверять реквизиты табличной части, то у них нужно заполнить аналогичное свойство.

Проверка заполнения программно в 1С

Иногда возникает необходимость проверить программно заполнение объекта в 1С. Для этих целей предназначен метод ПроверитьЗаполнение(), который имеется у большинства объектов 1С (справочники, документы и т.д.).

Например, во время программного создания элемента справочника, мы можем проверить заполнение реквизитов этого справочника, перед его записью.

НовОбъект = Справочники.Номенклатура.СоздатьЭлемент();
НовОбъект.Наименование = "Товар";
Если НовОбъект.ПроверитьЗаполнение() Тогда
    НовОбъект.Записать();
КонецЕсли;

В этом случае, элемент справочника не будет записан, если у него имеются реквизиты, у которых в свойстве ПроверкаЗаполнения установлено значение «Выдавать ошибку».

Иногда, нужно проверить заполнение реквизита, у которого в свойстве «Проверка заполнения» установлено значение «Не проверять».  Например, у реквизита Артикул справочника Номенклатура.

Проверка заполнения программно в 1С

Если нам нужно осуществлять проверку этого реквизита (например, по какой-то определенной логике), то необходимо в модуле объекта создать метод  ОбработкаПроверкиЗаполнения.

ОбработкаПроверкиЗаполнения в 1С

ОбработкаПроверкиЗаполнения в 1С

У этого метода, который является процедурой, имеется параметр ПроверяемыеРеквизиты. Этот параметр массив, в котором содержится список имен реквизитов, которые нужно проверять. Если в этот список мы добавим название реквизита, то при сохранении элемента будет осуществляться проверка на то, заполнен этот реквизит или нет.

Процедура ОбработкаПроверкиЗаполнения(Отказ, ПроверяемыеРеквизиты)
    ПроверяемыеРеквизиты.Добавить("Артикул");
КонецПроцедуры
Проверка заполнения программно в 1С

Также, мы можем удалить реквизит из проверяемых, если по какой-то причине нет необходимости в проверке заполнения этого реквизита.

Например, удалим из проверяемых реквизит ПолноеНаименование.

Процедура ОбработкаПроверкиЗаполнения(Отказ, ПроверяемыеРеквизиты)
    Индекс = ПроверяемыеРеквизиты.Найти("ПолноеНаименование");

    Если Индекс <> 0 Тогда
        ПроверяемыеРеквизиты.Удалить(Индекс);
    КонецЕсли;

КонецПроцедуры

Тогда мы сможем спокойно записать элемент с незаполненным реквизитом ПолноеНаименование.

Проверка заполнения программно в 1С

Если мы хотим проверить программно, что заполнен реквизит табличной части объекта, то необходимо добавить этот реквизит в массив ПроверяемыеРеквизиты по такому формату: [НазваниеТабличнойЧасти].[НазваниеРеквизита] .

Например:

Процедура ОбработкаПроверкиЗаполнения(Отказ, ПроверяемыеРеквизиты)

    ПроверяемыеРеквизиты.Добавить("СписокСвойств.НазваниеСвойства");

КонецПроцедуры

В этом случае, будет осуществляться проверка заполнения реквизита табличной части.

Проверка заполнения программно в 1С

Проверка заполнения формы 1С

Иногда нужно проверить заполнение реквизитов формы.  Разберем небольшую задачу: будем на форме умножать два числа друг на друга, если они заполнены. Создадим на форме реквизиты  с типом Число — Множитель1, Множитель2 и Сумма. У реквизитов Множитель1 и Множитель2 установим в свойство «Проверка заполнения» значение «Выдавать ошибку».

Проверка заполнения реквизита объекта 1С

При выполнении команды Посчитать, произведем расчет только в том случае, если реквизиты заполнены.  Проверку заполнения будем выполнять при помощи метода ПроверитьЗаполнение.

&НаКлиенте
Процедура Посчитать(Команда)

    Если ПроверитьЗаполнение() Тогда

        Сумма = Множетель1 * Множетель2;

    КонецЕсли;

КонецПроцедуры

Теперь мы не сможем посчитать сумму, если один из множителей не заполнен.

Проверка заполнения реквизита объекта 1С

Более подробно и основательно начальные вопросы программирования в 1С есть вы можете изучить в
Книга «Программировать в 1С за 11 шагов»

Изучайте программирование в 1С в месте с моей книгой «Программировать в 1С за 11 шагов»

Программировать в 1С за 11 шагов

Книга написана понятным и простым языком — для новичка.

  1. Книга посылается на электронную почту в формате PDF. Можно открыть на любом устройстве!
  2. Научитесь понимать архитектуру 1С;
  3. Станете писать код на языке 1С;
  4. Освоите основные приемы программирования;
  5. Закрепите полученные знания при помощи задачника.

О том как разрабатывать под управляемым приложением 1С, читайте в книге Книга «Основы разработки в 1С: Такси»

Отличное пособие по разработке в управляемом приложении 1С, как для начинающих разработчиков, так и для опытных программистов.

Основы разработки в 1С такси
  1. Очень доступный и понятный язык изложения
  2. Книга посылается на электронную почту в формате PDF. Можно открыть на любом устройстве!
  3. Поймете идеологию управляемого приложения 1С
  4. Узнаете, как разрабатывать управляемое приложение;
  5. Научитесь разрабатывать управляемые формы 1С;
  6. Сможете работать с основными и нужными элементами управляемых форм
  7. Программирование под управляемым приложением станет понятным

Промо-код на скидку в 15% — 48PVXHeYu

Эти книги, плюс книга по программированию оперативного учета имеются в едином комплекте: комплект книг по разработке в 1С.
Только для читателей моего блога,
промо-код на скидку в 300 рублей на весь комплект: blog


Если Вам понравился этот урок, был полезен или помог решить какую-нибудь проблему, то Вы можете поддержать мой проект, перечислив любую сумму
.

можно оплатить вручную:

Яндекс.Деньги — 410012882996301
Web Money — R955262494655

Вступайте в мои группы:

Вконтакте: https://vk.com/1c_prosto
Фейсбуке: https://www.facebook.com/groups/922972144448119/
ОК: http://ok.ru/group/52970839015518
Твиттер: https://twitter.com/signum2009

Как можно проверить, есть ли табличная часть в документе? Делаю так,не работает: пишет поле объекта не обнаружено

Через метаданные проверять надо.

Регистратор.Метаданные.ТабличныеЧасти.Найти(«Услуги»)=Неопределено

можно и без метаданных…

Можно, наверное. Но правила хорошего тона рекомендуют именно так. :)

в какой-то типовой давно уже подсмотрел, если честно ))

+ для проверки реквизитов форм хорошо продходит…

или экспортных переменных…

я про то что там как минимум два обязательных параметра Синтаксис: ЗаполнитьЗначенияСвойств(<Приемник>, <Источник>, <Список свойств>, <Исключая свойства>) Параметры: <Приемник> (обязательный) Тип: Произвольный. Значение, чьи свойства будут заполнены значениями соответствующих свойств <Источника>. <Источник> (обязательный) Тип: Произвольный. Значения свойств данного объекта будут установлены в соответствующие свойства <Приемника>.

Недостаточно фактических параметров (ЗаполнитьЗначенияСвойств) <<?>>ЗаполнитьЗначенияСвойств(Регистратор); мне кажется через метаданные будет попроще как-то

Да он просто СтруктураПроверки  вставить в параметры забыл:)

позже сам уже догадался :-) просто как бы пример с ошибкой

хотя, тоже вариант вполне уместный насколько конкурентен с Метаданными?

в 8.2 не прокатит, нужен другой тип данных тип УникальныйИдентификатор может быть у реквизита

ну теоретически может быть специально пустой хранят

УИ = Новый УникальныйИдентификатор пустым не будет никогда…

+ ты же сравниваешь не типы, а значения…

Тэги:

Комментарии доступны только авторизированным пользователям

// Функция «ЕстьРеквизитТабЧастиДокумента»
// Позволяет определить есть ли среди реквизитов табличной части документа
// реквизит с переданным именем.
//
// Параметры:
//  ИмяРеквизита — строковое имя искомого реквизита,
//  МетаданныеДокумента — объект описания метаданных документа, среди реквизитов которого производится поиск.
//  ИмяТабЧасти  — строковое имя табличной части документа, среди реквизитов которого производится поиск
//
// Возвращаемое значение:
//  Истина — нашли реквизит с таким именем, Ложь — не нашли.
//
Функция ЕстьРеквизитТабЧастиДокумента(ИмяРеквизита, МетаданныеДокумента, ИмяТабЧасти) Экспорт
 ТабЧасть = МетаданныеДокумента.ТабличныеЧасти.Найти(ИмяТабЧасти);
 Если ТабЧасть = Неопределено Тогда // Нет такой таб. части в документе
  Возврат Ложь;
 Иначе
  Возврат НЕ (ТабЧасть.Реквизиты.Найти(ИмяРеквизита) = Неопределено);
 КонецЕсли;
КонецФункции // ЕстьРеквизитТабЧастиДокумента()

Понравилась статья? Поделить с друзьями:
  • Как снять зеркальный элемент газель бизнес
  • Как проехать от омска до кургана на машине
  • Как проверить щиток приборов газель бизнес
  • Как снять коробку передач на газели бизнес
  • Как проехать парк победы на поклонной горе