К документу Поступление ТМЦ прилеплена печатная форма для печати этикетки. Когда приходит большая приходная накладная, в которой больше 500 строк прихода с количеством единиц на каждую позицию не меньше 2 (Бывает от 30 до 500), и потом менеджер по закупу из формы документа вызывает на печать, то 1С (под любым пользователем) зависает на продолжительное время ПРИ ВЫВЕДЕНИИ НА ЭКРАН и может потом из "подвиса" не выйти.
Тех условия:
Windows Server 2003
Intel i7 - 3770
ОЗУ - 16Gb
HDD - 2x1Tb
Терминальный режим
Тех условия:
Windows Server 2003
Intel i7 - 3770
ОЗУ - 16Gb
HDD - 2x1Tb
Терминальный режим
По теме из базы знаний
- Печать на принтере этикеток через ZPL
- Быстрая печать этикеток принтера этикеток из рабочего места кассира для Розница 2.х (расширение)
- Что делать, если принтер этикеток не печатает?
- Прямая печать на принтерах TSC из 1С
- Печать этикеток штрихкода весового товара на принтере термоэтикеток или кассовом аппарате
Ответы
Подписаться на ответы
Инфостарт бот
Сортировка:
Древо развёрнутое
Свернуть все
Сделал внешнюю печатную форму. Другой алгоритм формирования данных - ситуация не изменилась :(
Вариант 1 (как было до меня)
Вариант 2 (как сделал я во внешней ПФ)
Вариант 1 (как было до меня)
Процедура СформироватьЭтикетку(ТаблицаТоваров, Устройство = "экран")
Если фРозница = 1 Тогда
ИсхТабл = СоздатьОбъект("Таблица");
ИсхТабл.ИсходнаяТаблица("ЭтикеткаРозница");
ТаблицаТоваров.ВыбратьСтроки();
Пока ТаблицаТоваров.ПолучитьСтроку() = 1 Цикл
ПечФирма = Фирма.Наименование;
ПечКод = ТаблицаТоваров.Код;
ПечНаименование = ТаблицаТоваров.Товар;
ПечРозн = ТаблицаТоваров.Цена;
Штрих = ТаблицаТоваров.Штрихкод;
ИсхТабл.ВывестиСекцию("Товар|Ценник");
ИсхТабл.НоваяСтраница();
КонецЦикла;
Иначе
ИсхТабл = СоздатьОбъект("Таблица");
ИсхТабл.ИсходнаяТаблица("Этикетка");
ТаблицаТоваров.ВыбратьСтроки();
Пока ТаблицаТоваров.ПолучитьСтроку() = 1 Цикл
ПечКод = ТаблицаТоваров.Код;
ПечНаименование = ТаблицаТоваров.Товар;
ПечРозн = ТаблицаТоваров.Цена;
ПечОпт = ТаблицаТоваров.Цена1;
Штрих = ТаблицаТоваров.Штрихкод;
ИсхТабл.ВывестиСекцию("Товар|Ценник");
ИсхТабл.НоваяСтраница();
КонецЦикла;
КонецЕсли;
ИсхТабл.Опции(0,0,0,0,"ПечатьЦенников","ПечатьЦенников");
ИсхТабл.ТолькоПросмотр(1);
ИсхТабл.Показать("Товарные ценники","");
КонецПроцедуры
Процедура Этикетка()
Данные.УдалитьСтроки();
ВыбратьСтроки();
Пока ПолучитьСтроку()=1 Цикл
СчетчикЦикла = 0;
Для СчетчикЦикла = 1 По Количество Цикл
Данные.НоваяСтрока();
Данные.Товар = СокрЛП(Номенклатура.Наименование);
Данные.Штрихкод = СокрЛП(Номенклатура.БазоваяЕдиница.Штрихкод);
Если ЕстьЦенаР=1 Тогда
ПечРозн = глПолучитьЦену(Номенклатура, Константа.РозничныйТипЦен, ДатаДок) ;
ПечОпт = глПолучитьЦену(Номенклатура, Константа.МелкооптовыйТипЦен, ДатаДок) ;
иначе
печрозн=0;
ПЕЧОПТ=0;
КонецЕсли;
Данные.Цена = СокрЛП(Формат(ПечРозн,"Ч010.2-"));
Данные.Цена1 = СокрЛП(Формат(ПечОпт,"Ч010.2-"));
Данные.Код = СокрЛП(Номенклатура.Код);
КонецЦикла;
КонецЦикла;
СформироватьЭтикетку(Данные);
КонецПроцедуры
ПоказатьВариант 2 (как сделал я во внешней ПФ)
Процедура Печать(Докум, Устройство=0, КолвоКопий=1)
ИсхТабл = СоздатьОбъект("Таблица");
Докум.ВыбратьСтроки();
Пока Докум.ПолучитьСтроку() = 1 Цикл
ПечРозн = глПолучитьЦену(Докум.Номенклатура, Константа.РозничныйТипЦен, Докум.ДатаДок);
ПечОпт = глПолучитьЦену(Докум.Номенклатура, Константа.МелкооптовыйТипЦен, Докум.ДатаДок);
ПечНаименование = СокрЛП(Докум.Номенклатура.Наименование);
ПечКод = Докум.Номенклатура.Код;
Штрих = Докум.Номенклатура.БазоваяЕдиница.ШтрихКод;
Для Сч =1 По Докум.Количество Цикл
ИсхТабл.ВывестиСекцию("Товар|Ценник");
ИсхТабл.НоваяСтраница();
КонецЦикла;
КонецЦикла;
Если Устройство = 0 Тогда
ИсхТабл.Опции(0,0,0,0,"ОпцииПечатиРеализация");
Если глПолучитьПолномочие("РазрешитьРедактированиеТаблиц") = 0 Тогда
ИсхТабл.ТолькоПросмотр(1);
Иначе
ИсхТабл.ТолькоПросмотр(0);
КонецЕсли;
ИсхТабл.Показать(глНазваниеДокументаВжурнале(Докум),"");
Иначе
ИсхТабл.ПараметрыСтраницы(,,,,,,,,,1,,);
ИсхТабл.КоличествоЭкземпляров(КолвоКопий);
ИсхТабл.Напечатать(0);
КонецЕсли;
КонецПроцедуры // Печать()
Показать
На печать теперь без предпросмотра сделал. Единственное, что если обсчитывает накладную если на ляма полтора-два, то просто зависает кушая от 200Мб до бесконечности памяти и потом "Нехватка памяти". Вот тут я уже пас - код вылизан. ХЗ, чего с ним творить еще можно
Процедура Печать(Докум, Устройство=0, КолвоКопий=1)
ИсхТабл = СоздатьОбъект("Таблица");
Сч = 1;
тРозничныйТипЦен = Константа.РозничныйТипЦен;
тМелкооптовыйТипЦен = Константа.МелкооптовыйТипЦен;
Докум.ВыбратьСтроки();
Пока Докум.ПолучитьСтроку() = 1 Цикл
тНоменклатура = Докум.Номенклатура;
тДатаДок = Докум.ДатаДок;
ПечРозн = глПолучитьЦену(тНоменклатура, тРозничныйТипЦен, тДатаДок);
ПечОпт = глПолучитьЦену(тНоменклатура, тМелкооптовыйТипЦен, тДатаДок);
ПечНаименование = СокрЛП(тНоменклатура.Наименование);
ПечКод = тНоменклатура.Код;
Штрих = тНоменклатура.БазоваяЕдиница.ШтрихКод;
Для Сч =1 По Докум.Количество Цикл
ИсхТабл.ВывестиСекцию("Товар|Ценник");
ИсхТабл.НоваяСтраница();
КонецЦикла;
КонецЦикла;
ИсхТабл.ТолькоПросмотр(1);
ИсхТабл.ПараметрыСтраницы(1,,,0,0,0,0,0,0,1,,1);
ИсхТабл.Опции(0,0,0,0,,,,);
ИсхТабл.Напечатать(1);
//ИсхТабл.Показать("Таблица");
КонецПроцедуры // Печать()
Показать
Да не так уж и много - 6 штук. Поскольку терминальный режим - принтера мапятся по мере подключения. Но нюанс в том, что долго именно формируется выходная таблица ( в последний раз после 2-х часов ожидания я снял задачу пользователю). Сама печать идет быстро
(9) имхо вы все не туда копаете. если "долго выводится на экран" - то долго отрабатывает строка "ИсхТабл.Показать()". и все оптимизации кода - для очистки совести. проверьте, добавив вывод текущего времени перед формированием таблицы, после цикла формирования таблицы и после вывода таблицы на экран
Я бы сделал так: Перед печатью определяем примерное количество страниц печатной продукции. Если более пяти - предупреждаем юзверя, что печатать будем порциями по пять листов (например). И, собственно, оформляем печать этикеток порционно (по пять листочков). Таким образом пока печатается очередная порция картинок, готовится следующая очередь. Избавляемся от якобы "зависания" программы перед печатью.
Ускорить код можно уменьшив количество обращений через точку.
Например, код
Следует заменить на
Например, код
Пока Докум.ПолучитьСтроку() = 1 Цикл
ПечРозн = глПолучитьЦену(Докум.Номенклатура, Константа.РозничныйТипЦен, Докум.ДатаДок);
ПечОпт = глПолучитьЦену(Докум.Номенклатура, Константа.МелкооптовыйТипЦен, Докум.ДатаДок);
ПечНаименование = СокрЛП(Докум.Номенклатура.Наименование);
ПечКод = Докум.Номенклатура.Код;
Штрих = Докум.Номенклатура.БазоваяЕдиница.ШтрихКод;
Для Сч =1 По Докум.Количество Цикл
ИсхТабл.ВывестиСекцию("Товар|Ценник");
ИсхТабл.НоваяСтраница();
КонецЦикла;
КонецЦикла;
ПоказатьСледует заменить на
РозничныйТипЦен = Константа.РозничныйТипЦен;
МелкооптовыйТипЦен = Константа.МелкооптовыйТипЦен;
тДатаДок = Докум.ДатаДок;
Пока Докум.ПолучитьСтроку() = 1 Цикл
тНоменклатура = Докум.Номенклатура;
ПечРозн = глПолучитьЦену(тНоменклатура, РозничныйТипЦен, тДатаДок);
ПечОпт = глПолучитьЦену(тНоменклатура, МелкооптовыйТипЦен, тДатаДок);
ПечНаименование = СокрЛП(тНоменклатура.Наименование);
ПечКод = тНоменклатура.Код;
Штрих = тНоменклатура.БазоваяЕдиница.ШтрихКод;
Для Сч =1 По Докум.Количество Цикл
ИсхТабл.ВывестиСекцию("Товар|Ценник");
ИсхТабл.НоваяСтраница();
КонецЦикла;
КонецЦикла;
Показать
А что говорит замер производительности в отладчике? Исходя из того, сколько времени на что уходит, можно говорить о причинах и оптимизации.
Из основных кандидатов:
1. глПолучитьЦену функция тормозная. К тому же два раза вызывается для одной и той же номенклатуры. Могла распухнуть таблица с периодикой и тормозно заработать. Добавили пару типов цен, заполнили их обработкой - получите приличное замедление работы с периодикой в любом справочнике. Или какой-нибудь реквизит сделали периодическим со всеми вытекающими.
2. ИсхТабл.ВывестиСекцию. Вывод секции по имени горадо тормознее, чем вывод заранее полученной с помощью ПолучитьСекцию.
Из основных кандидатов:
1. глПолучитьЦену функция тормозная. К тому же два раза вызывается для одной и той же номенклатуры. Могла распухнуть таблица с периодикой и тормозно заработать. Добавили пару типов цен, заполнили их обработкой - получите приличное замедление работы с периодикой в любом справочнике. Или какой-нибудь реквизит сделали периодическим со всеми вытекающими.
2. ИсхТабл.ВывестиСекцию. Вывод секции по имени горадо тормознее, чем вывод заранее полученной с помощью ПолучитьСекцию.
Попробовал в коде изменить по всем рекомендациям. Не помогло. Чувствую проблема в сервере в самой ОС или в программе. Ведь обработка считает все как положено и быстро. Заторможен вывод на экран сформированных данных. И вот тут у меня затык. Моксель пофиксен, сервак перегружен... А воз и поныне там
Ну ё..
у тебя налицо самый тормозной вариант в мокселе -
1. объединённые ячейки
2.внедренный объект - картинка/оле объект
ясен пень, ято форма с 50000 такими картинками долго будет показываться.
примитивный вариант - показ 1 страницы. Усё.
у тебя налицо самый тормозной вариант в мокселе -
1. объединённые ячейки
2.внедренный объект - картинка/оле объект
ясен пень, ято форма с 50000 такими картинками долго будет показываться.
примитивный вариант - показ 1 страницы. Усё.
(50)Как обычно, прав.
Время формирования таблицы данных 00:00:57 Количество строк в таблице: 17100
Время формирования ценников 00:00:08
Время вывода ценников на экран 00:00:00
Это если применить вместо ActiveBarcode шрифт EanGnivc.
Если оставить ActiveBarcode - то у меня не хватило терпения дождаться вывода на экран. Именно ВЫВОДА. Все остальное отрабатывает так же.
Время формирования таблицы данных 00:00:57 Количество строк в таблице: 17100
Время формирования ценников 00:00:08
Время вывода ценников на экран 00:00:00
Это если применить вместо ActiveBarcode шрифт EanGnivc.
Если оставить ActiveBarcode - то у меня не хватило терпения дождаться вывода на экран. Именно ВЫВОДА. Все остальное отрабатывает так же.
У меня печать этикеток идет на А4 #65 (13 строк по 5 этикеток в строке). бывают заказы когда общая печать - страниц по 200.
Печать идет порциями по 30 листов.
если делать большие моксели - клюшки начинают глохнуть.
Печать идет порциями по 30 листов.
если делать большие моксели - клюшки начинают глохнуть.
Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот