Пример работы с общим макетом типа ActiveDocument в клиент-серверном варианте Код 1C v 8.х //**********************************************************************************
//получаем макет на сервере, сохраняем в файл и передаем на клиента
&НаСервере
Функция ПолучитьДанныеМакета()
АдресХранилища = Новый УникальныйИдентификатор();
Макет = ПолучитьОбщийМакет("Договор");
ВременныйФайл = ПолучитьИмяВременногоФайла("doc");
Макет.Записать(ВременныйФайл);
Адрес = ПоместитьВоВременноеХранилище(Новый ДвоичныеДанные(ВременныйФайл), АдресХранилища);
УдалитьФайлы(ВременныйФайл);
Возврат Адрес;
КонецФункции
//**********************************************************************************
//код сотрудника, нужно для создания уникального имени файла для каждого пользователя
&НаСервере
Функция КодПользователя(Пользователь)
Возврат СокрЛП(Пользователь.Сотрудник.Код);
КонецФункции
//**********************************************************************************
//Ссылка - ссылка на договор(ссылка справочника, нужно для подстановки реквизитов)
//РеквизитыДляПечати - структура с нужными реквизитами
&НаКлиенте
Процедура ПечатьДоговора(Ссылка,РеквизитыДляПечати)
Пользователь = ОбщегоНазначения.ТекущийПользователь();
Каталог = КаталогВременныхФайлов();
Каталог = ?(Прав(Каталог,1) = "\", Каталог, Каталог+"\");
ПолноеИмяФайла = Каталог+"Договор_"+КодПользователя(Пользователь)+".doc";
Попытка
Индификатор = ПолучитьДанныеМакета();
МакетДоговора = ПолучитьИзВременногоХранилища(Индификатор);
МакетДоговора.Записать(ПолноеИмяФайла);
Исключение
Сообщить(ОписаниеОшибки());
КонецПопытки;
Попытка
MSWord = Новый COMОбъект("Word.Application");
Исключение
Сообщить("Ошибка при попытке создать объект ""MS Word""!" + Символы.ПС +
"Возможно приложение ""MS Word"" не установлено или установлено неправильно.", СтатусСообщения.Внимание);
КонецПопытки;
MSWord.Documents.Open(ПолноеИмяФайла);
Попытка
Документ = MSWord.Application.Documents(1);
Документ.Activate();
Исключение
// Если произойдет ошибка, выводятся данные об ошибке, и объект закрывается.
Сообщение = Новый СообщениеПользователю();
Сообщение.Текст = ОписаниеОшибки();
Сообщение.Сообщить();
MSWord.Application.Quit();
Возврат;
КонецПопытки;
//*******************************************
//тут выполняем замену
Попытка
Замена = Документ.Content.Find;
Замена.Execute("{ЧтоМеняем}", Ложь, Истина, Ложь, , , Истина, , Ложь, "На что меняем");
Исключение
КонецПопытки;
// Делаем видимым приложение и активизируем его.
MSWord.Application.Visible = Истина;
MSWord.Activate();
КонецПроцедуры
Категория:
Работа с Microsoft Office и OpenOffice Фоновые задания 1С, примеры работы и параллельного запуска В рамках выполнения проекта столкнулся с интересной задачей ускорения загрузки данных из других информационных баз. Задача загрузки данных предполагала выполнение к внешней базе несвязанных между собой запросов, результаты которых помещаются в одну таблицу значений. Когда на оптимизацию запроса рука уже не поднималась, приступил к ускорению загрузки с помощью распараллеливания процессов. Отмечу, что элементы кода в данном посте приведены для клиент-серверного варианта и укрупнено для общего понимания подхода.
Что у нас в 1с Предприятии 8.2 имеется для распараллеливания & это фоновые задачи . Метод, который будет вызываться в фоновой задаче, должен быть прописан в серверном общем модуле и быть экспортным. Естественно нам понадобиться в фоновую задачу передавать и забирать значения.
В моем случае передача значений в фоновую задачу происходила через параметры. Метод ЗагрузитьИзВИБ имеет два параметра это ВходнойПараметр и АдресВХранилище. ВходнойПараметр это структура, в которую сгружаются все данные, необходимые для проведения загрузки. АдресВХранилище это адрес во временном хранилище, по которому будет передан результат загрузки. Сам код метода фонового задания выглядит так:
Код 1C v 8.х Процедура ЗагрузитьИзВИБ(ВходнойПараметр,АдресВХранилище) Экспорт
//Из структуры перегоняем данные в переменные
ТаблицаДляЗаполнения = ВходнойПараметр.ТаблицаДляЗаполнения;
ДанныеОбъекта = ВходнойПараметр.ДанныеОбъекта;
//Тут идет собственно загрузка данных
ВыполнитьЗагрузку(ТаблицаДляЗаполнения,ДанныеОбъекта);
//Возвращаем данные из фоновой задачи в хранилище
ПоместитьВоВременноеХранилище(ТаблицаДляЗаполнения, АдресВХранилище);
КонецПроцедуры
Зачем нам в фоновую задачу передавать адрес во временном хранилище. Наша фоновая задача должна куда-то положить результат, причем так чтобы мы знали где его потом взять.
Для того чтобы запустить фоновые задачи выполняется следующий код:
Код 1C v 8.х МассивАдресовВХранилище = Новый Массив;
МассивЗапущенныхЗаданий = Новый Массив;
Сч = 1;
Пока Сч <= КоличествоПотоков Цикл
Ключ = Новый УникальныйИдентификатор;
ВходнойПараметр = Новый Структура;
ВходнойПараметр.Вставить("ТаблицаДляЗаполнения",ТаблицаДляЗаполнения);
ВходнойПараметр.Вставить("ДанныеОбъекта",ДанныеОбъекта);
//Подготовим адрес в хранилище
АдресВХранилище = ПоместитьВоВременноеХранилище(Неопределено);
МассивПараметров = Новый Массив;
МассивПараметров.Добавить(ВходнойПараметр);
МассивПараметров.Добавить(АдресВХранилище);
МассивАдресовВХранилище.Добавить(АдресВХранилище);
МассивЗапущенныхЗаданий.Добавить(ФоновыеЗадания.Выполнить("ОбщийМодульСервер.ЗагрузитьИзВИБ",МассивПараметров, Ключ, "Загрузка"));
Сч = Сч + 1;
КонецЦикла;
Перед запуском фоновой задачи через ФоновыеЗадания.Выполнить() мы формируем массив параметров. Значения из массива параметров переходят в метод фонового задания в качестве параметров. В МассивЗапущенныхЗаданий хранятся все фоновые задачи, которые мы запустили. Теперь надо подождать их ожидания.
ФоновыеЗадания.ОжидатьЗавершения(МассивЗапущенныхЗаданий);
После того как все задачи были завершены, можем приступить к получению из них данных. Для этого мы проходим по всем адресам в хранилище, которые хранятся в массиве МассивАдресовВХранилище . После получения результата фонового задания перегоняем его в общую таблицу.
Код 1C v 8.х Для Каждого ТекАдресВХранилище Из МассивАдресовВХранилище Цикл
ТекТаблица = ПолучитьИзВременногоХранилища(ТекАдресВХранилище);
Для Каждого ТекСтрокаДанные Из ТекТаблица Цикл
НоваяСтрока = НашаОбщаяТаблица.Добавить();
ЗаполнитьЗначенияСвойств(НоваяСтрока,ТекСтрокаДанные);
КонецЦикла;
КонецЦикла;
Вопрос определения оптимального количества потоков выходит за рамки данного поста. А после получения некоторых результатов на рабочих данных пока что выходит и за рамки моего сознания . Но если у вас есть идеи как посчитать нужное количество потоков, пишите в комментариях, с радостью почитаю.
Источник
Категория:
Регламентные задания, Фоновые задания Динамический отчет на СКД с разными вариантами На днях делал несколько однотипных отчетов на СКД.
Общий принцип: формируются все варианты отчета, указанные в настройках схемы и каждый вариант выводится на отдельной вкладке.
Потом возникла мысль попробовать объединить все схемы в один отчет, чтобы не плодить лишних объектов в конфигурации. При этом количество вариантов в этих схемах заранее неизвестно. Ok, challenge accepted.
В тестовой конфигурации создаю для отчета две схемы компоновки, "Склад" и "Заявки".
Запросы наборов данных приводить не буду, для каждой схемы в настройках добавляю несколько вариантов отчетов.
Теперь переходим к созданию формы. Практически все реквизиты формы будут создаваться при выборе необходимого макета отчета.
Код 1C v 8.2 УП &НаСервере
Процедура СоздатьПереченьОтчетов()
Для Каждого Макет Из РеквизитФормыВЗначение("Отчет").Метаданные().Макеты Цикл
Элементы.МакетОтчета.СписокВыбора.Добавить(Макет.Имя, Макет.Синоним);
КонецЦикла;
КонецПроцедуры // СоздатьПереченьОтчетов()
&НаСервере
Процедура ОбработатьВыборМакета()
Макет = РеквизитФормыВЗначение("Отчет").ПолучитьМакет(МакетОтчета);
мУдалить = ?(ПустаяСтрока(РеквизитыКУдалению), Новый Массив, ПолучитьИзВременногоХранилища(РеквизитыКУдалению));
мДобавить = Новый Массив;
кУдалению = Новый Массив;
Для Каждого Вариант Из Макет.ВариантыНастроек Цикл
ИмяРеквизита = "ТабДок_" + Вариант.Имя;
тРеквизит = Новый РеквизитФормы(ИмяРеквизита, Новый ОписаниеТипов("ТабличныйДокумент"));
мДобавить.Добавить(тРеквизит);
кУдалению.Добавить(ИмяРеквизита);
КонецЦикла;
ИзменитьРеквизиты(мДобавить, мУдалить);
Пока Элементы.СтраницыОтчета.ПодчиненныеЭлементы.Количество() Цикл
Элементы.Удалить(Элементы.СтраницыОтчета.ПодчиненныеЭлементы[0]);
КонецЦикла;
Для Каждого Вариант Из Макет.ВариантыНастроек Цикл
Страница = Элементы.Добавить("Страница_" + Вариант.Имя, Тип("ГруппаФормы"), Элементы.СтраницыОтчета);
Страница.Вид = ВидГруппыФормы.Страница;
Страница.Заголовок = Вариант.Представление;
ИмяРеквизита = "ТабДок_" + Вариант.Имя;
ТабДок = Элементы.Добавить(ИмяРеквизита, Тип("ПолеФормы"), Страница);
ТабДок.Вид = ВидПоляФормы.ПолеТабличногоДокумента;
ТабДок.ПутьКДанным = ИмяРеквизита;
ТабДок.ПоложениеЗаголовка = ПоложениеЗаголовкаЭлементаФормы.Нет;
ЭтаФорма[ИмяРеквизита].Очистить();
КонецЦикла;
РеквизитыКУдалению = ПоместитьВоВременноеХранилище(кУдалению, УникальныйИдентификатор);
КонецПроцедуры // ОбработатьВыборМакета()
&НаСервере
Процедура СформироватьОтчеты()
Схема = РеквизитФормыВЗначение("Отчет").ПолучитьМакет(МакетОтчета);
Для Каждого Вариант Из Схема.ВариантыНастроек Цикл
Отчет.КомпоновщикНастроек.ЗагрузитьНастройки(Вариант.Настройки);
КомпоновщикМакета = Новый КомпоновщикМакетаКомпоновкиДанных;
Макет = КомпоновщикМакета.Выполнить(Схема, Отчет.КомпоновщикНастроек.ПолучитьНастройки());
ПроцессорКомпоновки = Новый ПроцессорКомпоновкиДанных;
ПроцессорКомпоновки.Инициализировать(Макет);
ПроцессорВывода = Новый ПроцессорВыводаРезультатаКомпоновкиДанныхВТабличныйДокумент;
ПроцессорВывода.УстановитьДокумент(ЭтаФорма["ТабДок_" + Вариант.Имя]);
ПроцессорВывода.Вывести(ПроцессорКомпоновки);
КонецЦикла;
КонецПроцедуры // СформироватьОтчеты()
&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
СоздатьПереченьОтчетов();
КонецПроцедуры
&НаКлиенте
Процедура МакетОтчетаПриИзменении(Элемент)
ОбработатьВыборМакета();
КонецПроцедуры
&НаКлиенте
Процедура Сформировать(Команда)
СформироватьОтчеты();
КонецПроцедуры
Смотрим, что получилось.
Выгрузка базы 1Cv8skd.rar
Источник
Категория:
Схема Компоновки Данных Пример хранения изображений в базе (отдельный справочник), в интерфейсе Такси и без модальности Часто разрабатывая некую конфигурацию, пользователи хотят прикреплять к элементу справочника фото и чтобы они хранились в базе данных.
В этой статье я расскажу как к справочнику объекты строительства подключить хранилище фотографий в виде справочника Хранилище файлов.
Основные элементы конфигурации с которыми нам работать :
1. Справочник Объекты строительства - основной справочник в котором хранится инфо и к каждому элементу нужно подгружать фото
2. Справочник Хранилище Фалов, он подчинен справочнику Объекты строительства и в нем есть реквизит ДанныеХЗ - хранилище значений в котором мы будем хранить фото
Форма элемента Объекты строительства , добавим кнопку загрузить фото для списка Файлы (динамический список, в котором запросом отбирается по владельцу приложенные файлы)
Код команды Добавить Файлы (Код для отключенного режима модальности):
Код 1C v 8.3 &НаКлиенте
Процедура ДобавитьФайлы()
//ПРОВЕРИМ - текущий элемент записан или нет
Если ЗначениеЗаполнено(Объект.Ссылка) Тогда // Записан
Оповещение = Новый ОписаниеОповещения("ОбработатьВыборФайла", ЭтотОбъект);
НачатьПомещениеФайла(Оповещение, , , Истина, УникальныйИдентификатор);
Иначе // НЕ записан, нужно спросить пользователя
Оповещение = Новый ОписаниеОповещения("ОтветНаВопросЗаписать", ЭтотОбъект);
ТекстВопроса = "Элемент не записан, Записать?";
ПоказатьВопрос(Оповещение, ТекстВопроса, РежимДиалогаВопрос.ДаНет);
КонецЕсли;
КонецПроцедуры
//вопрос пользователю
&НаКлиенте
Процедура ОтветНаВопросЗаписать(Результат, ДополнительныеПараметры) Экспорт
// Вопрос пользователю, если ДА, то записываем объект и снова вызываем добавить файлы
Если Результат = КодВозвратаДиалога.Да Тогда
ЭтотОбъект.Записать();
ДобавитьФайлы();
КонецЕсли;
КонецПроцедуры
// После диалога выбора файла срабатывает это оповещение, в котором мы сохраняем файл с справочник Хранилище файлов
&НаКлиенте
Процедура ОбработатьВыборФайла(Результат, Адрес, ВыбранноеИмяФайла, ДополнительныеПараметры) Экспорт
Если Не Результат Тогда
Возврат;
КонецЕсли;
//Получим данные файла
ОписаниеФайла = Новый Файл(ВыбранноеИмяФайла);
//Сохраним в справочник ХранилищеФайлов
СохранитьФайлВХранилище(Адрес,Объект.Ссылка,ОписаниеФайла.ИмяБезРасширения);
//обновим список файлы, т.к. там добавися новый файл
Элементы.Файлы.Обновить();
ЭтаФорма.ОбновитьОтображениеДанных();
КонецПроцедуры
// Сохранение файла в справочник
&НаСервереБезКонтекста
Процедура СохранитьФайлВХранилище(Адрес,Владелец,Имя)
НовФайл = Справочники.ХранилищеФайлов.СоздатьЭлемент();
НовФайл.Владелец = Владелец;
НовФайл.Наименование = Имя;
НовФайл.ДанныеТекущаяДата = ТекущаяДата();
НовФайл.ДанныеХЗ = Новый ХранилищеЗначения(ПолучитьИзВременногоХранилища(Адрес));
НовФайл.Записать();
КонецПроцедуры
файлы записаны, далее если файлов много, то пользователь может перемещаться по списку файлов и ему должны показываться файлы
Добавим для списка файлы Событие ФайлыПриАктивизацииСтроки
Код 1C v 8.3 &НаКлиенте
Процедура ФайлыПриАктивизацииСтроки(Элемент)
Попытка
ТекКартинка = ФайлыПриАктивизацииСтрокиНаСервере(Элемент.ТекущиеДанные.Ссылка);
Исключение
//видимо нет еще фото
КонецПопытки;
КонецПроцедуры
&НаСервереБезКонтекста
Функция ФайлыПриАктивизацииСтрокиНаСервере(ЭлементС)
Возврат ПолучитьНавигационнуюСсылку(ЭлементС, "ДанныеХЗ");
КонецФункции
+ чуть не забыл, т.к. файлы это динамический список с установленным запросом и параметром - необходимо при открытии задать параметр:
Установим параметр при открытии:
Код 1C v 8.3 &НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
Файлы.Параметры.УстановитьЗначениеПараметра("Владелец",Объект.Ссылка);
КонецПроцедуры
Результат:
Скачать DT с примером : Foto_V_BD.7z
Если у Вас есть вопросы или комментарии - пишите ниже, обсудим
Категория:
1С Общие вопросы - Управляемые формы и Такс… Как передать таблицу значений с сервера на клиент? Многие спрашиваю, как передать тз с сервера на клиент - ниже несколько вариантов как это можно реализовать:
Через ЗначениеВСтрокуВнутр и ЗначениеИзСтрокиВнутр
Код 1C v 8.3 &НаКлиенте
Процедура ПолучитьТаблицу НаСервер(Команд а)
ТЗВСтроке = ПолучитьТЗНаСер вере();
ТЗ = ЗначениеИзСтрокиВнутр(ТЗВСтрок е);
КонецПроцедуры
// Функция получает данные на сервере
&НаСервере
Функция ПолучитьТЗНаСер вере()
// Для примера сформируем ТЗ с данными
ТЗ = ЗаполнитьТЗДанными();
Возврат ЗначениеВСтрокуВнутр(ТЗ);
КонецФункции
Через реквизит Формы
Код 1C v 8.3 // Создаем реквизит формы "ВремТабЗнач" с типом данных: Таблица значений
// Ревкизит будет использоваться для передачи данных с сервера на клиент.
&НаСервере
Функция ПолучитьТЧ(ОбъектСсылка,ИмяТЧ)
ЗначениеОбъекта = ОбъектСсылка.ПолучитьОбъект();
ТабРез = ЗначениеОбъекта[ИмяТЧ].выгрузить();
МассивДобавляемыхРеквизитов = Новый Массив;
МассивУдаляемыхРеквизитов = Новый Массив;
МассивКолонок = Новый Массив;
ИдКоллекции="ВремТабЗнач";
КоллФормы=РеквизитФормыВЗначение(ИдКоллекции);
Для каждого ТекКол из КоллФормы.Колонки Цикл
МассивУдаляемыхРеквизитов.Добавить(ИдКоллекции+"."+ТекКол.Имя);
КонецЦикла;
Для каждого ТекКол из ТабРез.Колонки Цикл
МассивДобавляемыхРеквизитов.Добавить(
Новый РеквизитФормы(ТекКол.Имя,ТекКол.ТипЗначения,ИдКоллекции));
МассивКолонок.Добавить(ТекКол.Имя);
КонецЦикла;
// Добавим новые, удалим старые колонки
ЭтаФорма.ИзменитьРеквизиты(МассивДобавляемыхРеквизитов,МассивУдаляемыхРеквизитов);
// Поместим значение в реквизит формы
ЗначениеВРеквизитФормы(ТабРез,ИдКоллекции);
// вернем массив колонок в обрабатываемой ТЗ, например для более простого перебора
Возврат МассивКолонок;
КонецФункции
Через Временное хранилище
Код 1C v 8.3
АдресХранилища = ПоместитьВоВременноеХранилище(МассивДанных,ЭтаФорма.УникальныйИдентификатор);
ПротоколПереноса = ПолучитьИзВременногоХранилища(АдресХранилища);
Через обычный возврат
Код 1C v 8.2 УП &НаКлиенте
Процедура ПолучитьТаблицуНаСервер(Команда)
ТЗ = ЗаполнитьТЗДанными();
КонецПроцедуры
//Функция заполняет ТЗ
&НаСервере
Функция ЗаполнитьТЗДанными()
ТЗ = Новый ТаблицаЗначений;
ТЗ.Колонки.Добавить("Поле1");
ТЗ.Колонки.Добавить("Поле2");
ТЗ.Колонки.Добавить("Поле3");
ТЗ.Колонки.Добавить("Поле4");
ТЗ.Колонки.Добавить("Поле5");
Для i = 1 По 3 Цикл
НоваяСтр = ТЗ.Добавить();
НоваяСтр.Поле1 = i;
НоваяСтр.Поле2 = 2*i;
НоваяСтр.Поле3 = 3*i;
НоваяСтр.Поле4 = 4*i;
НоваяСтр.Поле5 = 5*i;
КонецЦикла;
Возврат ТЗ;
КонецФункции
Пробуйте и пишите в комментариях как делаете это Вы
Категория:
Управляемое приложение, Тонкий клиент Загрузка данных из файла табличного документа в управляемом приложении В управляемом приложении (если конечно вы не работаете в Толстом клиенте) можно столкнутся с такой проблемой, что многие функции работают только на сервере. Что делать, если у Вас есть файл-макет с данными, которые надо прочитать (обработать)? Надо передать этот файл на сервер и дальше работать с ним на сервере.
Для начала на клиенте через диалог получим имя файла
Код 1C v 8.2 УП длгВыборФайла = Новый ДиалогВыбораФайла(РежимДиалогаВыбораФайла.Открытие);
длгВыборФайла.Заголовок = "Выберите табличный документ...";
длгВыборФайла.Фильтр = "Табличный документ (*.mxl)|*.mxl";
длгВыборФайла.Расширение = "mxl";
длгВыборФайла.ПроверятьСуществованиеФайла = Истина;
Если Не длгВыборФайла.Выбрать() Тогда Возврат; КонецЕсли;
Адрес = ПоместитьВоВременноеХранилище(Новый ДвоичныеДанные(длгВыборФайла.ПолноеИмяФайла));
ЗаполнитьИзФайлаНаСервере(Адрес);
На сервере обработам полученные данные:
Код 1C v 8.2 УП ФайлПриемник = ПолучитьИмяВременногоФайла("mxl");
ДанныеХранилища = ПолучитьИзВременногоХранилища(Адрес);
ДанныеХранилища.Записать(ФайлПриемник);
ТабДок = Новый ТабличныйДокумент;
ТабДок.Прочитать(ФайлПриемник);
Вот и все,теперь данные из файла загружены
Категория:
Табличный документ Выгрузка картинок из базы 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="iVBORw0KGgoAAAANSUhEUgAAAGUAAAAaCAYAAACuCJLbAAAABHNCSVQICAgIfAhk
iAAAAAlwSFlzAAADtgAAA7YBp8dLNgAAABl0RVh0U29mdHdhcmUAd3d3Lmlua3Nj
YXBlLm9yZ5vuPBoAABQvSURBVGiB7Xp5cJ3HceevZ77rXXjv4QZIAjzFUxIpSqQo
0ZIiS5apK1EiKYpke2OvdawrLttyNrXeql2K3qxd8WZXKW9i+YiPjeNLdJxDt2Qd
DGVCMi+JJ0iQBEFcxPXu975zpvcPABQIgtRWHFftbrmrpoBvpmemp3/TPT09j5gZ
lyai7dvvEzhyRMaGHCObduT4aFUi+z7dfkNAHmhsTqh80VNuuxdh1Sp13/3bNd5H
6XSx9m3bSKwubbIblWtr2Pa4GyWgrRRLEYcQZkha/FoW8v8RmSw0tA4Ng6tCB2XD
krUU+T4yGe+mrW/4wNzKnxOUvY9ebU4kzFTgO9mC9luIZDJSlAoVMoo5BcEmmOjX
vqr/x0kS60hT5AguWVIUmLlCUlViljmaEEGuoRqW139jTzi73/mgENG3HlkfW2Q5
mVxI7R7k4mqkFmjFVhRpN1RBVYdUYRGFWuk5URaE9/OHlyQCnesviH6lsS5Fmvnc
pmLwr7TBNGPO/oYUxNowTZOThrQShkGOIApituhPSt2rlR7O6yD/8Df3ujNd2nmg
vPKxtYkoHW/I+VgakLGk5kdZ3/cLbqTznq8qtSCoeF5Qq0UcqrD2f6wwIc4Haqay
5SUULwRY/oogz0WKQVrPrcjJ9vdAmgkeAFyq32ySZpxsASsRt2Mpy0o6tkjaplVv
2WY6LmXeMPWpxoTumRitTXzkb96pTvc7B8r2bWusbC3TOFI2V9TccE01Cslzw+GJ
anloPOeWJoqeNxaFqhaR9n2fCWBvlhB0EQXOdnSSSAMATYG1eH7aPDVQDIFfr3Vc
jGYrHgB4SvmK+byz82JHNM+yFgcAA2TbNsUNFg3SNJoyjt2USWaymWR70jLb4rbB
MYcPJql2dF4gxqZdmQEA2EYiXfxQckxV5gWRWlJRISq1sG94LN9/bKxSGixUwrIP
7Xkeu5hUJLlzAnC+RQBqDoZzPI8+vCG97+1B9/ab18TTWds6eHyw/PVv7i1NtxPA
BGgAuObyFnP3wZEL/O8Pv3ffwse/8OKZs8NlPbe65hRSMObe8XPV0xx1GpAXss0a
KwYCPMQAchwnTJWqflvR85aHuragIRYwxxaSNJdaMl6aSCgP26iArawNAHh2aL0T
xrz6IJALa75Oh27UNzyW739nOJ/vm/CjvOdp9z0QZoMx83s2CAwAf/lnt7f/1dd2
j95597L45g0dTZWyChYvysxb2JG+0iBKgCCY4W/YtOCd5Ss6DvWfLXlf/MqrJQD4
93+0IVlnJ+RYoRj85y/etmTBvPRy0zJTzNB//pdv/NP8jobs337ngfSGLd/aN5eS
L6K42QDOBdD7KX22HmbyT/JO6cwFCK6HWAy65EN7UaiAFnTWC0uastMwzEVOTOW6
ipvcTYBL/MQT4uXii5l81ViZ19hYqXmlkdFC976Bwkj3SMUv5D1Vu1CI6f/1RerP
fX/zK3e33XbLkttjlkxCEPcNFnaM52rFtpa6lrbmxAZJwgamXRxzuRodE0I4/QP5
d1pakwuSjtXsxIz5AMBEipglALDmIIr4NBmoM4Ronhjzdi7Z9Bc730fRACAu0T67
bua3mPV9KV66yDwUAyibdcSKlqS9rjPdOr++fqUds1NZS3WlMvLoHc4tRXr6idWW
Xcs0lvN0JWfmb0q2LyyETvpMzWeMvbvrI5hSdGbpFdtj8xaPAIBpGFpIiZG3f35D
dWzwTgLISKT2z7txy9OWlQqmJbAdW2VjUWJRx8RdptRxAGCmaGzEndj7wu5bSxOl
tljcDlddv+zIsnULhwVNroMI2PfqoSUjAxNNdsz0b77/uv006Vn4wJvHOgZODs9r
bs1OXH3bFT0A8MoP3rzGrYWRHUscW3LrJ78KADzWtfEX//D6raHrLgbJYqK+8c0r
7/3k3wFA9wtPby6OD2+QJPx1f/CprwFAEAR08p+f3Vg+O3idbTtDmaWrukYO77v3
PLUzYEpZWnLXR79z4vkfPhgGfkuyfeGrjWuuPVLoO9ZeOLb/9wBGrGn+m5FbbgrK
xRVWXeP++rWbd2k9eW6Nv/3i76rAb3fSDe+2LF9xkAtn20eP7Y03OWJ/hqsHGhnj
RmzIMXyJZCRE2kkmWBuWKwwnqo0OtEaVwm9Py1MbO3M4sWDpqGVZGkEgTz73v/6a
Vdg5JSuCgrfeHxp63V68csixbQUA7fXV1sb66lVSIq6ZiIgAgrnjx6/9YWGk2Eog
lCfKGP3xeKdXCV6/8gMrT0+Nx3tePrhZay0BYOkVC/s7VswbJyG4e/eJNRPD+fax
vvHSNbevO/6zJ5//8NmB8fkA8IF7Noy1NhRadv7gRw/3HT59+8zzoTjcf+3Or/2X
j131wMMPWYl4xT+Ruw8A9v3o67zho3/0lGEYnO858gSzrkMiuaPU2xMGpdzvzbIG
BKBIkPiumxv9GLNO1IbY4FUbuif27fgrrVUGRH7LNTd/f3DHM59hFXbqwFsshOgS
Ahj+xbMPBLnRfwsAtdBdJFav3U+JTCiEHQTaqwtNjgeWbYhs5MiAZFIppEtjQ2f7
Tx7p6+7uHh4anTjh+cEOv1bl0PMQeX5kWlYIAH2v/mTrNCAkjAlhWCcBUkQCjm2r
sZ4DC4TQQpgSphG1EYEkgyiKDHN0ou32Dy4/3dBcN7Zm07K9hikDAOj+Zc8qSDCg
sffnB5ZprSVo0vj3Pb/veiGFnhnFMVjs+buua6cBWXPt8t1XbF7Znzv+1sdPHz59
BwMkhFDJbPK0YVrDIIB11Hzw77/7vQ/+/m+NJLPJPgBw82N/AL9odr/y003Mug4A
L7/5nq8QBGhSAGXFkzuFYfVOzy3kewGZIELvc3/z37RWGQC6cc3GTycaWovTlqUj
xSGzO7D7tSWlgVOfcMtF1Io5FEfOBvv27Rno2dd1wnOLxYCNdJnr6uoCWxrjdVUp
AicWkZEoj44O9Z7Njezsy+V6RouDrosHP7u+uR8A9faeHPz817cfTSQS9OjquuuE
lIBh/nN1zYc/nonFpF3qn18oV0q93/rSlzkKbj27++UzVz7xwNOCoIzTQ0tF4Kco
VA4ydWP1McO6+bpFZ8dGSg1i6oBsTpiW0Te8SFRq2Z6u4ytAgG0Zyg8iOTZSqpen
+i7Tixcen3anKtTW3l09qwnAwo768Vu2rOnlILR/+cL+jQSAhFAPfeF3flRXn/II
wv/Hp166uf/E0MrA9ebR8L5P/u6DG45+/2uvdTCzsXf7d/7ULVfaAcBwnAMNi5bl
B3bv5Cmle1c99JkvvPv3336wenbgU1prlAvVilcts4pCVEuFtRxGHUpFiIzY5/a8
e/qliefe1FfqvgBKwbCkWmu+dtn+rlf+AjPC5pB1uPv4sxNXL23mJU2pRq1VC4fa
Ga73pQEArIkRzQrIL0K3tFjLtFJCK4XBXO1L2596ajqEzQNQn13f3EQAvIqdkuqM
oomyMs6OmNDMDNSMEuIA1D/86MCywZFqioggpOB7r08NGoNHUuVqQKeOdjtEhHtu
uazvH1/vXcwM2vXSrvZrH6TD7vCAUxopAUQWEcEyhbrngaV96Dk0T0sZDfWcyLhu
iIbmRCnbe2gBBhDqtoYzH7yjbdeTf/L2Sgbj4HOvtW6+ftHJdJ135MSh4dVj/aeu
B0/e2SrKfuTpz/+H7o3ct9lghmZWN9265eBjaxtHYpMWwp947LHTn1hm81RY0wEA
6Zbkmcf+6y3xznVP1gDQ5eubWIBAkuTrT+34MhgOAy4DowLoBIA7tqzIjvfkwMwg
EEsxiZloLCUUseWZQlRYIm7b0okbLOKzwFBT0UTvhDs4XbekM/1bT3/795d99ctb
Wv/nl+9sfvVnH1/7+W888OL6D634+Wc/s3mH3T2w1syVWwE2MOmJSE3tlnWrGseW
d2ZypoEoCkP65k/2r4QK+dlXe9rDwEcYeMjlC4ZQfhi4NezqOjHP7DmxNKoVTbdS
Qlgr61qpgMJETn7vJ291ciVvUnE8JlRNu5USckPjCVnNx2QhX2ee7Ft88IV9lwde
DaHnorM9lo9KRfOhDy16l7UKVBgKFYWkVdT9jT29h99++23FES9gZghA97/7+Eeu
uXHp9QBAgsTxrkc/Kw1pAoA0ZMAACiOVjr0vHdm456VHbgAAgcmoJfKiNX4taAHA
nmn8Gwb7U7rA7XdfsfHu+9etS9THswbJsjIi16h4Soi0jshUZSJVNA0rmYxbySbD
lLbjzA4BAUAeKHpVZs4DQJCv/Ymz78SPr1He992dh3+xcGjkK4VfHL8p1312Xd+B
wVWi6jaKfHUe9Pkx/O5DI/UnzxTr7t+y7HRTNuYBQBAoCQDdpyfqgcmb8yu7znTU
fGUygHzJi5VHSw3Tg8TiZrhmWcMYABw9MdH4866+VjBj5eL6PADUvND66g/eWdnT
X0y+uvNUx4svHbuaAUhDqPaYqFHFYxovWxtWNh6YHvOGtS3P9f/3m+46+6UPfKQh
Ke8EA/G6mO/kSwvNiJPTfILYmb5QLljefNRJ2kUA2PnTd+7O9Y1f/Y3/cef8WMpO
Ta3DAIDLNix85Q+33mElUk4aAOqb6lobsvbClo661U0tmTY7RuVEGJXQ1BQZ6XRJ
lQr1FSVQqgqxyLasVEPacVJFFcRi3sxLFgFAPA4jnXEeL5f872rN9Npb/R3TJoww
iv3sme4l+aLnDI2U0yuX1L8r5kgmP7+jt9PzlfHFnrcbp+sScSs4fCKXDoLJiOuK
y5rGTGMyHbPv6FgzM9MzO04vOJcSYOCBLcuO//lIJZEv+fFXdp3paG1O1G7buODY
vkOjyYoXpgdHKqm/3n5w1cy5b7+u47AOlccVb4wZOD1QvAYAHFNWb1yajSPQNzy3
/+xVxWq0CAA608aw6DqeEqXKuY2lNAvGe5eyj/6nD//g2//xnx7Rio2Xvt31+I2P
bN57esaNrXFe+sydD19/CMBVQpIBAKYpLCkoHXesxsa2VG5gpFJMxYJqqq2sxCrc
F0VOwWPJpZjJYcKwGxrqE9m2tLSyk9YybgjypJSlu1Y1xY9+4YY/fvyjV336Uw9d
eaSh3nGFmMxV2ZaMYjEj6mxPlYnAne11JTBDaz1ZZiSNrr68ZTRmy5AIICLOph33
4ftXHzvYM5q1TKma6mO1+29b0vPbtyzpvedDy/ovW5jJW5ZUYxPVWCZle5YlVDZp
uexHxX9397KXE45RM6UInnnl1Lxoonzqj+9e9sNFzfFjUtB0Wobjlizfe13Hc2vb
k3vCopeLFJPSTPlq2GAK4W9cmv0lM4gBysatshQUNWfsgXs2zHuLASTAVdMQgWMb
nvNW9+WppOWZpgibU6bRZJO15aGrnzctwyMBHHv5yFYnZecMS/jxjDPxsSfu/OnU
PqJkKl40LOGnsrEiR+wEXiT9ql8wRFh2AwTrh+9SxAB1fW6TMxoFbZUgcVXJjxbl
q95Af6548nDvWG7Tokzy0zd1PqZZh6YhkkYylrXrYvNB526s76Wc50oSnU8X5MtI
iAv6qKo/oqr+uIyZWRG360mQpf2ooP2wqGt+yWpOr2TFgSrVBlQY1cDMUHxBnm3G
pAQAJIUkKSwdRO5FBWKQZn1hHmuK0W7NLIw0ahSFEMk4aQFQ3BGs2fY6Gnu0bfms
eMZwU3MDYDCIIZi15FDHAk9nB4+MjA0dGX/dYn/PPJuGNj3Z5cknmLHgrQF9JjwA
JU1olhmCqHeEoISF4NFr2+5yTNFg1sXbCcRky4S0ZJKmc780fZuYLDyjzNQ2vffn
/MJMzExaM6kwrEZVfzSq+SUQDJYko5pf1JVgJHKDIphJhdrlUFU5jGrKD6usWDNP
XfcvUibzmiBmZhUqxVNzThfNLHi6TPFOynbB2kRU8YqIlIpc31UVNwxztbJF3KYK
Vc/OlTvt0XwHImUaXphQMdN1hic6IUQk3CBueGFceEEcGrb2oobxs7Xy2KniQcOv
7XdSleGbk3dV8frrfC51f2Tb/VZ/4VRDzo1d5mlxRdWNDDf0Ru9dHrvNdgzbjFtJ
JsCwjbh0rMzFduUMAC7aQGAGnXfYMADU+if2AwCZ0iCCJAipo8iDvjDbPMVnc6j8
S8kyF73fo9bMNPzcT3nniwEBISzT0X7kClPadkNyoZDCApEAAZFjF2UUOay0TUrb
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>
Источник
Категория:
XML, DBF, TXT, CSV Загрузка картинок в базу 1С (сохранение в хранилище значений) В теме форма: v8: Получение данных из ХралищаЗначений
Bell в управляемом интерфейсе пробует сохранить выбранные картинки в базу 1С, но возникли сложности с сохранением в хранилище значений. как пример Bell приложил CF файл с мини конфигурацией, за что ему большое спасибо, т.к. большая часть материалов этой статьи написана им, я лишь поправил небольшие участки кода связанные с передачей файлов и сохранение в хранилище значений.
Так как везде уже Такси, то CF я перевел в этот режим и в нем демонстрирую.
Имеется справочник Хранилище данных :
Основная Форма Элемента:
Ее код:
Код 1C v 8.3 // ПРОЦЕДУРЫ ФОРМЫ
//======================================================================================================
&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
Если Объект.Ссылка.Пустая() Тогда
Объект.Наименование = ".";
КонецЕсли;
Если НЕ Параметры.Ключ.Пустая() Тогда
ДанныеАдрес = ПолучитьНавигационнуюСсылку(Объект.Ссылка, "ДанныеХЗ");
КонецЕсли;
КонецПроцедуры
&НаКлиенте
Процедура ПриОткрытии(Отказ)
Если Объект.Ссылка.Пустая() Тогда
КонецЕсли;
КонецПроцедуры
&НаСервере
Процедура ПередЗаписьюНаСервере(Отказ, ТекущийОбъект, ПараметрыЗаписи)
Если ЭтоАдресВременногоХранилища(ДанныеАдрес) Тогда
РежимСжатия = Новый СжатиеДанных(9);
ДанныеСохранения = ПолучитьИзВременногоХранилища(ДанныеАдрес);
ТекущийОбъект.ДанныеХЗ = Новый ХранилищеЗначения(ДанныеСохранения, РежимСжатия);
КонецЕсли;
КонецПроцедуры
&НаСервере
Процедура ПриЗаписиНаСервере(Отказ, ТекущийОбъект, ПараметрыЗаписи)
Если ЭтоАдресВременногоХранилища(ДанныеАдрес) Тогда
УдалитьИзВременногоХранилища(ДанныеАдрес);
ДанныеАдрес = ПолучитьНавигационнуюСсылку(ТекущийОбъект.Ссылка, "ДанныеХЗ");
КонецЕсли;
КонецПроцедуры
// ПРОЦЕДУРЫ ЭЛЕМЕНТОВ ФОРМЫ
//======================================================================================================
&НаКлиенте
Процедура ВыбратьДанные(Команда)
ДанныеВыбрать();
КонецПроцедуры
&НаКлиенте
Процедура СохранитьДанные(Команда)
Если НЕ ЗначениеЗаполнено(Объект.Ссылка) Тогда
Предупреждение(НСтр("ru = 'Элемент не записан !!!'"));
Возврат;
КонецЕсли;
ДанныеСохранения = ПолучитьНавигационнуюСсылку(Объект.Ссылка, "ДанныеХЗ");
ИмяСохранения = Объект.Наименование;
//ИмяСохранения = Объект.Наименование + Объект.ДанныеРасширение;
ПолучитьФайл(ДанныеСохранения, ИмяСохранения, Истина);
КонецПроцедуры
// ПРОЦЕДУРЫ ПРОЧИЕ
//======================================================================================================
&НаКлиенте
Процедура ДанныеВыбрать()
ПолученныеДанныеАдрес = "";
Если ПоместитьФайл(ПолученныеДанныеАдрес, , Объект.ДанныеПуть, Истина, УникальныйИдентификатор)Тогда
ДанныеАдрес = ПолученныеДанныеАдрес;
ВыбранныйФайл = Новый Файл(Объект.ДанныеПуть);
Объект.Наименование = ВыбранныйФайл.Имя;
Объект.ДанныеТекущаяДата = ТекущаяДата();
Модифицированность = Истина;
КонецЕсли;
КонецПроцедуры
так же имеется общая форма ФормаЗагрузкиФайлов
При помощи ее выбираются файлы изображений и загружаются в справочник - одновременно можно загружать несколько файлов
код формы:
Код 1C v 8.3 // ПРОЦЕДУРЫ ЭЛЕМЕНТОВ ФОРМЫ
//======================================================================================================
&НаКлиенте
Процедура СписокФайловПередНачаломДобавления(Элемент, Отказ, Копирование, Родитель, Группа)
Отказ = Истина;
ДобавитьФайлы();
КонецПроцедуры
// ПРОЦЕДУРЫ ПРОЧИЕ
//======================================================================================================
&НаКлиенте
Процедура ДобавитьФайлы()
ВыборФайла = Новый ДиалогВыбораФайла(РежимДиалогаВыбораФайла.Открытие);
ВыборФайла.МножественныйВыбор = Истина;
ВыборФайла.Заголовок = НСтр("ru = 'Выбор файла'", "ru");
ВыборФайла.Фильтр = НСтр("ru = 'Все файлы'", "ru") + " (*.*)|*.*";
ВыборФайла.ПредварительныйПросмотр = Истина;
Если ВыборФайла.Выбрать() Тогда
Для каждого СтрокаФайл Из ВыборФайла.ВыбранныеФайлы Цикл
ОписаниеФайла = Новый Файл(СтрокаФайл);
НВС = СписокФайлов.Добавить();
НВС.ПолноеИмяФайла = СтрокаФайл;
НВС.РазмерФайла = ОписаниеФайла.Размер();
КонецЦикла;
КонецЕсли;
КонецПроцедуры
&НаКлиенте
Процедура Загрузить()
Если НЕ ПроверитьЗаполнение() Тогда
Возврат;
КонецЕсли;
ОчиститьСообщения();
Если СписокФайлов.Количество() = 0 Тогда
Сообщить("Файлы не выбраны !!!'");
Возврат;
КонецЕсли;
ПомещаемыеФайлы = Новый Массив;
Для каждого СтрокаФайл Из СписокФайлов Цикл
Описание = Новый ОписаниеПередаваемогоФайла(СтрокаФайл.ПолноеИмяФайла, "");
ПомещаемыеФайлы.Добавить(Описание);
КонецЦикла;
// -------------------------------------------------------------------------------
ПомещенныеФайлы = Новый Массив;
СписокЗагруженныхФайлов = Новый СписокЗначений;
Если ПоместитьФайлы(ПомещаемыеФайлы, ПомещенныеФайлы, , Ложь, УникальныйИдентификатор) Тогда
Закрыть(Истина);
Иначе
Сообщение = Новый СообщениеПользователю();
Сообщение.Текст = НСтр("ru = 'Файлы не загружены'", "ru");
Сообщение.Сообщить();
КонецЕсли;
ОповеститьОВыборе(ПомещенныеФайлы);
КонецПроцедуры
&НаСервере
Функция ПоместитьВыбранныеФайлыВХранилище(ПомещаемыеФайлы)
АдресХЗ = ПоместитьВоВременноеХранилище(ПомещаемыеФайлы, УникальныйИдентификатор);
Возврат АдресХЗ;
КонецФункции
в коде вызывается ОповеститьОВыборе(ПомещенныеФайлы) и срабатывает обработчик в ФормаСпискаДополнительно
Код 1C v 8.3 &НаКлиенте
Процедура ОбработкаВыбора(ВыбранноеЗначение, ИсточникВыбора)
Если ИсточникВыбора.ИмяФормы = "ОбщаяФорма.ФормаЗагрузкиФайлов" Тогда
ОбработкаВыбораПодборНаСервере(ВыбранноеЗначение);
КонецЕсли;
КонецПроцедуры
и следующим кодом идет создание элементов справочника и загрузка изображений из временного хранилища
Код 1C v 8.3 &НаСервере
Процедура ОбработкаВыбораПодборНаСервере(ВыбранноеЗначение)
Для Каждого СтрокаФайл Из ВыбранноеЗначение Цикл
Файл = Новый Файл(СтрокаФайл.Имя);
ХранимыйФайл = Справочники.ХранилищеДанныхСправочники.СоздатьЭлемент();
ХранимыйФайл.Наименование = Файл.Имя;
ХранимыйФайл.ДанныеПуть = Файл.Путь;
ХранимыйФайл.ДанныеТекущаяДата = ТекущаяДата();
ХранимыйФайл.ДанныеХЗ = Новый ХранилищеЗначения(ПолучитьИзВременногоХранилища(СтрокаФайл.Хранение), Новый СжатиеДанных());
ХранимыйФайл.Записать();
КонецЦикла;
Элементы.Список.Обновить();
КонецПроцедуры
Скачать DT - Платформа 8.3.4
Категория:
Работа с Хранилищем Значений Обработка на сервере с индикатором Обработка на сервере с отображением процесса загрузки (индикатор) и возможностью прерывания
Код 1C v 8.2 УП // Автор acsent
&НаСервере
Функция ИнициализацияОбработкиСервер()
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| Спр.Ссылка
|ИЗ
| Справочник.Банки КАК Спр";
Данные = Запрос.Выполнить().Выгрузить();
АдресДанных = ПоместитьВоВременноеХранилище(Данные, УникальныйИдентификатор);
// Обработка
// В справочнике ~ 4000 элементов
Возврат Данные.Количество();
КонецФункции
&НаСервереБезКонтекста
Функция ОбработатьЭлемент(ДанныеЭлемента)
СпрОбъект = ДанныеЭлемента.Ссылка.ПолучитьОбъект();
// Обработка
СпрОбъект.ОбменДанными.Загрузка = Истина;
СпрОбъект.Записать();
КонецФункции
&НаСервереБезКонтекста
Функция ОбработатьПорциюНаСервере(Начало, Конец, АдресДанных)
Данные = ПолучитьИзВременногоХранилища(АдресДанных);
Для Счетчик = Начало - 1 По Конец - 1 Цикл
ОбработатьЭлемент(Данные[Счетчик]);
КонецЦикла;
КонецФункции
&НаКлиенте
Процедура ВыполнитьОбработку(Команда)
Количество = ИнициализацияОбработкиСервер();
РазмерШага = 10;
КоличествоШагов = Цел(Количество / РазмерШага);
КоличествоЦел = КоличествоШагов * РазмерШага;
Если КоличествоЦел < Количество Тогда
Элементы.Индикатор.МаксимальноеЗначение = КоличествоШагов + 1;
Иначе
Элементы.Индикатор.МаксимальноеЗначение = КоличествоШагов;
КонецЕсли;
Для Счетчик = 1 По КоличествоШагов Цикл
ОбработатьПорциюНаСервере(РазмерШага * (Счетчик - 1) + 1, РазмерШага * Счетчик, АдресДанных);
Индикатор = Счетчик;
ОбработкаПрерыванияПользователя();
ОбновитьОтображениеДанных();
КонецЦикла;
Если КоличествоЦел < Количество Тогда
ОбработатьПорциюНаСервере(КоличествоШагов * РазмерШага + 1, Количество, АдресДанных);
Индикатор = Индикатор + 1;
КонецЕсли;
КонецПроцедуры
Категория:
Управляемое приложение, Тонкий клиент Как передать файл с сервера на клиент? Код 1C v 8.2 УП &НаСервере
Функция ПолучитьФайл()
Двоичное=Новый ДвоичныеДанные("C:\файл.bmp");
Адрес=ПоместитьВоВременноеХранилище(Двоичное,ЭтаФорма.УникальныйИдентификатор);
Возврат Адрес
КонецФункции
&НаКлиенте
Процедура Получить()
Адрес=ПолучитьФайл();
Двоичное=ПолучитьИзВременногоХранилища(Адрес);
КонецПроцедуры
Если же необходимо файл сохранить на Клиенте на диск - тогда так:
Код 1C v 8.2 УП
&НаСервере
Функция ПолучитьФайл()
Двоичное=Новый ДвоичныеДанные("C:\файл.bmp");
Адрес=ПоместитьВоВременноеХранилище(Двоичное,ЭтаФорма.УникальныйИдентификатор);
Возврат Адрес
КонецФункции
&НаКлиенте
Процедура Получить()
Адрес=ПолучитьФайл();
Описание=Новый ОписаниеПередаваемогоФайла("C:\FromServer.bmp",Адрес);
МассивОписаний=Новый Массив;
МассивОписаний.Добавить(Описание);
ПолучитьФайлы(МассивОписаний,,,Ложь);
КонецПроцедуры
Категория:
Работа с Файлами и Каталогами Получение расшифровки для текущей ячейки СКД Код 1C v 8.х // “Результат” – поле табличного документа.
&НаСервере
Функция ПолучитьЗначениеРасшифровки(КодРасшифровки)
Если КодРасшифровки = Неопределено тогда
Возврат Неопределено;
КонецЕсли;
ДР=ПолучитьИзВременногоХранилища(ДанныеРасшифровки);
КоллекцияПолей = ДР.Элементы[КодРасшифровки].ПолучитьПоля();
Если КоллекцияПолей.Количество() = 0 тогда
Возврат Неопределено
Иначе
Возврат КоллекцияПолей[0].Значение ;
КонецЕсли;
КонецФункции
&НаКлиенте
...
РасшифровкаЗначение = ПолучитьЗначениеРасшифровки(Результат.ТекущаяОбласть.Расшифровка);
...
Категория:
Управляемое приложение, Тонкий клиент Импорт документа Excel через web-клиент Во время реализации задачи по регистрации продаж дистрибьюторов на основании Excel документов столкнулся с интересной задачей. Необходимо реализовать загрузку файла и на стороне сервера обработать его, заполнив табличную часть документа.
Решение состоит из двух функций: клиентской и серверной.
Клиентская часть инициирует выбор файла, передачу выбранного файла на сервер и передача управления серверной процедуре.
Код 1C v 8.2 УП #НаКлиенте
Процедура ИмпортИзВнешнегоФайла(Команда)
//Выбор и загрузка файла.
Если НЕ ПодключитьРасширениеРаботыСФайлами() Тогда
УстановитьРасширениеРаботыСФайлами();
КонецЕсли;
Если ПодключитьРасширениеРаботыСФайлами() Тогда
Режим = РежимДиалогаВыбораФайла.Открытие;
ДиалогОткрытияФайла = Новый ДиалогВыбораФайла(Режим);
ДиалогОткрытияФайла.ПолноеИмяФайла = "";
ДиалогОткрытияФайла.МножественныйВыбор = Ложь;
Фильтр = "Текст(*.xls)|*.xls";
ДиалогОткрытияФайла.Фильтр = Фильтр;
ДиалогОткрытияФайла.Заголовок = "Выберите файл для импорта";
Если ДиалогОткрытияФайла.Выбрать() Тогда
Объект.МедицинскиеРаботники.Очистить();
ДанныеНачинаютсяС = 1;
Если Не ВвестиЧисло(ДанныеНачинаютсяС, "Данные начинаются со строки", 2, 0) Тогда
Возврат;
КонецЕсли;
МассивФайлов = ДиалогОткрытияФайла.ВыбранныеФайлы;
ПомещаемыеФайлы = Новый Массив;
Для Каждого Файл Из МассивФайлов Цикл
ТекФайл = Новый Файл(Файл);
Описание = Новый ОписаниеПередаваемогоФайла(Файл, "");
ПомещаемыеФайлы.Добавить(Описание);
КонецЦикла;
ПомещенныеФайлы = Новый Массив;
Если ПоместитьФайлы(ПомещаемыеФайлы, ПомещенныеФайлы, , Ложь, УникальныйИдентификатор) Тогда
//Запуск импорта
ИмпортироватьФайлИзВременногоХранилищаВТЗ(ПомещенныеФайлы, ДанныеНачинаютсяС);
КонецЕсли;
Иначе
Предупреждение("Файл(ы) не выбран!");
КонецЕсли;
Иначе
Предупреждение(НСтр("ru ='Данная возможность недоступна, так как не подключено расширение работы с файлами.'", "ru"));
КонецЕсли;
КонецПроцедуры //ИмпортИзВнешнегоФайла()
Серверная процедура перебирает полученные на сервер файлы. Получает COM-объекты и импортирует данные.
Код 1C v 8.2 УП #НаСервере
Процедура ИмпортироватьФайлИзВременногоХранилищаВТЗ(МассивФайлов, ДанныеНачинаютсяС)
ДокументОбъект = РеквизитФормыВЗначение("Объект");
//Обход файлов, записанных во временное хранилище
Для Каждого ЭлементМассива Из МассивФайлов Цикл
ФайлИзХранилища = ПолучитьИзВременногоХранилища(ЭлементМассива.Хранение);
ВременныйФайл = ПолучитьИмяВременногоФайла("xls");
//Сохранение во временнный файл на диске
ФайлИзХранилища.Записать(ВременныйФайл);
//Импорт
Док = ПолучитьCOMОбъект(ВременныйФайл);
ФИОУчастника = Док.Sheets(1).Cells(ДанныеНачинаютсяС, 2).Value;
Пока СокрЛП(ФИОУчастника) ="" Цикл
// Добавление строки с файла в документ
НоваяСтрока = ДокументОбъект.МедицинскиеРаботники.Добавить();
НоваяСтрока.Фио = ФИОУчастника;
НоваяСтрока.Учреждение = Док.Sheets(1).Cells(ДанныеНачинаютсяС, 7).Value;
НоваяСтрока.Адрес = Док.Sheets(1).Cells(ДанныеНачинаютсяС, 3).Value;
НоваяСтрока.Телефон = Док.Sheets(1).Cells(ДанныеНачинаютсяС, 4).Value;
НоваяСтрока.ЭлПочта = Док.Sheets(1).Cells(ДанныеНачинаютсяС, 5).Value;
НоваяСтрока.Образование = Док.Sheets(1).Cells(ДанныеНачинаютсяС, 6).Value;
ДанныеНачинаютсяС = ДанныеНачинаютсяС + 1;
ФИОУчастника = Док.Sheets(1).Cells(ДанныеНачинаютсяС, 2).Value;
КонецЦикла;
Сообщить("Импорт завершён");
Док.Application.Quit();
КонецЦикла;
ЗначениеВРеквизитФормы(ДокументОбъект, "Объект");
КонецПроцедуры //ИмпортироватьФайлИзВременногоХранилищаВТЗ()
Источник Категория:
Работа с Microsoft Office и OpenOffice Открытие, перемещение и загрузка файла Пример обработки загрузки данных на управляемой форме, с определением необходимости передачи файла на сервер:
Код 1C v 8.2 УП &НаКлиенте
Процедура ИмяФайлаНачалоВыбора(Элемент, ДанныеВыбора, СтандартнаяОбработка)
Диалог = Новый ДиалогВыбораФайла(РежимДиалогаВыбораФайла.Открытие);
Диалог.Фильтр = "*.xml|*.xml";
Если Диалог.Выбрать() Тогда
Объект.ИмяФайла = Диалог.ПолноеИмяФайла;
КонецЕсли;
КонецПроцедуры
&НаКлиенте
Процедура ИмяФайлаОткрытие(Элемент, СтандартнаяОбработка)
СтандартнаяОбработка = Ложь;
ЗапуститьПриложение(Объект.ИмяФайла);
КонецПроцедуры
&НаКлиенте
Процедура Загрузить(Команда)
СтрокаСоединения = СтрокаСоединенияИнформационнойБазы();
ws = НСтр(СтрокаСоединения, "ws");
ИмяСервера = НСтр(СтрокаСоединения, "Srvr");
Если ИмяСервера = "" Тогда
Если ws = "" Тогда
ПередачаФайлаНаСервер = Ложь;
Иначе
ПередачаФайлаНаСервер = Истина;
КонецЕсли;
Иначе
ПередачаФайлаНаСервер = (ИмяКомпьютера() <> ИмяСервера);
КонецЕсли;
Если ПередачаФайлаНаСервер Тогда
ПоместитьФайл(АдресХранилища, Объект.ИмяФайла,, Ложь, УникальныйИдентификатор);
КонецЕсли;
ЗагрузитьСервер();
КонецПроцедуры
&НаСервере
Процедура ЗагрузитьСервер()
ЧтениеXML = Новый ЧтениеXML;
Если ПередачаФайлаНаСервер Тогда
ИмяВременногоФайла = ПолучитьИмяВременногоФайла("xml");
ДвоичныеДанные = ПолучитьИзВременногоХранилища(АдресХранилища);
ДвоичныеДанные.Записать(ИмяВременногоФайла);
ЧтениеXML.ОткрытьФайл(ИмяВременногоФайла);
Иначе
ЧтениеXML.ОткрытьФайл(Объект.ИмяФайла);
КонецЕсли;
ОбъектXDTO = ФабрикаXDTO.ПрочитатьXML(ЧтениеXML);
ЧтениеXML.Закрыть();
/// Код загрузки
Сообщить("Загрузка завершена");
КонецПроцедуры
Категория:
Работа с Файлами и Каталогами