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