Вход | Регистрация


1С:Предприятие :: 1С:Предприятие 7.7 и ранее

v7: Поиск предыдущего документа

v7: Поиск предыдущего документа
Я
   ДНН
 
17.10.18 - 13:58
Добрый день, коллеги.
1С 7.7.
Нужно найти предыдущий документ по автомобилю и взять из него значение спидометра, зная ссылку на текущий док и автомобиль.
Использую такой код:

Доки = СоздатьОбъект("Документ.ПЛАвтобуса");
Доки.ОбратныйПорядок(1);
Доки.ВыбратьДокументы();
НайденТекущийДокумент = 0;
Пока Доки.ПолучитьДокумент() = 1 Цикл
    ТекДок = Доки.ТекущийДокумент();
    Если ТекДок.Выбран() = 1 Тогда
        Если ТекДок.Проведен() = 0 Тогда
            Продолжить;
        КонецЕсли;    
        Если ТекДок.ПометкаУдаления() = 1 Тогда
            Продолжить;
        КонецЕсли;
        Если ТекДок.Автомобиль <> спрАвтомобиль Тогда
            Продолжить;
        КонецЕсли; 
        Если ТекДок = докПЛ Тогда 
            НайденТекущийДокумент = 1;
            Сообщить("Найден");
            Продолжить;
        КонецЕсли;
        Если НайденТекущийДокумент = 1 Тогда
             пвСпидометрНачальный=ТекДок.СпидометрВозвращения;    
        КонецЕсли;    
    КонецЕсли;    
КонецЦикла;    

Вот это условие Если ТекДок = докПЛ Тогда никогда не бывает истинным. Что делаю не так?
Есть ли более простой способ найти предыдущий документ? Если да, то какой?
Спасибо.
 
 
   Cool_Profi
 
1 - 17.10.18 - 14:00
За использование запросов, я так понимаю, у вас расстреливают?
   ДНН
 
2 - 17.10.18 - 14:03
(1) Предыдущий документов может быть той же датой, что и текущий. Как тогда в запросе делать отбора по дате?
   ДНН
 
3 - 17.10.18 - 14:04
(1) Основной вопрос почему вот это Если ТекДок = докПЛ Тогда никогда не бывает истинным.
   ДНН
 
4 - 17.10.18 - 14:04
(1) в отладчике пишет "Ошибка в выражении"
   lubitelxml
 
5 - 17.10.18 - 14:06
в ДокПЛ что у тебя?
   ДНН
 
6 - 17.10.18 - 14:07
(5) ссылка на документ типа Документ.ПЛАвтобуса, в отладчике корректно показывает. Это реквизит на форме
   1Сергей
 
7 - 17.10.18 - 14:13
(6) попробуй докПЛ.ТекущийДокумент()
   ДНН
 
8 - 17.10.18 - 14:18
Разобрался. Текущий документ не был проведен, поэтому не находился.
   ДНН
 
9 - 17.10.18 - 14:18
Всем спасибо
   АгентБезопаснойНацио
 
10 - 17.10.18 - 14:18
(1) похоже, за чтение СП тоже.
 
 Рекламное место пустует
   1Сергей
 
11 - 17.10.18 - 14:19
(10) черный запрос в данном случае будет медленнее. По крайней мере, не быстрее
   АгентБезопаснойНацио
 
12 - 17.10.18 - 14:20
(9) не уходи. объясни, пожалуйста, мне, скудоумному, смысл конструкции
пока Доки.ПолучитьДокумент() = 1 Цикл
    ТекДок = Доки.ТекущийДокумент();
    Если ТекДок.Выбран() = 1 Тогда
   АгентБезопаснойНацио
 
13 - 17.10.18 - 14:21
(11) УстановитьФильтр() тоже критически замедляет работу?
   1Сергей
 
14 - 17.10.18 - 14:24
(13) это нет
   АгентБезопаснойНацио
 
15 - 17.10.18 - 14:25
(14) а ВыбратьПоЗначению() запрещено под страхом уголовного наказания?
но меня больше интересует (12). ТКВ...
   АгентБезопаснойНацио
 
16 - 17.10.18 - 14:32
по идее, задача решается ровно в четыре строчки.
а автор темы сбежал, оставив меня в неведеньи...
   ADirks
 
17 - 17.10.18 - 14:33
(15) шобы тормозило эффективнее
   uno-group
 
18 - 17.10.18 - 14:49
В Доки.ВыбратьДокументы(); не мешало бы даты прописать.
хотя бы как то так
Доки.ВыбратьДокументы(ТекДок.ДатаДок-30,ТекДок);
Если вдруг на скл решиш базу перевести конструкции без дат тормозить будут страшно.
   АгентБезопаснойНацио
 
19 - 17.10.18 - 14:51
(18) вообще-то, лучше позицию.
   ДНН
 
20 - 17.10.18 - 16:15
(12) Данная конструкция была скопирована из интернета.
Я понимаю ее так:
пока Доки.ПолучитьДокумент() = 1 Цикл - выборка документов
ТекДок = Доки.ТекущийДокумент() - в переменную ТекДок  сохраняется текущий документ выборки
Если ТекДок.Выбран() = 1 Тогда - если текущий документ выбран, то есть это не пустая ссылка, то ... Видимо для того, чтобы при обращении к реквизитам через точку не было ошибки "Элемент не выбран". Допускаю, что при выборки документов через "ВыбратьДокументы()" такии ситуации исключаются, но я в семерке программирую 2 раза в год. Работает и ладно.
   ДНН
 
21 - 17.10.18 - 16:16
(16) я тебе ответил, теперь ты мне, скудоумному, напиши те самые 4 строчки
   ДНН
 
22 - 17.10.18 - 16:24
почему при копировании кода из текстового документа в модуль все буквы копируются как знак вопроса?
   ДНН
 
23 - 17.10.18 - 16:25
*вставляются
   uno-group
 
24 - 17.10.18 - 16:27
(12) ИМХО откуда-то скопированные условия проверяющие, что в доке автомобиль и т.п. Где в ТекДок мог содержаться еще не записанный документ. Чтобы не менять во всем коде
ТекДок на доки сделали присвоение и код вообще не правили от лишнего. работает да и бог с ним.
   uno-group
 
25 - 17.10.18 - 16:29
языки при копирование не совподают делай руский в обеих програмах
   АгентБезопаснойНацио
 
26 - 17.10.18 - 16:36
(20) т.е. думать - запрещено?
откуда в выборке документов возьмется "пустая ссылка"?
----------------
Док=создатьОбъект("Документ.ПЛ");
Док.ОбратныйПорядок(1);
Док.ВыбратьПоЗначению(,СформироватьПозициюДокумента(ТекДок,-1),"Автомобиль",Текдок) 
Док.ПолучитьДокумент();

(только надо предварительно создать графу отбора по автомобилю)
   АгентБезопаснойНацио
 
27 - 17.10.18 - 16:39
может, в третьей строке в последних двух параметрах порядком  ошибся - лень проверять.
ну и первый можно добавить для уменьщнения выборки. зависит от гдубины, на которой точно есть предыдущий документ
   АгентБезопаснойНацио
 
28 - 17.10.18 - 16:41
(24) "но как, Холмс?"©
   АгентБезопаснойНацио
 
29 - 17.10.18 - 16:45
+(26) да, конечно же забыл 
третью строчку 
Док.УстановитьФильтр(Тут_параметы_которые_надо_прочитать_в_СП);
   uno-group
 
30 - 17.10.18 - 16:57
Док=создатьОбъект("Документ")
Выбрать по значению не работает ко конкретному виду документов и фильтра никакого не надо вы его "ВыбратьПоЗначению" устанавливаете.
   АгентБезопаснойНацио
 
31 - 17.10.18 - 16:58
(30) Фильтр надо, чтоб только проведенные...
   Эльниньо
 
32 - 18.10.18 - 11:32
(16) Ну это ты загнул. Пять строчек, не менее
   Харлампий Дымба
 
33 - 18.10.18 - 13:40
(32) Точно загнул. Три, не более!

Док=СоздатьОбъект("Документ");
Док.УстановитьФильтр(1,0);
Ноль=?(Док.ОбратныйПорядок(1)=0,?(Док.ВыбратьПоЗначению('01.01.1980',СформироватьПозициюДокумента(ДокПЛ.ТекущийДокумент(),-1),"ИмяГрафыОтбораПоАвтобусам",спрАвтомобиль.ТекущийЭлемент())=1,?(Док.ПолучитьДокумент()=1,0,0),0),0);
 
 
   Случайный прохожий
 
34 - 18.10.18 - 13:48
Может правильнее данные по спидометрам поместить в регистр сведений? И не придется каждый раз так извращаться? :)
   Харлампий Дымба
 
35 - 18.10.18 - 13:58
(34) Уйди мальчик, не мешай. Тут маститые семёрочники собрались. У нас регистра сведений
нет, мы каждый раз извращемся.
+(33) Про спидометр же я забыл - третья строчка такая
пвСпидометрНачальный=?(Док.ОбратныйПорядок(1)=0,?(Док.ВыбратьПоЗначению('01.01.1980',СформироватьПозициюДокумента(ДокПЛ.ТекущийДокумент(),-1),"ИмяГрафыОтбораПоАвтобусам",спрАвтомобиль.ТекущийЭлемент())=1,?(Док.ПолучитьДокумент()=1,Док.СпидометрВозвращения,0),0),0);
   Дмитрий
 
36 - 18.10.18 - 14:04
(35)  В периодический реквизит можно
   АгентБезопаснойНацио
 
37 - 18.10.18 - 14:55
(35)"тоже вариант!"©ёжик :-)
   Базис
 
38 - 18.10.18 - 15:45
(36) Не надо без крайней необходимости использовать в 77 периодику. А вот регистр "пробег", в нём отбор по автобусу - будет правильно.
   Харлампий Дымба
 
39 - 18.10.18 - 16:31
(38) Ну, скажем компонента "Оперативный учет" не у всех есть. Может у ТС автобусы к зарплате прикручены или к бухгалтерии.
В случае периодического реквизита:
1 строка в модуле проведения (УстановитьРеквизитСправочника(СпрАвтомобиль.ТекущийЭлемент(),"ЗначениеОдометра",ТекущееЗначениеОдометра)), у нас же всё-таки одометр, верно?
1 строка для получения значения (СпрАвтомобиль.ЗначениеОдометра.Получить(ТекДок));
А с регистрами что-то как-то ну совсем не очень...
   Эльниньо
 
40 - 18.10.18 - 17:53
(35) "У нас регистра сведений нет...
Делов то. Создай Справочник.РегистрСведений и наслаждайся
   Kigo_Kigo
 
41 - 18.10.18 - 19:01
(39) Ога ога, и 1сКонст будет пухнуть и пухнуть, потом переодику чистить
(38) только по идее это будет тоже не закрывающийся регистр
Имхо - оптимально- справочник
   Харлампий Дымба
 
42 - 18.10.18 - 22:54
Ребят вы о чём?!
Чем отбор по справочнику будет отличаться от первоначального перебора документов у ТС в (0)? Как без перебора и периодических реквизитов получить из справочника значение по предпоследнему документу, зная только позицию последнего? Нет, я могу это сделать - но это будет тоже самое, что уже есть с документами.
Даже хуже, потому что как сделать вот это:

Док.ВыбратьПоЗначению(,СформироватьПозициюДокумента(ДокПЛ.ТекущийДокумент(),-1),"ИмяГрафыОтбораПоАвтобусам",спрАвтомобиль.ТекущийЭлемент())?
Сделать реквизит "Автобус" с галкой "Сортировка" -  можно сделать ВыбратьЭлементыПоРеквизиту() - а дальше? Как спозиционироваться на нужном документе не нарушив уже установленную выборку? Только перебором.
Сделать реквизит "Документ" - с галкой "Сортировка" - теперь можно спозиционироваться на нужном документе. А как по нему найти предыдущий по этому же автобусу? Опять перебором. А запросом по всему справочнику - ещё дольше, чем перебором, проверено.
И при этом появляется ненужная сущность, которая так и просится под бритву Оккама.

Сколько автобусов должно быть у автора, чтобы один периодический реквизит, даже записываемый каждый день, серьёзно загрузил 1sconst? Если люди годами работают на полутиповом ТиСе с кучей товарных позиций и типов цен к ним? И зачем вообще тогда нужны периодические реквизиты, если ими не пользоваться?

Про регистр я вообще молчу. Если регистр остатков - надо делать две записи сразу, чтобы закрывался. Как получить значение на документ? Если через Рег.Остаток(), тогда надо при проведении документа рассчитывать регистр и писать не текущее значение одометра, а изменение. И делать последовательность и следить за границей этой последовательности, потому как впихнутый между другими документ (или распроведенный) изменит текущий остаток - получится ерунда.
Если оборотный - как тогда получать значение? А если несколько поездок в день, какая периодичность регистра?

Ещё можно прямым запросом...
Или на 8 перевести фирму...

А то 3 строчки как-то сложно, а доли секунды как-то долго.
   АгентБезопаснойНацио
 
43 - 19.10.18 - 07:25
(42) с точки зрения индексов - лучше либо графа отбора, либо  оборотный регистр с "быстрыми движениями". с точки зрения отсутсвия излишеств - эмуляция регистра сведений справочником.
скалярный прямой запрос вообще напрашивается. а можно просто вышеупомянутые "строчки". три их или пять - уже не столь важно...
   Харлампий Дымба
 
44 - 19.10.18 - 22:05
(43) Просто, для своего развития. Допустим, регистр сведений справочником я сделал. Автомобиль, документ (позиция, дата), значение. Ну и любые индексы к нему. Как быстро получить значение предыдущего документа по этому автомобилю?
   palsergeich
 
45 - 19.10.18 - 22:34
(44) Написать запрос.
Поля запроса и условия должны покрываться индексом
   Харлампий Дымба
 
46 - 19.10.18 - 23:19
(45)
1) Зачем тогда городить справочник, если запрос я могу написать сразу к документу "Документ.ПЛАвтобуса"?
2) Запрос, перебирающий все элементы справочника, вместо "открыл выборку, получил предыдущий"? Где ускорение, какой смысл? Какие индексы помогут моему запросу? Мы точно про 7ку говорим, бо в 8ке регистр сведений уже есть и там можно и нужно использовать уже готовое?
   palsergeich
 
47 - 20.10.18 - 00:44
(46) угу признаю, неверно понял задачу в (44)
   АгентБезопаснойНацио
 
48 - 22.10.18 - 08:38
(44) прямым запросом :-)
(46) объем меньше, следовательно, накладные расходы меньше.


Список тем форума
Рекламное место пустует  Рекламное место пустует
ВНИМАНИЕ! Если вы потеряли окно ввода сообщения, нажмите Ctrl-F5 или Ctrl-R или кнопку "Обновить" в браузере.
Рекламное место пустует