Имя: Пароль:
1C
1С v8
Печать документа с большим количеством строк
0 Маркусс
 
19.11.13
12:11
Добрый день.

В УТ 10.3 В инвентаризации вывожу печатную форму "инв-19".
По факту в документе 900 строк.
Повисает на моменте перебора строки.

Уменьшаю количество до 300-печатается нормально.

Как разрулить?

Спасибо.
1 ДенисЧ
 
19.11.13
12:11
Искать, почему повисает.
2 User_Agronom
 
19.11.13
12:18
Точно подвисает? Может долго какую-то таблицу формирует?
3 Маркусс
 
19.11.13
12:29
(2)Запросом выгребается номер дата склад организация и табличная часть целиком.
Потом из результата запроса из табличной части циклом перебираются строки вот таким макаром:
    Пока ВыборкаСтрокТовары.Следующий() Цикл
после этой строки и повисает намертво.
минут 10 висело точно.
Док из 300 строк формируется секунды за 2
4 User_Agronom
 
19.11.13
12:31
(3) Но потом отвисло?
Замер производительности не предлагать?
5 Маркусс
 
19.11.13
12:32
(4) не отвисло
6 Маркусс
 
19.11.13
12:32
(4) или таки упорно ждать? что-то мне подсказывает, что смысла в этом особого нет
7 Рэйв
 
19.11.13
12:33
Попробуй транзакцию по 300 строк сделать
8 User_Agronom
 
19.11.13
12:34
Поставь в цикл
Сообщить("какая-то фигня"+Выборка.ЛюбоеПоле)
Увидишь идёт цикл или нет
9 Маркусс
 
19.11.13
12:34
кстате база SQL. мож там чего?
10 Маркусс
 
19.11.13
12:36
(8) да не идёт цикл. повисает тут же.
в доке на 300 строк всё как полагается, а тут виснет и всё.
виснет, имею ввиду, и в конфигураторе тоже.
11 User_Agronom
 
19.11.13
12:36
нужно видеть код. Если у тебя цикл в цикле, то с увеличением в 3 раза общее время может увеличиться в 27 раз.
А если три вложенности циклов? Возводи 27 в третью степень сам))
12 anaed
 
19.11.13
12:38
А может одной из строк тч приплохело? Стоит засечь на какой спотыкается строке.
13 Маркусс
 
19.11.13
12:38
Вот запрос
Запрос.Текст =
    "ВЫБРАТЬ
    |    Номер  КАК НомерДокумента,
    |    Дата   КАК ДатаДокумента,
    |    Дата   КАК ДатаНачалаИнвентаризации,
    |    Организация КАК Руководители,
    |    Организация,
    |    Склад.Представление КАК ПредставлениеСклада,
    |    Товары.(
    |        НомерСтроки КАК Номер,
    |        Номенклатура,
    |        Номенклатура.НаименованиеПолное КАК ТоварНаименование,
    |        Номенклатура." + ТоварКод + "   КАК ТоварКод,
    |        ЕдиницаИзмерения.Представление  КАК ЕдиницаИзмеренияНаименование,
    |        ЕдиницаИзмерения.ЕдиницаПоКлассификатору.Код КАК ЕдиницаИзмеренияКодПоОКЕИ,
    |        Количество                     КАК ФактКоличество,
    |        КоличествоУчет                 КАК БухКоличество,
    |        ВЫБОР
    |            КОГДА Склад.ВидСклада = &ВидСкладаНТТ ТОГДА ЦенаВРознице
    |            ИНАЧЕ Цена * &Курс / &Кратность
    |        КОНЕЦ КАК Цена,
    |        ВЫБОР
    |            КОГДА Склад.ВидСклада = &ВидСкладаНТТ ТОГДА Количество * ЦенаВРознице
    |            ИНАЧЕ Сумма * &Курс / &Кратность
    |        КОНЕЦ КАК ФактСумма,
    |        ВЫБОР
    |            КОГДА Склад.ВидСклада = &ВидСкладаНТТ ТОГДА КоличествоУчет *ЦенаВРознице
    |            ИНАЧЕ СуммаУчет * &Курс / &Кратность
    |        КОНЕЦ КАК БухСумма,
    |        ХарактеристикаНоменклатуры     КАК Характеристика,
    |        СерияНоменклатуры КАК Серия
    |    )
    |ИЗ
    |    Документ.ИнвентаризацияТоваровНаСкладе КАК ИнвентаризацияТоваровНаСкладе
    |
    |ГДЕ
    |    ИнвентаризацияТоваровНаСкладе.Ссылка = &ТекущийДокумент
    |УПОРЯДОЧИТЬ ПО
    |    Товары.НомерСтроки";

    Шапка = Запрос.Выполнить().Выбрать();
    Шапка.Следующий();
    ВыборкаСтрокТовары = Шапка.Товары.Выбрать();
14 Маркусс
 
19.11.13
12:39
Вот чего после
    Шапка = Запрос.Выполнить().Выбрать();
    Шапка.Следующий();
    ВыборкаСтрокТовары = Шапка.Товары.Выбрать();

    ТабДокумент = Новый ТабличныйДокумент;
    ТабДокумент.ИмяПараметровПечати = "ПАРАМЕТРЫ_ПЕЧАТИ_ИнвентаризацияТоваровНаСкладе_ИНВ19";
    Макет       = ПолучитьОбщийМакет("ИНВ19");

    // Выводим шапку накладной
    ОбластьМакета = Макет.ПолучитьОбласть("Шапка");
    ОбластьМакета.Параметры.Заполнить(Шапка);
    СведенияОбОрганизации = УправлениеКонтактнойИнформацией.СведенияОЮрФизЛице(Шапка.Организация, Шапка.ДатаДокумента);
    ОбластьМакета.Параметры.ПредставлениеОрганизации = ФормированиеПечатныхФорм.ОписаниеОрганизации(СведенияОбОрганизации);
    ОбластьМакета.Параметры.ОрганизацияПоОКПО        = СведенияОбОрганизации.КодПоОКПО;
    ОбластьМакета.Параметры.ДатаДокумента            = Шапка.ДатаДокумента;
    ОбластьМакета.Параметры.ДатаНачалаИнвентаризации = Шапка.ДатаНачалаИнвентаризации;
    ОбластьМакета.Параметры.НомерДокумента           = ОбщегоНазначения.ПолучитьНомерНаПечать(СсылкаНаОбъект);

    Руководители = РегламентированнаяОтчетность.ОтветственныеЛицаОрганизации(Шапка.Руководители, Шапка.ДатаДокумента,);
    Руководитель = Руководители.Руководитель;
    Бухгалтер    = Руководители.ГлавныйБухгалтер;

    ТабДокумент.Вывести(ОбластьМакета);
    ТабДокумент.ВывестиГоризонтальныйРазделительСтраниц();

    Ном             = 0;
    НомерСтраницы   = 2;

    ИтогоРезультатИзлишекКолво   = 0;
    ИтогоРезультатИзлишекСумма   = 0;
    ИтогоРезультатНедостачаКолво = 0;
    ИтогоРезультатНедостачаСумма = 0;

    // Выводим заголовок таблицы
    ЗаголовокТаблицы = Макет.ПолучитьОбласть("ЗаголовокТаблицы1");
    ЗаголовокТаблицы.Параметры.НомерСтраницы = "Страница " + НомерСтраницы;
    ТабДокумент.Вывести(ЗаголовокТаблицы);

    КоличествоСтрок = ВыборкаСтрокТовары.Количество();

    // Выводим многострочную часть докмента
    ВыборкаСтрокТовары = Шапка.Товары.Выбрать();
    
    // Создаем массив для проверки вывода
    МассивВыводимыхОбластей = Новый Массив;
    
    // Выводим многострочную часть докмента
    ОбластьМакета           = Макет.ПолучитьОбласть("СтрокаТаблицы1");
    ОбластьИтоговПоСтранице = Макет.ПолучитьОбласть("ИтогоТаблицы1");
    ОбластьПодвала          = Макет.ПолучитьОбласть("Подвал");
    Пока ВыборкаСтрокТовары.Следующий() Цикл
///////////////////////////тут виснет
        Если ВыборкаСтрокТовары.Номенклатура = Неопределено Тогда
            Сообщить("В одной из строк не заполнено значение номенклатуры - строка при печати пропущена.", СтатусСообщения.Важное);
            Продолжить;
        КонецЕсли;
15 Маркусс
 
19.11.13
12:41
(12)удалял первые строки-ничего не поменялось
16 User_Agronom
 
19.11.13
12:43
Попробуй так. И скажи на каком й зависло.
ОбластьПодвала          = Макет.ПолучитьОбласть("Подвал");
й= 1;
    Пока ВыборкаСтрокТовары.Следующий() Цикл
Сообщить("счетчик "+й);
й=й+1;
///////////////////////////тут виснет
17 anaed
 
19.11.13
12:47
(15) может до конеццикла по выборке покажешь?
Вместо (16) проще уж сообщать ВыборкаСтрокаТовары.Номер + ВыборкаСтрокаТовары.Номенклатура
18 Маркусс
 
19.11.13
12:47
(16) на первом й
19 Tarnum
 
19.11.13
12:48
Попробуй выгрузить строки в Таблицу значений, а уже её потом перебирать
20 User_Agronom
 
19.11.13
12:49
(18) Комп слабоват? Таблица большая.
21 Маркусс
 
19.11.13
12:50
Пока ВыборкаСтрокТовары.Следующий() Цикл
            
        Если ВыборкаСтрокТовары.Номенклатура = Неопределено Тогда
            Сообщить("В одной из строк не заполнено значение номенклатуры - строка при печати пропущена.", СтатусСообщения.Важное);
            Продолжить;
        КонецЕсли;

        Если НЕ ЗначениеЗаполнено(ВыборкаСтрокТовары.Номенклатура) или ВыборкаСтрокТовары.Номенклатура = Неопределено Тогда
            Сообщить("В одной из строк не заполнено значение номенклатуры - строка при печати пропущена.", СтатусСообщения.Важное);
            Продолжить;
        КонецЕсли;

        МассивВыводимыхОбластей.Очистить();
        МассивВыводимыхОбластей.Добавить(ОбластьМакета);
        МассивВыводимыхОбластей.Добавить(ОбластьИтоговПоСтранице);
        Если Ном = КоличествоСтрок Тогда
            МассивВыводимыхОбластей.Добавить(ОбластьПодвала);
        КонецЕсли;        
        
        Если НЕ ТабДокумент.ПроверитьВывод(МассивВыводимыхОбластей) Тогда

            ТабДокумент.Вывести(ОбластьИтоговПоСтранице);

            НомерСтраницы = НомерСтраницы + 1;
            ТабДокумент.ВывестиГоризонтальныйРазделительСтраниц();

            ЗаголовокТаблицы.Параметры.НомерСтраницы = "Страница " + НомерСтраницы;
            ТабДокумент.Вывести(ЗаголовокТаблицы);

        КонецЕсли;

        ОбластьМакета.Параметры.Заполнить(ВыборкаСтрокТовары);
        ОбластьМакета.Параметры.ТоварНаименование = ВыборкаСтрокТовары.ТоварНаименование + ФормированиеПечатныхФорм.ПредставлениеСерий(ВыборкаСтрокТовары);

        Разница     = 0;
        РазницаСумм = 0;

        Разница     = ВыборкаСтрокТовары.ФактКоличество - ВыборкаСтрокТовары.БухКоличество;
        РазницаСумм = ВыборкаСтрокТовары.ФактСумма      - ВыборкаСтрокТовары.БухСумма;
        Если Разница = 0 Тогда
            Продолжить;
        КонецЕсли;

        Если Разница < 0 И РазницаСумм < 0 Тогда
            ОбластьМакета.Параметры.РезультатНедостачаКолво = - Разница;
            ОбластьМакета.Параметры.РезультатНедостачаСумма = - РазницаСумм;
            ОбластьМакета.Параметры.РезультатИзлишекКолво   = 0;
            ОбластьМакета.Параметры.РезультатИзлишекСумма   = 0;

            ИтогоРезультатНедостачаКолво = ИтогоРезультатНедостачаКолво + (- Разница);
            ИтогоРезультатНедостачаСумма = ИтогоРезультатНедостачаСумма + (- РазницаСумм);
            ИтогоРезультатИзлишекКолво   = ИтогоРезультатИзлишекКолво   + 0;
            ИтогоРезультатИзлишекСумма   = ИтогоРезультатИзлишекСумма   + 0;
        ИначеЕсли Разница < 0 И РазницаСумм >= 0 Тогда
            ОбластьМакета.Параметры.РезультатНедостачаКолво = - Разница;
            ОбластьМакета.Параметры.РезультатНедостачаСумма = РазницаСумм;
            ОбластьМакета.Параметры.РезультатИзлишекКолво   = 0;
            ОбластьМакета.Параметры.РезультатИзлишекСумма   = 0;

            ИтогоРезультатНедостачаКолво = ИтогоРезультатНедостачаКолво + (- Разница);
            ИтогоРезультатНедостачаСумма = ИтогоРезультатНедостачаСумма + РазницаСумм;
            ИтогоРезультатИзлишекКолво   = ИтогоРезультатИзлишекКолво   + 0;
            ИтогоРезультатИзлишекСумма   = ИтогоРезультатИзлишекСумма   + 0;
        Иначе
            ОбластьМакета.Параметры.РезультатНедостачаКолво = 0;
            ОбластьМакета.Параметры.РезультатНедостачаСумма = 0;
            ОбластьМакета.Параметры.РезультатИзлишекКолво   = Разница;
            ОбластьМакета.Параметры.РезультатИзлишекСумма   = РазницаСумм;

            ИтогоРезультатНедостачаКолво = ИтогоРезультатНедостачаКолво + 0;
            ИтогоРезультатНедостачаСумма = ИтогоРезультатНедостачаСумма + 0;
            ИтогоРезультатИзлишекКолво   = ИтогоРезультатИзлишекКолво   + Разница;
            ИтогоРезультатИзлишекСумма   = ИтогоРезультатИзлишекСумма   + РазницаСумм;
        КонецЕсли;

        ТабДокумент.Вывести(ОбластьМакета);

        Ном = Ном + 1;        
    КонецЦикла;
22 Маркусс
 
19.11.13
12:50
(19) типовую обработку переписывать?
23 User_Agronom
 
19.11.13
12:53
(21) Клиент, как я понял толстый. Характеристики железа скинь.
24 Маркусс
 
19.11.13
12:54
(23)я на сервере уже запустил. ждёмс)) коре и5 16 гб оперативы, правда она скулём вся забита
25 Маркусс
 
19.11.13
13:02
7 минут прошло. на сервере картина та же.
26 Tarnum
 
19.11.13
13:03
(22) Раз у тебя такие документы не маленькие, попробуй и узнаешь
27 Маркусс
 
19.11.13
13:10
Настройки скуля может какие покрутить?
Помогите, други.
28 mzelensky
 
19.11.13
13:14
(0) попробуй не печатать это документ, а просто получить данные этим запросом в Консоле запросов. Аналогичная ситуация будет или нет?!

Честно говоря запрос мне не очень нравится.
29 Маркусс
 
19.11.13
13:24
(28) в консоли всё замечательно
30 Маркусс
 
19.11.13
13:45
Сделал тупо перебор тч документа.
заработало.
31 mzelensky
 
19.11.13
13:46
(29) Значит дело не в выборке. Косяк какой-то в твоей обработке и запрос тут не причем, как и развер таблицы.
32 mzelensky
 
19.11.13
13:48
(30) Вообще делать подобные выборки не очень правильно:

|    Товары.(
    |        НомерСтроки КАК Номер,
    |        Номенклатура,
    |        Номенклатура.НаименованиеПолное КАК ТоварНаименование,
    |        Номенклатура." + ТоварКод + "   КАК ТоварКод,
    |        ЕдиницаИзмерения.Представление  КАК ЕдиницаИзмеренияНаименование,
    |        ЕдиницаИзмерения.ЕдиницаПоКлассификатору.Код КАК ЕдиницаИзмеренияКодПоОКЕИ,
    |        Количество                     КАК ФактКоличество,
    |        КоличествоУчет                 КАК БухКоличество,
    |        ВЫБОР
    |            КОГДА Склад.ВидСклада = &ВидСкладаНТТ ТОГДА ЦенаВРознице
    |            ИНАЧЕ Цена * &Курс / &Кратность
    |        КОНЕЦ КАК Цена,
    |        ВЫБОР
    |            КОГДА Склад.ВидСклада = &ВидСкладаНТТ ТОГДА Количество * ЦенаВРознице
    |            ИНАЧЕ Сумма * &Курс / &Кратность
    |        КОНЕЦ КАК ФактСумма,
    |        ВЫБОР
    |            КОГДА Склад.ВидСклада = &ВидСкладаНТТ ТОГДА КоличествоУчет *ЦенаВРознице
    |            ИНАЧЕ СуммаУчет * &Курс / &Кратность
    |        КОНЕЦ КАК БухСумма,
    |        ХарактеристикаНоменклатуры     КАК Характеристика,
    |        СерияНоменклатуры КАК Серия
    |    )

Может все-таки перепишешь на обычное левое соединение Таблицы шапки с таблицей товаров?
33 Маркусс
 
19.11.13
13:56
(32) это типовая обработка.
бухам щас позарез надо. склепал по бырому. заморачиваться ради печати 1 документа в месяц неохота. других задач море.
34 Маркусс
 
19.11.13
14:03
(34) видимо прогеры из 1ц тем же руководствовались)
35 mzelensky
 
19.11.13
14:03
(33) Есть золотое правило: нашел ошибку - устрани ее, т.к. если она появилась единожды, то обязательно вылезет и в будущем (и не факт, что в тот момент ты будешь менее занят).
36 vhl
 
19.11.13
14:16
В (4) верный ответ.
37 mzelensky
 
19.11.13
15:05
(36) "Замер производительности не предлагать?" - это верный ответ? Вообще-то это не ответ, а наметка в какую сторону капать. Даи какой замер производительности, если он у него тупо зависает на первой же строке

"Пока ВыборкаСтрокТовары.Следующий() Цикл"

???

Что тебе даст замер???
38 Маркусс
 
19.11.13
15:52
да ладна спорить)
надо по уму запрос написать с отбрасыванием не выводящихся в печатную форму строк, коих абсолютное большинство, и будет всё замечательно.
Программист всегда исправляет последнюю ошибку.