Имя: Пароль:
1C
1С v8
1С искажает картинку при сохранении файл EMF
,
0 SgBe
 
20.09.13
17:10
Загружаю в хранилище значений картинку в формате EMF. При выводе этой картинки на форму документа (справочника) или в табличный документ все выводится нормально, с учетом, конечно, конвертации в растровый формат.

При сохранении этой же картинки в файл формата EMF, программно средствами 1С, происходит искажение картинки. Проявляется в пропадании отдельных символов в надписях на картинке (картинка - это чертеж).

Сталкивался ли кто-нибудь с подобным явлением и, если сталкивался, то как поборот?
1 SgBe
 
23.09.13
14:47
Ап...
2 kosts
 
23.09.13
14:52
Сохраняй из хранилища, а не с формы
3 SgBe
 
23.09.13
15:02
Я так и делаю - сохраняю из хранилища.
4 kosts
 
23.09.13
18:51
Ну код выложи, может кто-то, что-то подскажет...
5 SgBe
 
26.09.13
15:18
Код:

Картинка = Стр.Изображение.Получить();
Картинка.Записать(ПутьКВременномуФайлуКартинки);

Стр - строка табличной части документа.
Изображение - хранилище значений.

Исходная картинка в формате EMF. Никаких преобразований с ней не делаю, тем более, что 1С не умеет работать с векторным форматом.
6 kosts
 
26.09.13
18:58
> Загружаю в хранилище значений картинку
Загружаешь в хранилище из файла и сохраняешь в файл и при этом файл изменяется?
7 Базис
 
naïve
26.09.13
19:00
Там где-нибудь вариант вида файла (бинарный или текстовый) не может встречаться?
8 SgBe
 
27.09.13
11:29
(6) Да, именно так. Причем, как писал в (0) в хранилище картинке нормальная - не искаженная, т.к. на форму документа (справочника), в табличный документ, выводится все нормально.

А при сохранении в файл - искажается.

Пробовал сохранять через ДвоичныеДанные - так же искажается.

(7) Нет у метода Записать() таких параметров.
9 SgBe
 
27.09.13
11:34
Не оставляет ощущение, что такая фигня появилась на одном из последних релизов 1С, т.к., до этого система эксплуатировалась почти год и все, вроде бы, было нормально.

Сейчас стоит 8.2.18.109.
10 SgBe
 
27.09.13
11:56
Вот сами картинки:

http://s1.ipicture.ru/uploads/20130927/1V457H66.jpg

Правильная - справа, она находится на форме документа, слева - файл EMF.
11 kosts
 
27.09.13
12:14
Попробуй для обхода проблемы зазиповать файл перед сохранением из файла в хранилище (в 1с есть zip). Ну и при сохранении в файл обратно распаковать.

И проверь "Картинка" в реквизитах или на форме нет ли (так на всякий случай).
Картинка = Стр.Изображение.Получить();
Картинка.Записать(ПутьКВременномуФайлуКартинки);

Ну и для теста в отдельной обработке попробуй сохранить в хранилище и обратно в файл. Поменяется ли...
12 SgBe
 
27.09.13
13:59
(11) У меня такая последовательность:

1. В конструкторской программе создается чертеж в формате EMF. Хранится он в SQL базе.

2. Через ADO я вытаскиваю этот чертеж и, без промежуточного сохранения в файл, записываю его в ХранилищеЗначений в 1С.

3. Затем, при подготовке документов, я формирую файл RTF и в него вставляю этот чертеж (EMF). Перед вставкой в RTF, я сохраняю чертеж в файл и из файла уже в RTF.

ЗаписьZipФайла в 1С записывает в ZIP только файлы, т.е., я запишу в архив уже искаженный файл.

Есть ли возможность записать в ZIP ДвоичныеДанные без сохранения их (ДвоичныхДанных) в файл?
13 SgBe
 
27.09.13
15:00
Уточнение к (12).

В хранилище я все-таки записываю через создание временного файла.

Код:

Поток = Новый ComОбъект("ADODB.Stream");
Поток.Type = 1;
Поток.Open();
Поток.Write(НаборЗаписей.Fields("pic").Value);
Поток.SaveToFile(ПутьКВременномуФайлуКартинки,2);
Поток.Close();

МояКартинка = Новый Картинка(ПутьКВременномуФайлуКартинки);

СтепеньСжатия = Новый СжатиеДанных(9);

ХранилищеКартинки = Новый ХранилищеЗначения(МояКартинка, СтепеньСжатия);

НаборЗаписей - это ADO.Recordset
Fields("pic").Value - картинка из внешней SQL базы

Т.е, получается, что SaveToFile(ПутьКВременномуФайлуКартинки,2) сохраняет картинку без искажений, а Картинка.Записать(ПутьКВременномуФайлуКартинки) - искажает!
14 kosts
 
27.09.13
15:12
(13) >Т.е, получается, что SaveToFile(ПутьКВременномуФайлуКартинки,2) сохраняет картинку без искажений, а Картинка.Записать(ПутьКВременномуФайлуКартинки) - искажает!

Вот мне и кажется, что ты Картинка.Записать() не из хранилища сохраняешь, а из картинки так сказать. В этот момент и происходит преобразование... проверь логику программы.
15 SgBe
 
27.09.13
16:25
(14)>ты Картинка.Записать() не из хранилища сохраняешь, а из картинки

Да, нет... Я же в (5) привел код, которым картинку сохраняю.

В (10) я дал ссылку на картинку как это все выглядит.

Обе картинки получены из одного хранилища.
16 SgBe
 
30.09.13
13:55
Поговорю пока сам с собою...

Установив дедуктивным методом, что SaveToFile(ПутьКВременномуФайлуКартинки,2) сохраняет картинку без искажений, а Картинка.Записать(ПутьКВременномуФайлуКартинки) - искажает, вижу путь для обхода проблемы:

Писать в файл через ADODB.Stream метод SaveToFile().

Однако, не могу подсунуть этому ADODB.Stream'у в метод Write() данные из 1С. Даю Картинка.ПолучитьДвоичныеДанные() не принимает - ошибка в параметре.

Опять - что делать?
17 kosts
 
30.09.13
14:05
При сохранении в БД сохраняй как двоичные данные, а не как картинка.

Вот как в СП.


МояКартинка = Новый ДвоичныеДанные("C:\Мои документы\Картинка1.bmp");
ХранилищеКартинки = Новый ХранилищеЗначения(МояКартинка);

// сохранение значения типа ХранилищеЗначения в базе данных
НовНоменклатура = Справочники.Номенклатура.СоздатьЭлемент();
НовНоменклатура.Наименование = "Диван ""Маргарита""";
// реквизит Изображение имеет тип ХранилищеЗначения
НовНоменклатура.Изображение = ХранилищеКартинки;
НовНоменклатура.Записать();
...
// выгрузка значения типа ДвоичныеДанные из хранилища значений в файл
ИмяФайла = "C:\Мои документы\Картинка2.bmp";
НовНоменклатура.Изображение.Получить().Записать(ИмяФайла);

18 SgBe
 
30.09.13
14:13
Спасибо. За общение, прежде всего.

Ваш совет сейчас опробую, только сложность в том, что не все картинки искажаются.

Т.е., код я сейчас поменяю на ваш, но вот ловить надо будет, помогло или нет!
19 kosts
 
30.09.13
14:17
(18) Т.е. для одной и той же картинки по разному, то меняется, то нет? Если так, то это грустно...
20 SgBe
 
30.09.13
14:56
(17) Сделал сохранение картинки в БД 1С через ДвоичныеДанные.

То же самое - картинка искажается.

Что делать-то... :,-(
21 kosts
 
30.09.13
15:00
Выложи одну картинку куда нибудь, тоже попробую...
22 SgBe
 
30.09.13
15:04
(19) Нет, не так. Если картинка искажается, то искажается гарантировано - всегда!

Не все картинки искажаются, т.е., на 100 картинок 1 (условно) искажается.
23 SgBe
 
03.10.13
17:54
Реабилитировал 1С. Оказывается, кривая картинка приходит из конструкторской программы. Причем, внутри программы, как и в 1С, отображается эта картинка правильно.

При этом, при просмотре картинки в CorelDraw, в ней присутствуют все размеры. Но при этом видно, что объекты (отдельные циферки) перекрывают друг друга
При просмотре гляделками от Microsoft (другие не пробовал) циферок не хватает.

Сейчас бодаемся с разработчиками конструкторской программы.
Ошибка? Это не ошибка, это системная функция.