Содержание:
1. Когда возникает необходимость проверить наличие реквизита 1С?
2. Как можно получить метаданные объекта 1С?
1. Когда возникает необходимость проверить наличие реквизита 1С
Потребность проверки наличия реквизита обычно возникает при написании общих, универсальных процедур или функций, к примеру, когда необходимо выполнить ряд однообразных действий, проверить заполнение перед проведением, при этом реквизитный состав обрабатываемых объектов метаданных отличается незначительно (например, в документе, отражающем продажу товара, есть реквизит Склад, а в документе, отражающем перемещение товара – реквизиты Склад-отправитель и Склад-получатель).
В ряде типовых конфигураций 1С предлагается стандартная функция проверки наличия реквизита в объекте (расположена в модуле “ОбщегоНазначения”)
Функция ЕстьРеквизитОбъекта(ИмяРеквизита, МетаданныеОбъекта) Экспорт
Возврат НЕ (МетаданныеОбъекта.Реквизиты.Найти(ИмяРеквизита) = Неопределено);
КонецФункции
2. Как можно получить метаданные объекта 1С
Однако написать свою функцию также не представляет труда. В первую очередь необходимо получить метаданные объекта 1С одним из способов:
через функцию Метаданные() объекта
пример синтаксиса: СправочникСсылка.Метаданные()
ДокументСсылка.Метаданные()
через свойство глобального контекста Метаданные
пример синтаксиса: Метаданные.Справочники.[ИмяСправочника]
Метаданные.Документы.[ИмяДокумента]
Далее через свойство “Реквизиты” использовать функцию Найти(). В случае, если реквизит не найден, возвращается значение Неопределено.
Пример 1
Метаданные = Контрагент.Метаданные();
Если Метаданные.Реквизиты.Найти(«Ответственный») = Неопределено Тогда
Возврат Ложь;
Иначе
Возврат Истина;
КонецЕсли;
Пример 2
Функция ПолучитьОрганизацию(Контрагент, Пользователь)
Если Метаданные.Справочники.Контрагенты.Реквизиты.Найти(«Организация») <> Неопределено Тогда
Возврат Контрагент.Организация;
Иначе
Возврат Пользователь.Организация;
КонецЕсли;
КонецФункции
Описанный алгоритм подходит для случаев проверки наличия реквизита шапки. Но что делать, когда возникает необходимость определить, существует ли реквизит в табличной части 1С (справочника или документа)? Для этого используется следующая конструкция:
Метаданные.Справочники.<ИмяСправочника>.ТабличныеЧасти.Реквизиты.Найти(<ИмяОбъектаПоиска>).
При обработке таблиц значений также возможно выполнить проверку существования колонки – в этом случае применяется метод Свойство(), с помощью которого, помимо основной функции – получения значения элемента по указанному имени, можно проверить, имеется ли указанного свойство.
Пример синтаксиса:
Если НЕ ТекущаяСтрока.Свойство(«Исключить») ИЛИ НЕ ТекущаяСтрока.Исключить Тогда
ЗаполнитьЗначенияСвойств(ТаблицаЗагрузки.Добавить(); ТекущаяСтрока);
КонецЕсли;
Специалист компании ООО «Кодерлайн»
Кондренко Анна Сергеевна
0
1С 8.3 : Функции ЕстьРеквизитДокумента и ЕстьРеквизитОбъекта
При разработке частенько нужно проверить наличие реквизита в документе или справочнике.
Ниже приведены функции позволяющие проверить наличие заданных реквизитов в объектах конфигурации:
Код 1C v 8.х
// Позволяет определить есть ли среди реквизитов шапки Объекта реквизит с переданным именем.
Функция ЕстьРеквизитОбъекта(ИмяРеквизита, Объект) Экспорт
МетаданныеОбъекта = Объект.Метаданные();
Если МетаданныеОбъекта.Реквизиты.Найти(ИмяРеквизита) = Неопределено Тогда
Возврат Ложь;
Иначе
Возврат Истина;
КонецЕсли;
КонецФункции
Для документа:
Код 1C v 8.х
// Позволяет определить есть ли среди реквизитов шапки документа
// реквизит с переданным именем.
//
// Параметры:
// ИмяРеквизита - строковое имя искомого реквизита,
// МетаданныеДокумента - объект описания метаданных документа, среди реквизитов которого производится поиск.
//
// Возвращаемое значение:
// Истина - нашли реквизит с таким именем, Ложь - не нашли.
//
Функция ЕстьРеквизитДокумента(ИмяРеквизита, МетаданныеДокумента) Экспорт
Если МетаданныеДокумента.Реквизиты.Найти(ИмяРеквизита) = Неопределено Тогда
Возврат Ложь;
Иначе
Возврат Истина;
КонецЕсли;
КонецФункции
P.S. Посмотрите еще Полезные функции по работе с метаданными
Проверка существования реквизита |
Я |
03.09.14 — 10:02
Народ, подскажите как проверить существование реквизита у документа. Не его заполнение, а именно существование
1 — 03.09.14 — 10:05
Если Документ.Метаданные().Реквизиты.Найти(ИмяРеквизита) = Неопределено Тогда
Сообщить(«Нету»);
КонецЕсли;
2 — 03.09.14 — 10:09
(1) ага, а если метаданных нету
(0) через Попытка — наверняка
3 — 03.09.14 — 10:12
(2) т.е. как нету ? ))
4 — 03.09.14 — 10:16
(3) ну ты че с будуна внешней обработкой в нету конфу не тыкал?
в пустой тоже запускается
5 — 03.09.14 — 10:18
(4) всё равно есть метаданные у документа, хоть обработкой тыкай, хоть чем.
6 — 03.09.14 — 10:18
(4)В не той конфе пошлет лесом через ошибку и это будет правильно и соразмерно:-)
7 — 03.09.14 — 10:20
(4) ну если с фанатизмом, то версию еще конфы при открытии проверить да? ))
8 — 03.09.14 — 10:21
(5)
Наверное он имеет в виду вариант если в обработке стоит:
Документ=Документы.КакойтоВид.ПустаясСылка();
в случае если нет такого вида:-)
9 — 03.09.14 — 10:23
(2) Попытка — ЗЛО
10 — 03.09.14 — 10:25
(1) у Задачи поищи реквизит «Адресат»….
или у справочника «Код»
в 8.1 было все просто, сейчас развели по разным коллекциям, по этому стало куда более проблемно…
11 — 03.09.14 — 10:28
можно через задницу
Структура = Новый Структура(ИмяРеквизита);
ЗаполнитьЗначенияСвойств(Структура, Документ);
Если Структура[ИмяРеквизита] = Неопределено Тогда
Сообщить(«Нету»);
КонецЕсли;
12 — 03.09.14 — 10:30
(10) >>у справочника «Код»
а зачем его искать?
13 — 03.09.14 — 10:32
(9) если проверять наличие каждого объекта метаданных в процессе обращения — супер мега универсальная обработка получится. года через два тестирования
14 — 03.09.14 — 10:33
(12) а его может и не быть…. да у справочника может не быть кода
проверь на длине кода = 0
15 — 03.09.14 — 10:34
(14) ну и проверяй длину кода отдельно
да несколько не однообразно, ну что делать
16 — 03.09.14 — 10:34
(12) или например общие реквизиты у документов, угадай где они
17 — 03.09.14 — 10:34
(13) ты просто не знаешь какое зло эта «попытка»
18 — 03.09.14 — 10:34
(12) его может не быть
19 — 03.09.14 — 10:36
(15) ты не понял, его физически в таблице нет, колонки нет! и запрос вылетет с ошибкой
20 — 03.09.14 — 10:52
(17) И какое ж зло это — попытка? Не поясните?
21 — 03.09.14 — 10:57
Я кстати тоже подумал над попыткой. -почему мегазло???
22 — 03.09.14 — 10:59
23 — 03.09.14 — 11:01
вот еще про попытки исключение и остановка по ошибке в отладчике
http://forum.infostart.ru/forum26/topic56814/
24 — 03.09.14 — 11:17
(20)(21) вы теряете ошибку, все проходит «хорошо», но результат может быть плачевен
25 — 03.09.14 — 11:20
(22) (24) ну это смотря где пытаться проверять
в приначалеработысистемы или в приоткрытии, если внешняя обработка — ничего не будет
26 — 03.09.14 — 11:25
+ флажок один раз зарядил — и работай себе не хочу
а про метаданные в 150-ти местах вставлять — это каждый тормоз может
27 — 03.09.14 — 11:28
(24) Например?
28 — 03.09.14 — 11:46
(10) Речь про документ вообще-то, а не про задачу и не про справочник
29 — 03.09.14 — 11:48
(8) Вообще-то в таких случаях сначала делается проверка на существование вида документа, а уже потом его реквизитов.
30 — 03.09.14 — 11:50
+(10) адресата у задачи и код у справочника надо искать через СтандартныеРеквизиты
31 — 03.09.14 — 11:54
(30) У стандартных реквизитов НЕТ метода «НАЙТИ» — только перебором, либо через «заполнитьЗначенияСвойств», либо через попытку
32 — 03.09.14 — 11:57
(0) Вот тебе универсальная процедура. Кинь в общий модуль и пользуйся:
Функция ЕстьРеквизитДокумента(ИмяРеквизита, МетаданныеДокумента) Экспорт
Если МетаданныеДокумента.Реквизиты.Найти(ИмяРеквизита) = Неопределено Тогда
//<—Maximus
Для Каждого Реквизит Из МетаданныеДокумента.СтандартныеРеквизиты цикл
Если Врег(Реквизит.Имя) = Врег(ИмяРеквизита) Тогда
Возврат Истина;
КонецЕсли;
КонецЦикла;
//Maximus—>
Возврат Ложь;
Иначе
Возврат Истина;
КонецЕсли;
КонецФункции // ЕстьРеквизитДокумента()
33 — 03.09.14 — 11:57
(24) Конструкцией, позволяющей отработать ошибку, вы умудряетесь её потерять?? Вспоминается анекдот: а где шары металлические? — один сломал, второй про..терял.
34 — 03.09.14 — 11:59
Конечно, это сугубое ИМХО. Я считаю при хорошей архитектуре решения не должна вставать необходимость выяснения наличия реквизитов.
35 — 03.09.14 — 12:03
(34) имело место быть на больших кусках, вложенных в Попытка
36 — 03.09.14 — 12:03
(22) (23) — осилил, но так и не понял, зачем к серьёзному вопросу ссылки на ламерские топики?
Адский плющ
37 — 03.09.14 — 12:10
(24) +1
Попытка хороша, когда в блоке «Исключение» вызывается исключение.
Ну кроме пользовательского уровня, когда в исключении просто выводится более вежливое сообщение.
Вопрос Как определить программно, существует ли у документа требуемый реквизит
С давних времен в типовых конфигурациях для этого существовала специальная функция.
В конфигурациях последних редакций эта функция стала более универсальной и кроме того стала неожиданно оригинальной, даже эстетически восхитительной.
Так, на сегодня, в 2019 г., эта функция называется ЕстьРеквизитИлиСвойствоОбъекта и располагается в общем модуле ОбщегоНазначенияКлиентСервер. Обращение к функции:
ОбщегоНазначенияКлиентСервер.ЕстьРеквизитИлиСвойствоОбъекта(Форма, "ПериодРегистрацииИсправленногоДокумента")
Сама функция проверки выглядит сейчас (2019 год) так:
// Проверяет наличие реквизита или свойства у произвольного объекта без обращения к метаданным. // // Параметры: // Объект - Произвольный - объект, у которого нужно проверить наличие реквизита или свойства; // ИмяРеквизита - Строка - имя реквизита или свойства. // // Возвращаемое значение: // Булево - Истина, если есть. // Функция ЕстьРеквизитИлиСвойствоОбъекта(Объект, ИмяРеквизита) Экспорт КлючУникальности = Новый УникальныйИдентификатор; СтруктураРеквизита = Новый Структура(ИмяРеквизита, КлючУникальности); ЗаполнитьЗначенияСвойств(СтруктураРеквизита, Объект); Возврат СтруктураРеквизита[ИмяРеквизита] <> КлючУникальности; КонецФункции
В типовых конфигурациях 1С по состоянию на 2010 г. для этой цели использовалась функция, например, «ЕстьРеквизитДокумента» общего модуля «ОбщегоНазначения» и была построена на получении метаданных. Обращение к функции:
Если ОбщегоНазначения.ЕстьРеквизитДокумента("БанковскийСчет", МетаданныеДокумента) Тогда ...
где «БанковскийСчет» — пример наименования искомого реквизита,
«МетаданныеДокумента«:
МетаданныеДокумента = ДокументОбъект.Метаданные();
Сама функция проверки (расположенная в общем модуле «ОбщегоНазначения«):
// Позволяет определить есть ли среди реквизитов шапки документа // реквизит с переданным именем. // // Параметры: // ИмяРеквизита - строковое имя искомого реквизита, // МетаданныеДокумента - объект описания метаданных документа, среди реквизитов которого производится поиск. // // Возвращаемое значение: // Истина - нашли реквизит с таким именем, Ложь - не нашли. // Функция ЕстьРеквизитДокумента(ИмяРеквизита, МетаданныеДокумента) Экспорт Если МетаданныеДокумента.Реквизиты.Найти(ИмяРеквизита) = Неопределено Тогда Возврат Ложь; Иначе Возврат Истина; КонецЕсли; КонецФункции // ЕстьРеквизитДокумента()
Next Post
-
v8
-
Программисту 1C
Ср Ноя 10 , 2010
Примеры работы с регистами сведений см. также в Шпаргалке по программированию для системы 1С:Предприятие 8.2 Оглавление 1. Как из регистра сведений «РасчетчикиЗарплатыОрганизации» получить в виде массива всех расчетчиков зарплаты определенного подразделения организации 2. Как добавить запись в непериодический независимый регистр сведений 3. Как считать содержимое непериодического независимого регистра сведений «СобственныеКонтрагенты» […]
Breaking News
Перейти в раздел примеры кода 1С 8.3:
При наличии в конфигурации БСП, желательно использовать метод ЕстьРеквизитИлиСвойствоОбъекта (ссылка выше). Но что делать если конфигурация нетиповая? Вариантов (в зависимости от поставленной задачи) несколько: скопировать метод из БСП, проверить на свойство объекта, проверить через поиск, использовать попытку (не рекомендуется, только как временная заплатка).
Проверка реквизита через свойство объекта в 1С 8.3:
Функция ПроверкаНаСвойствоОбъекта(Объект, ИмяСвойстваОбъекта) Экспорт
ЕстьСвойство = Ложь;
СтруктураОбъекта = Новый Структура(ИмяСвойстваОбъекта, Неопределено);
ЗаполнитьЗначенияСвойств(СтруктураОбъекта, Объект);
Если СтруктураОбъекта[ИмяСвойстваОбъекта] = Неопределено Тогда
СтруктураОбъекта[ИмяСвойстваОбъекта] = Ложь;
ЗаполнитьЗначенияСвойств(СтруктураОбъекта, Объект);
Если СтруктураОбъекта[ИмяСвойстваОбъекта] <> Ложь Тогда
ЕстьСвойство = Истина;
КонецЕсли;
Иначе
ЕстьСвойство = Истина;
КонецЕсли;
Возврат ЕстьСвойство;// Булево
КонецФункции
Проверка реквизита через Найти в 1С 8.3:
Функция ПроверитьНаРеквизит(ИмяРеквизита, МетаданныеДок) // универсальная функция
// Например ИмяРеквизита=»ДрагМеталлы»;
Если МетаданныеДок.Реквизиты.Найти(ИмяРеквизита) = Неопределено Тогда
Возврат Ложь;
Иначе
Возврат Истина;
КонецЕсли;
КонецФункции
Функция НайтиДрагМеталлы(Номенклатура, Материал, ОсновноеСредство) // пример использования в универсальной обработке
// если реквизит шапки
ИмяРеквизита=«ДрагМеталлы»;
Если Метаданные.Справочники.Товары.Реквизиты.Найти(ИмяРеквизита) <> Неопределено Тогда
Возврат Номенклатура.ДрагМеталлы;
ИначеЕсли Метаданные.Справочники.Материалы.Реквизиты.Найти(ИмяРеквизита) <> Неопределено Тогда
Возврат Материал.ДрагМеталлы;
ИначеЕсли Метаданные.Справочники.ОсновныеСредства.Реквизиты.Найти(ИмяРеквизита) <> Неопределено Тогда
Возврат ОсновноеСредство.ДрагМеталлы;
Иначе
Возврат Ложь;
КонецЕсли;
// если реквизит таб.части
//Если НЕ ТекущаяСтрока.Свойство(ИмяРеквизита) ИЛИ НЕ ТекущаяСтрока.ДрагМеталлы Тогда
// ЗаполнитьЗначенияСвойств(ТаблицаДок.Добавить(), ТекущаяСтрока); // приёмник, источник
//КонецЕсли;
КонецФункции
Проверка реквизита через Попытка (&НаКлиенте) в 1С 8.3:
&НаКлиенте
Функция ПроверитьНаНаличиеРеквизитаЧерезПопытку(ИмяРеквизита)
Попытка
РеквизитФормыПоИмени = ЭтаФорма[ИмяРеквизита];
ЕстьРеквизитНаФорме = Истина;
Исключение
ЕстьРеквизитНаФорме = Ложь;
КонецПопытки;
Возврат ЕстьРеквизитНаФорме;
КонецФункции
В определенных задачах можно использовать метод в 1С 8.3:
ПолучитьРеквизиты(GetAttributes)
Синтаксис:
ПолучитьРеквизиты(<Путь>)
Параметры:
<Путь> (необязательный)
Тип: Строка.
Указывает путь к родительскому реквизиту. Если параметр опущен или указана пустая строка, возвращаются реквизиты верхнего уровня.
Возвращаемое значение:
Тип: Массив.
Массив объектов РеквизитФормы.
Описание:
Получает описание реквизитов формы.
Copyright©, «Программист 1С в г.Минске», 06.11.2021
Перепечатка текста и фотографий разрешена при наличии прямой ссылки на источник
Войти или зарегистрироваться
8.х Как проверить реквизит/Объект метаданных на существование?
Тема в разделе «Конфигурирование на платформе «1С:Предприятие 8″», создана пользователем alp, 17 апр 2010.
-
0/5,
Голосов: 0
-
Offline
alp
Опытный в 1С- Регистрация:
- 8 янв 2009
- Сообщения:
- 434
- Симпатии:
- 0
- Баллы:
- 26
есть Список реквизитов:
Контрагент
Договор
Договор2
….
Как проверить существует ли этот реквизит в объекте?
подобно методу Выбран() в 77.
alp,
17 апр 2010
#1 -
Offline
mialord
Модераторы
Команда форума
Модератор- Регистрация:
- 31 июл 2009
- Сообщения:
- 5.460
- Симпатии:
- 53
- Баллы:
- 54
Здраствуйте!
Если Вы хотите проверить существует ли реквизит у объекта метаданных контрагент, то самый простой способ попытаться его получить через Метаданные() с использованием оператора Попытка … КонецПопытки;
mialord,
17 апр 2010
#2 -
Offline
Stack_G
Опытный в 1С- Регистрация:
- 10 дек 2007
- Сообщения:
- 786
- Симпатии:
- 2
- Баллы:
- 29
Из типовой:
Код:МетаданныеДокумента = ДокументОбъект.Метаданные();
Код:// Позволяет определить есть ли среди реквизитов шапки документа // реквизит с переданным именем. // // Параметры: // ИмяРеквизита - строковое имя искомого реквизита, // МетаданныеДокумента - объект описания метаданных документа, среди реквизитов которого производится поиск. // // Возвращаемое значение: // Истина - нашли реквизит с таким именем, Ложь - не нашли. // Функция ЕстьРеквизитДокумента(ИмяРеквизита, МетаданныеДокумента) Экспорт Если МетаданныеДокумента.Реквизиты.Найти(ИмяРеквизита) = Неопределено Тогда Возврат Ложь; Иначе Возврат Истина; КонецЕсли; КонецФункции // ЕстьРеквизитДокумента()
Переписать под любой объект не составляет труда:
Код:Функция ЕстьРеквизитОбъекта(ИмяРеквизита, Объект) Экспорт МетаданныеОбъекта = Объект.Метаданные(); Если МетаданныеОбъекта.Реквизиты.Найти(ИмяРеквизита) = Неопределено Тогда Возврат Ложь; Иначе Возврат Истина; КонецЕсли; КонецФункции
Как говорит «начальника форума»: «все украдено до нас»
Stack_G,
17 апр 2010
#3
- Похожие темы
-
8.х
Как проверить существование переменной
GRUV,
15 май 2008, в разделе: Конфигурирование на платформе «1С:Предприятие 8»
- Ответов:
- 5
- Просмотров:
- 6.698
- BabySG
- 20 май 2008
-
8.х
Как созданную в SQL таблицу превратить в объект метаданных 1С 8.2?
МалышкА,
8 мар 2014, в разделе: Конфигурирование на платформе «1С:Предприятие 8»
- Ответов:
- 4
- Просмотров:
- 849
- Thelearning
- 12 мар 2014
-
7.7
Проверить существование файла запросом
man37,
21 ноя 2015, в разделе: Конфигурирование на платформе «1С:Предприятие 7.7»
- Ответов:
- 8
- Просмотров:
- 2.765
- man37
- 23 ноя 2015
-
[РЕШЕНО]
Как проверить существование узла при чтении ФабрикаXDTO
Aidis,
27 ноя 2015, в разделе: Конфигурирование на платформе «1С:Предприятие 8»
- Ответов:
- 3
- Просмотров:
- 2.723
- hawksib
- 24 сен 2019
- Ваше имя или e-mail:
- У Вас уже есть учётная запись?
-
- Нет, зарегистрироваться сейчас.
- Да, мой пароль:
-
Забыли пароль?
-
Запомнить меня
-
- Искать только в заголовках
- Сообщения пользователя:
-
Имена участников (разделяйте запятой).
- Новее чем:
-
- Искать только в этой теме
- Искать только в этом разделе
- Отображать результаты в виде тем
-
Быстрый поиск
- Последние сообщения
Больше…
Метаданные 1С – это список справочников, документов, их реквизитов и прочего, составляющего конфигурацию. Список метаданных 1С правится программистов в конфигураторе в окне конфигурации.
Из программы на языке 1С доступен список метаданных 1С и их свойства.
Это удобно, когда требуется получить список документов в конфигурации или отработать все реквизиты документа.
Рассмотрим, как работать с метаданными 1С конфигурации из языка 1С.
Метаданные 1С конфигурации
Глобальная переменная Метаданные дает доступ к метаданным 1С всей конфигурации (т.е. к «корню» конфигурации). Далее через точку можно обращаться к «коллекциям» — документы, справочники и т.п., чтобы выйти на конкретный справочник или документ, у которых соответственно есть «коллекции» реквизиты, табличные части и т.п. – все, как в конфигураторе, в дереве конфигурации.
Пример – создадим список всех документов конфигурации для того, чтобы пользователь мог выбрать нужный документ из списка:
спДокументовКонфигурации = Новый СписокЗначений(); //сюда будем сохранять список
//Метаданные - глобальная переменная, которая дает доступ ко всем метаданным 1С конфигурации
//Метаданные.Документы - коллекция документов конфигурации
Для каждого Документ из Метаданные.Документы Цикл
//Документ - это метаданные 1С документа (каждого, так как мы обходим их в цикле)
//.Имя - наименование документа так, как оно задано в конфигурации
//.Синоним - "человеческое" наименование документа, которое отображается пользователю
//список значений может хранить значение (имя документа) и "представление для пользователя" (как раз - синоним документа)
спДокументовКонфигурации.Добавить( Документ.Имя, Документ.Синоним );
КонецЦикла;
//даем возможность пользователю выбрать из списка нужный документ
элДокумент = спДокументовКонфигурации.ВыбратьЭлемент();
//если пользователь нажал "Отмена", то результатом выбора будет значение НЕОПРЕДЕЛЕНО, иначе результатом будет - выбранный элемент
Если элДокумент <> Неопределено Тогда
//в .Значение списка значений мы записывали имя документа "как в конфигурации"
//создадим новый документ с таким именем, напомним - к документам можно обращаться Документы.ИмяДокумента или Документы[ИмяДокумента]
обДокумент = Документы[элДокумент.Значение].СоздатьДокумент();
//ДокументОбъект.ПолучитьФорму() - возвращает форму с указанным именем, а если имя не указано - то форму "по-умолчанию"
обДокумент.ПолучитьФорму().Открыть();
КонецЕсли;
Пример – для общего журнала документов (отображающего все виды документов) создадим запрос, который вернет список всех документов:
Метаданные 1С объекта
Большинство объектов 1С, сохраняемых в базе данных (справочники, документы и т.д.) представлены ссылками и объектами (подробнее см. «Ссылки и объекты»).
У ссылок и объектов есть метод .Метаданные(), который позволяет выйти на метаданные 1С этого объекта.
Пример – проверка на наличие реквизитов с типом «Справочник.Организация» в документе и обнуление значения этих реквизитов:
//ДокументОбъект - документ, полученный на изменение или создание
//аналогичным образом можно работать со ссылками, например: ДокументСсылка = Документ.ИмяДокумента.ПустаяСсылка().Метаданные()
ДокументОбъект = Документы.ПоступлениеТоваров.СоздатьДокумент();
//цикл по реквизитам
Для каждого Реквизит из ДокументОбъект.Метаданные().Реквизиты Цикл
//у каждого реквизита может быть как один, так и несколько типов, подробнее см. "ОписаниеТипов"
мТипов = Реквизит.Тип.Типы();
//проверяем по каждому типу - тот ли это нужный нам?
Для каждого Тип из мТипов Цикл
Если Тип = Тип("СправочникСсылка.Организации") Тогда
//обнуляем реквизит с этим именем в документе
//для "обнуления" можно приравнивать его к Неопределено,
//по факту значение будет установлено не Неопределено, а "пустое значение" типа реквизита
//Неопределено только если у реквизита несколько типов
ДокументОбъект[Реквизит.Имя] = Неопределено;
КонецЕсли;
КонецЦикла;
КонецЦикла;
//цикл по табличным частям
Для каждого ТабЧасть из ДокументОбъект.Метаданные().ТабличныеЧасти Цикл
//в табличной части тоже реквизиты (колонки таб.части)
Для каждого Реквизит из ТабЧасть.Реквизиты Цикл
//здесь аналогично
мТипов = Реквизит.Тип.Типы();
Для каждого Тип из мТипов Цикл
Если Тип = Тип("СправочникСсылка.Организации") Тогда
//так как это таб.часть, то мы должны пройтись по всем строкам этой тач. части
Для каждого Строка из ДокументОбъект[ТабЧасть.Имя] Цикл
Строка[Реквизит.Имя] = Неопределено;
КонецЦикла;
КонецЕсли;
КонецЦикла;
КонецЦикла;
КонецЦикла;
Загрузка…