Каталог решений - Как найти новые документы автора, в т.ч. созданные программно

Как найти новые документы автора, в т.ч. созданные программно

Как найти новые документы автора, в т.ч. созданные программно

В наличии

Как найти новые документы автора, в т.ч. созданные программно  и не прописанные в журнале регистрации (v77). Передо мной встала такая задача: пользователь создал много новых документов обработкой в разных периодах, а потом захотел сделать откат назад. Делюсь, может кому-нибудь пригодится.

Категория:

Описание

Идея поиска таких документов, в общем, довольно простая: найти первый документ (по реальному времени его создания) пользователя, и, исходя из того, что у созданных позднее документов внутренний идентификатор больше, в цикле увеличиваем его и пробуем найти реальный документ. Напоследок проверяем автора.

Остались тонкости, в частности, использование методов ЗначениеВСтрокуВнутр / ЗначениеИзСтрокиВнутр выделение префикса ИБ и выяснение такого факта, что для позиционирования документа по внутреннему представлению его вид  — неважен.

Функция НайтиНовыеДокументы(ПервыйДокумент)
    
  // начало строки внутр. представления по первому попавшемуся виду документа
  НачалоСтрВнутр = ЗначениеВСтрокуВнутр(ПолучитьПустоеЗначение("Документ." + 

      Метаданные.Документ(1).Идентификатор)); 
  НачалоСтрВнутр = Лев(НачалоСтрВнутр,СтрДлина(НачалоСтрВнутр) - 15); 

  // 13 на ИД, кавычка и скобка }
     
  // выделить ИД и префикс ИБ первого документа
  НачИндекс      = Лев(Прав(ЗначениеВСтрокуВнутр(ПервыйДокумент.ТекущийДокумент()),15),13);
  ПрефиксБазы    = Прав(НачИндекс,3);
  НачИндекс      = Число(Лев(НачИндекс,10));
    
  // найти конечный ИД из нового документа                                             
  НачатьТранзакцию();
  Док            = СоздатьОбъект("Документ." + Метаданные.Документ(1).Идентификатор);
  Док.Новый();
  Док.ДатаДок    = ТекущаяДата();
  Док.АвтоВремяКонецДня();
  Док.Записать();

  КонИндекс      = Число(Лев(Прав(ЗначениеВСтрокуВнутр(Док.ТекущийДокумент()),15),10));
  ОтменитьТранзакцию();
 
  Док            = СоздатьОбъект("Документ");
  СписокДокументов = СоздатьОбъект("СписокЗначений");
  ВсегоНайдено   = 0; 
  ЕстьАвтор      = Метаданные.ОбщийРеквизитДокумента("Автор").Выбран();
 
  Состояние("Найдено : 0");
  Для М1 = НачИндекс По КонИндекс Цикл
    ТекДок = НачалоСтрВнутр + Прав("         " + М1,10) + ПрефиксБазы + """}";
    ТекДок = ЗначениеИзСтрокиВнутр(ТекДок);     
    Если ПустоеЗначение(ТекДок) = 0 Тогда
      Если Док.НайтиДокумент(ТекДок) > 0 Тогда       
        Если ЕстьАвтор = 1 Тогда
          Если Док.Автор <> ПервыйДокумент.Автор Тогда
            Продолжить;
          КонецЕсли;
        КонецЕсли;
        СписокДокументов.ДобавитьЗначение(Док.ТекущийДокумент());
        ВсегоНайдено = ВсегоНайдено + 1;
        Состояние("Найдено : " + ВсегоНайдено);
      КонецЕсли;
    КонецЕсли;
  КонецЦикла;                                             
  Возврат СписокДокументов; // СЗ найденных документов
КонецФункции

 

has been added to your cart:
Оформление заказа