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


1С:Предприятие ::

Метки: 

Выборка не первых записей из ТЗ

Я
   Cоляпсус
 
08.12.17 - 10:40
Здравствуйте, снова вынужден спросить совета
Есть обработка, которая делает корректировки регистров,создавая документы корректировки, по просьбе заказчика в целях оптимизации работы этой обработки, чтобы не нагружать систему, необходимо создавать документы не более (предположим) 200 записей. Предположим, что получается документ с 230 записями. Тем самым необходимо бить 200 записей создавать документ и создавать новый документ с оставшимися 30-ю записями. обработка делает различные действия и создаёт необходимую ТЗ из которой потом создаются док. ТЗ соответственно содержит 230 записей.Как отобрать первые 200 с внешней &ТЗ запросом, это понятно, но вот в чём встал вопрос как отобрать остальные 30 этой же ТЗ и создать новый документ. Не могу понять как бы мне задать условия отбора, если в принципе наверное я могу отобраться по индексу или как-то ещё. Других полей на которые можно было бы опереться не вижу
Заранее благодарен
 
 
   Cоляпсус
 
1 - 08.12.17 - 10:44
В конструкторе есть поле индекс, но честно не знаю как оно работает
   Cоляпсус
 
2 - 08.12.17 - 10:45
*вкладка индекс
   hhhh
 
3 - 08.12.17 - 10:51
(1) ну типа

ГДЕ
   НомерСтроки > 200
   Cоляпсус
 
4 - 08.12.17 - 11:07
(3) А увидит он НомерСтроки или ругнётся на него, явного же такого поля нет. И как я понял это надо делать вторым запросом? Сначала запрос до 200 создать документ, потом снова туда же запрос >200 создать документ? Или всё можно описать в рамках одного запроса?
   hhhh
 
5 - 08.12.17 - 11:29
(4) ну есть же такое поле у тз
   Ц_У
 
6 - 08.12.17 - 11:31
(4) выбрать первые 200 отсортировать в обратную сторону, вбрать первые 200 :)
   Ц_У
 
7 - 08.12.17 - 11:34
выбрать строка из тз где строка не в (выбрать первые 200 из тз)
   Рэйв
 
8 - 08.12.17 - 11:34
(0)А зачем тебе именно запросом?ВСе равно же строки потом перебирать чтобы движения делать.
Выбирай первые 200 и удаляй их. Потом оставшиеся 30
   Cоляпсус
 
9 - 08.12.17 - 11:34
(5) у ТЗ есть вот такие поля:
http://pastenow.ru/803ffb5eb768631f5feade5bbf75a608
есть конечно поле индекс, но как в запросе к нему обратиться? А других полей к чему прицепиться не вижу((
   Lama12
 
10 - 08.12.17 - 11:37
(0) Посмотри как расчет себестоимости в УПП работает. Там это реализовано.
 
 Рекламное место пустует
   Cоляпсус
 
11 - 08.12.17 - 11:39
(8) Ну запросом же типа оптимизированей))
Можно и не запросом, но вот думаю, а можно ли это с запросом реализовать?
   Cоляпсус
 
12 - 08.12.17 - 11:40
(10) Нет УПП к сожалению
   Рэйв
 
13 - 08.12.17 - 11:43
(11)Любой инструмент нужно применять с умом.
Тебе вообще делить ТЗ необязательно.Поставь счетчик и перебирай ее.
Как только счетчик=200 записывай документ с движениями и создавай новый
   Cоляпсус
 
14 - 08.12.17 - 11:45
(8) Ну да можно конечно реализовать это через Для Индекс= сначала 200, создать док, потом Для Индекс = от 200 до граница, создать док. Хотел малой кровью обойтись (через запрос), но не придумал как отобрать записи после 200-тых.... а жаль)
   Рэйв
 
15 - 08.12.17 - 11:46
(14)легко реализуется как в (13), только еще счетчик надо обнулять
   Рэйв
 
16 - 08.12.17 - 11:47
или
Если Счетчик%200=0 Тогда...

:-)
   Ц_У
 
17 - 08.12.17 - 11:47
(14) а (7) тебе чем не подходит?
   Cоляпсус
 
18 - 08.12.17 - 11:50
(16) уж не знаю корректно ли это в рамках соблюдения правил этики написания кода ,сначала запросом выбрать, а второй раз через цикл и как это влияет на производительность.
а через обнуление счётчика конечно попробую. Спасибо за совет. Только подумаю как это пишется ))
   Cоляпсус
 
19 - 08.12.17 - 11:51
(17) Не совсем понял как это кодом реализовать, "выбрать не" пробовал с самого начала, синтаксическая ошибка говорит
   Ц_У
 
20 - 08.12.17 - 11:53
(19) ВЫБРАТЬ
    ТЗ.НомерСтроки КАК НомерСтроки
ИЗ
    &ТЗ КАК ТЗ
ГДЕ
    НЕ ТЗ.НомерСтроки В
                (ВЫБРАТЬ ПЕРВЫЕ 200
                    ТЗ.НомерСтроки
                ИЗ
                    &ТЗ КАК ТЗ)
   Табуретко
 
21 - 08.12.17 - 11:55
(20) угу а как у него запрос на 430 строк сработает, тогда что?
   Ц_У
 
22 - 08.12.17 - 11:56
(21) рекурсия
   Табуретко
 
23 - 08.12.17 - 11:56
(0) делайте как в (13) и не изобретайте лесепеды
   Ц_У
 
24 - 08.12.17 - 11:58
Порция = 200;
КоличествоПорций = Цел(ТЗ.Количество()/Порция);
И запрос в цикле, ну а что делать, раз надо :)
   Cоляпсус
 
25 - 08.12.17 - 12:03
(23) Да с учётом что записей может быть разное количество, хотя если брать реальный запрос заказчика, что записей нужно 5000 и делать новый док, вряд ли записей случится (во всяком случае на той базе), например 13000 записей, но полностью с Вами согласен, этот вариант надо предусмотреть и сделать с обнулением счётчика...++
   Рэйв
 
26 - 08.12.17 - 12:04
(18)>>Только подумаю как это пишется ))

//-------

Что там думать то?:-)
Док=Документы.Твой.СоздатьДокумент();
Сч-0;
Для Каждого Стр из ТЗ Цикл
    //добавляешь движение по Стр

    Если Сч=200 Тогда 
        Док.Записать(РежимЗаписиДокумента.Проведение);
        Сч=0
        Док=Документы.Твой.СоздатьДокумент();
    КонецЕсли;
Конеццикла;
Если Сч>0 Тогда
    Док.Записать(РежимЗаписиДокумента.Проведение);
КонецЕсли;
   Рэйв
 
27 - 08.12.17 - 12:05
*Сч-0; -> Сч=0;
   catena
 
28 - 08.12.17 - 12:06
(26)Еще счетчик увеличить внутри цикла.
   Рэйв
 
29 - 08.12.17 - 12:06
+еще забыл:-)

в цикле 
Сч=Сч+1;
   Рэйв
 
30 - 08.12.17 - 12:07
(28)Да, точно:-)
   Ц_У
 
31 - 08.12.17 - 12:08
(26) (28) и руки вырвать :)
   Рэйв
 
32 - 08.12.17 - 12:09
(31)За что это?
А то запросом будет оптимальнее,ага...
   Ц_У
 
33 - 08.12.17 - 12:10
(32) 200 раз перепроводить документ - вон из профессии
 
 
   Рэйв
 
34 - 08.12.17 - 12:11
(33)С хрена ли 200 раз? Внимательно прочитай код прежде чем вонкать:-)
   Табуретко
 
35 - 08.12.17 - 12:12
и где он 200 раз проводит?
   Ц_У
 
36 - 08.12.17 - 12:12
(34) уговорил :) пустой документ на 200
   Табуретко
 
37 - 08.12.17 - 12:12
руки тока подкорректировать чтоб код полностью сразу писал, без правки...
   Рэйв
 
38 - 08.12.17 - 12:14
(36)Еще раз внимательно прочитай последние 3 строки:-)
   catena
 
39 - 08.12.17 - 12:15
Так руки или глаза?)))
   Рэйв
 
40 - 08.12.17 - 12:15
(37)Много вас тут корректировщиков:-)
Сами так же все пишите.Так что нечего тут:-)
   Табуретко
 
41 - 08.12.17 - 12:17
(39) одному руки, другому глаза...
   Рэйв
 
42 - 08.12.17 - 12:18
(41)а тебе губу..:-))
   Табуретко
 
43 - 08.12.17 - 12:21
(42)???
   Рэйв
 
44 - 08.12.17 - 12:22
(43)....закатать обратно:-)
   3achem
 
45 - 08.12.17 - 12:24
(25) Делаешь нумерацию в запросе (наростающим итогом), потом выводишь по диапозонам.
Про сч = сч + 1 забудь как про страшный сон
   Cоляпсус
 
46 - 08.12.17 - 12:33
Запрос = Новый Запрос;
    Запрос.Текст = 
        "ВЫБРАТЬ
        |    МояТЗ.ВидДвижения КАК ВидДвижения,
        |    МояТЗ.ИнвентарныйНомер КАК ИнвентарныйНомер,
        |    МояТЗ.Количество,
        |    МояТЗ.Организация,
        |    МояТЗ.ОсновноеСредство,
        |    МояТЗ.Подразделение,
        |    МояТЗ.Стоимость,
        |    МояТЗ.ЦМО,
        |    МояТЗ.ЭтоСписание
        |ПОМЕСТИТЬ ВТ
        |ИЗ
        |    &МояТЗ КАК МояТЗ
        |ГДЕ
        |    НЕ МояТЗ.НомерСтроки В
        |                (ВЫБРАТЬ ПЕРВЫЕ 200
        |                    МояТЗ.НомерСтроки
        |                ИЗ
        |                    &МояТЗ КАК ТЗ)
        |;
        |
        ////////////////////////////////////////////////////////////////////////////////

        |ВЫБРАТЬ
        |    ВТ.ВидДвижения,
        |    ВТ.ИнвентарныйНомер,
        |    ВТ.Количество,
        |    ВТ.Организация,
        |    ВТ.ОсновноеСредство,
        |    ВТ.Подразделение,
        |    ВТ.Стоимость,
        |    ВТ.ЦМО,
        |    ВТ.ЭтоСписание
        |ИЗ
        |    ВТ КАК ВТ";
    
    Запрос.Параметры.Вставить("МояТЗ", МояТЗ1);
    ТЗ30 = Запрос.Выполнить().Выгрузить();
     
    СоздатьДокументКорректировки("СтоимостьОбъектовОС", ТЗ30);
   Cоляпсус
 
47 - 08.12.17 - 12:33
Ругнулся,что данные можно передать только во временную таблицу, наверное это где условия я ошибся?
   Рэйв
 
48 - 08.12.17 - 12:37
"Мыши пищали, кололись, но продолжали есть кактус."(С)
   Ц_У
 
49 - 08.12.17 - 12:37
(47) сначала все в ВТ потом уже обрабатывай
 
 Рекламное место пустует
   Ц_У
 
50 - 08.12.17 - 12:38
(48) циклом любой сможет, а ты запросом дерни :)
   Cоляпсус
 
51 - 08.12.17 - 12:39
ааа, сейчас поправлю)
   Рэйв
 
52 - 08.12.17 - 12:40
(50)Только один вопрос - Зачем?:-)
   Cоляпсус
 
53 - 08.12.17 - 12:45
НомераСтроки то нет же, он и не хочет
   Cоляпсус
 
54 - 08.12.17 - 15:47
(26) Где-то цикл в цикле забыли)
   Cоляпсус
 
55 - 08.12.17 - 15:48
Отвлекли меня от написания рабочего кода, продолжу)
   Cоляпсус
 
56 - 08.12.17 - 16:00
Запросом не получится или не получается. нет поля к которому можно было бы привязаться.
Через цикл что-то запутался, никак не выходит.
Вычитал, что это можно сделать рекурсивно, но не знаком с теорией как это реализовать
   Cоляпсус
 
57 - 08.12.17 - 16:02
(45) Что имели ввиду?
   Cоляпсус
 
58 - 08.12.17 - 16:07
МояТЗ = Новый ТаблицаЗначений;    
        МояТЗ = Данные.Скопировать();
        Индекс = 0;
             Для Индекс = 0 По 100 Цикл

            НоваяСтрока = МояТЗ.Добавить();
            ЗаполнитьЗначенияСвойств(НоваяСтрока, Данные[Индекс]);
            Индекс=Индекс+1;
            Если Индекс=100 Тогда 
            СоздатьДокументКорректировки("СтоимостьОбъектовОС", МояТЗ);
                Индекс=0
            КонецЕсли;
        Конеццикла;
        Если Индекс>0 Тогда
            СоздатьДокументКорректировки("СтоимостьОбъектовОС", МояТЗ);
        КонецЕсли;
   Cоляпсус
 
59 - 08.12.17 - 16:08
Подскажите пожалуйста, где собака порылась?
Спасибо
Большое
   Табуретко
 
60 - 08.12.17 - 16:12
Данные[Индекс]
   Табуретко
 
61 - 08.12.17 - 16:13
а по ходу тут все не так...
   Табуретко
 
62 - 08.12.17 - 16:15
тебе предлагали заполнять ТЧ документа в цикле с счетчиком, а ты тут с ТЗ чето мудриш...
   Cоляпсус
 
63 - 08.12.17 - 16:15
Да, извините. Так никто мне не сможет помочь. НЕ полные данные предоставил.
Данные - это исходная ТЗ состоящая из 230 строк
Поэтому и прошу помощи
   Cоляпсус
 
64 - 08.12.17 - 16:16
А так нельзя?
   Табуретко
 
65 - 08.12.17 - 16:17
покажи лучше СоздатьДокументКорректировки
   Cоляпсус
 
66 - 08.12.17 - 16:18
Не совсем понял, что показать?
   Табуретко
 
67 - 08.12.17 - 16:18
процедуру СоздатьДокументКорректировки()
   Cоляпсус
 
68 - 08.12.17 - 16:19
Процедура СоздатьДокументКорректировки(ИмяРегистра, Данные)
    
    Если Данные.Количество() = 0 Тогда
        //ОбщегоНазначенияКлиентСервер.СообщитьПользователю("Расхождений по " + ?(ИмяРегистра = "СтоимостьОбъектовОС", "стоимости", "амортизации") + " не обнаружено");

        Возврат;
    КонецЕсли;
    
    Если Данные.Количество() > 100000 Тогда
        ОбщегоНазначенияКлиентСервер.СообщитьПользователю("Количество строк превышает 100000. Запись невозможна");
        Возврат;
    КонецЕсли;
    
    ДатаДвижений = КонецДня(ДатаСведения);
    
    Док = Документы.КорректировкаРегистров.СоздатьДокумент();
    Док.Организация = Организация;
    Док.Дата = ДатаДвижений;
    Док.УстановитьНовыйНомер();        
    Док.Комментарий = ИмяРегистра + " | документ создан автоматически | " + Формат(ТекущаяДата(), "ДЛФ=D");
        
    Таблица = Док.ТаблицаРегистровНакопления.Добавить();
    Таблица.Имя = ИмяРегистра;
    
    ОбновлениеИнформационнойБазы.ЗаписатьОбъект(Док);
        
    НаборЗаписей = РегистрыНакопления[ИмяРегистра].СоздатьНаборЗаписей();
    НаборЗаписей.Отбор.Регистратор.Установить(Док.Ссылка);
    
    Данные.Колонки.Добавить("Период");
    Данные.ЗаполнитьЗначения(ДатаДвижений, "Период");    
    НаборЗаписей.Загрузить(Данные);
        
    ОбновлениеИнформационнойБазы.ЗаписатьНаборЗаписей(НаборЗаписей);
    
    ДокументыСведения.Добавить(Док.Ссылка);
    
КонецПроцедуры
   Табуретко
 
69 - 08.12.17 - 16:19
здесь оставляеш тока СоздатьДокументКорректировки("СтоимостьОбъектовОС", Данные);
   Cоляпсус
 
70 - 08.12.17 - 16:22
простите за ...
здесь это где?
   Табуретко
 
71 - 08.12.17 - 16:24
там откуда вызываеш эту процедуру...
   Cоляпсус
 
72 - 08.12.17 - 16:27
понял
а в эту процедуру вставить код со счётчиком?
   Cоляпсус
 
73 - 08.12.17 - 16:30
А в данной процедуре может как раз и встроить счётчик, что если Данные >= столько строкам, то создать первый док? Потом обнулить счётчик и дописать оставшиеся строки?
Может не прав...
   1Садовник
 
74 - 08.12.17 - 16:31
(58) Вначале копируешь "Данные" в "МояТЗ" - Зачем?
В цикле добавляешь в "МояТЗ" еще 50 строк из "Данные".
После создания документа, "МояТЗ" очищается?
Зачем в этом цикле "Индекс = Индекс + 1" ?
   Cоляпсус
 
75 - 08.12.17 - 16:33
Согласен не прав
   Cоляпсус
 
76 - 08.12.17 - 16:38
(74) Это я неудачно экспериментировал, пытаясь понять почему стоки добавляет, а колонки не хочет брать из данных, видимо их отдельно надо добавлять
   Табуретко
 
77 - 08.12.17 - 17:05
ок, процедуру СоздатьДокКорректировки не трогаем

за место (58) пишем примерно следующее...
    СчетчикВыгрузки = 0;//обьяви на всякий пожарный

    МассивСтрок = Новый Массив;
    Для каждого Стр Из Данные Цикл
        СчетчикВыгрузки = Стр.Индекс;
        Массив.Добавить(Стр);
        Если СчетчикВыгрузки % 99 = 0 Тогда//помни что индекс начинается с 0

            МояТЗ = Данные.Скопировать(МассивСтрок);
            СоздатьДокументКорректировки("СтоимостьОбъектовОС", МояТЗ);    
            МассивСтрок.Очистить();
        КонецЕсли;        
    КонецЦикла; 
    
    Если СчетчикВыгрузки % 99 <> 0 Тогда
        МояТЗ = Данные.Скопировать(МассивСтрок);
        СоздатьДокументКорректировки("СтоимостьОбъектовОС", МояТЗ);    
    КонецЕсли;
   Табуретко
 
78 - 08.12.17 - 17:17
сорь Массив.Добавить(Стр); --> МассивСтрок.Добавить(Стр);
   Табуретко
 
79 - 08.12.17 - 17:28
или даже так...

    МассивСтрок = Новый Массив;
    Для каждого Стр Из Данные Цикл
        МассивСтрок.Добавить(Стр);
        Если МассивСтрок.Количество() % 100 = 0 Тогда 
            МояТЗ = Данные.Скопировать(МассивСтрок);
            СоздатьДокументКорректировки("СтоимостьОбъектовОС", МояТЗ);    
            МассивСтрок.Очистить();
        КонецЕсли;        
    КонецЦикла; 
    
    Если МассивСтрок.Количество() % 100 <> 0 Тогда
        МояТЗ = Данные.Скопировать(МассивСтрок);
        СоздатьДокументКорректировки("СтоимостьОбъектовОС", МояТЗ);    
    КонецЕсли;
   Cоляпсус
 
80 - 08.12.17 - 17:33
(78) Да это я видел, понимаю машинально.
спасибо, почему сам никак не до пру((
(79) Наверное (ещё не проверил) будет правильнее, а то
СчетчикВыгрузки = Стр.Индекс; - говорит что Индекс ему не нравится, поле объекта не обнаружено
   Cоляпсус
 
81 - 08.12.17 - 17:34
(79) ещё раз спасибо, самому стыдно)))
   Табуретко
 
82 - 08.12.17 - 17:37
работает хоть?
   Cоляпсус
 
83 - 08.12.17 - 17:38
Проверяю
   Cоляпсус
 
84 - 08.12.17 - 17:50
Теоретически работает, проверить до конца пока не могу, потому что при создании документа ругается на поле период в Процедура СоздатьДокументКорректировки(ИмяРегистра, Данные)
Придётся с этим разбираться, приходится править. Но с этой обработкой так и происходит, вставляешь действие на что-то ругается. Уже всё поправил, два пункта только остались, но вот на них и встрял.
Наверное правильнее будет в самой процедуре код внести на ограничение записей, хотя не уверен, буду разбираться
спасибо ещё раз
   Cоляпсус
 
85 - 08.12.17 - 17:51
Обработка не моя, написанная фрилансирами, как то вроде давно
   Cоляпсус
 
86 - 08.12.17 - 17:51
(82) Спасибо



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