Доработанная УТ 10.2.11.3 на платформе 8.3.9.2170 Серверный вариант. Печать изображений (jpg)

1. aezdakov 5 02.06.17 14:29 Сейчас в теме
На файл-сервере лежат сканы в формате jpg В 1с в справочнике хранится их расположение с привязкой к номенклатуре. Разработан модуль печати данных сканов:
Изображение = Новый Картинка(ПутьКФайлу);
						МакетОтчета = ПолучитьОбщийМакет("СправкиАБСканы");
						ОбластьМакета = МакетОтчета.ПолучитьОбласть("Картинка");
						Рисунок = ОбластьМакета.Рисунки.Добавить(ТипРисункаТабличногоДокумента.Картинка);
						Рисунок.Высота = 240;
						Рисунок.Ширина = 190;
						Рисунок.РазмерКартинки = РазмерКартинки.АвтоРазмер;
						Рисунок.Картинка = Изображение;
						ТабличныйДокумент.Вывести(ОбластьМакета);
Показать

Раньше всё это действо крутилось на платформе 8.1 И такой вариант печати работал без нареканий. После перехода на платформу 8.3.9.2170 возникли проблемы печати, а именно ни на принтер ни на предварительном просмотре некоторые изображения просто не выводились, только рамка по указанным размерам. Долго искали зависимость почему именно так. Проявляется проблема не всегда и одно изображение может как вывестись так и нет. В конечном итоге определилось следующее: на пк с виндовс 8.1 (64 разряда) и 4ГБ ОЗУ все работает прекрасно (ну по крайней мере проблему воспроизвести не получилось у меня не разу, хотя операторы говорят, что проявляется такая проблема, но очень редко), на виндовс 7 (32 разряда) и без зависимости на объем ОЗУ проблема проявляется повсеместно. Так же на одном ПК проблема воспроизводилась постоянно и из 10 изображений выводились только два и при этом одни и теже. С помощью обработки выяснилась следующая зависимость на этом ПК: файлы с размером более 440 Кбайт не выводятся. Был найден самый "жирный" файл в 6 Мбайт и с помощью него попытался воспроизвести проблему на ПК с виндовс 8.1, воспроизвести не получилось, на остальных ПК с вин7 получилось.
Попытка найти решение привели к реализации печати с помощью макета типа "Active document" через MS Word:
МакетОтчета = ПолучитьОбщийМакет("СканыВWord");
		Word = МакетОтчета.Получить();
		СсылкаМакет = Word.Application.Documents(1);
		СсылкаМакет.Activate();
		ТабФайлов = Новый ТаблицаЗначений;
		ТабФайлов.Колонки.Добавить("Файлик");
		
		//Установка размера полей
		СсылкаМакет.Application.ActiveDocument.PageSetup.TopMargin = 7; //Размер в поинтах, 1 СМ=28pt
		СсылкаМакет.Application.ActiveDocument.PageSetup.BottomMargin = 7;
		СсылкаМакет.Application.ActiveDocument.PageSetup.LeftMargin = 7;
		СсылкаМакет.Application.ActiveDocument.PageSetup.RightMargin = 7;
		//Установка высоты колонтитулов
		СсылкаМакет.Application.ActiveDocument.PageSetup.HeaderDistance = 0; //Размер в поинтах, 1 СМ=28pt
		СсылкаМакет.Application.ActiveDocument.PageSetup.FooterDistance = 0;
Показать

Все заработало и вроде можно ставить точку, но не все ПК смогли в такой алгоритм. Один ПК приказал долго жить и печатал один лист через 5 минут простоя, при этом сборка на овер 1000 листов) По старому алгоритму все летает, а по новому встаёт на "Word = МакетОтчета.Получить();" и в отладчике занимает 80% времени от всего алгоритма)) При этом поведение 1С как программы становится не предсказуемым, она может забить ОЗУ под 100%, не помогает перезапуск/перезагрузка, а на следующий день данная сборка по данному алгоритму не вызвало никаких проблем и зависаний. Другие ПК подвисали тоже, но редко и не так продолжительно. Так большеё частью заклюк был связан с подготовкой слишком массивного Word-документа, который начинал жрать 50% от проца и 500МБ от оперативной памяти, но даже это не проблема и таким поведением можно пренебречь. От такого решения в итоге тоже пришлось отказаться, предсказуемости мало, а звонков много, а операторы работают в две смены в отличии от меня, да и точек у нас не одна.
Ещё одно решение проблемы, которое вселяло надежны на здоровой сон был старый алгоритм, но без применения макетов:
Изображение = Новый Картинка(ПутьКФайлу);
						ТабличныйДокумент.ПолеСверху         = 5;
						ТабличныйДокумент.ПолеСлева          = 5;
						ТабличныйДокумент.ПолеСнизу          = 5;
						ТабличныйДокумент.ПолеСправа         = 5;
						ТабличныйДокумент.ОриентацияСтраницы = ОриентацияСтраницы.Портрет;
						ТабличныйДокумент.АвтоМасштаб = Истина;
						Рисунок = ТабличныйДокумент.Рисунки.Добавить(ТипРисункаТабличногоДокумента.Картинка);
						Индекс=ТабличныйДокумент.Рисунки.Индекс(Рисунок);
						ТабличныйДокумент.Рисунки[Индекс].Картинка = Изображение;
						ТабличныйДокумент.Рисунки[Индекс].Расположить(ТабличныйДокумент.Область("R"+R1+"C1:R"+R72+"C"+C52+""));
Показать

План дал положительные результаты сразу же. По всем тестам ни на одном ПК воспроизвести проблему не получалось. Но отработавшая смена сообщила, что проблема осталась, но частота проявления уменьшилась. Так же стала проявляться ещё одна особенность. Если табличный документ показать, то все изображения на мести и всё "ОК", но если его же отправить потом на печать, то принтер выдаёт пустые листы.
Собственно на этом вся история, идеи кончились. Есть мысль попробовать загонять сразу в Word через com объект, но есть ощущения, что эти калькуляторы опять прикажут искать другое решение. Так же странно, что на 8.1 всё работало, а на 8.3 начались проблемы, такое чувство, что поменались или размеры переменных, или алгоритм выделения памяти под ник в моём случае лажает или Луна не в той фазе.
Поэтому я пришёл к вам, дорогие форумчане, за советами с протянутой рукой. Помогите, кто что знает) Буду рад всем!)
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
Оставьте свое сообщение

Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот