Перебрать все реквизиты документа 1с в цикле

Нужно вытащить все документы в реквизитах  которых есть сылка на справочник номенклатура, сделал так:

Для Каждого док из Метаданные.документы Цикл

    ддд=Документы[Док.Имя];

   // Сообщить(док.ПолноеИмя()+ТипЗнч(док));

    Выборка = ддд.Выбрать();

    Пока выборка.Следующий() Цикл

     Для каждого сс Из выборка.ссылка.реквизиты Цикл

         Если ТипЗнч(сс)=тип(«справочник.ссылка.номенклатура») Тогда

         Сообщить(док.ПолноеИмя()+ТипЗнч(док));

         //Сообщить(ТипЗнч(Выборка.Номер));

       КонецЕсли;

     КонецЦикла;    

    КонецЦикла;

 КонецЦикла;

документы выбираются, реквизиты у каждого видны, но как их все перебрать программно чтобы определить где ТипЗнч(сс)=тип(«справочник.ссылка.номенклатура») ?

Перебор реквизтов документа

Автор Bitaxa, 02 мар 2018, 18:18

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


Есть вот такая форма. В поле «документ» на форме пользователь выбирает один из документов в информационной базе. Нужно, чтобы из выбранного документа были взяты определенные реквизиты и записаны в txt. Не понимаю что мне в модуле формы нужно написать, чтобы получить документ, выбранный пользователем, и начать перебирать его реквизиты <_<
Знаю, что надо метаданные использовать, но не понимаю как это все связать.


Цитата: Bitaxa от 02 мар 2018, 18:18

Есть вот такая форма. В поле «документ» на форме пользователь выбирает один из документов в информационной базе. Нужно, чтобы из выбранного документа были взяты определенные реквизиты и записаны в txt. Не понимаю что мне в модуле формы нужно написать, чтобы получить документ, выбранный пользователем, и начать перебирать его реквизиты <_<
Знаю, что надо метаданные использовать, но не понимаю как это все связать.

Вообще задание звучит следующим образом:Разработать внешнюю обработку «ПерегрузкаДокументов». На ней должна быть возможность выбрать один из документов. При нажатии на кнопку информация, содержащиеся в выбранном документе, должна выгрузиться в указанный файл txt. Все сделать через Метаданные.
Готовое решение не нужно. просто хочу понять, какие темы для этого надо читать и что нужно понимать.


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


Цитата: AIFrame от 02 мар 2018, 19:01
Документ = Документы.РеализацияТоваровУслуг.ПустаяСсылка();
МетаданныеДокумента = Документ.Метаданные().Реквизиты;
Для Каждого Реквизит из МетаданныеДокумента Цикл
Сообщить(Реквизит.Имя);
КонецЦикла;

Я так понимаю здесь идет обращение к конкретному документу?


Цитата: Bitaxa от 02 мар 2018, 18:36информация, содержащиеся в выбранном документе, должна выгрузиться в указанный файл txt

ТекстДляЗаписи = Новый ТекстовыйДокумент;
Документ = Документы.РеализацияТоваровУслуг.ПустаяСсылка();
МетаданныеДокумента = Документ.Метаданные().Реквизиты;
Для Каждого Реквизит из МетаданныеДокумента Цикл
ТекстДляЗаписи.ДобавитьСтроку("" + Реквизит.Имя + ":" + Документ[Реквизит.Имя]);
КонецЦикла;
ТекстДляЗаписи.Записать("C:test.txt");

Чо еще надо то?


Цитата: AIFrame от 03 мар 2018, 00:25

Цитата: Bitaxa от 02 мар 2018, 18:36информация, содержащиеся в выбранном документе, должна выгрузиться в указанный файл txt

ТекстДляЗаписи = Новый ТекстовыйДокумент;
Документ = Документы.РеализацияТоваровУслуг.ПустаяСсылка();
МетаданныеДокумента = Документ.Метаданные().Реквизиты;
Для Каждого Реквизит из МетаданныеДокумента Цикл
ТекстДляЗаписи.ДобавитьСтроку("" + Реквизит.Имя + ":" + Документ[Реквизит.Имя]);
КонецЦикла;
ТекстДляЗаписи.Записать("C:test.txt");

Чо еще надо то?

Просто не понимаю, здесь для конкретного документа или нет?)
У меня документ выбирается пользователем.

Добавлено: 03 мар 2018, 10:37


Цитата: AIFrame от 03 мар 2018, 00:25

Цитата: Bitaxa от 02 мар 2018, 18:36информация, содержащиеся в выбранном документе, должна выгрузиться в указанный файл txt

ТекстДляЗаписи = Новый ТекстовыйДокумент;
Документ = Документы.РеализацияТоваровУслуг.ПустаяСсылка();
МетаданныеДокумента = Документ.Метаданные().Реквизиты;
Для Каждого Реквизит из МетаданныеДокумента Цикл
ТекстДляЗаписи.ДобавитьСтроку("" + Реквизит.Имя + ":" + Документ[Реквизит.Имя]);
КонецЦикла;
ТекстДляЗаписи.Записать("C:test.txt");

Чо еще надо то?

&НаКлиенте
Процедура Выгрузить(Команда)
ТекстДляЗаписи = Новый ТекстовыйДокумент;
//Документ = Документы.ОказаниеУслуг.ПустаяСсылка();
Документ = ЭтаФорма.Элементы.Документ.ПутьКДанным;

МетаданныеДокумента = Документ.Метаданные().Реквизиты;
Для Каждого  Реквизит из МетаданныеДокумента Цикл
   ТекстДляЗаписи.ДобавитьСтроку(«» + Реквизит.Имя + «:» + Документ[Реквизит.Имя]);
КонецЦикла;
ТекстДляЗаписи.Записать(«C:test.txt»)
КонецПроцедуры

Вот что сделал. Пишет «Свойство недоступно»


Цитата: Bitaxa от 03 мар 2018, 10:06Документ = ЭтаФорма.Элементы.Документ.ПутьКДанным;

Откуда вы такие ужасы вообще берете?

Док = Документ;
Или если это реквизит объекта

Док = Объект.Документ;
Не страдай ерундой.


Откуда вы такие ужасы вообще берете?

Док = Документ;
Или если это реквизит объекта

Док = Объект.Документ;
Не страдай ерундой.
[/quote]
Спасибо)))вот что пишет:{ВнешняяОбработка.ВнешняяОбработка1.Форма.ПерегрузкаДокумента.Форма(9)}: Метод объекта не обнаружен (Метаданные)
МетаданныеДокумента = Док.Метаданные().Реквизиты;




Теги:

  • Форум 1С

  • Форум 1С — ПРЕДПРИЯТИЕ 8.0 8.1 8.2 8.3 8.4

  • Конфигурирование, программирование в 1С Предприятие 8

  • Перебор реквизтов документа

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

Рейтинг@Mail.ru

Rambler's Top100

Поиск

 +1 

   

Распечатать

1С 8.x : Реквизит ~ Перебор реквизитов Формы

Код 1C v 8.х

 //Перебор Основных Реквизитов формы
Для Каждого Рек из ЭтаФорма.Метаданные().Реквизиты Цикл
Сообщить(рек.Имя+" - "+рек.Синоним+" - "+Строка(рек.Тип));
КонецЦикла;
// или так
Для Каждого Рек из Метаданные().Реквизиты Цикл
Сообщить(рек.Имя+" - "+рек.Синоним+" - "+Строка(рек.Тип));
КонецЦикла;

//Реквизиты формы - Надписи, Поля Ввода и т.д
//можно и через ЭтаФорма.ЭлементыФормы
Для Каждого Рек из ЭлементыФормы Цикл
Сообщить(Строка(рек)+" - "+рек.имя);
КонецЦикла;

Перебор реквизитов определенного слоя формы:

Код 1C v 7.x

 Процедура ПриВыбореЗакладки(НомерЗакладки, ЗначениеЗакладки)
ТекущаяСтраница = ЗначениеЗакладки;
Форма.ИспользоватьСлой("Кнопки,"+СокрЛП(ТекущаяСтраница), 2);

Если ТекущаяСтраница="зклдПодписание" Тогда
Для Инд = 1 По Метаданные.Справочник("ДоговораНов").Реквизит() Цикл

Реквизит = Метаданные.Справочник("ДоговораНов").Реквизит(Инд);
Если Форма.ПолучитьАтрибут(Реквизит).Видимость() = 1 Тогда
Форма.ПолучитьАтрибут(Реквизит).Доступность(0);
КонецЕсли;

КонецЦикла;
КонецЕсли;

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

Рекомендовать в новости

Перебор реквизитов ТЧ и все что с этим связано.

Beholder

0

28.04.2012 — 08:10


Всем привет. Возникла задача перебрать реквизиты табличной части документа и по определенному условию сохранить их, например в ТЗ.
Перебрал примерно в таком цикле реквизиты:
Для каждого РеквизитТЧ из Ссылка.Метаданные().ТабличныеЧасти.ТЧ.Реквизиты Цикл
….
КонецЦикла.
Теперь, по идее, нужно сделать вложенный цикл, операцию сравнения и, если реквизит нужный — записать его имя и значение.
Прошу помощи в синтаксисе. Как по имени реквизита тч получить его значение?

Beholder

1

28.04.2012 — 08:23

Всем спасибо, задача решена примерно следующим образом :)
Для каждого РеквизитТЧ из Ссылка.Метаданные().ТабличныеЧасти.ТЧ.Реквизиты Цикл
Сообщить(«РеквизитТЧ — » + РеквизитТЧ.Представление());
Для каждого стр из ТЧ Цикл
Сообщить(Стр[РеквизитТЧ.Имя]);
КонецЦикла;
КонецЦикла;

Viking

2

28.04.2012 — 10:06

а чем «ВыгрузитьКолонки()» не понравилось?

Beholder

3

28.04.2012 — 10:31

(2), у меня есть список реквизитов, которые необходимо контролировать от изменения и писать, в случае изменения в регистр. Это не только реквизиты табличной части, но и реквизиты шапки. ПОэтому просто выгрузитьКолонки() ниче не даст.

Код 1C v 8.х

 //Перебор Основных Реквизитов формы
      
Для Каждого Рек из ЭтаФорма.Метаданные().Реквизиты Цикл
Сообщить(рек.Имя+" - "+рек.Синоним+" - "+Строка(рек.Тип));
КонецЦикла;
// или так
Для Каждого Рек из Метаданные().Реквизиты Цикл
Сообщить(рек.Имя+" - "+рек.Синоним+" - "+Строка(рек.Тип));
КонецЦикла;

//Реквизиты формы - Надписи, Поля Ввода и т.д
//можно и через ЭтаФорма.ЭлементыФормы
Для Каждого Рек из ЭлементыФормы Цикл
Сообщить(Строка(рек)+" - "+рек.имя);
КонецЦикла;

Код 1C v 7.x

 //функция создаёт список реквизитов документа
      
Процедура гСписокРеквизитовДокумента(Список,Документ,ФлагПредставление=0) Экспорт
//Шапка
Для i=1 По Метаданные.Документ(Документ).РеквизитШапки() Цикл
Ж=Метаданные.Документ(Документ).РеквизитШапки(i);
Если ФлагПредставление=0 Тогда
Представление=Ж.Идентификатор;
Иначе
Представление=Ж.Представление();
КонецЕсли;
Список.ДобавитьЗначение(Ж.Идентификатор,"Ш: "+Представление);
КонецЦикла;
//Табличная часть
Для i=1 По Метаданные.Документ(Документ).РеквизитТабличнойЧасти() Цикл
Ж=Метаданные.Документ(Документ).РеквизитТабличнойЧасти(i);
Если ФлагПредставление=0 Тогда
Представление=Ж.Идентификатор;
Иначе
Представление=Ж.Представление();
КонецЕсли;
Список.ДобавитьЗначение(Ж.Идентификатор,"Т: "+Представление);
КонецЦикла;
//Общие
Для i=1 По Метаданные.ОбщийРеквизитДокумента() Цикл
Ж=Метаданные.ОбщийРеквизитДокумента(i);
Если ФлагПредставление=0 Тогда
Представление=Ж.Идентификатор;
Иначе
Представление=Ж.Представление();
КонецЕсли;
Список.ДобавитьЗначение(Ж.Идентификатор,"О: "+Представление);
КонецЦикла;
КонецПроцедуры

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

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

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

Подписаться

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

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

Andrey102019

5 / 4 / 1

Регистрация: 21.10.2019

Сообщений: 194

1

Как обойти все реквизиты справочника?

21.11.2019, 16:12. Показов 11896. Ответов 8

Метки 1с 8.3 оф (Все метки)


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

1C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
Процедура КнопкаВыполнитьНажатие(Кнопка)
      МассивОбъектов = Новый Массив; 
МассивОбъектов.Добавить("Документы");
МассивОбъектов.Добавить("Справочники");
 
Для Каждого Элем из МассивОбъектов Цикл
    для Каждого ТекОбъект из Метаданные[Элем] Цикл
        Если СтрДлина(ТекОбъект) > 80 тогда
            Сообщить(ТекОбъект);    
        //что-то делаем
        КонецЕсли;
    КонецЦикла;
КонецЦикла;
    
КонецПроцедуры

Добавлено через 8 минут
видимо вот так можно обойти все реквизиты справочника, но теперь следующий вопрос, как

1C
1
2
3
для Каждого ТекОбъект из Метаданные.Справочники.Номенклатура.Реквизиты Цикл
        а=0;   
    КонецЦикла;

проверить, что текущий ТекОбъект сам является ссылкой из Справочника Номенкалатура?



0



Tklwegsd

Эксперт 1С

841 / 604 / 211

Регистрация: 24.07.2013

Сообщений: 2,101

21.11.2019, 20:28

2

1C
1
ТекОбъект.Тип.СодержитТип(Тип("СправочникСсылка.Номенклатура"))



1



Andrey102019

5 / 4 / 1

Регистрация: 21.10.2019

Сообщений: 194

22.11.2019, 15:03

 [ТС]

3

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

1C
1
2
3
4
5
6
7
8
9
10
11
12
Процедура КнопкаВыполнитьНажатие(Кнопка)
    ТабЗнч= Новый ТаблицаЗначений;
    ТабЗнч.Колонки.Добавить("Объект",,"Объект");
    ТабЗнч.Колонки.Добавить("Реквизит",,"Реквизит");
    ТабЗнч.Колонки.Добавить("Значение",,"Значение");
    Для Каждого ТекОбъект из Метаданные.Справочники.хххххххххххххххххх.Реквизиты Цикл
                Стр=ТабЗнч.Добавить();
            Стр.Объект="ххххххх";
            Стр.Реквизит=ТекОбъект;
            Стр.Значение=Значение(ТекОбъект); //Вот это как то надо иначе???
    КонецЦикла;
КонецПроцедуры

Добавлено через 14 минут
наверно не правильно сформулировал, можно ли выполнить проверку каждого реквизита на вхождение в них части заданной строки?

Добавлено через 8 минут
Наверно можно, если полученный реквизит поместить в запрос подстановкой, где-то такой пример попадался — подстановка параметра в запросе, как часть строки в параметре, как-то так.



0



Модератор

Эксперт 1С

3708 / 2905 / 572

Регистрация: 10.03.2011

Сообщений: 11,442

Записей в блоге: 1

23.11.2019, 02:44

4



0



5 / 4 / 1

Регистрация: 21.10.2019

Сообщений: 194

25.11.2019, 13:07

 [ТС]

5

Цитата
Сообщение от Dethmontt
Посмотреть сообщение

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

Зачем вы меня отправили в мою тему?



0



Модератор

Эксперт 1С

3708 / 2905 / 572

Регистрация: 10.03.2011

Сообщений: 11,442

Записей в блоге: 1

27.11.2019, 00:16

6

Цитата
Сообщение от Andrey102019
Посмотреть сообщение

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

вот так

Цитата
Сообщение от Dethmontt
Посмотреть сообщение

Andrey102019, Как проверить есть ли в реквизитах справочника определенное наименование?

Добавлено через 22 секунды

Цитата
Сообщение от Andrey102019
Посмотреть сообщение

Зачем вы меня отправили в мою тему?

Затем и отправил что вопрос повторяется…



0



5 / 4 / 1

Регистрация: 21.10.2019

Сообщений: 194

27.11.2019, 09:22

 [ТС]

7

Цитата
Сообщение от Dethmontt
Посмотреть сообщение

Затем и отправил что вопрос повторяется…

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



0



Модератор

Эксперт 1С

3708 / 2905 / 572

Регистрация: 10.03.2011

Сообщений: 11,442

Записей в блоге: 1

27.11.2019, 23:24

8

Цитата
Сообщение от Andrey102019
Посмотреть сообщение

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

какой вариант, почему будет огромное время… Ничего не понял



0



5 / 4 / 1

Регистрация: 21.10.2019

Сообщений: 194

28.11.2019, 15:34

 [ТС]

9

Цитата
Сообщение от Dethmontt
Посмотреть сообщение

какой вариант, почему будет огромное время… Ничего не понял

Если в программе проверять вхождение Текущей ссылки в Справочник Номенклатура, по данной функции НайтиПоСсылкам(<СписокСсылок>, <ОбластьПоиска>, <ВключитьОбъекты>, <ИсключитьОбъекты>) Почему может не работать Пример из Синт.пом?, то это займет много времени , близкое к минуте. Извините я кажется сам уже сбился в своих темах где и что спрашивал, из за вашей ссылки на мою же тему —

Цитата
Сообщение от Dethmontt
Посмотреть сообщение

Andrey102019, Как проверить есть ли в реквизитах справочника определенное наименование?

сам уже зациклился.
Сделал просто запрос по нужным реквизитам, получилось время близкое к секунде, возможно этого будет достаточно) Можно закрыть все темы, что бы распутаться.



0



Нужно вытащить все документы в реквизитах  которых есть сылка на справочник номенклатура, сделал так: Для Каждого док из Метаданные.документы Цикл документы выбираются, реквизиты у каждого видны, но как их все перебрать программно чтобы определить где ТипЗнч(сс)=тип(«справочник.ссылка.номенклатура») ?

там почитай — принцип один….

а надо перебрать в уже имеющихся документах? или просто определить какой вид документа имеет реквизит типа Номенклатура и что делать с составными?

Ужоснах. А составные типы что, не учитываем? А табличные части? Тебе вообще зачем это надо?

просто определить какой вид документа имеет реквизит типа Номенклатура

вроде так: ТипНоменклатура = Новый ОписаниеТипов(«СправочникСсылка.Номенклатура»); Для Каждого Док из Метаданные.документы Цикл

о то что нужно, спасибо за помощь

Тэги:

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

Понравилась статья? Поделить с друзьями:

Другие крутые статьи на нашем сайте:

0 0 голоса
Рейтинг статьи
Подписаться
Уведомить о
guest

0 комментариев
Старые
Новые Популярные
Межтекстовые Отзывы
Посмотреть все комментарии