gifts2017

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

Опубликовал Михаил Семенов (Shaman100M) в раздел Администрирование - Чистка базы

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

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

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

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

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

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

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

 

См. также

Подписаться Добавить вознаграждение

Комментарии

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

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


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

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

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