IE2017

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

Администрирование - Чистка базы

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

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

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

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

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

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

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

 

См. также

Комментарии
1. Михаил Семенов (Shaman100M) 1179 11.03.09 19:33 Сейчас в теме
А как код-то раскрасить в новой редакции?
2. Сhe Burashka (CheBurator) 11.03.09 19:39 Сейчас в теме
3. Артур Аюханов (artbear) 877 11.03.09 21:50 Сейчас в теме
Да, идее зачет.

ЗЫ А все-таки те, кто юзает прямые запросы, в т.ч. на 1С++, давно о подобном знают :) и юзают :)
4. Ёпрст (Ёпрст) 1021 12.03.09 10:59 Сейчас в теме
Если создавал на работающей базе, то способ не очень... автора могут и не ставить, в выборке будут документы "левых авторов".. с большой долей вероятности.
5. Ёпрст (Ёпрст) 1021 12.03.09 11:01 Сейчас в теме
с таким же успехом, можно просто было открыть выборку документов через ВыбратьДокументы ...+ обратныйПорядок (а можно и без него)+ условие на начало первого.
6. Михаил Семенов (Shaman100M) 1179 12.03.09 14:35 Сейчас в теме
(4) Создавал на работающей базе, ТиС 9.2, реквизит Автор там есть, да и распространенная методика, если в какой-либо конфигурации для документа есть Автор, то он обычно задается автоматически, по имени пользователя его изменить в диалоге нельзя, ...чтоб он стал левым... только если учойсом... Ну это ж надо постараться пользователю (...он сам ко мне пришел @б.р. ) : "Вот я насоздавал документов тут... и вдобавок изменил в них автора на другого, нельзя ли все вернуть взад" ;)))


(5) если бы все было одной датой, то да. Документы были созданы в разных датах, разных месяцев, при неизвестном периоде перебирать придется все.
7. Михаил Семенов (Shaman100M) 1179 12.03.09 14:37 Сейчас в теме
8. Ёпрст (Ёпрст) 1021 12.03.09 15:37 Сейчас в теме
(6)про разные даты согласен, про разные виды - нет..
ВыбратьДокументы можно по всем видам :)

ГЫ... а если еще один насоздавал обработкой в этот момент ? :)
9. Александр Рытов (Арчибальд) 2660 12.03.09 16:04 Сейчас в теме
Ёпрст, не придирайся. Это полезная идея, а не обработка.
10. Михаил Семенов (Shaman100M) 1179 12.03.09 16:43 Сейчас в теме
(8) ну, примерно прикинуть, сколько документов может создасться за время выполнения этого поиска (работает быстро).
На 10т сделать больше переборов, вполне хватит.
Или занять автора чем нить на это время, чтоб он не мог генерить новые документы, - пусть рядом стоит или сам запускает поиск. ;)
11. Михаил Семенов (Shaman100M) 1179 12.03.09 16:53 Сейчас в теме
+ (10) так и до монитора новых документов недалеко.
12. Валерий Корженко (motogon) 13.03.09 18:43 Сейчас в теме
Вообще б было неплохо, чтоб у админа был такой инструмент, который бы показывал, сколько, кем, когда, как, каких новых введено/проведено из них доков, сколько из них задним числом, сколько изменено/проведено из них, сколько задним числом докво, сколько помечено на удаление доков, можно и справочников по дневно, за промежутки в часах, днях, неделях и т.д. Чтоб видеть, когда кто последовательность сбил, кто менял что-то сегодня "задним" числом, чтоб оперативно реагировать и быть в курсе событий. "Монитор админа" можно назвать.
13. Михаил Семенов (Shaman100M) 1179 16.03.09 08:19 Сейчас в теме
14. Алексей Викторович (Alav) 13 29.03.09 17:09 Сейчас в теме
(6) "... Автор,... обычно задается автоматически, по имени пользователя его изменить в диалоге нельзя,..." - так если "...пользователь насоздавал много новых документов обработкой..." что мешает в этом случае не указывать автора в документах? Это же не 8-ка.
15. Михаил Семенов (Shaman100M) 1179 30.03.09 08:28 Сейчас в теме
(14) Лучше бы что-нибудь мешало. :) Желаю всем, чтоб обработки, запускаемые пользователями, создающие новые объекты, работали корректно и правильно прописывали их реквизиты.

А невыбранный автор, - измени фильтр в функции (фильтр м.б. любой), или просто укажи более точно ПервыйДокумент.
Оставьте свое сообщение