1с проверить существование реквизита формы

Как программно определить наличие у документа опрелённого реквизита?

Метаданные.Документ(«Реализация»).РеквизитТабличнойЧасти(«Вася»).Выбран()
+ поглядеть на реквизит шапки + общий реквизит.

См. во всех типовых глЕстьРеквизитШапки + глЕстьРеквизитТЧ

(4) Чего в ней нет? Этих функций? Это нестрашно :-)

(6) Не факт, что мои из типовой взяты. Они из рабочей.
Сейчас проверю.

Добавлено: в комплексной для Украины также

(10) А зачем наличие общего реквизита в документе нужно проверять?
Разве что для универсальных отчетов/обработок, не привязанных к определенной конфигурации.

(11) Не знаю, но в типовых конфигурациях наличие общего реквизита проверяется в функции глЕстьРеквизитШапки().

З.Ы. Кстати, глобальные переменные Да и Нет в российских конфигурациях давно не используются.

(12) З.Ы. Это я уже прочитал в (6) :-)

Для российских собратьев по разуму привожу кусок кода из глобальника типовой российской ТиС редакции 9.2

(12)
//////////////////////////////////////////////////////////// ­///////////////
//
Перем глТаблицаСчетов Экспорт;
Перем глОбщиеУстановки Экспорт;
Перем глЗначениеОтбора Экспорт;
Перем глПоОплате Экспорт;
Перем глПоОтгрузке Экспорт;
Перем Да Экспорт;
Перем Нет Экспорт;

Типовая бухия. Декабрь 2008.

А вот глЕстьРеквизитШапки() отсутствует.

(17) Оно надо всего в двух-трех случаях:
— Замена значений
— Автоматизация конвертации/обмена
— Восможно, в самописной конфе
— Для ОЧЧень универсального отчета/обработки

я пользовался по 1 и 3 вариантам.

Функция ПроверитьСтандартныеРеквизитыНаСервере(ТипОбъекта, Имя, ИмяРеквизита)

ЕстьРеквизит = Ложь;
СтандартныеРеквизиты = Метаданные[ТипОбъекта][Имя].СтандартныеРеквизиты;
Для каждого ЭлСтандартныеРеквизиты Из СтандартныеРеквизиты Цикл
Если ЭлСтандартныеРеквизиты.Имя = ИмяРеквизита Тогда
ЕстьРеквизит = Истина;
КонецЕсли;
КонецЦикла;
Возврат ЕстьРеквизит;

Функция ВернутьИмяНаСервере(Имя) Экспорт

ТипОбъекта = «Справочники»;
ИмяСтандартныеРеквизиты = «Наименование»;
Если Не ПроверитьСтандартныеРеквизитыНаСервере(ТипОбъекта, Имя, ИмяСтандартныеРеквизиты) Тогда
ИмяСтандартныеРеквизиты = «Код»;
КонецЕсли;
Возврат ИмяСтандартныеРеквизиты;

Источник

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Источник

IT Блог Сергея Бобошко

1С Предприятие, конфигурации, обработки, услуги программиста, помощь программиста

1С Предприятие 8.3 Как проверить наличие реквизита документа или табличной части программно

В типовых конфигурациях это делается просто:

Но если у вас не типовая конфигурация, или же, как я, привыкли работать методами, предоставляемыми платформой по возможности максимально их используя, где это имеет смысл, тогда вот так:

Если реквизит отсутствует, тогда будет возвращено значение неопределено, как будет в случае с реквизитом «БабаЯга» в регистре цен.

К метаданным можно так-же обращаться через строковое имя, как в других коллекциях, что позволяет сделать гибкую программную обработку.

В случае удачного нахождения реквизита с указанным именем возвращается искомый объект метаданных, иначе, как уже упоминалось — НЕОПРЕДЕЛЕНО,

Добавить комментарий Отменить ответ

В помощь программисту

Спасибо за интерес к моим статьям!

Если Вам понравилась статья, а особенно если я сэкономил вам кучу времени, сил и нервов(!), и Вы хотите поблагодарить автора за труды, можете пожертвовать рублик на один из кошельков автора:
R378379457675
Z428430781167
U266558095968

Ну, или нажмите кнопочку репоста в соцсетях. Или напишите отзыв.

Рубрики

Свежие записи

Благодарность мне

Если Вам понравилась статья, а особенно если я сэкономил вам кучу времени, сил и нервов(!), и Вы хотите поблагодарить автора за труды, можете пожертвовать рублик на один из кошельков автора:
R378379457675
Z428430781167
U266558095968

Ну, или нажмите кнопочку репоста в соцсетях. Или напишите отзыв.

Источник

Профессия — 1С

рубрики: Платформа 8.3 | Дата: 12 июля, 2018

Одной из стандартных задач при работе с формами различных объектов является проверка реквизитов формы на заполненность.

Рассмотрим несколько способов проверки заполненности реквизитов на форме. Рассматривать будем на примере элемента справочника.

Проверка средствами платформы

Как правило у различных объектов метаданных (справочники, документы и т.д.) часть реквизитов обязательны к заполнению. Это могут быть как стандартные реквизиты, например, для справочника наименование и код, так и реквизиты созданные в процессе конфигурирования. Для таких реквизитов свойство «Проверка заполнения» обычно устанавливается в значение «Выдавать ошибку»
ProverkaRekvizitov ProverkaZapolneniya
Кроме этого в свойствах самой формы должен быть установлен флаг Проверять Заполнение Автоматически
ProverkaRekvizitov FormaProveryatAvtomatom
Это позволяет выполнять проверку средствами платформы в момент записи объекта без написания дополнительного кода. Давайте посмотрим как это работает в режиме предприятия.
ProverkaRekvizitov OshibkaPlatforma
При выполнении такой проверки платформа осуществляет вызов предопределенной процедуры ОбработкаПроверкиЗаполненияНаСервере(), расположенной в модуле формы, а затем и вызов процедуры ОбработкаПроверкиЗаполнения(), которая находится уже в модуле объекта, если конечно эти процедуры имеются в наличии. И как мы видим организация такого рода проверки занимает минимальное количество усилий.

Программная проверка реквизитов с флагом «Выдавать ошибку»

Для реквизитов у которых свойство «Проверка заполнения» установлено в значение «Выдавать ошибку» достаточно легко можно организовать программную проверку буквально одной строчкой кода c помощью метода ПроверитьЗаполнение():

В отличие от предыдущего способа (когда проверка происходит в момент записи), мы можем вызвать данную проверку в любом месте своего кода. И точно также как и в предыдущем случае будут выполнены процедуры ОбработкаПроверкиЗаполненияНаСервере() и ОбработкаПроверкиЗаполнения()

Программная проверка реквизитов

И конечно же мы всегда можем программно проверить заполненность реквизитов вне зависимости от значения свойства «Проверка заполнения». В самом простейшем случае с помощью метода ЗначениеЗаполнено():

Давайте теперь попробуем разобраться в каком из предопределенных модулей лучше выполнять проверку, когда речь идет о записи объекта. Если мы обратимся к схеме событий при проведении документа, то увидим, что логично будет выполнить проверку до начала транзакции. То есть это следующие предопределенные процедуры:

Как правило проверка реквизитов выполняется в предопределенной процедуре модуля объекта ОбработкаПроверкиЗаполнения(). По умолчанию она выглядит следующим образом:

Здесь ПроверяемыеРеквизиты — это массив с именами реквизитов, которые подлежат проверке. Тип элементов массива — строка. Естественно, что платформа автоматически добавляет в этот массив имена реквизитов для которых установлено свойство «Выдавать ошибку». Но мы можем программно добавлять или удалять элементы массива и таким образом менять перечень проверяемых реквизитов:

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

Выводы

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

Источник

Проверка на наличие определенного реквизита во всех документах

Всем доброго времени суток.
Люди добрые, помогите кто чем сможет))

Необходимо проверить все документы на наличие определенного реквизита. Как проверить имеется ли тот или иной реквизит в определенном документе, нашел тут. ( http://1cprofi.com/content/view/4/40/)

Реквизит = Метаданные.Документ(«АвансовыйОтчет»).РеквизитШапки(«Основание»).Выбран();
Если Реквизит = 1 Тогда
Сообщить(«У документа есть такой реквизит»);
Иначе
Сообщить(«У документа нет такого реквизита»);
КонецЕсли;

Как применить подобный шаблон ко всем документам.
ВСЕМ Спасибо за внимание.

ВидыДок = «»;
Для Инд=1 По ВыбранныеДокументы.РазмерСписка() Цикл
ВидыДок = ВидыДок + Документы.ПолучитьЗначение(ВыбранныеДокументы.ПолучитьЗначение(Инд))+»,»;
КонецЦикла;

Если ПустаяСтрока(ВидыДок)=1 Тогда
Возврат;
КонецЕсли;

Если (ВыбКонтрагент.Выбран()=1) Тогда
Док.ВыбратьПоЗначению(ДатаНачала,ДатаКонца,»Контрагент»,ВыбКонтрагент);
ИначеЕсли (ВыбПроект.Выбран()=1) Тогда
Док.ВыбратьПоЗначению(ДатаНачала,ДатаКонца,»Проект», ВыбПроект);
ИначеЕсли (ВыбАвтор.Выбран()=1) Тогда
Док.ВыбратьПоЗначению(ДатаНачала,ДатаКонца,»Автор», ВыбАвтор);
ИначеЕсли (ВыбФирма.Выбран()=1) Тогда
Док.ВыбратьПоЗначению(ДатаНачала,ДатаКонца,»Фирма», ВыбФирма);
ИначеЕсли (ВыбЮрЛицо.Выбран()=1) Тогда
Док.ВыбратьПоЗначению(ДатаНачала,ДатаКонца,»ЮрЛицо», ВыбЮрЛицо);
ИначеЕсли (ВыбФизЛицо.Выбран()=1) Тогда
Док.ВыбратьПоЗначению(ДатаНачала,ДатаКонца,»ФизЛицо», ВыбФизЛицо);
ИначеЕсли (ВыбСклад.Выбран()=1) Тогда
Док.ВыбратьПоЗначению(ДатаНачала,ДатаКонца,»Склад», ВыбСклад);
ИначеЕсли (ВыбСотр.Выбран()=1) Тогда
Док.ВыбратьПоЗначению(ДатаНачала,ДатаКонца,»Сотрудник», ВыбСотр);
Иначе
Док.ВыбратьДокументы(ДатаНачала,ДатаКонца);
КонецЕсли;

Если (ТипЗначенияСтр(Таб) <> «Таблица») ИЛИ (Обновить = 0) Тогда
Таб = СоздатьОбъект(«Таблица»);
Иначе
Таб.Очистить();
КонецЕсли;
Таб.ИсходнаяТаблица( «РеестрДокументов» );

Расшифровка = СоздатьОбъект(«СписокЗначений»);
Расшифровка.Установить(«Отчет», «РеестрДокументов»);

// все настройки помещаем в список
Расшифровка.Установить(«ДатаНачала», ДатаНачала);
Расшифровка.Установить(«ДатаКонца», ДатаКонца);

Расшифровка.Установить(«ВыбФирма», ВыбФирма);
Расшифровка.Установить(«ВыбЮрЛицо», ВыбЮрЛицо);
Расшифровка.Установить(«ВыбФизЛицо», ВыбФизЛицо);
Расшифровка.Установить(«ВыбКонтрагент», ВыбКонтрагент);
Расшифровка.Установить(«ВыбАвтор», ВыбАвтор);
Расшифровка.Установить(«ВыбПроект», ВыбПроект);
Расшифровка.Установить(«ВыбСклад», ВыбСклад);

Расшифровка.Установить(«ВклПроведенные»,ВклПроведенные);
Расшифровка.Установить(«ВклТекущие», ВклТекущие);
Расшифровка.Установить(«ВклУдаленные», ВклУдаленные);

Расшифровка.Установить(«ВыбранныеДокументы», ВыбранныеДокументы);
Расшифровка.Установить(«ВсеДокументы», ВсеДокументы);

Если ВыбЮрЛицо.Выбран()>0 Тогда
Заг=Заг+»По юр. лицу «+СокрП(ВыбЮрЛицо)+». «;
КонецЕсли;
Если ВыбФизЛицо.Выбран()>0 Тогда
Заг=Заг+»По физ. лицу «+СокрП(ВыбФизЛицо)+». «;
КонецЕсли;
Если ВыбФирма.Выбран()>0 Тогда
Заг=Заг+»По фирме «+СокрП(ВыбФирма)+». «;
КонецЕсли;
Если ВыбКонтрагент.Выбран()>0 Тогда
Заг=Заг+»По контрагенту «+СокрП(ВыбКонтрагент)+». «;
КонецЕсли;
Если ВыбАвтор.Выбран()>0 Тогда
Заг=Заг+»Автор документов: «+СокрП(ВыбАвтор)+». «;
КонецЕсли;
Если ВыбПроект.Выбран()>0 Тогда
Заг=Заг+»Проект документов: «+СокрП(ВыбПроект)+». «;
КонецЕсли;
Если ВыбСклад.Выбран()>0 Тогда
Заг=Заг+»Склад документов: «+СокрП(ВыбСклад)+». «;
КонецЕсли;

Таб.ВывестиСекцию(«Кнопки»);
Таб.ВывестиСекцию(«Шапка»);
Таб.ВывестиСекцию(«ШапкаТаблицы»);

// выводим шапку на каждой странице
НачПовт = Таб.ВысотаСекции(«Кнопки») + Таб.ВысотаСекции(«Шапка»);
КонПовт = НачПовт + Таб.ВысотаСекции(«ШапкаТаблицы»);
Таб.ПовторятьПриПечатиСтроки(НачПовт + 1, КонПовт);

НПП=0;
ПечИтогСумма = 0;

СуммыПоВалютам = СоздатьОбъект(«ТаблицаЗначений»);
СуммыПоВалютам.НоваяКолонка(«Валюта», «Справочник.Валюты»);
СуммыПоВалютам.НоваяКолонка(«Сумма», «Число»);

Пока Док.ПолучитьДокумент()=1 Цикл

//Проверка статуса
Если (Док.ПометкаУдаления()>0) Тогда
Если ВклУдаленные=0 Тогда
Продолжить;
КонецЕсли;
ИначеЕсли (Док.Проведен()>0) Тогда
Если ВклПроведенные=0 Тогда
Продолжить;
КонецЕсли;
Иначе
Если ВклТекущие=0 Тогда
Продолжить;
КонецЕсли;
КонецЕсли;

//Проверка юр. лица, к которому относится документ
Если ВыбЮрЛицо.Выбран() = 0 Тогда
ИначеЕсли (Док.ЮрЛицо <> ВыбЮрЛицо) Тогда
Продолжить;
КонецЕсли;

//Проверка фирмы, к которой относится документ
Если ВыбФирма.Выбран() = 0 Тогда
ИначеЕсли (Док.Фирма <> ВыбФирма) Тогда
Продолжить;
КонецЕсли;

//Проверка физ. лица, к которому относится документ
Если ВыбФизЛицо.Выбран() = 1 Тогда
Если глЕстьРеквизитШапки(«ФизЛицо»,Док.Вид()) = 1 Тогда
Если (Док.ФизЛицо <> ВыбФизЛицо) Тогда
Продолжить;
КонецЕсли;
Иначе
Продолжить;
КонецЕсли;
КонецЕсли;

//Проверка автора
Если ВыбАвтор.Выбран() = 0 Тогда
ИначеЕсли (Док.Автор <> ВыбАвтор) Тогда
Продолжить;
КонецЕсли;

//Проверка проекта
Если ВыбПроект.Выбран() = 0 Тогда
ИначеЕсли (Док.Проект <> ВыбПроект) Тогда
Продолжить;
КонецЕсли;

//Проверка сотрудника
Если ВыбСотр.Выбран() = 1 Тогда
Если глЕстьРеквизитШапки(«Сотрудник»,Док.Вид()) = 1 Тогда
Если (Док.Сотрудник <> ВыбСотр) Тогда
Продолжить;
КонецЕсли;
Иначе
Продолжить;
КонецЕсли;
КонецЕсли;

//Проверка склада
Если ВыбСклад.Выбран() = 1 Тогда
ХорошийДокумент = 0;
Если глЕстьРеквизитШапки(«Склад»,Док.Вид()) = 1 Тогда
Если (Док.Склад = ВыбСклад) Тогда
ХорошийДокумент = 1;
КонецЕсли;
КонецЕсли;
Если глЕстьРеквизитШапки(«СкладПолучатель»,Док.Вид()) = 1 Тогда
Если (Док.СкладПолучатель = ВыбСклад) Тогда
ХорошийДокумент = 1;
КонецЕсли;
КонецЕсли;
Если ХорошийДокумент = 0 Тогда
Продолжить;
КонецЕсли;
КонецЕсли;

//Проверка вида документа
Если Найти(ВидыДок,Док.Вид()+»,»)=0 Тогда
Продолжить;
КонецЕсли;

ПечСумма = глСуммаДокументаВЖурнале(Док.ТекущийДокумент(), «число»);

//ал для вывода в реестре документов суммы для СписанияТМЦ
Если Док.Вид()=»СписаниеТМЦ» Тогда
ПечИтого = 0;
ТабДвиж1 = СоздатьОбъект(«ТаблицаЗначений»);
ТабДвиж1.НоваяКолонка(«Номенклатура»);
ТабДвиж1.НоваяКолонка(«Количество»);
ТабДвиж1.НоваяКолонка(«Сумма»);

РегПартии1 = СоздатьОбъект(«Регистр.ПартииНаличие»);
РегПартии1.ВыбратьДвиженияДокумента(Док.ТекущийДокумент());

Пока РегПартии1.ПолучитьДвижение() = 1 Цикл
ТабДвиж1.НоваяСтрока();
ТабДвиж1.Номенклатура = РегПартии1.Номенклатура;
ТабДвиж1.Количество = РегПартии1.Количество;
ТабДвиж1.Сумма = РегПартии1.СуммаБезНДС;
КонецЦикла;

// выгрузим табличную часть документа в таблицу значений
ТабДок1 = СоздатьОбъект(«ТаблицаЗначений»);
Док.ВыгрузитьТабличнуюЧасть(ТабДок1, «Номенклатура, Количество, Единица, Коэффициент»);

// сформируем таблицу значений для печати

ТабПеч1 = СоздатьОбъект(«ТаблицаЗначений»);
ТабПеч1.НоваяКолонка(«Номенклатура»);
ТабПеч1.НоваяКолонка(«Количество»);
ТабПеч1.НоваяКолонка(«Сумма»);

ТабДок1.ВыбратьСтроки();
Пока ТабДок1.ПолучитьСтроку() = 1 Цикл

Поз = 0;
Пока (ТабДвиж1.НайтиЗначение(ТабДок1.Номенклатура, Поз, «Номенклатура») = 1)
и (ТабДок1.Количество > 0) Цикл
ТабДвиж1.ПолучитьСтрокуПоНомеру(Поз);

Если ТабДвиж1.Количество 0) // есть что погашать
и (ТабДвиж.НайтиЗначение(Док.Номенклатура, Поз, «Номенклатура») <> 0) // есть чем погашать
Цикл

КолвоРег = ТабДвиж.ПолучитьЗначение(Поз, «Количество»);
СуммаРег = ТабДвиж.ПолучитьЗначение(Поз, ИдКолонкиСуммы);

// преобразуем количество из регистра (в базовой единице)
// в единицу из строки документа
Если Док.Коэффициент <> 0 Тогда
КолвоРег = КолвоРег / Док.Коэффициент;
КонецЕсли;

Если глЕстьРеквизитШапки(«ДатаДокВходящий», Док.Вид()) = 1 тогда
ПечДата = Док.ДатаДокВходящий;
Иначе
ПечДата = Док.ДатаДок;
КонецЕсли;

Пока Найти(ПечСумма,» «) > 0 Цикл
ПечСумма = СтрЗаменить(ПечСумма,» «,»»);
КонецЦикла;

ПечИтогСумма = ПечИтогСумма + Число(ПечСумма);
глОживить(1);
КонецЦикла;

КолвоСтрок = СуммыПоВалютам.КоличествоСтрок();
Если КолвоСтрок >= 1 Тогда
СуммыПоВалютам.ПолучитьСтрокуПоНомеру(1);
Сумма = СуммыПоВалютам.Сумма;
Валюта = СуммыПоВалютам.Валюта;

Для Сч = 2 По КолвоСтрок Цикл
СуммыПоВалютам.ПолучитьСтрокуПоНомеру(Сч);
Сумма = СуммыПоВалютам.Сумма;
Валюта = СуммыПоВалютам.Валюта;

Таб.ВывестиСекцию(«Итого»);
глОживить(1);
КонецЦикла;
КонецЕсли;

Таб.Опции(0, 0, 7, 0, «РеестрДокументов», «РеестрДокументов»);
Таб.ТолькоПросмотр(1);
Таб.ОбластьПечати(2);
Если глПолучитьПолномочие(«РазрешитьРедактированиеТаблиц») = 0 Тогда
Таб.Защита(1);
КонецЕсли;
Таб.Показать(«Реестр документов»,»»);

Если (Обновить = 2)ИЛИ(ЗакрытьДиалог=1) Тогда
СтрокаДействийФормы = «#Закрыть»;
КонецЕсли;

Это полное содержание процедуры..

Где тут идет получение документа («Имя вашего документа»), так и не нашел..

Источник

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