Как декодировать (преобразовать) Unicode в 1С При разработке очередного обмена с интернет магазином через API столкнулисть что сайт возвращает ответ в виде:
Код VBS {"ok":"true","description":"\u0421\u0442\u0430\u0442\u0443\u0441 \u0437\u0430\u043a\u0430\u0437\u0430 \u0438\u0437\u043c\u0435\u043d\u0435\u043d"}
из кода ясно что это JSON и используя код ПрочитатьJSON
Код 1C v 8.3 Чтение = Новый ЧтениеJSON;
Чтение.УстановитьСтроку(стрВходящая);
ДанныеЛога = ПрочитатьJSON(Чтение);
Чтение.Закрыть();
В переменной ДанныеЛога будет структура в виде
В результате получилась функция с 2-мя вариантами возрата, в зависимости от того как нужно
Код 1C v 8.3 //Функция читает полученный JSON декадируя текст юникод
Функция ДекодироватьUniCodeВJSON(стрВходящая)
// стрВходящая содержит {"ok":"true","description":"\u0421\u0442\u0430\u0442\u0443\u0441 \u0437\u0430\u043a\u0430\u0437\u0430 \u0438\u0437\u043c\u0435\u043d\u0435\u043d"}
Чтение = Новый ЧтениеJSON;
Чтение.УстановитьСтроку(стрВходящая);
ДанныеЛога = ПрочитатьJSON(Чтение);
Чтение.Закрыть();
// Вариант 1 используя перебор структуры и вывод в текстовую переменную
Текст = "";
Для каждого Элемент Из ДанныеЛога Цикл
//добавим разделитель после предыдущего значения
Текст = Текст + ?(НЕ ПустаяСтрока(Текст), Символы.ПС, "");
//добавим представление ключа и значения:
Текст = Текст + Элемент.Ключ + " = " + Элемент.Значение;
КонецЦикла;
Возврат Текст; //Вернет ok = true description = Статус заказа изменен
// Вариант 2 мспользуя ЗаписьJSON
Запись = Новый ЗаписьJSON;
Запись.УстановитьСтроку(Новый ПараметрыЗаписиJSON(ПереносСтрокJSON.Нет));
ЗаписатьJSON(Запись, ДанныеЛога,);
Возврат Запись.Закрыть(); // Вернет JSON {"ok":"true","description":"Статус заказа изменен"}
КонецФункции
На просторах интернета была найдена еще одна функция:
Код 1C v 8.3 //Параметры: Строка в Юникод (обязательный) Тип: Строка. Исходная строка.
//Возвращаемое значение: Тип: Строка. Строка обработанных символов.
//Описание: Возвращает преобразованную строку из формата Unicod.
//Автор: Александр Кияница (treedo)
Функция ПереобразоватьЮникод(Строка)
ГотововаяСтрока = "" ;
МасУкр = Новый Массив(66) ;
МасУкр[0]="А"; МасУкр[1]="Б"; МасУкр[2]="В"; МасУкр[3]="Г"; МасУкр[4]="Ґ"; МасУкр[5]="Д";
МасУкр[6]="Е"; МасУкр[7]="Є"; МасУкр[8]="Ж"; МасУкр[9]="З"; МасУкр[10]="И"; МасУкр[11]="І";
МасУкр[12]="Ї"; МасУкр[13]="Й"; МасУкр[14]="К"; МасУкр[15]="Л"; МасУкр[16]="М"; МасУкр[17]="Н";
МасУкр[18]="О"; МасУкр[19]="П"; МасУкр[20]="Р"; МасУкр[21]="С"; МасУкр[22]="Т"; МасУкр[23]="У";
МасУкр[24]="Ф"; МасУкр[25]="Х"; МасУкр[26]="Ц"; МасУкр[27]="Ч"; МасУкр[28]="Ш"; МасУкр[29]="Щ";
МасУкр[30]="Ь"; МасУкр[31]="Ю"; МасУкр[32]="Я";
МасУкр[33]="а"; МасУкр[34]="б"; МасУкр[35]="в"; МасУкр[36]="г"; МасУкр[37]="ґ"; МасУкр[38]="д";
МасУкр[39]="е"; МасУкр[40]="є"; МасУкр[41]="ж"; МасУкр[42]="з"; МасУкр[43]="и"; МасУкр[44]="і";
МасУкр[45]="ї"; МасУкр[46]="й"; МасУкр[47]="к"; МасУкр[48]="л"; МасУкр[49]="м"; МасУкр[50]="н";
МасУкр[51]="о"; МасУкр[52]="п"; МасУкр[53]="р"; МасУкр[54]="с"; МасУкр[55]="т"; МасУкр[56]="у";
МасУкр[57]="ф"; МасУкр[58]="х"; МасУкр[59]="ц"; МасУкр[60]="ч"; МасУкр[61]="ш"; МасУкр[62]="щ";
МасУкр[63]="ь"; МасУкр[31]="ю"; МасУкр[65]="я";
МасКод = Новый Массив(66) ;
МасКод[0]="0410"; МасКод[1]="0411"; МасКод[2]="0412"; МасКод[3]="0413"; МасКод[4]="0490"; МасКод[5]="0414";
МасКод[6]="0415"; МасКод[7]="0404"; МасКод[8]="0416"; МасКод[9]="0417"; МасКод[10]="0418"; МасКод[11]="0406";
МасКод[12]="0407"; МасКод[13]="0419"; МасКод[14]="041A"; МасКод[15]="041B"; МасКод[16]="041C"; МасКод[17]="041D";
МасКод[18]="041E"; МасКод[19]="041F"; МасКод[20]="0420"; МасКод[21]="0421"; МасКод[22]="0422"; МасКод[23]="0423";
МасКод[24]="0424"; МасКод[25]="0425"; МасКод[26]="0426"; МасКод[27]="0427"; МасКод[28]="0428"; МасКод[29]="0429";
МасКод[30]="042C"; МасКод[31]="042E"; МасКод[32]="042F";
МасКод[33]="0430"; МасКод[34]="0431"; МасКод[35]="0432"; МасКод[36]="0413"; МасКод[37]="0491"; МасКод[38]="0434";
МасКод[39]="0435"; МасКод[40]="0454"; МасКод[41]="0436"; МасКод[42]="0437"; МасКод[43]="0438"; МасКод[44]="0456";
МасКод[45]="0457"; МасКод[46]="0439"; МасКод[47]="043A"; МасКод[48]="043B"; МасКод[49]="043C"; МасКод[50]="043D";
МасКод[51]="043E"; МасКод[52]="043F"; МасКод[53]="0440"; МасКод[54]="0441"; МасКод[55]="0442"; МасКод[56]="0443";
МасКод[57]="0444"; МасКод[58]="0445"; МасКод[59]="0446"; МасКод[60]="0447"; МасКод[61]="0448"; МасКод[62]="0449";
МасКод[63]="044C"; МасКод[31]="044E"; МасКод[65]="044F";
тмпСтрока = "" ;
Для Счетчик = 1 По СтрДлина(Строка) Цикл
Если Лев(Строка, 1) = "\" Тогда
Если Лев(Строка, 2) = "\u" Тогда
тмпСтрока = Прав(Лев(Строка, 6),4) ;
Если МасКод.Найти(тмпСтрока) = Неопределено Тогда
СтрокаЗамены = Прав(тмпСтрока, 1) ;
тмпСтрока = СтрЗаменить(тмпСтрока,СтрокаЗамены,ТРег(СтрокаЗамены));
Если МасКод.Найти(тмпСтрока) = Неопределено Тогда
Сообщить("Код символа не найден: " + тмпСтрока) ;
Иначе
ГотововаяСтрока = ГотововаяСтрока + МасУкр[МасКод.Найти(тмпСтрока)] ;
КонецЕсли;
Иначе
ГотововаяСтрока = ГотововаяСтрока + МасУкр[МасКод.Найти(тмпСтрока)] ;
КонецЕсли;
Строка = Прав(Строка, (СтрДлина(Строка)-6)) ;
Иначе
Строка = Прав(Строка, (СтрДлина(Строка)-2)) ;
КонецЕсли;
Иначе
ГотововаяСтрока = ГотововаяСтрока + Лев(Строка, 1) ;
Строка = Прав(Строка, (СтрДлина(Строка)-1)) ;
КонецЕсли;
КонецЦикла;
Возврат ГотововаяСтрока ;
КонецФункции
Категория:
WEB-сервисы, WS-ссылки, XDTO-пакеты Выгрузка картинок из базы 1С в XML В нынешнее время для электронного каталога или интернет-магазина необходимо выгружать не только информацию о цене и характеристиках товара, но и сопутствующие изображения. Хранящиеся в базе или связанные с номенклатурой изображения порой приходилось выгружать отдельно, подвергая предварительной обработке имена файлов, подгоняя их под правила связи товара с изображениями в приемнике. Тем не менее, в 1С существует возможность поместить двоичные данные изображений в виде строки в XML, либо другой файл выгрузки, чтобы уже на месте разобрать информацию о товаре.
Рассмотрим на примере следующей конфигурации.
Перечень объектов:
- справочники "Номенклатура", подчиненный ему справочник "Файлы";
- документ "Установка цен";
- обработка "Выгрузка прайса";
- перечисления "Типы файлов", "Типы номенклатуры";
- регистр "Цены номенклатуры".
Для начала, добавим форму элемента для справочника "Файлы"
Код 1C v 8.2 УП &НаСервере
Процедура ОбновитьКартинкуФорма(ХранилищеКартинки)
Если Объект.ТипФайла = Перечисления.ТипыФайлов.Картинка Тогда
Картинка = ПоместитьВоВременноеХранилище(ХранилищеКартинки.Получить(), УникальныйИдентификатор);
КонецЕсли;
КонецПроцедуры // ОбновитьКартинку()
&НаСервере
Процедура ПоместитьНаСервер(Данные = Неопределено)
ХранилищеКартинки = ?(Данные = Неопределено, Неопределено, Новый ХранилищеЗначения(Данные));
ОбновитьКартинкуФорма(ХранилищеКартинки);
КонецПроцедуры // ПоместитьНаСервер()
&НаКлиенте
Процедура ДобавитьФайл(Команда)
Режим = РежимДиалогаВыбораФайла.Открытие;
ДиалогОткрытияФайла = Новый ДиалогВыбораФайла(Режим);
ДиалогОткрытияФайла.ПолноеИмяФайла = "";
ДиалогОткрытияФайла.Фильтр = "Все *.*|*.*|.jpg|*.jpg|.png|*.png";
ДиалогОткрытияФайла.МножественныйВыбор = Ложь;
ДиалогОткрытияФайла.Заголовок = "Выберите файл";
Если ДиалогОткрытияФайла.Выбрать() Тогда
мФайл = ДиалогОткрытияФайла.ПолноеИмяФайла;
ПоместитьНаСервер(Новый ДвоичныеДанные(мФайл));
Иначе
Текст = "Файл не выбран!";
Предупреждение(Текст);
КонецЕсли;
КонецПроцедуры
&НаСервере
Процедура ПриЧтенииНаСервере(ТекущийОбъект)
ОбновитьКартинкуФорма(ТекущийОбъект.ХранилищеФайла);
КонецПроцедуры
&НаСервере
Процедура ПередЗаписьюНаСервере(Отказ, ТекущийОбъект, ПараметрыЗаписи)
ТекущийОбъект.ХранилищеФайла = ?(ПустаяСтрока(Картинка), Неопределено, Новый ХранилищеЗначения(ПолучитьИзВременногоХранилища(Картинка)));
КонецПроцедуры
Настроим форму документа "Установка цен".
Код 1C v 8.2 УП &НаСервере
Процедура ЗаполнитьТЧ()
Результат = ВыгрузкаПрайса.ПолучитьТаблицуЦен(Объект.Дата);
Объект.Товары.Загрузить(Результат);
КонецПроцедуры // ЗаполнитьТЧ()
&НаКлиенте
Процедура Заполнить(Команда)
ЗаполнитьТЧ();
КонецПроцедуры
Добавляем обработку выгрузки в XML.
Код 1C v 8.2 УП &НаКлиенте
Процедура Выгрузить(Команда)
Если ПустаяСтрока(ФайлВыгрузки) Тогда
Возврат;
КонецЕсли;
мСтрока = ВыгрузкаПрайса.ПолучитьДанныеXML();
мФайл = Новый ТекстовыйДокумент;
мФайл.УстановитьТекст(мСтрока);
мФайл.Записать(ФайлВыгрузки);
КонецПроцедуры
&НаКлиенте
Процедура ФайлВыгрузкиОткрытие(Элемент, СтандартнаяОбработка)
СтандартнаяОбработка = Ложь;
Режим = РежимДиалогаВыбораФайла.Сохранение;
ДиалогОткрытияФайла = Новый ДиалогВыбораФайла(Режим);
ДиалогОткрытияФайла.ПолноеИмяФайла = ФайлВыгрузки;
Фильтр = "(*.xml)|*.xml";
ДиалогОткрытияФайла.Фильтр = Фильтр;
ДиалогОткрытияФайла.Заголовок = "Выберите файл";
Если ДиалогОткрытияФайла.Выбрать() Тогда
ФайлВыгрузки = ДиалогОткрытияФайла.ПолноеИмяФайла;
Иначе
Текст = "ru = ""Файл(ы) не выбран!""; en = ""File(s) not selected!""";
Предупреждение(НСтр(Текст));
КонецЕсли;
КонецПроцедуры
При заполнении табличной части "Товары" документа "Установка цен" и в обработке выгрузки мы обращаемся к общему модулю "Выгрузка прайса":
Код 1C v 8.2 УП Функция ПолучитьТаблицуЦен(ДатаЗапроса = Неопределено) Экспорт
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| Номенклатура.Ссылка КАК Номенклатура,
| ЕСТЬNULL(Цены.Цена, 0) КАК Цена,
| ПРЕДСТАВЛЕНИЕ(Номенклатура.Ссылка) КАК НоменклатураСтрока
|ИЗ
| Справочник.Номенклатура КАК Номенклатура
| ЛЕВОЕ СОЕДИНЕНИЕ (ВЫБРАТЬ
| ЦеныНоменклатурыСрезПоследних.Номенклатура КАК Товар,
| ЦеныНоменклатурыСрезПоследних.Цена КАК Цена
| ИЗ
| РегистрСведений.ЦеныНоменклатуры.СрезПоследних(&Дата, ) КАК ЦеныНоменклатурыСрезПоследних) КАК Цены
| ПО Номенклатура.Ссылка = Цены.Товар
|ГДЕ
| НЕ Номенклатура.ЭтоГруппа
|
|УПОРЯДОЧИТЬ ПО
| Номенклатура
|АВТОУПОРЯДОЧИВАНИЕ";
Запрос.УстановитьПараметр("Дата", ?(ЗначениеЗаполнено(ДатаЗапроса), ДатаЗапроса, ТекущаяДата()));
Возврат Запрос.Выполнить().Выгрузить();
КонецФункции // ПолучитьТаблицуЦен()
Функция ПолучитьИзображения(НоменклатураСсылка)
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| Файлы.Ссылка
|ИЗ
| Справочник.Файлы КАК Файлы
|ГДЕ
| Файлы.Владелец = &Владелец
| И Файлы.ТипФайла = ЗНАЧЕНИЕ(Перечисление.ТипыФайлов.Картинка)
| И НЕ Файлы.ПометкаУдаления";
Запрос.УстановитьПараметр("Владелец", НоменклатураСсылка);
Возврат Запрос.Выполнить().Выгрузить();
КонецФункции
Функция ПолучитьДанныеXML() Экспорт
ТЧ_Цены = ПолучитьТаблицуЦен();
ЗаписьXML = Новый ЗаписьXML;
ЗаписьXML.УстановитьСтроку();
ЗаписьXML.ЗаписатьОбъявлениеXML();
ЗаписьXML.ЗаписатьНачалоЭлемента("price_list");
Для Каждого СтрокаЦен Из ТЧ_Цены Цикл
ЗаписьXML.ЗаписатьНачалоЭлемента("tovar");
ЗаписьXML.ЗаписатьАтрибут("name", СтрокаЦен.НоменклатураСтрока);
ЗаписьXML.ЗаписатьАтрибут("price", Формат(СтрокаЦен.Цена, "ЧРД=.; ЧГ=0"));
ТЧ = ПолучитьИзображения(СтрокаЦен.Номенклатура);
Если НЕ ТЧ.Количество() = 0 Тогда
ЗаписьXML.ЗаписатьНачалоЭлемента("picture_list");
Для Каждого СтрТЧ Из ТЧ Цикл
мДанные = СтрТЧ.Ссылка.ХранилищеФайла.Получить();
Если НЕ ЗначениеЗаполнено(мДанные) Тогда
Продолжить;
КонецЕсли;
ЗаписьXML.ЗаписатьНачалоЭлемента("picture");
ЗаписьXML.ЗаписатьАтрибут("binary", Base64Строка(мДанные));
ЗаписьXML.ЗаписатьКонецЭлемента();
КонецЦикла;
ЗаписьXML.ЗаписатьКонецЭлемента();
КонецЕсли;
ЗаписьXML.ЗаписатьКонецЭлемента();
КонецЦикла;
ЗаписьXML.ЗаписатьКонецЭлемента();
СтрокаXML = ЗаписьXML.Закрыть();
Возврат СтрокаXML;
КонецФункции // ПолучитьФайлXML()
Кодирование изображений выполняется с помощью функции Base64Строка , в качестве аргумента передаются двоичные данные из справочника "Файлы". Предполагается, что приемник XML может выполнить обратное преобразование. В 1С это можно сделать с помощью функции Base64Значение.
результат выгрузки прайса в XML:
Код Batch File (DOS, CMD, BAT) <?xml version="1.0"?>
<price_list>
<tovar name="Товар 1" price="5">
<picture_list>
<picture binary="iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAIAAACQkWg2AAAAB3RJTUUH3QINBSMt
F2PHEwAAABd0RVh0U29mdHdhcmUAR0xEUE5HIHZlciAzLjRxhaThAAAACHRwTkdH
TEQzAAAAAEqAKR8AAAAEZ0FNQQAAsY8L/GEFAAAABmJLR0QA/wD/AP+gvaeTAAAA
pklEQVR4nGP4jw3kajICEVYpBmRFcMafGkMgQhZB1wBRBDEYohquBy6F0AAXejM5
DoiQbUAWgehB2ACRg0jDEbIgRCUTAyponLY4XF8cjoBcNAUMaB44EiEBRJhsuJOY
8rSY+oMNgDohJBCsvPiyZd0xIAIyICJwBUDF6E4iDEh1EnoowdXBVaOFElnBCvE3
cggCufAwgIQ1xMdQP5CcNMhJfMQnbwDR3npihwr9YwAAAABJRU5ErkJggg=="/>
</picture_list>
</tovar>
<tovar name="Товар 2" price="10"/>
<tovar name="Товар 3" price="15"/>
<tovar name="Товар 4" price="18">
<picture_list>
<picture binary="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
Ahj+xbMP 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
kSbzrE+Hx0bdY0NDlRfmpYPusUQtd9/WQwEw85GLiLo+t8kZ88OGCscWR5FYmomp
FcszWOUYZEhDQlpS2pl4q5CCiMCzbV9P2r5iAgkSc197mFlrDqBZaaUCDiLPSDjZ
yA8qQa42zFMC0ZSlkSCAL8jq/ko0nYf6l9DFUv4gJjCxMKUNzVpY0tJKKxAZ0rZS
RszKMsGMmNRgLjg4OBF11WrhO3GXe5sy0cSmJ7u86ddH473ZmF/ets1fP/RMrjUe
hAXYxZKnC6eLRmibaEmmZF2dYaSFIkhoYgYiNygySJgxM0XECN2oypqVNA2HBLMw
yJxjWVwbr+UjL/RIkDDjZlxP1PIcKqW1SDGfvzfpPTj+NR6/pnLR/yJM3qfTVLM/
JXAYAYDQGqgV3bFKWO1Tpq0DjfHhQrArYYlTdeSOaFOXNj2517voczAAEBE9/cRq
c7HrxAZ9M+PVzNYAlDKESNgOWhMGtYFgCQKiUGs9JYMQk4ehNISQBhlgYjUVcpGE
kNIQREDoh4EOzz+UiZg0n/8+/38bXcrlMTNrAHKGS6bJI4wZOiiH6GfNOc2yJiks
J8xotC2u8qdinnv/E4dDngXCRX9ihG3bxBt4w4rlXCvPpi0UOSXFSZcoboJNkvI3
v2a5BEUApFLMQgRQ2o1Lv5KJxV0n9AK3PhbchJsCbN06p1u+OChTtG3bNnEj3hDu
xICcKCSMRaYnjGSGyrHoN6C8D6Vcg6NKgXtDRzdkqlGsYb7agZv01ouAMU3/G2jy
rVebJ+JFAAAAAElFTkSuQmCC"/>
</picture_list>
</tovar>
<tovar name="Услуга 1" price="32"/>
<tovar name="Услуга 2" price="15"/>
</price_list>
Источник
Категория:
JSON, XML, TXT, CSV, DBF Как передать файл с сервера на клиент? Код 1C v 8.2 УП &НаСервере
Функция ПолучитьФайл()
Двоичное=Новый ДвоичныеДанные("C:\файл.bmp ");
Адрес=ПоместитьВоВременноеХранилище(Двоичное,ЭтаФорма.УникальныйИдентификатор);
Возврат Адрес
КонецФункции
&НаКлиенте
Процедура Получить()
Адрес=ПолучитьФайл();
Двоичное=ПолучитьИзВременногоХранилища(Адрес);
КонецПроцедуры
Если же необходимо файл сохранить на Клиенте на диск - тогда так:
Код 1C v 8.2 УП
&НаСервере
Функция ПолучитьФайл()
Двоичное=Новый ДвоичныеДанные("C:\файл.bmp ");
Адрес=ПоместитьВоВременноеХранилище(Двоичное,ЭтаФорма.УникальныйИдентификатор);
Возврат Адрес
КонецФункции
&НаКлиенте
Процедура Получить()
Адрес=ПолучитьФайл();
Описание=Новый ОписаниеПередаваемогоФайла("C:\FromServer.bmp ",Адрес);
МассивОписаний=Новый Массив;
МассивОписаний.Добавить(Описание);
ПолучитьФайлы(МассивОписаний,,,Ложь);
КонецПроцедуры
Категория:
Работа с Файлами и Каталогами Как получить информацию о изображении (высота, ширина, размер)? Платформа 1С версии 8.х предоставляет слабые возможности по работе с изображением.
Для работы с изображениями можно использовать библиотеку Windows Image Acquisition Automation Library. Библиотеку с описанием можно
скачать здесь (в Windows 7 уже входит в состав дистриботива).
После того, как загрузили архив, распакуйте. Саму библиотеку
wiaaut.dl l придется зарегистрировать командой
regsvr32 . После регистрации доступен
COM-объект "WIA.ImageFile" . Приведем пример работы:
Код 1C v 8.х // Выбор файла
СтандартнаяОбработка = Ложь;
РежимДиалога = РежимДиалогаВыбораФайла.Открытие;
ДиалогВыбораФайла = Новый ДиалогВыбораФайла(РежимДиалога);
ДиалогВыбораФайла.МножественныйВыбор = Ложь;
ДиалогВыбораФайла.Заголовок = "Задайте имя файла";
ДиалогВыбораФайла.ПолноеИмяФайла = ПолеИмениФайла;
ДиалогВыбораФайла.Фильтр = "Все файлы картинок|*.jpg;*.jpeg;*.gif;*.bmp ;*.ico;*.png;*.tif;*.*";
Если НЕ ДиалогВыбораФайла.Выбрать() Тогда
// Если не выбран файл
Возврат;
КонецЕсли;
ПолеИмениФайла = ДиалогВыбораФайла.ПолноеИмяФайла;
// Создаем объект
ФайлКартинка = Новый COMОбъект("WIA.ImageFile");
ФайлКартинка.LoadFile(ПолеИмениФайла);
Сообщить("Расширение файла: " + ФайлКартинка.FileExtension);
Сообщить("Высота: " + ФайлКартинка.Height);
Сообщить("Ширина: " + ФайлКартинка.Width);
Сообщить("Размер: " + Окр(ФайлКартинка.FileData.Count / 1024, 2) + " Кб");
Библиотека была протестирована на самых распространенных форматах файлов-картинок: jpeg, gif,
bmp , ico, png, tif.
Здесь можно скачать готовую обработку:
Скачивать файлы может только зарегистрированный пользователь!
Помимо данных о картинке, библиотека может многое другое: изменить размер изображения, повернуть, получить изображение со сканера и прочее. Надеюсь, мы еще вернемся к этой библиотеке.
Источник Категория:
COM-объекты, WMI, WSH Внешние источники данных Почему данная возможность вызывает такой интерес? Любой человек, который программировал в 1С при этом достаточно неплохо знаком с SQL и хотя бы в общих чертах знаком с архитектурой и принципами разработки других технологических платформ для бизнес приложений с твердой уверенностью скажет вам - что ему нравится больше всего в 1С. Конечно конструктор запросов - самый удобный и продуманный механизм написания запросов для получения данных из реляционных структур, который я лично когда-либо встречал. А теперь 1С нам предоставили такую замечательную возможность использовать его не только с 1С, но и с любыми другими таблицами. Вот только в эту "бочку мёда" насыпана куча "ложек дёгтя". Обо всём по порядку:
1) Настройка и использование - без "танцев с бубном" не получится
a) Добавляете внешний источник данных - вроде ничего сложного
б) ставите галочку "Выбрать из списка" - обязательно - это нужно чтобы проверить работоспособность уже в начале и избавит от лишних заморочек
в) - обязательно нажимаем "..." - подключение именно ODBC. Не OLEDB как мы все привыкли, а на уровень ниже
г) А вот здесь будьте ОЧЕНЬ ВНИМАТЕЛЬНЫ.
Это драйвер ODBC - в случае использования клиент-серверной версии он должен обязательно быть на сервере. Если вы ведёте разработку на одной системе, а рабочая версия на другой (как это обычно бывает) убедитесь что вас не ждут сюрпризы. Странная рекоммендация, но выбирайте самый древний или самый общий драйвер в случае если вас не особо заботит скорость и за пределы возможностей стандарта SQL92 вы выходить не намерены. Это обеспечит вам лучшую совместимость. Например для SQL Server 2008 лучшим драйвером будет SQL Server Native Client 11, но рекоммендую выбирать просто SQL Server, иначе этот самый native client придётся устанавливать либо на сервер, либо на все клиентские машины (в случае использования файловой версии), а выигрыша особого для простых задач он не даст.
д) Стандартные диалоги выбора Сервера
и БД
е) На вопрос сохранения пароля рекомендую ответить "да", иначе так и не получится это дело запустить.
ж) Выбираете таблицу и реквизиты... замечательная возможность - её можно сразу же переименовать так как вам нравится (и реквизиты тоже), при этом в свойствах у вас будут отображаться названия полей источника данных
з) А теперь запускаете, открываете конструктор запросов - выбираете тупо все записи из таблицы и ОПА - ошибка. Что делать? Если у вас управляемый интерфейс - заглянуть в меню сервис, а если обычный...
Я лично использовал вот такой код:
Код 1C v 8.х Параметры = ВнешниеИсточникиДанных.DAX.ПолучитьОбщиеПараметрыСоединения();
Параметры.АутентификацияСтандартная = Истина;
Параметры.ИмяПользователя = "sa";
Параметры.Пароль = "pas";
Параметры.СтрокаСоединения = "DRIVER={SQL Server};SERVER=servet;UID=sa;PWD=;DATABASE=database";
Параметры.СУБД = "MSSQLServer";
ВнешниеИсточникиДанных.DAX.УстановитьОбщиеПараметрыСоединения(Параметры);
ВнешниеИсточникиДанных.DAX.УстановитьПараметрыСоединенияПользователя(ИмяПользователя(), Параметры);
ВнешниеИсточникиДанных.DAX.УстановитьПараметрыСоединенияСеанса(Параметры);
ВнешниеИсточникиДанных.DAX.УстановитьСоединение();
Может каких-то кусков и не нужно, но это работает.
Выполнить код нужно ОДИН РАЗ. После чего будет нормально подключаться... мистика конечно - зачем это было нужно не понятно...
2) Источники данных только для чтения - Да, чудес не бывает... но иногда так хочется....
3) НЕЛЬЗЯ ИХ ИСПОЛЬЗОВАТЬ ВМЕСТЕ С ВНУТРЕННИМИ ИСТОЧНИКАМИ ДАННЫХ
Меня лично этот факт убил наповал
Как же так.... то чего так ждали и уже представляли и облизывались как мы сейчас в одном запросе соединим наши данные с 1С-кой свернём - сгруппируем, вставим в отчет, а не тут то было...
Но естественно опытных людей это не останавливает... какая мысль пришла в голову? Правильно - временные таблицы:
4) НЕЛЬЗЯ ИХ ИСПОЛЬЗОВАТЬ ВМЕСТЕ С ВРЕМЕННЫМИ ТАБЛИЦАМИ
А вот это уже не похоже на технологические трудности, а очень смахивает на то что нам хотят "чтобы жизнь раем не казалась" сделать
.
5) Можно использовать только в соединениях СКД
Для тех кто не знает - это в СКД на вкладке "Связи наборов данных". Часто вы ими пользуетесь? Удобно? Видимо так нас хотят принудить к использованию их чаще. Вот только там есть колонка "Условие связи" и "Параметр связи". Ни в одной типовой конфигурации не нашел примера их использования, в документации и у Хрусталевой тоже как-то всё не прозрачно. Кто-нибудь сможет мне объяснить как работает "условие связи". Если там написать РеквизитИсточника = РевизитПриемника это не работает. Конечно условие можно записать в поле "Выражение" - в большинстве случаев этого хватает... вот только как-то не очень просто получается.
Итого ранее эта задача решалась где-то так:
Код 1C v 8.х Функция ИнициализироватьИсточникДанных()
ДатаНач = КомпоновщикНастроек.Настройки.ПараметрыДанных.Элементы[5].Значение;
ДатаКон = КомпоновщикНастроек.Настройки.ПараметрыДанных.Элементы[4].Значение;
Если ДатаКон > '20100101' Тогда
ДатаКон = '20100101';
КонецЕсли;
КЧ = Новый КвалификаторыЧисла(15,2);
КС = Новый КвалификаторыСтроки(255);
МассивЧисло = Новый Массив();
МассивЧисло.Добавить(Тип("Число"));
МассивСтрока = Новый Массив();
МассивСтрока.Добавить(Тип("Строка"));
МассивДата = Новый Массив();
МассивДата.Добавить(Тип("Дата"));
//В таблицу будем заполнять бухгалтерскую себестоимость
ТипЧисло = Новый ОписаниеТипов(МассивЧисло,,КЧ);
ТипСтрока = Новый ОписаниеТипов(МассивСтрока,,КС);
ТипДата = Новый ОписаниеТипов(МассивДата);
//таблица для загрузки данных из SQL
ТЗ = Новый ТаблицаЗначений();
ТЗ.Колонки.Добавить("НоменклатураКод", ТипСтрока);
ТЗ.Колонки.Добавить("Qnty", ТипЧисло);
ТЗ.Колонки.Добавить("Период", ТипДата);
ТЗ.Индексы.Добавить("Период");
//Подключаемся к SQL
СтрокаПодключения = "Provider=SQLOLEDB.1;Persist Security Info=True;User ID=sa;Pwd=;Data Source=;Use Procedure for Prepare=1;Auto Translate=True;Packet Size=4096;Workstation ID=;Use Encryption for Data=False;Tag with column collation when possible=False;Initial Catalog=Reports";
Connection = Новый COMОбъект("ADODB.Connection");
Command = Новый COMОбъект("ADODB.Command");
RecordSet = Новый COMОбъект("ADODB.RecordSet");
Дата = "";
Попытка
Connection.Open(СокрЛП(СтрокаПодключения));
Command.ActiveConnection = Connection;
Command.CommandText = "S_elect * from PH where period >= '" + Строка(Формат(ДатаНач, "ДФ=ггггММдд")) + "' and period <= '" + Строка(Формат(ДатаКон, "ДФ=ггггММдд")) + "'";
RecordSet = Command.Execute();
RecordSet.MoveFirst();
Исключение
Возврат ТЗ;
КонецПопытки;
Пока RecordSet.EOF = Ложь Цикл
Строка = ТЗ.Добавить();
Строка.НоменклатураКод = RecordSet.Fields(RecordSet.Fields.Item(1).Name).Value;
Строка.Qnty = RecordSet.Fields(RecordSet.Fields.Item(12).Name).Value;
Строка.Период = RecordSet.Fields(RecordSet.Fields.Item(13).Name).Value;
RecordSet.MoveNext();
КонецЦикла;
Запрос = Новый Запрос();
ВрТаблица = Новый МенеджерВременныхТаблиц();
Запрос.МенеджерВременныхТаблиц = ВрТаблица;
Запрос.УстановитьПараметр("врТаблицаДанных", ТЗ);
Запрос.УстановитьПараметр("ДатаНач", ДатаНач);
Запрос.УстановитьПараметр("ДатаКон", ДатаКон);
Запрос.Текст = "ВЫБРАТЬ
| врТаблицаДанных.НоменклатураКод,
| врТаблицаДанных.Qnty,
| врТаблицаДанных.Период
|ПОМЕСТИТЬ ТаблицаДанных
|ИЗ
| &врТаблицаДанных КАК врТаблицаДанных
|ГДЕ
| врТаблицаДанных.Период >= &ДатаНач
| И врТаблицаДанных.Период <= &ДатаКон";
Запрос.Выполнить();
ТЗ = Неопределено;
Запрос = Новый Запрос;
Запрос.МенеджерВременныхТаблиц = ВрТаблица;
Запрос.Текст = "Здесь запрос с участием верменной таблицы";
Результат = Запрос.Выполнить();
Возврат Результат;
КонецФункции
Внешнийнабор = ИнициализироватьИсточникДанных();
НаборДанных = Новый Структура();
НаборДанных.Вставить("ТаблицаSQL", Внешнийнабор);
ТиповыеОтчеты.СформироватьТиповойОтчет(ЭтотОбъект, Результат, ДанныеРасшифровки, ВыводВФормуОтчета, НаборДанных);
Собственно строчек кода не много и они достаточно стандартны... при этом можно пользоваться полным функционалом конструктора запросов, а в СКД отдать только функцию КОМПАНОВКИ ДАННЫХ
Но на вид чуть конечно не так красиво... да и выгрузка в таблицу значений каждый раз нужно код писать и проверять не ошибся ли в названии реквизитов... а то что нам дали в 1С выглядит как-то половинчато. Я ещё не определился чем удобнее пользоваться. Вы решайте, и пишите о ваших решениях, и что вас к ним подтолкнуло.
Автор:
Олег Филиппов Категория:
Встроенные Функции Вывод Диаграммы График Валют, Сохранение диаграммы, графиков и гистограмм в виде Картинки Алгоритм обработки выполняет запрос к регистру сведений "курсы валют" за определенный пользователем период. Полученные данные выборки в цикле выводятся в элемент экранной формы "диаграмма" в режиме построения графика. Для элемента управления "Диаграмма" на этапе конфигурирования был задан тип - График, и имя - "График Курсов". Это наиболее наглядный и простой пример работы с графиками в 1С 8.1.
Внешний вид и органы управления показаны на рисунке:
Алгоритм процедуры рисования графика:
- Очистить старые данные графика;
- Сформировать текст запроса;
- Установить значения периода выборки;
- Выполнить запрос;
- Подготовить структуру соответствия серий и валют, которые будут изображены на графике;
- В цикле заполнить значения точек графика для всех используемых валют;
- В цикле, используя ранее установленные значения графика для валют, добавить серию графика бивалютной корзины;
- Обновить данные графика курсы валют экранной формы;
Использование элемента Диаграмма в 1С
Алгоритм обработки использует в качестве параметра элемент НастройкаПериода, значения которого используются в запросе к регистру сведений "Курсы валют".
Исходный код:
Код 1C v 8.х Процедура Нарисовать (Кнопка)
// Подготовить текст запроса для выборки данных из
// регистра сведений Курсы валют
SQL = Новый Запрос;
SQL.Текст = "ВЫБРАТЬ
|КурсыВалют.Валюта,
|КурсыВалют.Курс,
|ДЕНЬГОДА(КурсыВалют.Период) КАК Точки
|ИЗ
|РегистрСведений.КурсыВалют КАК КурсыВалют
|ГДЕ
|КурсыВалют.Период МЕЖДУ &НачПериода И &КонПериода
|И КурсыВалют.Валюта.Наименование <> &исключитьРуб
|УПОРЯДОЧИТЬ ПО
|КурсыВалют.Период";
// Установить период выборки данных
SQL.УстановитьПараметр("НачПериода",НачПериода);
SQL.УстановитьПараметр("КонПериода",КонПериода);
// Исключить курсы валюты рубли
SQL.УстановитьПараметр("исключитьРуб","Руб.");
Далее в процедуре "Нарисовать", осуществляющей вывод данных запроса в диаграмму экранной форме, обозначена структура для работы с валютами и ряд подготовительных действий. Переменная курсы будет использоваться для связи с элементом управления Диаграмма, расположенным на экранной форме. Перед работой будут очищены текущие данные диаграммы и отлючена перерисовка значений в момент нового формирования и насыщения данными. Структура "серии" потребуется для связи названия валюты (ключ) и серии (значение) диаграммы, как на моменте инициализации, так и при выводе данных. Так же при создании серий диаграммы производится отключение маркеров.
Код 1C v 8.х // Получить доступ к диаграмме, как элементу экранной формы
курсы = ЭлементыФормы.ГрафикКурсов;
// Подготовить элемент к формированию графика
// Сброить данные серий и точек
// Очистить старые значения графика
курсы.Очистить();
курсы.КоличествоСерий = 0;
курсы.КоличествоТочек = 0;
// Отключить обновление диаграммы на время вывода данных.
курсы.Обновление = Ложь;
// Задать заголовок диаграммы
курсы.ОбластьЗаголовка.Текст = "Анализатор курсов валют";
// Сформировать соответствие номеров серий и наименований валют
// Ключ - название валюты,
// Значение - номер серии
серии = Новый Структура;
серии.Вставить("БВЛ",0);
серии.Вставить("USD",1);
серии.Вставить("EUR",2);
серии.Вставить("GBP",3);
// Добавить в диаграмму серии графиков
Для каждого график из серии Цикл
серия = курсы.Серии.Добавить(Строка(график.Ключ));
серия.Маркер = ТипМаркераДиаграммы.Нет;
КонецЦикла;
Далее необходимо выполнить запрос и перейти к формированию диаграммы. Следующая часть процедуры заполняет значение точек для серий диаграммы, добавленных в цикле инициализации серий графика. Если точек диаграммы не было создано ранее, они создается. Алгоритм рассчитан для работы с курсами валют в течении года, если нужен больший период механизм создания точек следует переделать либо в запросе, либо в данном цикле. Номер серии, используемый при выводе значения точки диаграммы, находится при помощи структуры ключ и значение по названию валюты, полученному для текущей строки выборки запроса.
Код 1C v 8.х
// Выполнить запрос и начать выборку
Query = SQL.Выполнить().Выбрать();
сменаТочки = 0;
Пока Query.Следующий() Цикл
// Добавляем новую точку после заполнения всех серий
Если сменаТочки <> Query.Точки Тогда
курсы.Точки.Добавить(Query.Точки);
сменаТочки = Query.Точки;
КонецЕсли;
Попытка
// Установка значения графика в точке и серии
курсы.УстановитьЗначение(
Курсы.Точки.Количество()-1,
серии[Строка(Query.Валюта)], Query.Курс);
Исключение
КонецПопытки;
КонецЦикла;
Получение значения точки уже построенного графика в элементе диаграмма можно при помощи функции "ПолучитьЗначение". Для использования этой функции нужно знать серию и точку диаграммы. После вычисления значения графика бивалютной корзины диаграмму нужно обновить:
Код 1C v 8.х // Заполнение расчетных значений для точек и серий
график = 0;
Пока график < Курсы.Точки.Количество() Цикл
// Создание графика бивалютной корзины
Корзина = (курсы.ПолучитьЗначение(график,серии["USD"]).Значение*0.55 +
курсы.ПолучитьЗначение(график,серии["EUR"]).Значение*0.45);
курсы.УстановитьЗначение(график,серии["БВЛ"], Корзина);
график = график + 1;
КонецЦикла;
// Обновить диаграмму в экранной форме.
курсы.Обновление = Истина;
КонецПроцедуры
Данные курсов можно загрузить штатным загрузчиком 1С с сайта РБК, для этого можно воспользоваться справочником "Валюты" нажав пункт меню "Загрузить курсы":
При построении графика предполагается наличие в справочнике данных следующих валют: EUR, GBP, USD, Руб. После открытия формы для загрузки данных курсов валют нужно указать интервал требуемых данных - например с 2000 по 2010 год и нажать на кнопку "Заполнить", затем на кнопку "Загрузить". В данном примере курсы валют будут загружены с сайта РБК:
После добавления необходимого состава валют и загрузки их курсов по отношению к рублю за нужный период можно пользоваться построителем, текст которого приведен выше. Для ускорения вывода данных дополнительные проверки не вводились, по этому, если нет требуемых данных, внешняя обработка вызовет ошибку выполнения.
Сохранение диаграммы, графиков и гистограмм в виде картинки
Построенные в диаграмме графики можно сохранить средствами 1С в один из поддерживаемых форматов:
BMP
EMF
GIF
Icon
JPEG
PNG
TIFF
WMF
Пример процедуры для экспорта диаграммы в графический формат:
Код 1C v 8.х Процедура PNG(Кнопка)
// Получить картинку диаграммы
График = ЭлементыФормы.ГрафикКурсов.ПолучитьКартинку( 500, 300, ФорматКартинки.PNG );
// Записать картинку из 1С в PNG
График.Записать( "C:\TEMP\Диаграмма.png" );
КонецПроцедуры
Полученная картинка графика будет выглядеть так:
Скачать внешнюю обработку иллюстрирующую работу элемента формы "Диаграмма" для построения графика курсов валют в "1С Предприятие"
Скачивать файлы может только зарегистрированный пользователь!
Источник Категория:
Диаграмма Работа с MS Word через OLE В качестве примера использования можно указать вот такую ситуацию: в зависимости от типа клиента (договора, документа и т.п) формируются разные тексты договоров с разным количеством таблиц. В реальности, конечно должены использоваться и макет и описанные здесь динамические механизмы.
В моем примере я заранее создал новый пустой документ.
Тестировалось на Office 2007.
Код 1C v 8.х
// "ПутьКФайлу" - строка. Полное имя файла в формате MSWord.
// "Ссылка" - ДокументСсылка (в моем случае - счет).
Процедура ВыполнитьОбработку() Экспорт
Попытка
Объект = ПолучитьCOMОбъект(ПутьКФайлу);
// Покажем документ. Для красоты.
Объект.Application.Visible = 1;
Word = Объект.Application;
Doc = Объект.Application.Documents(1);
Doc.Activate();
// Готовим переменную в которой будет содержимое нашего документа
// (текст, таблицы и проч).
Text = Word.S_election;
// Очистим документ
// Ctrl-A
Text.WholeStory();
// Del
Text.Delete(1, 1);
// Двигаемся на 3 строки ниже. Документ пустой, поэтому добавляем
// строки "Переводами коретки"
Text.TypeText(Символы.ВК);
Text.TypeText(Символы.ВК);
Text.TypeParagraph(); // другой вариант того же действия
// Выводим текст.
Text.TypeText("Обычный текст, набранный первую очередь");
// Курсор в конце строки
// Эмулируем нажатие Shift+Home - выделяем строку
Text.HomeKey(, 1);
// Форматирование выделенной строки
Text.Font.Bold = 9999998;
Text.Font.Size = 14;
Text.Font.Name = "Verdana";
// Сдвигаем курсор. Сдвинуть курсор по строкам возможно, только,
// если эти строки уже содержат текст, иначе ничего не произойдет.
Text.MoveUp(,2); // вверх на 2 строки
//Word.S_election.MoveDown(,числострок); // вниз
//Word.S_election.MoveLeft(,числострок); // влево
//Word.S_election.MoveRight(,числострок);// вправо
// Добавление текста. Текст выводится начиная с текщей позиции
// курсора.
Text.HomeKey(, 1);
Text.TypeText("Обычный текст, набранный во вторую очередь");
Text.MoveDown(,1); // вниз на 2 строки
Text.EndKey(); // в конец строки
Text.TypeParagraph(); // и в начало следующей строки
// Очищаем форматирование
Text.ClearFormatting();
// Добавляем таблицу.
// Получаем текущую позицию курсора
Position = Text.Range();
// Параметры: Позиция, число строк, число колонок,
// последние 2 параметра отвечают за автоподбор высоты и отображение
// границ таблицы
Table = Doc.Tables.Add(Position, 1, 6, 1, 2);
// Устанавливаем ширину колонок
Table.Columns(1).PreferredWidth=10;
Table.Columns(2).PreferredWidth=50;
Table.Columns(3).PreferredWidth=10;
Table.Columns(4).PreferredWidth=10;
Table.Columns(5).PreferredWidth=10;
Table.Columns(6).PreferredWidth=10;
// Задаем заголовки колонок
Row1=Table.Rows(1);
Row1.Cells(1).Range.Text="№ п/п";
Row1.Cells(2).Range.Text="Наименование";
Row1.Cells(4).Range.Text="Кол-во";
Row1.Cells(3).Range.Text="Ед. изм.";
Row1.Cells(5).Range.Text="Цена,руб.";
Row1.Cells(6).Range.Text="Сумма,руб.";
// Построчно выводим содержимое таблицы Товары
НомерСтроки = 1;
Для каждого СтрокаТовары Из Ссылка.Товары Цикл
Row=Table.Rows.Add();
Row.Cells(1).Range.Text=НомерСтроки;
// Выравнивание по левому краю
Row.Cells(1).Range.ParagraphFormat.Alignment = 1;
// В качестве текста можно передать только значение "простого" формата
// все агрегатные объекты, переданные как текст, что нормально для платформы 1с
// вызовут исключение.
Row.Cells(2).Range.Text=СтрокаТовары.Номенклатура.Наименование
+?(ЗначениеЗаполнено(СтрокаТовары.ХарактеристикаНоменклатуры),
" ("+СтрокаТовары.ХарактеристикаНоменклатуры+")","");
Row.Cells(4).Range.Text=Строка(СтрокаТовары.Количество);
Row.Cells(4).Range.ParagraphFormat.Alignment = 1;
Row.Cells(3).Range.Text=?(ЗначениеЗаполнено(СтрокаТовары.Номенклатура.БазоваяЕдиницаИзмерения)
,СтрокаТовары.Номенклатура.БазоваяЕдиницаИзмерения.Наименование,"-");
Row.Cells(3).Range.ParagraphFormat.Alignment = 1;
Row.Cells(5).Range.Text=Формат(СтрокаТовары.Цена,"ЧДЦ=2");
Row.Cells(5).Range.ParagraphFormat.Alignment = 1;
Row.Cells(6).Range.Text=Формат(СтрокаТовары.Сумма,"ЧДЦ=2");
Row.Cells(6).Range.ParagraphFormat.Alignment = 1;
НомерСтроки=НомерСтроки+1;
КонецЦикла;
// Задаем форматирование первой строки
// Если сделать это сразу, то все новые строки таблицы будут
// формироваться с тем же форматом
Row1.Range.Font.Bold = 9999998;
Row1.Range.Font.Size = 14;
Row1.Range.Font.Name = "Verdana";
Row1.Range.ParagraphFormat.Alignment = 1;
// Последняя строка...
Row = Table.Rows.Add();
Row.Range.Font.Bold = 9999998;
Row.Cells(1).Range.Text="Итого:";
Исключение
Doc.Save();
Сообщить(ОписаниеОшибки());
Объект.Application.Quit();
Объект = Неопределено;
КонецПопытки;
Попытка // эта конструкция выдает исключительную ситуацию, но при этом
// результат все-равно работает))
// объединяем ячейки в конце таблицы
Table.cell(НомерСтроки+1, 1).Merge(Table.cell(НомерСтроки+1, 5));
Исключение
КонецПопытки;
Попытка
Row.Cells(1).Range.ParagraphFormat.Alignment = 3;
Row.Cells(2).Range.Text=Формат(Ссылка.Товары.Итог("Сумма"), "ЧДЦ=2");
Row.Cells(2).Range.ParagraphFormat.Alignment = 1;
Doc.Save();
Объект.Application.Quit();
Объект = Неопределено;
Исключение
Doc.Save();
Сообщить(ОписаниеОшибки());
Объект.Application.Quit();
Объект = Неопределено;
КонецПопытки;
КонецПроцедуры
Часто при создании документа из макета используют метод замены кусков текста. В примере представлен другой вариант выполнения того же действия - с использованием закладок. Также представлен пример построения нумерованного списка, вставки картинки, настройки ее параметров.
Пример использования описанных возможностей прост. При формировании коммерческого предложения бывает необходимо описать список условий, добавить изображение образца продукции.
Для отображения закладок включите эту опцию в настройках вашего Word'а.
В моем примере я заранее создал новый пустой документ, путь к документу и картинке прописан в тексте. Не забудте указать свои пути.
Код 1C v 8.х Процедура ВыполнитьОбработку() Экспорт
Попытка
//Объект = ПолучитьCOMОбъект(ПутьКФайлу);
Объект = ПолучитьCOMОбъект("C:\Users\NKrylov\Desktop\Тест.docx");
// Покажем документ.
Объект.Application.Visible = 1;
Word = Объект.Application;
ThisDocument = Word.Documents(1);
ThisDocument.Activate();
// Отключим проверку грамматики и вывод информации о грамматических ошибках.
ThisDocument.GrammarChecked=0;
ThisDocument.ShowGrammaticalErrors=0;
// Готовим переменную в которой будет содержимое документа (текст).
S_election = Word.S_election;
// Очистим документ
// Ctrl-A
S_election.WholeStory();
// Del
S_election.Delete(1, 1);
// Уменьшим междустрочный интервал.
S_election.ParagraphFormat.LineSpacingRule = 0; // 1 по умолчанию
S_election.ParagraphFormat.SpaceAfter = 0; // 10 по умолчанию
// Разметим документ. Это можно сделать и предварительно в макете
ThisDocument.Bookmarks.Add("Закладка1", S_election.Range());
S_election.TypeParagraph();
S_election.TypeText("34r3 ");
S_election.HomeKey(, 1);
ThisDocument.Bookmarks.Add("Закладка2", S_election.Range());
S_election.EndKey();
S_election.TypeParagraph();
ThisDocument.Bookmarks.Add("Закладка3", S_election.Range());
S_election.TypeParagraph();
ThisDocument.Bookmarks.Add("Закладка4", S_election.Range());
S_election.EndKey();
// Так можно работать с текстом только в конкреной области документа - это и будет замена метода Find-Execute.
ThisDocument.Bookmarks("Закладка3").Range.S_elect();
S_election = Word.S_election;
Bookmark = ThisDocument.Bookmarks("Закладка3");
Table = ThisDocument.Tables.Add(Bookmark.Range(),1,5,1,2);
Table.Rows(1).Cells(1).Range.Text = 1;
Table.Rows(1).Cells(2).Range.Text = 2;
Table.Rows(1).Cells(3).Range.Text = 3;
Table.Rows(1).Cells(4).Range.Text = 4;
Table.Rows(1).Cells(5).Range.Text = 5;
// После вывода таблицы, появится "лишняя строка", удалим ее
// в результате курсор встанет в область закладки 4
S_election.MoveDown(, 1);
S_election.Delete(1, 1);
// Этот текст будет выведен не с последней позиции курсора, а в активной области.
// в данном случае - в области закладки 2
ThisDocument.Bookmarks("Закладка2").Range.S_elect();
S_election = Word.S_election;
Text = S_election.Range.Text;
S_election.TypeText(Text + " sdcsdcs");
// При выводе текста закладка "сбросилась". Восстановим.
// "Победить" эту проблему я так и не смог((
// Хотя на практике, закладка больше и не понадобится.
// Дважды выводить текст в одну и ту же область - не имеет смысла.
S_election.HomeKey(, 1);
ThisDocument.Bookmarks.Add("Закладка2", S_election.Range());
S_election.EndKey();
// В области закладки 4 сформируем нумерованный список
ThisDocument.Bookmarks("Закладка4").Range.S_elect();
S_election = Word.S_election; // активная (выделенная) область будет начинаться
// от закладки 4)
// Добавим текст "для опытов"
// 1
S_election.TypeText("sdcsdcsdcsdc");
S_election.TypeParagraph();
// 2
S_election.TypeText("sdcsdcsdcsdc");
S_election.TypeParagraph();
// 3
S_election.TypeText("sdcsdcsdcsdc");
S_election.TypeParagraph();
// 4
S_election.TypeText("sdcsdcsdcsdc");
S_election.TypeParagraph();
// Выделяем введенный текст
S_election.MoveUp(,4,1);
// Настроим шаблон объекта галереи списков
// Галереи списков бывают несккольких типов, 2 - нумерованные списки
ListTemplate = Word.ListGalleries(2).ListTemplates(1).ListLevels(1);
// Формат нумератора списка - точка после символа нумерации
ListTemplate.NumberFormat = "%1.";
// стиль нумератора - арабские цифры
ListTemplate.NumberStyle = 0; // wdListNumberStyleArabic
// 4 - маленькие латинские буквы.
// 2 - маленькие римские цифры.
// 58- меленькие русские буквы.
// Font = Template.Font; // можно указать форматирование текста списка
// Применим шаблон к выделенному тексту
S_election.Range.ListFormat.ApplyListTemplateWithLevel( Word.ListGalleries(2).ListTemplates(1));
// Перейдем в конец текста
S_election.EndKey(6);
// Добавим картинку
// Параметры: путь к файлу, создавать ссылку на картинку, сохранять с файлом
Picture = S_election.InlineShapes.AddPicture("C:\Users\NKrylov\Desktop\Новый.bmp ", Ложь, Истина);
// Зададим размер
Picture.Height = 100;
Picture.Width = 150;
// Чтобы установить обтекание текста, конвертируем рисунок в фигуру
Shape = Picture.ConvertToShape();
Shape.WrapFormat.Type = 0; // по контуру...
ThisDocument.Save();
//Объект.Application.Quit();
Объект = Неопределено;
Исключение
ThisDocument.Save();
Сообщить(ОписаниеОшибки());
//Объект.Application.Quit();
Объект = Неопределено;
КонецПопытки;
КонецПроцедуры
Автор:
Крылов Николай Категория:
Работа с Microsoft Office и OpenOffice Печать в PDF Столкнулся с вопросом печати счета на оплату сразу в pdf.
Решение: установка виртуального принтера
bioPDF скачать можно тут. И прописывание в 1с следующего кода:
Код 1C v 8.х
Попытка
ПДФ_принтер = Новый COMОбъект("bioPDF.PDFPrinterSettings");
Исключение
#Если Клиент Тогда
Предупреждение("Не удалось подключиться к PDF-принтеру!", 60);
#КонецЕсли
Возврат;
КонецПопытки;
ПДФ_принтер_имя = ПДФ_принтер.GetPrinterName();
ИмяФайла = Константы.КаталогФайловПДФ.Получить() +"" + Заголовок + ".pdf";
ПДФ_принтер.SetValue("output", ИмяФайла);
ПДФ_принтер.SetValue("ConfirmOverwrite", "yes");
ПДФ_принтер.SetValue("ShowSaveAS", "never");
ПДФ_принтер.SetValue("ShowSettings", "never");
ПДФ_принтер.SetValue("ShowPDF", "no");
ПДФ_принтер.SetValue("Target", "printer");
ПДФ_принтер.SetValue("Subject", "Report generated at " + ТекущаяДата());
ПДФ_принтер.SetValue("UseThumbs", "yes");
ПДФ_принтер.SetValue("Zoom", "100");
ПДФ_принтер.SetValue("WatermarkFontSize", "10");
ПДФ_принтер.SetValue("WatermarkTransparency", "50");
ПДФ_принтер.SetValue("WatermarkVerticalPosition", "bottom");
ПДФ_принтер.SetValue("WatermarkHorizontalPosition", "right");
ПДФ_принтер.SetValue("WatermarkVerticalAdjustment", "3");
ПДФ_принтер.SetValue("WatermarkHorizontalAdjustment", "1");
ПДФ_принтер.SetValue("WatermarkRotation", "90");
ПДФ_принтер.SetValue("WatermarkColor", "#ff0000");
ПДФ_принтер.SetValue("WatermarkOutlineWidth", "1");
ПДФ_принтер.WriteSettings(True);
ПечатныйДокумент.ИмяПринтера = ПДФ_принтер_имя;
ПечатныйДокумент.АвтоМасштаб = Истина;
ПечатныйДокумент.Напечатать();
Как выяснилось во время печати в pdf есть проблема с передачей прозрачности картинки. Если вставлять прозрачную печать в счет поверх подписи, то в pdf-документе печать будет непрозрачной и затрет все собой. У меня был частный случай, когда печать находилась на одном и том же месте документа и за ней постоянно было одно и то же. Решением в данном случае стала генерация картинки печати с фоном, на котором она должна быть и вставка её в макет.
Так же решением может быть печать не в pdf а xps документ. Там с прозрачностью все нормально.
Автор:
Андрей Данилюк
Экспорт печатных форм и любых данных из 1С в BMP , JPEG, PCX, PDF, PNG и TIFF. Категория:
COM-объекты, WMI, WSH Пример построения в Word нумерованного списка, закладок, вставки картинки, настройки ее параметров. Часто при создании документа из макета используют метод замены кусков текста. В примере представлен другой вариант выполнения того же действия - с использованием закладок. Также представлен пример построения нумерованного списка, вставки картинки, настройки ее параметров.
Пример использования описанных возможностей прост. При формировании коммерческого предложения бывает необходимо описать список условий, добавить изображение образца продукции.
Для отображения закладок включите эту опцию в настройках вашего Word'а.
В моем примере я заранее создал новый пустой документ, путь к документу и картинке прописан в тексте. Не забудьте указать свои пути.
Тестировалось на Office 2007.
Некоторые переменные переименованы по стандарту Office: Text --> S_election. Doc --> ThisDocument.
Вот текст модуля:
Код 1C v 8.х Процедура ВыполнитьОбработку() Экспорт
Попытка
//Объект = ПолучитьCOMОбъект(ПутьКФайлу);
Объект = ПолучитьCOMОбъект("C:\Users\NKrylov\Desktop\Тест.docx");
// Покажем документ.
Объект.Application.Visible = 1;
Word = Объект.Application;
ThisDocument = Word.Documents(1);
ThisDocument.Activate();
// Отключим проверку грамматики и вывод информации о грамматических ошибках.
ThisDocument.GrammarChecked=0;
ThisDocument.ShowGrammaticalErrors=0;
// Готовим переменную в которой будет содержимое документа (текст).
S_election = Word.S_election;
// Очистим документ
// Ctrl-A
S_election.WholeStory();
// Del
S_election.Delete(1, 1);
// Уменьшим междустрочный интервал.
S_election.ParagraphFormat.LineSpacingRule = 0; // 1 по умолчанию
S_election.ParagraphFormat.SpaceAfter = 0; // 10 по умолчанию
// Разметим документ. Это можно сделать и предварительно в макете
ThisDocument.Bookmarks.Add("Закладка1", S_election.Range());
S_election.TypeParagraph();
S_election.TypeText("34r3 ");
S_election.HomeKey(, 1);
ThisDocument.Bookmarks.Add("Закладка2", S_election.Range());
S_election.EndKey();
S_election.TypeParagraph();
ThisDocument.Bookmarks.Add("Закладка3", S_election.Range());
S_election.TypeParagraph();
ThisDocument.Bookmarks.Add("Закладка4", S_election.Range());
S_election.EndKey();
// Так можно работать с текстом только в конкреной области документа - это и будет замена метода Find-Execute.
ThisDocument.Bookmarks("Закладка3").Range.S_elect();
S_election = Word.S_election;
Bookmark = ThisDocument.Bookmarks("Закладка3");
Table = ThisDocument.Tables.Add(Bookmark.Range(),1,5,1,2);
Table.Rows(1).Cells(1).Range.Text = 1;
Table.Rows(1).Cells(2).Range.Text = 2;
Table.Rows(1).Cells(3).Range.Text = 3;
Table.Rows(1).Cells(4).Range.Text = 4;
Table.Rows(1).Cells(5).Range.Text = 5;
// После вывода таблицы, появится "лишняя строка", удалим ее
// в результате курсор встанет в область закладки 4
S_election.MoveDown(, 1);
S_election.Delete(1, 1);
// Этот текст будет выведен не с последней позиции курсора, а в активной области.
// в данном случае - в области закладки 2
ThisDocument.Bookmarks("Закладка2").Range.S_elect();
S_election = Word.S_election;
Text = S_election.Range.Text;
S_election.TypeText(Text + " sdcsdcs");
// При выводе текста закладка "сбросилась". Восстановим.
// "Победить" эту проблему я так и не смог((
// Хотя на практике, закладка больше и не понадобится.
// Дважды выводить текст в одну и ту же область - не имеет смысла.
S_election.HomeKey(, 1);
ThisDocument.Bookmarks.Add("Закладка2", S_election.Range());
S_election.EndKey();
// В области закладки 4 сформируем нумерованный список
ThisDocument.Bookmarks("Закладка4").Range.S_elect();
S_election = Word.S_election; // активная (выделенная) область будет начинаться
// от закладки 4)
// Добавим текст "для опытов"
// 1
S_election.TypeText("sdcsdcsdcsdc");
S_election.TypeParagraph();
// 2
S_election.TypeText("sdcsdcsdcsdc");
S_election.TypeParagraph();
// 3
S_election.TypeText("sdcsdcsdcsdc");
S_election.TypeParagraph();
// 4
S_election.TypeText("sdcsdcsdcsdc");
S_election.TypeParagraph();
// Выделяем введенный текст
S_election.MoveUp(,4,1);
// Настроим шаблон объекта галереи списков
// Галереи списков бывают несккольких типов, 2 - нумерованные списки
ListTemplate = Word.ListGalleries(2).ListTemplates(1).ListLevels(1);
// Формат нумератора списка - точка после символа нумерации
ListTemplate.NumberFormat = "%1.";
// стиль нумератора - арабские цифры
ListTemplate.NumberStyle = 0; // wdListNumberStyleArabic
// 4 - маленькие латинские буквы.
// 2 - маленькие римские цифры.
// 58- меленькие русские буквы.
// Font = Template.Font; // можно указать форматирование текста списка
// Применим шаблон к выделенному тексту
S_election.Range.ListFormat.ApplyListTemplateWithLevel( Word.ListGalleries(2).ListTemplates(1));
// Перейдем в конец текста
S_election.EndKey(6);
// Добавим картинку
// Параметры: путь к файлу, создавать ссылку на картинку, сохранять с файлом
Picture = S_election.InlineShapes.AddPicture("C:\Users\NKrylov\Desktop\Новый.bmp ", Ложь, Истина);
// Зададим размер
Picture.Height = 100;
Picture.Width = 150;
// Чтобы установить обтекание текста, конвертируем рисунок в фигуру
Shape = Picture.ConvertToShape();
Shape.WrapFormat.Type = 0; // по контуру...
ThisDocument.Save();
//Объект.Application.Quit();
Объект = Неопределено;
Исключение
ThisDocument.Save();
Сообщить(ОписаниеОшибки());
//Объект.Application.Quit();
Объект = Неопределено;
КонецПопытки;
КонецПроцедуры
Написал Nikola23 - http://infostart.ru/public/68072/ Категория:
Работа с Microsoft Office и OpenOffice Вывод картинки (изображения) на печать, в макет (табличный документ) Код 1C v 8.х // 1-й вариант
//Как вывести картинку в табличный документ?
ТабДок = Новый ТабличныйДокумент;
Макет = ОбработкаОбъект.ПолучитьМакет("Макет");
ОбластьКартинки = Макет.ПолучитьОбласть("ОбластьСКартинкой");
Картинка = Новый Картинка(ПутьККартинке);
// Элемент управления "Логотип" входит в коллекцию картинок области.
ОбластьКартинки.Рисунки.Логотип.Картинка = Картинка;
ТабДок.Вывести(ОбластьКартинки);
ТабДок.Показать();
// 2-й вариант
//Как вывести картинку в табличный документ без изменения макета?
Область = Макет.ПолучитьОбласть("Шапка");
Рисунок = Область.Рисунки.Добавить(ТипРисункаТабличногоДокумента.Картинка);
Рисунок.Верх = 5;
Рисунок.Высота = 10;
Рисунок.Ширина = 10;
Рисунок.Лево = 5;
Рисунок.Картинка = Новый Картинка(ПутьККартинке);
Рисунок.РазмерКартинки = РазмерКартинки.РеальныйРазмер;
ТабДок.Вывести(Область);
//3-й вариант
//ПечатьОрганизации , добавляем в макет картинку с именем Картинка1 в самую нижнюю
//область с именем ОбластьПечатьОрганизации
ОбластьПечатьОрганизации = Макет.ПолучитьОбласть("ПечатьОрганизации");
Картинка= Новый Картинка("C:\files\img\печатьОрганизации.gif") ;
ОбластьПечатьОрганизации.Рисунки.Картинка1.Картинка = картинка;
ТабДок.Вывести(ОбластьПечатьОрганизации);
// 4-й вариант динамически
ОбластьПечатьОрганизации = Макет.ПолучитьОбласть("ПечатьОрганизации");
КартинкаПечатьОрганизации = ОбластьПечатьОрганизации.Рисунки.Добавить(ТипРисункаТабличногоДокумента.Картинка);
КартинкаПечатьОрганизации.Картинка = БиблиотекаКартинок.ОбщаяКартинка1;
КартинкаПечатьОрганизации.Верх = 0;
КартинкаПечатьОрганизации.Высота = 80;
КартинкаПечатьОрганизации.Ширина = 80;
КартинкаПечатьОрганизации.Лево = 50;
КартинкаПечатьОрганизации.ГраницаСверху = Ложь;
КартинкаПечатьОрганизации.ГраницаСлева = Ложь;
КартинкаПечатьОрганизации.ГраницаСправа = Ложь;
КартинкаПечатьОрганизации.ГраницаСнизу = Ложь;
КартинкаПечатьОрганизации.РазмерКартинки = РазмерКартинки.АвтоРазмер;
ТабДок.Вывести(ОбластьПечатьОрганизации);
//5-й вариант получение картинки из хранилища значений
// Выборка.Изображение - выборка из запроса, Изображение реквизит -хранил. значений
Попытка
Путь = КаталогВременныхФайлов()+ "\1С_Картинка_"+Формат(ТекущаяДата(),"ДФ=yyyyMMddЧЧммсс")+".bmp ";
КартинкаВПамяти = Выборка.Изображение.Получить();
КартинкаВПамяти.Записать(Путь);
ОбластьСостав.Рисунки.D1.Картинка = Новый Картинка(Путь);
Исключение
ОбластьСостав.Рисунки.D1.Картинка = Новый Картинка;
КонецПопытки;
Для
7.7 пример обработки, которая выводит все картинки (.jpg) из выбранного каталога (и подкаталогов) в печатную форму
Скачивать файлы может только зарегистрированный пользователь!
Вот ее код:
Код 1C v 7.x Перем Картинка, ТЗКаталога, ПутьКаталогаРисунков;
//******************************************************************************
Процедура Сформировать1()
Таб = СоздатьОбъект("Таблица");
Таб.ИсходнаяТаблица("Сформировать");
Картинка = СоздатьОбъект("Картинка");
т=1;
ТЗКаталога.ВыбратьСтроки();
Пока ТЗКаталога.ПолучитьСтроку() = 1 Цикл
Картинка.Загрузить(ТЗКаталога.Путь);
Сформировать = т;
Таб.ВывестиСекцию("Заголовок");
т = т+1;
КонецЦикла;
Таб.Опции(0,0,0,0);
Таб.Показать("Сформировать","");
ТЗКаталога = "";
КонецПроцедуры
//******************************************************************************
Процедура карт(карт) //Вызывается из объекта картинка на печатной форме
карт.РежимРисования(3);
карт.УстановитьКартинку(Картинка);
КонецПроцедуры //карт(карт) Вызывается из объекта картинка на печатной форме
//******************************************************************************
Процедура СканироватьКаталог(Каталог)
Перем А;
ФСО=СоздатьОбъект("ФС");
Ф=ФСО.НайтиПервыйФайл(Каталог+"*");
Пока Ф<>"" Цикл
Если (Ф<>".")И(Ф<>"..") Тогда
ФС.АтрибутыФайла(Каталог+Ф,,А);
Если Сред(А,4,1)="1" Тогда
СканироватьКаталог(Каталог+Ф+"\");
Иначе
Если (Прав(Ф,4)=".jpg") или (Прав(Ф,4)=".wmf") или (Прав(Ф,4)=".emf") или (Прав(Ф,4)=".ico") или (Прав(Ф,4)=".bmp ") или (Прав(Ф,4)=".dib") или (Прав(Ф,4)=".rle") Тогда
ТЗКаталога.НоваяСтрока();
ТЗКаталога.Путь = Каталог+Ф;
ТЗКаталога.Файл = Ф; //Для поиска файла по имени (исп в другой обработке)
КонецЕсли;
КонецЕсли;
КонецЕсли;
//Сообщить(Каталог+Ф);
Ф=ФСО.НайтиСледующийФайл();
КонецЦикла;
КонецПроцедуры //СканироватьКаталог(Каталог)
//******************************************************************************
Процедура Сформировать()
Если ФС.ВыбратьКаталог(ПутьКаталогаРисунков,"Выберете папку с рисунками .jpg...",60) <> 1 Тогда
Предупреждение("Рисунки не покажу!");
Возврат;
Иначе
ТЗКаталога = СоздатьОбъект("ТаблицаЗначений");
ТЗКаталога.НоваяКолонка("Путь",,,,,,,);
ТЗКаталога.НоваяКолонка("Файл",,,,,,,);
СканироватьКаталог(ПутьКаталогаРисунков+"\");
КонецЕсли;
Сформировать1();
КонецПроцедуры
Категория:
Табличный документ Экспорт печатных форм и любых данных из 1С в BMP , JPEG, PCX, PDF, PNG и TIFF. Оптимальным решением является установка
Bullzip PDF Printer . После установки в системе появляется виртуальный принтер, с помощью которого можно "печатать" в файл pdf из любого приложения. Программа бесплатная, работает в терминале и имеет поддержку русского языка.
После установки, можно печатать напрямую используя код:
Код 1C v 8.х
//Таб - ТабличныйДокумент
//ИмяФайла – путь для сохранения файла PDF (например «D:\Torg12.pdf»)
Процедура СоздатьФайлПДФ(Таб, ИмяФайла)
Попытка
ПДФПринтер = Новый ComObject(«Bullzip.PDFPrinterSettings»);
ПДФПринтер.SetValue(«output», ИмяФайла);
ПДФПринтер.SetValue(«ShowSaveAS», «never»);
ПДФПринтер.SetValue(«ShowProgress», «no»);
ПДФПринтер.SetValue(«ShowProgressFinished», «no»);
ПДФПринтер.SetValue(«ShowSettings», «never»);
ПДФПринтер.SetValue(«ShowPDF», «no»);
ПДФПринтер.SetValue(«ConfirmOverwrite»,»no»);
ПДФПринтер.WriteSettings();
Таб.Автомасштаб = Истина;
Таб.ИмяПринтера = «Bullzip PDF Printer»;Таб.Напечатать(Истина);
PDFФайл = Новый Файл(ИмяФайла);
Пока НЕ PDFФайл.Существует() Цикл
ОбработкаПрерыванияПользователя();
КонецЦикла;
Исключение
Сообщить(ОписаниеОшибки());
Сообщить(«Скорее всего необходимо установить или переустановить «»Bullzip PDF Printer»);
КонецПопытки;
//устанавливаем принтер по умолчанию
Таб.ИмяПринтера = ПолучитьПринтерПоУмолчанию();
КонецПроцедуры
Здесь функция
ПолучитьПринтерПоУмолчанию() нужна для того чтобы вернуть печатной форме принтер по умолчанию, т.к. если напечатать без предварительного просмотра то печать пойдет на виртуальный PDF принтер BullzipPDFPrinter.
Код 1C v 8.х //получаем принтер по умолчанию
Функция ПолучитьПринтерПоУмолчанию()
Скрипт = Новый ComObject(«MSScriptControl.ScriptControl»);
Скрипт.Language = «vbscript»;
Скрипт.AddCode(»
|Function GetDefaultPrinter()
|GetDefaultPrinter=vbNullString
|Set objWMIService=GetObject(«»winmgmts:»" _
|& «»{impersonationLevel=impersonate}!\\.\root\cimv2″»)
|Set colInstalledPrinters=objWMIService.ExecQuery _
|(«»S_elect * from Win32_Printer»")
|For Each objPrinter in colInstalledPrinters
|If objPrinter.Attributes and 4 Then
|GetDefaultPrinter=objPrinter.Name
|Exit For
|End If
|Next
|End Function»);
Возврат СокрЛП(Скрипт.run(«GetDefaultPrinter»));
КонецФункции
Печать в PDF используя bioPDF Категория:
Администрирование