Форум 1С
Программистам, бухгалтерам, администраторам, пользователям
Задай вопрос - получи решение проблемы
22 ноя 2024, 06:20

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

Автор wildman, 26 апр 2011, 16:59

0 Пользователей и 1 гость просматривают эту тему.

wildman

Есть переменная "НомДоговора" в которой имеется некоторое значение.
Есть Документ "Договор" с реквизитом "НомерДоговора". Мне необходимо перебрать все документы и сравнить, есть ли документ с реквизитом "НомерДоговора" = "НомДоговора".
Или это можно сделать как-то иначе?

wildman

Запрос сделать у меня получилось, ради проверки я его вывожу в ТабличноеПоле.
Я так понимаю что на основании запроса формируется таблица значений. Теперь у меня вопрос как перебрать все значения в ТаблицеЗначений?

Запрос = Новый Запрос;
Запрос.Текст = "ВЫБРАТЬ Договор.НомерДоговора ИЗ Документ.Договор КАК Договор";
ТабличноеПоле1 = Запрос.Выполнить().Выгрузить();
ЭлментыФормы.ТабличноеПоле1.СоздатьКолонки():
ТаблЗнач =  Запрос.Выполнить().Выгрузить();


Не пойму как перебрать все значения строки ТаблЗнач.

Klyacksa

ЦитироватьЕсть Документ "Договор" с реквизитом "НомерДоговора". Мне необходимо перебрать все документы и сравнить, есть ли документ с реквизитом "НомерДоговора" = "НомДоговора".
Нужно найти документы "Договор", у которых "НомерДоговора"="НомДоговора"?

Тогда так:
ДоговораВыборка=Документы.Договор.Выбрать(,,Новый Структура("НомерДоговора",НомДоговора));

Но для использования такого отбора, нужно убедиться, что признак индексирования реквизита "НомерДоговора" у документа "Договор"  установлен в значение "Индексировать" или в значение "Индексировать с доп. упорядоч.".  
xxx: Спасибо! Я бы загуглил, но ты интересней. Материшься. Злишься. Послать можешь...

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

wildman


zkolenko

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

&НаКлиенте
Процедура НайтиПоНомеру()
   НомерДоговора = "ЗначениеСТипомЗначенияКакВРеквизитеНомерДоговора";   
   НайтиДокументПоНомеруДоговора(НомерДоговора);
КонецПроцедуры

&НаСервере
Процедура НайтиДокументПоНомеруДоговора(НомерДоговора)
   
   запрос = новый Запрос;
   Запрос.Текст = "ВЫБРАТЬ
                  |   Договор.Ссылка,
                  |   Договор.НомерДоговора
                  |ИЗ
                  |   Документ.Договор КАК Договор
                  |ГДЕ
                  |   Договор.НомерДоговора = &НомерДоговора";
   Запрос.УстановитьПараметр("НомерДоговора", НомерДоговора);
   Результат = Запрос.Выполнить();
   ТаблицаЗначений = Результат.Выгрузить();
   
   //В ТаблицаЗначений вы выгружаете ссылки тех документов, у
   //которых реквизит НомерДоговора равен переменной НомерДоговора
   //а дельше имея таблицу значений с ссылками на нужные документы
   //делайте с этими документами все что хотите, например
   Для Каждого Док Из ТаблицаЗначений Цикл
      Документ = Док.Ссылка;
      Сообщить("Документ с номером: "+Документ.Номер);
      Сообщить("И датой: "+Документ.Дата);
      Сообщить("Имеет значение реквизита НомерДоговора = "+Документ.НомерДоговора);
      ДокументДляИзменения = Документ.ПолучитьОбъект();
      ДокументДляИзменения.Удалить();
   КонецЦикла;
   
   
КонецПроцедуры

cska-fanat-kz

То есть сперва через метаданные перебрать все реквизиты всех документов и сформировать список имен документов, у которых имеется реквизит НомерДоговора?
Получил помощь - скажи СПАСИБО.
Разобрался сам - расскажи другим.

zkolenko

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

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

zkolenko

В этой строчке вместо реквизита с названием "ПодотчетноеЛицо" напишите название того реквизита, который вы ищите, например "НомерДоговора"
Было так:
Если РеквизитыДок.Найти("ПодотчетноеЛицо")<>Неопределено Тогда

а станет так:
Если РеквизитыДок.Найти("НомерДоговора")<>Неопределено Тогда

zkolenko

   //вот полный пример где я искал все докменты где есть реквизит валюта и
   //потом выбирал из них те, где есть та валюта которую я хочу найти
   массивПодходящихДокументов = новый Массив;
   Для Каждого Документ Из Документы Цикл
      РеквизитыДок = Документ.ПустаяСсылка().Метаданные().Реквизиты;
      Если РеквизитыДок.Найти("Валюта")<>Неопределено Тогда
         массивПодходящихДокументов.Добавить(Документ.ПустаяСсылка());
      КонецЕсли;
   КонецЦикла;
   
   переменнаяЗначенияПоиска = Справочники.Валюты.НайтиПоНаименованию("RUB");;
   перемНазваниеРеквизитаПоиска = "Валюта";
   
   ТекстЗапроса = "ВЫБРАТЬ
   |   Документ.Ссылка
   |ИЗ
   |   [НаименованиеДокумента] КАК Документ
   |ГДЕ
   |   Документ.[названиеРеквизитаДляПоиска] = &Значение";
   
   РазделительПакетногоЗапроса = "
   |;
   |
   |////////////////////////////////////////////////////////////////////////////////
   |";

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

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

Теги:

Похожие темы (5)

Рейтинг@Mail.ru

Поиск