Всем доброго времени суток!!!
Люди добрые, помогите кто чем сможет))
Необходимо проверить все документы на наличие определенного реквизита. Как проверить имеется ли тот или иной реквизит в определенном документе, нашел тут. (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 Тогда
Заг=Заг+"Склад документов: "+СокрП(ВыбСклад)+". ";
КонецЕсли;
//Проверка статуса
Если (Док.ПометкаУдаления()>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 Цикл
Поз = 0;
Пока (ТабДвиж1.НайтиЗначение(ТабДок1.Номенклатура, Поз, "Номенклатура") = 1)
и (ТабДок1.Количество > 0) Цикл
ТабДвиж1.ПолучитьСтрокуПоНомеру(Поз);
// получим текущее количество в документе в базовой единице
ТекКолво1 = ТабДок1.Количество * ТабДок1.Коэффициент;
// в таблицу печати добавляем количество - минимум из регистра и документа
ИспКолво1 = Мин(ТабДвиж1.Количество, ТекКолво1);
ИспСумма1 = ИспКолво1 * ТабДвиж1.Сумма / ТабДвиж1.Количество;
Если ТабДвиж1.Количество <= ИспКолво1 Тогда
// количество полностью использовано. Удалим строку из таблицы, чтобы
// на следующем шаге итереции могла бы найтись строка с этим же товаром, но
// из другой партии (конечно, если такое движение было)
ТабДвиж1.УдалитьСтроку(Поз);
Иначе
// количество в движении больше чем в строке докуиента (может быть из-за
// того, что табличной части документа встречаются строки с одинаковыми товарами)
ТабДвиж1.Количество = ТабДвиж1.Количество - ИспКолво1;
КонецЕсли;
// преобразуем количество из регистра (в базовой единице)
// в единицу из строки документа
Если Док.Коэффициент <> 0 Тогда
КолвоРег = КолвоРег / Док.Коэффициент;
КонецЕсли;
КолвоПеч = Мин(КолвоДок, КолвоРег);
СуммаПеч = СуммаРег * КолвоПеч / КолвоРег;
Если Док.Склад.РозничныйСклад = 1 Тогда
// Перемещение следует отражать по розничным ценам
ЦенаПеч = ТабДвиж.ПолучитьЗначение(Поз, "РознЦена");
Иначе
// пытаемся уменьшить потерю точности,
// поэтому сначала считаем сумму, а только потом цену
ЦенаПеч = ?(КолвоПеч = 0, СуммаПеч, СуммаПеч / КолвоПеч);
КонецЕсли;
ОстРег = КолвоРег - КолвоПеч;
Если ОстРег <= 0 Тогда
// количество из движений регистра полностью погасилось количеством из накладной
// удалим строку таблицы значений
ТабДвиж.УдалитьСтроку(Поз);
Иначе
// количество движений регистра оказалось больше, чем количество документа
ТабДвиж.УстановитьЗначение(Поз, "Количество", ОстРег * Док.Коэффициент);
ТабДвиж.УстановитьЗначение(Поз, ИдКолонкиСуммы , СуммаРег - СуммаПеч);
КонецЕсли;
// уменьшаем непогашенное количество из строки документа
КолвоДок = КолвоДок - КолвоПеч;
Если ПустоеЗначение(ПечВалюта) = 1 Тогда
ПечВалюта = глРубли;
КонецЕсли;
Поз = 0;
Если СуммыПоВалютам.НайтиЗначение(ПечВалюта, Поз, "Валюта") = 1 Тогда
СуммыПоВалютам.ПолучитьСтрокуПоНомеру(Поз);
СуммыПоВалютам.Сумма = СуммыПоВалютам.Сумма + Число(СтрЗаменить(ПечСумма,"'",""));
Иначе
СуммыПоВалютам.НоваяСтрока();
СуммыПоВалютам.Сумма = Число(СтрЗаменить(ПечСумма,"'",""));
СуммыПоВалютам.Валюта = ПечВалюта;
КонецЕсли;
ПечИнформация = СокрЛП(глИнформацияПоДокументуВЖурнале(Док.ТекущийДокумент()));
//**********
Если Док.Комментарий = " " Тогда
ПечКомментарий = " ";
Иначе
ПечКомментарий = Док.Комментарий;
КонецЕсли;
//28-02-2013
//Для К=1 по Метаданные.Документ() Цикл
//Идентификатор= Метаданные.Документ(К).Идентификатор;
Нашли=0;
//Для РеквШапки=1 По Метаданные.Документ("Имя вашего документа").РеквизитШапки() Цикл
// Если Строка(Метаданные.Документ("Имя вашего документа").РеквизитШапки(РеквШапки).Идентификатор)="Основание" Тогда
Для РеквШапки=1 По Метаданные.Документ("Имя вашего документа").РеквизитШапки() Цикл
Если Строка(Метаданные.Документ("Имя вашего документа").РеквизитШапки(РеквШапки).Идентификатор)="Основание" Тогда
// ВидыДок
Нашли=1;
Прервать;
КонецЕсли;
КонецЦикла;
Если Нашли=1 Тогда
ПечДокОснование = Док.Основание; ;
Иначе
ПечДокОснование="";
КонецЕсли;
КонецЦикла;
//28-02-2013
//Для К=1 по Метаданные.Документ() Цикл
// Идентификатор= Метаданные.Документ(К).Идентификатор;
// Реквизит = Метаданные.Документ(Идентификатор).РеквизитШапки("Основание").Выбран();
//Конеццикла;
//
//Если Реквизит = 1 Тогда
// ПечДокОснование = Док.Основание;
//Иначе
// ПечДокОснование = " ";
//КонецЕсли;
//// ***
//Если Док.Основание = " " Тогда
// ПечДокОснование = " ";
// Иначе
// ПечДокОснование = Док.Основание;
//КонецЕсли;
//**********
ПечСтатус = "Не проведен";
Если (Док.ПометкаУдаления()>0) Тогда
ПечСтатус = "Помечен на уд.";
ИначеЕсли (Док.Проведен()>0) Тогда
ПечСтатус = "Проведен";
КонецЕсли;
Если глЕстьРеквизитШапки("ДатаДокВходящий", Док.Вид()) = 1 тогда
ПечДата = Док.ДатаДокВходящий;
Иначе
ПечДата = Док.ДатаДок;
КонецЕсли;
Таб.ВывестиСекцию("Докум");
Пока Найти(ПечСумма," ") > 0 Цикл
ПечСумма = СтрЗаменить(ПечСумма," ","");
КонецЦикла;
КолвоСтрок = СуммыПоВалютам.КоличествоСтрок();
Если КолвоСтрок >= 1 Тогда
СуммыПоВалютам.ПолучитьСтрокуПоНомеру(1);
Сумма = СуммыПоВалютам.Сумма;
Валюта = СуммыПоВалютам.Валюта;
(23) в конструцию Метаданные.Документ("Имя вашего документа").
вместо "Имя вашего документа" надо передать Вид() документа который тебя интересует...
ну собственно и циклы там не упали.... только лишнее время тратят...
если нашел в глобальнике глЕстьРеквизит... то сам разберешься как это работает...
тогда проверка наличия реквизита шапки будет:
Если Метаданные.Документ(видДока).РеквизитШапки(ИмянУжногоРеквизита).Выбран() = 1 Тогда
Есть такой реквизит
Иначе
нет такого реквизита
КонецЕсли;
(1)можешь ссылку на сайт дать, на то как нашел проверку реквизита в документе чтобы выдавалась ошибка если данные уже используются в другом документе
(1)
(1)
Для й=1 по Метаданные.Документ() цикл
Идентификатор= Метаданные.Документ(й).Идентификатор;
Реквизит = Метаданные.Документ(Идентификатор).РеквизитШапки("Основание").Выбран();
Конеццикла;
//
Для К=1 по Метаданные.Документ() Цикл
Идентификатор= Метаданные.Документ(К).Идентификатор;
Реквизит = Метаданные.Документ(Идентификатор).РеквизитШапки("Основание").Выбран();
Конеццикла;
Если Реквизит = 1 Тогда
ПечДокОснование = Док.Основание;
Иначе
ПечДокОснование = " ";
КонецЕсли;
//
Сделал таким образом, в отчете заполняется ПечДокОснование = " ";
хотя документы содержащие реквизит "Основание" в отчете присутствуют.
Мне нужно перебрать все документы и проверить, есть ли в шапке реквизит "Основание", если есть, то значение этого реквизита выводиться в отчет, если такого реквизита нет, выводится " ", т. е. ничего.
//*******************************************
Процедура Сформировать()
Для К=1 по Метаданные.Документ() Цикл
Идентификатор= Метаданные.Документ(К).Идентификатор;
Нашли=0;
Для РеквШапки=1 По Метаданные.Документ(Идентификатор).РеквизитШапки() Цикл
Если Строка(Метаданные.Документ(Идентификатор).РеквизитШапки(РеквШапки).Идентификатор)="ДокументОснование" тогда
Нашли=1;
Прервать;
Конецесли;
КонецЦикла;
Если Нашли=1 тогда
Док=СоздатьОбъект("Документ."+Идентификатор);
Док.ВыбратьДокументы();
Пока док.ПолучитьДокумент()=1 Цикл
Если СокрЛП(док.ДокументОснование)="" Тогда
Сообщить("У документа "+Док+" - Нет основания!");
Иначе
Сообщить("У документа "+Док+"Основание "+док.ДокументОснование);
КонецЕсли;
КонецЦикла;
Конецесли;
Конеццикла;
КонецПроцедуры
Видимо я не правильно объяснил...речь не идет о документе основании...
В некоторые документы (ПКО, РКО и т.д.) добавлен реквизит "Основание" с типом строка.
Имеется конфигурация КА, в каких-то документах есть реквизит "Основание" (добавлен), а в каких-то документах его нет. Необходимо в уже имеющийся отчет добавить выведение реквизита основание, но дело в том, что если в документе нет этого реквизита, выходит ошибка: "Поле агрегатного объекта не обнаружено (Основание)". Так вот нужна проверка на наличие реквизита "Основание" во всех документах конфигурации.
Нашли=0;
Для РеквШапки=1 По Метаданные.Документ("Имя вашего документа").РеквизитШапки() Цикл
Если Строка(Метаданные.Документ("Имя вашего документа").РеквизитШапки(РеквШапки).Идентификатор)="Основание" тогда
Нашли=1;
Прервать;
Конецесли;
КонецЦикла;
Если Нашли=1 тогда
ПечДокумент.Основание=Основание;
Иначе
печДокумент.Основание="";
Конецесли;