[РЕШЕНО] Групповая обработка всех документов.

Тема в разделе "Конфигурирование на платформе "1С:Предприятие 8"", создана пользователем fenlork, 19 июн 2015.

  1. TopicStarter Overlay
    fenlork
    Offline

    fenlork Опытный в 1С

    Регистрация:
    5 сен 2013
    Сообщения:
    71
    Симпатии:
    0
    Баллы:
    26
    Суть обработки такова -1.Выбрать тип Документа 2..отобрать выбранные документы за период (ДатаНачала/ДатаОкончания). 3. В полученных документах очистить все реквизиты и тч, кроме реквизитов Дата и номер. Суть проблемы что код должен быть универсальным ко всем документам.
    Есть реквизиты: Ссылка на объект-типЗначения(документСсылка) и дачаНач/датаКон , если был бы нужен конкретный док например реализация-то запрос отбора за период выглядел бы так:
    Запрос = Новый Запрос;
    Запрос.Текст =
    "ВЫБРАТЬ
    | РеализацияТоваровУслуг.Ссылка
    |ИЗ
    | Документ.РеализацияТоваровУслуг КАК РеализацияТоваровУслуг
    |ГДЕ
    | (РеализацияТоваровУслуг.Дата МЕЖДУ &ДатаНач И &ДатаКон)";

    Запрос.УстановитьПараметр("ДатаНач",ДатаНач);
    Запрос.УстановитьПараметр("ДатаКон", ДатаКон);
    а как написать запрос чтобы подошел ко всем документам?
    2. По очистке списка документов
    //очищение реквизитов
    тут как то нужно выделить что реквизиты; дата/номер не очищаются.
    Для Каждого Реквизит Из СсылкаНаОбъект.Метаданные().Реквизиты Цикл
    Объект[Реквизит.Имя] = Неопределено;
    КонецЦикла;
    //очищение тч
    Для Каждого ТабличнаяЧасть из СсылкаНаОбъект.Метаданные().ТабличныеЧасти Цикл
    ТабличнаяЧасть.Очистить();
    КонецЦикла;
    заранее спасибо за помощь или просто совет как подступить к делу
  2. alexburn
    Offline

    alexburn Модераторы Команда форума Модератор

    Регистрация:
    5 янв 2009
    Сообщения:
    14.782
    Симпатии:
    509
    Баллы:
    204
    Универсальность - тяжелая штука, много кода придется писать.
  3. TopicStarter Overlay
    fenlork
    Offline

    fenlork Опытный в 1С

    Регистрация:
    5 сен 2013
    Сообщения:
    71
    Симпатии:
    0
    Баллы:
    26
    О, нет..только не это..
  4. nomad_irk
    Offline

    nomad_irk Гуру в 1С

    Регистрация:
    20 окт 2008
    Сообщения:
    7.581
    Симпатии:
    717
    Баллы:
    204
    Ну блин.....По ссылке на документ через метаданные можно узнать его имя, заданное в конфигураторе.
    Код:
    Запрос = Новый Запрос;
    Запрос.Текст =
    "ВЫБРАТЬ
    | Документ.Ссылка
    |ИЗ
    | Документ._Документ КАК Документ
    |ГДЕ
    |Документ.Дата МЕЖДУ &ДатаНач И &ДатаКон";
    
    ТекМетаданные = СсылкаНаДокумент.Метаданные();
    Запрос.Текст = СтрЗаменить(Запрос.Текст, "_Документ", ТекМетаданные.Имя);
    
    Выборка = Запрос.Выполнить.выбрать();
    
    Пока Выборка.Следующий() Цикл
    
    Для Каждого ТекРеквизит Из ТекМетаданные.Реквизиты Цикл
    
    КонецЦикла
    
    Для Каждого ТекТЧ Из ТекМетаданные.ТабилчныеЧасти Цикл
    
    КонецЦикла
    
    КонецЦикла;
    --- Объединение сообщений, 19 июн 2015 ---
    Ну либо все это завернуть в цикл вида:
    Код:
    Для Каждого ТекДокумент Из Метаданные.Документы Цикл
    
    Запрос.Текст = СтрЗаменить(Запрос.Текст, "_Документ", ТекДокумент.Имя);
    ......
    КонецЦикла
    IceBeerG и fenlork нравится это.
  5. TopicStarter Overlay
    fenlork
    Offline

    fenlork Опытный в 1С

    Регистрация:
    5 сен 2013
    Сообщения:
    71
    Симпатии:
    0
    Баллы:
    26
    спасибо, посижу подумаю, поразбираюсь
  6. alexburn
    Offline

    alexburn Модераторы Команда форума Модератор

    Регистрация:
    5 янв 2009
    Сообщения:
    14.782
    Симпатии:
    509
    Баллы:
    204
    И причем у каждого дока есть как одинаковые реквизиты, так и отличающиеся :), ну по наименованию :), и их нужно все обрабатывать:)
  7. nomad_irk
    Offline

    nomad_irk Гуру в 1С

    Регистрация:
    20 окт 2008
    Сообщения:
    7.581
    Симпатии:
    717
    Баллы:
    204
    Дык код обойдет каждый реквизит каждого документа :) Только нужно исключить реквизиты "Дата" и "Номер" из обработки, а то и их затрет :)
  8. TopicStarter Overlay
    fenlork
    Offline

    fenlork Опытный в 1С

    Регистрация:
    5 сен 2013
    Сообщения:
    71
    Симпатии:
    0
    Баллы:
    26
    //Для Каждого ТекРеквизит Из ТекМетаданные.Реквизиты Цикл
    ////ТекРеквизит.Имя=неопределено;
    //КонецЦикла;

    //Для Каждого ТекТЧ Из ТекМетаданные.ТабличныеЧасти Цикл
    // тектч.имя.очистить();
    //тектч.очистить();
    //КонецЦикла
    чего то не получается-очистить
  9. Thelearning
    Offline

    Thelearning Профессионал в 1С Команда форума

    Регистрация:
    9 сен 2010
    Сообщения:
    701
    Симпатии:
    72
    Баллы:
    54
    Код:
    Запрос = Новый Запрос;
    Запрос.Текст =
    "ВЫБРАТЬ
    | Документ.Ссылка
    |ИЗ
    | Документ._Документ КАК Документ
    |ГДЕ
    |Документ.Дата МЕЖДУ &ДатаНач И &ДатаКон";
    
    ТекМетаданные = СсылкаНаДокумент.Метаданные();
    Запрос.Текст = СтрЗаменить(Запрос.Текст, "_Документ", ТекМетаданные.Имя);
    
    Выборка = Запрос.Выполнить.выбрать();
    
    Пока Выборка.Следующий() Цикл
    
    мОбъект = Выборка.Ссылка.ПолучитьОбъект();
    
    Для Каждого ТекРеквизит Из ТекМетаданные.Реквизиты Цикл
      Если ТекРеквизит.Имя = "Номер" ИЛИ ТекРеквизит.Имя = "Дата" Тогда
          Продолжить;
       КонецЕсли;
       мОбъект[ТекРеквизит.Имя] = Неопределено;
    КонецЦикла
    
    Для Каждого ТекТЧ Из ТекМетаданные.ТабличныеЧасти Цикл
      мОбъект[ТекТЧ.Имя].Очистить();
    КонецЦикла
    
    Попытка
       мОбъект.Записать();
    Исключение
       Сообщить(ОписаниеОшибки());
    КонецПопытки;
    
    КонецЦикла;
    Вроде вот так.
  10. TopicStarter Overlay
    fenlork
    Offline

    fenlork Опытный в 1С

    Регистрация:
    5 сен 2013
    Сообщения:
    71
    Симпатии:
    0
    Баллы:
    26
    мОбъект = Выборка.ссылка.ПолучитьОбъект();
    Заработало. Спасибо за помощь

Поделиться этой страницей