Использование синхронных методов на клиенте запрещено Адаптировала обработку под интерфейс Такси Бухгалтерии 3, и получила ошибку:
Ошибка при вызове метода контекста (Выбрать)
Если ДиалогОткрытияФайла.Выбрать() Тогда
по причине:
Использование синхронных методов на клиенте запрещено!
Это вызвано тем, что Использование модальных окон запрещено!
Решение:
Нужно использовать создание объекта «ОписанияОповещения » и вызов другого метода диалога Показать()
Вот пример кода с ошибкой:
Код 1C v 8.2 УП &НаКлиенте
Процедура Выгрузить(Команда)
Диалог = Новый ДиалогВыбораФайла( РежимДиалогаВыбораФайла. Сохранение) ;
Диалог. Заголовок = "Сохранить в файл" ;
Диалог. Фильтр = "Файл ТЧ документа (*.ftd)|*.ftd|Все файлы (*.*)|*.*" ;
Диалог. ПолноеИмяФайла = "Выгрузка_" + Строка( Документ. Номер) ;
Если Диалог. Выбрать( ) Тогда
ЗначениеВФайл( Диалог. ПолноеИмяФайла, ТПТЧ) ;
КонецЕсли ;
КонецПроцедуры
Исправленный код:
Код 1C v 8.3 &НаКлиенте
Процедура Выгрузить(Команда)
Диалог = Новый ДиалогВыбораФайла( РежимДиалогаВыбораФайла. Сохранение) ;
Диалог. Заголовок = "Сохранить в файл" ;
Диалог. Фильтр = "Файл ТЧ документа (*.ftd)|*.ftd|Все файлы (*.*)|*.*" ;
Диалог. ПолноеИмяФайла = "Выгрузка_" + Строка( ВернутьНомерОснования( Объект. Основание) ) ;
Диалог. Показать( Новый ОписаниеОповещения( "ВыгрузитьЗавершение" , ЭтаФорма, Новый Структура( "Диалог" , Диалог) ) ) ;
КонецПроцедуры
&НаКлиенте
Процедура ВыгрузитьЗавершение(ВыбранныеФайлы, ДополнительныеПараметры) Экспорт
Диалог = ДополнительныеПараметры. Диалог;
Если ( ВыбранныеФайлы < > Неопределено ) Тогда
ВыгрузитьСервер( Диалог. ПолноеИмяФайла) ;
КонецЕсли ;
КонецПроцедуры
&НаСервере
Процедура ВыгрузитьСервер(ПолнИмяФайла)
ЗначениеВФайл( ПолнИмяФайла, ЭтаФорма. ТЗ. Выгрузить( ) ) ;
КонецПроцедуры
Категория:
Системные Ошибки Как выгрузить все дополнительные обработки и отчеты в каталог? Выгрузить все дополнительные обработки и отчеты в каталог всего за пару кликов. Простейшая обработка в один реквизит и команду.
Набросайте элементы на форму и вставьте код в модуль формы обработки. И без всякого скачивания.
Работоспособность проверена на БП 3.0, Документооборот 1.4-2.0, платформы 1С 8.3.7, 8.3.8
Код 1C v 8.3 #Область ВыборКаталогаДляВыгрузки
&НаКлиенте
Процедура КаталогВыгрузкиНачалоВыбора(Элемент, ДанныеВыбора, СтандартнаяОбработка)
ДопПараметры = новый Структура;
ДопПараметры. Вставить( "ИмяЭлемента" , "КаталогВыгрузки" ) ;
ОписаниеОповещения = Новый ОписаниеОповещения( "ОбработатьВыборКаталога" , ЭтаФорма, ДопПараметры) ;
ДиалогОткрытияФайла = Новый ДиалогВыбораФайла( РежимДиалогаВыбораФайла. ВыборКаталога) ;
ДиалогОткрытияФайла. МножественныйВыбор = Ложь ;
Если ЗначениеЗаполнено( Объект. КаталогВыгрузки) Тогда
ДиалогОткрытияФайла. Каталог = Объект. КаталогВыгрузки;
КонецЕсли ;
ДиалогОткрытияФайла. Показать( ОписаниеОповещения) ;
КонецПроцедуры
&НаКлиенте
Процедура ОбработатьВыборКаталога(ВыбранныеФайлы, ДополнительныеПараметры) Экспорт
Если ВыбранныеФайлы = Неопределено Тогда
Возврат ;
КонецЕсли ;
Объект[ДополнительныеПараметры. ИмяЭлемента] = ВыбранныеФайлы[0 ];
КонецПроцедуры
#КонецОбласти
#Область НажатиеНаКнопку
&НаКлиенте
Процедура Выгрузить(Команда)
ОчиститьСообщения( ) ;
Если НЕ ЗначениеЗаполнено( Объект. КаталогВыгрузки) Тогда
Сообщить( "Укажите каталог для выгрузки" ) ;
Возврат ;
КонецЕсли ;
Каталог = Новый Файл( Объект. КаталогВыгрузки) ;
Если НЕ Каталог. Существует( ) Тогда
Сообщить( "Указанный каталог не существует" ) ;
Возврат ;
КонецЕсли ;
МассивФайлов = НайтиФайлы( Объект. КаталогВыгрузки, "*.*" ) ;
Если МассивФайлов. Количество( ) > 0 Тогда
ОписаниеОповещения = новый ОписаниеОповещения( "ПодвержденияЗамещения" , ЭтаФорма) ;
ПоказатьВопрос( ОписаниеОповещения, "В каталоге есть файлы. При выгрузке будет выполнение замещение существующих." + Символы. ПС+ "Начать выгрузку?" , РежимДиалогаВопрос. ДаНет) ;
Возврат ;
КонецЕсли ;
ВыгрузкаНачнись( ) ;
КонецПроцедуры
&НаКлиенте
Процедура ПодвержденияЗамещения(ЧтоОтветилПользователь, Параметры) Экспорт
Если ЧтоОтветилПользователь = КодВозвратаДиалога. Да Тогда
ВыгрузкаНачнись( ) ;
Иначе
Возврат ;
КонецЕсли ;
КонецПроцедуры
#КонецОбласти
#Область СамаВыгрузка
&НаКлиенте
Процедура ВыгрузкаНачнись()
ПолучаемыеФайлы = ПодготовимФайлыНаСервере( ЭтаФорма. УникальныйИдентификатор) ;
Обработчик = Новый ОписаниеОповещения( "ОбработкаРезультатаВыгрузки" , ЭтотОбъект) ;
НачатьПолучениеФайлов( Обработчик, ПолучаемыеФайлы, Объект. КаталогВыгрузки, Ложь ) ;
КонецПроцедуры
&НаСервере
Функция ПодготовимФайлыНаСервере(ИдентификаторФормы)
Массив = Новый Массив;
Выборка = Справочники. ДополнительныеОтчетыИОбработки. Выбрать( ) ;
Пока Выборка. Следующий( ) Цикл
Если ТипЗнч( Выборка. ХранилищеОбработки) = Тип( "ХранилищеЗначения" ) Тогда
Адрес = ПоместитьВоВременноеХранилище( Выборка. ХранилищеОбработки. Получить( ) , ИдентификаторФормы) ;
Массив. Добавить( Новый ОписаниеПередаваемогоФайла( Выборка. ИмяФайла, Адрес) ) ;
КонецЕсли ;
КонецЦикла ;
Возврат Массив;
КонецФункции
&НаКлиенте
Процедура ОбработкаРезультатаВыгрузки(ПолученныеФайлы, ДополнительныеПараметры) Экспорт
ПоказатьПредупреждение( , "Выгрузка в каталог завершена" , 10 ) ;
КонецПроцедуры
#КонецОбласти
Автор: Михали Задорнов (MZadornov)
Категория:
Внешние печатные формы, отчеты и обработк�… Обработка файлов в папке и запись дополнительной информации в них Частенько при загрузке данных в 1С сталкиваешься с необходимостью дополнительной обработки загружаемых файлов. Возможно это добавление какой-либо информации или наоборот удаление, а может изменение.
Ниже приведен код, который обрабатывает файлы в указанной папке и добавляет в конец файла информацию о дате его последнего изменения:
(это лишь рабочий пример / набросок - который вы можете использовать для написания своего обработчика)
Код 1C v 8.х Процедура КнопкаВыполнитьНажатие(Кнопка)
масФайлов = НайтиФайлы( ПутьКФайлу, "*.w1c" ) ;
Для Каждого стр из масФайлов Цикл
Состояние( "Обработка: " + стр. Имя) ;
текФайл = стр. ПолноеИмя;
ВыбФайл = Новый Файл( текФайл) ;
ДатаИзмененияФайла = Формат( ВыбФайл. ПолучитьУниверсальноеВремяИзменения( ) , "ДЛФ=D" ) ;
текДок = Новый ТекстовыйДокумент;
текДок. Прочитать( текФайл, "UTF-8" ) ;
текТекст = текДок. ПолучитьТекст( ) + Символы. ПС+ "<&w1c&>" + ДатаИзмененияФайла;
текДок. УстановитьТекст( текТекст) ;
текДок. Записать( текФайл, "UTF-8" ) ;
КонецЦикла ;
КонецПроцедуры
Процедура ПриОткрытии()
ПутьКФайлу= "Укажите каталог"
КонецПроцедуры
Процедура ПутьКФайлуНачалоВыбора(Элемент, СтандартнаяОбработка)
СтандартнаяОбработка = Ложь ;
Режим = РежимДиалогаВыбораФайла. ВыборКаталога;
ДиалогОткрытияФайла = Новый ДиалогВыбораФайла( Режим) ;
ДиалогОткрытияФайла. Заголовок = "Выберите Каталог с файлами" ;
Если ДиалогОткрытияФайла. Выбрать( ) Тогда
ПутьКФайлу = ДиалогОткрытияФайла. Каталог;
Иначе
Текст = "ru = "" Файл(ы) не выбран!"" ; en = "" File(s) not selected!"" " ;
Предупреждение( НСтр( Текст) ) ;
КонецЕсли ;
КонецПроцедуры
Сама обработка : ObrabotkaFaylov.rar
Категория:
Работа с Файлами и Каталогами Выгрузка картинок из базы 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с из текстового файла с разделителями В этой статье я расскажу, как загружать данные в 1с 8 из простейших текстовых файлов с разделителями. Обычно они имеют расширение csv (Comma-Separated Values). Т. е. название подразумевает, что в каждой строке такого текстового файла значения разделены запятой. Но на самом деле, запятую, в качестве разделителя, использовать не надёжно. Поэтому применяют другие разделители, которые в обычном тексте встречаются редко. Это могут быть символы «^», «~»,«|» и другие. Итак, наша задача состоит в том, чтобы загрузить имеющуюся в csv файле информацию в базу данных 1с. Например, в файле будут содержаться товары интернет - магазина. В качестве образца, я взял выгрузку из магазина на скрипте virtuemart. Посмотрим, как выглядит файл.
Привожу две первых строки из него:
Код ~product_sku~^~category_path~^~product_name~^~product_desc~
~20~^~Книги/Электронные книги~^~Amazon Kindle 4 Touch~^~<p>Популярная электронная книга с ч/б экраном 6", электронной бумагой E-Ink Pearl, разрешением 600x800 пикс. с 16 - ю оттенками серого.</p>~
Посмотрим на файл.
Первая строка служебная. В ней описан формат нашего файла. Т. е. в какой ячейке, что находится. Однако, имейте в виду, что такой строки может и не быть.
Ячейки образуются при помощи разделителя «^», а данные в ячейках обрамляются символом «~».
В любой конфигурации 1с есть иерархический справочник товаров. В него и будем загружать информацию.
Создадим внешнюю обработку. Добавим строковый реквизит «путьКФайлуЗагрузки» для хранения имени файла. Добавим на форму поле ввода, связанное с данным реквизитом. Включим в свойствах поля ввода кнопку выбора и создадим обработчик события «НачалоВыбора» и напишем в нём такой код:
Код 1C v 8.х Процедура путьКФайлуЗагрузкиНачалоВыбора(Элемент, СтандартнаяОбработка)
Режим = РежимДиалогаВыбораФайла. Открытие;
ДиалогОткрытияФайла = Новый ДиалогВыбораФайла( Режим) ;
ДиалогОткрытияФайла. ПолноеИмяФайла = "" ;
Фильтр = "Comma separated file (*.csv)|*.csv" ;
ДиалогОткрытияФайла. Фильтр = Фильтр;
ДиалогОткрытияФайла. МножественныйВыбор = Ложь ;
ДиалогОткрытияФайла. Заголовок = "Выберите файл" ;
Если ДиалогОткрытияФайла. Выбрать( ) Тогда
путьКФайлуЗагрузки = ДиалогОткрытияФайла. ПолноеИмяФайла;
КонецЕсли ;
КонецПроцедуры
Т. о. мы организовали диалог для выбора файла в нашей обработке.
Хорошо. Теперь, для удобства и наглядности я предлагаю создать временную табличку, в которую мы загрузим текстовый файл, а уже после её заполнения - будем осуществлять загрузку в базу 1с. Для этого, на форму добавим табличное поле «табЗагрузки», с типом значения «ТаблицаЗначений» и командной панелью. В панели поместим кнопку «Заполнить» и создадим обработчик её нажатия «КоманднаяПанель1Заполнить». Также для элемента универсальности, добавим в обработку два строковых реквизита «символОграничения» и «разделительПолей». В них мы будем хранить «^», и «~». Можно в теле модуля формы осуществить их начальную инициализацию:
разделительПолей = "^";
символОграничения = "~";
Это позволит пользователю задать свои значения и при желании сохранить настройку, которая впоследствии не затрется нашей инициализацией.
Код 1C v 8.х Процедура КоманднаяПанель1Заполнить(Кнопка)
Если табЗагрузки. Количество( ) > 0 И Вопрос( "Таблица будет очищена. Вы уверены?" , РежимДиалогаВопрос. ДаНет)
= КодВозвратаДиалога. Нет Тогда
Возврат ;
КонецЕсли ;
ЗаполнитьТаблицу( ) ;
КонецПроцедуры
Процедура ЗаполнитьТаблицу()
текст = Новый ТекстовыйДокумент;
Попытка
текст. Прочитать( путьКФайлуЗагрузки, КодировкаТекста. UTF8) ;
Исключение
Сообщить( "Не удалось прочитать файл: "
+ ОписаниеОшибки( ) , СтатусСообщения. ОченьВажное) ;
Возврат ;
КонецПопытки ;
табЗагрузки. Очистить( ) ;
табЗагрузки. Колонки. Очистить( ) ;
квоСтрок = текст. КоличествоСтрок( ) ;
Если Не квоСтрок > 0 Тогда
Сообщить( "Файл пустой" , СтатусСообщения. Внимание) ;
Возврат ;
КонецЕсли ;
стрТекста = текст. ПолучитьСтроку( 1 ) ;
масЗначСтр = ОбщегоНазначения. РазложитьСтрокуВМассивПодстрок( стрТекста, разделительПолей) ;
табЗагрузки. Колонки. Добавить( "не_загружать" , Новый ОписаниеТипов( "Булево" ) , "Не загружать" ) ;
табЗагрузки. Колонки. Добавить( "номер_строки" , Новый ОписаниеТипов( "Число" ,
Новый КвалификаторыЧисла( 10 , 0 , ДопустимыйЗнак. Неотрицательный) ) , "Номер строки" ) ;
Для каждого зн Из масЗначСтр Цикл
значение = СтрЗаменить( зн, символОграничения, "" ) ;
кол = табЗагрузки. Колонки. Добавить( значение, Новый ОписаниеТипов( "Строка" ) ) ;
КонецЦикла ;
ЭлементыФормы. табЗагрузки. СоздатьКолонки( ) ;
Для номСтр = 2 По квоСтрок Цикл
стрТекста = текст. ПолучитьСтроку( номСтр) ;
масЗначСтр = ОбщегоНазначения. РазложитьСтрокуВМассивПодстрок( стрТекста, разделительПолей) ;
новСтр = табЗагрузки. Добавить( ) ;
новСтр. номер_строки = номСтр;
номЗнач = 2 ;
Для каждого зн Из масЗначСтр Цикл
новСтр[номЗнач] = СтрЗаменить( зн, символОграничения, "" ) ;
номЗнач = номЗнач + 1 ;
КонецЦикла ;
КонецЦикла ;
КонецПроцедуры
Функцию разложения строки с разделителями в массив можно разместить как в одном из общих модулей, так и непосредственно в обработке.
Код 1C v 8.х Функция РазложитьСтрокуВМассивПодстрок(Знач Стр, Разделитель = "," ) Экспорт
МассивСтрок = Новый Массив( ) ;
Если Разделитель = " " Тогда
Стр = СокрЛП( Стр) ;
Пока Истина Цикл
Поз = Найти( Стр, Разделитель) ;
Если Поз= 0 Тогда
МассивСтрок. Добавить( Стр) ;
Возврат МассивСтрок;
КонецЕсли ;
МассивСтрок. Добавить( Лев( Стр, Поз- 1 ) ) ;
Стр = СокрЛ( Сред( Стр, Поз) ) ;
КонецЦикла ;
Иначе
ДлинаРазделителя = СтрДлина( Разделитель) ;
Пока Истина Цикл
Поз = Найти( Стр, Разделитель) ;
Если Поз= 0 Тогда
МассивСтрок. Добавить( Стр) ;
Возврат МассивСтрок;
КонецЕсли ;
МассивСтрок. Добавить( Лев( Стр, Поз- 1 ) ) ;
Стр = Сред( Стр, Поз+ ДлинаРазделителя) ;
КонецЦикла ;
КонецЕсли ;
КонецФункции
Отлично. В итоге, после заполнения, получим примерно такую картинку:
Теперь приступим непосредственно к загрузке товаров. Рядом с кнопкой «заполнить» добавим кнопку «загрузить» и добавим обработчик её нажатия «КоманднаяПанель1Загрузить», а также добавим реквизит «ПапкаЗагрузкиВыгрузкиТоваров» с типом вашего справочника товаров для опциональной их загрузки в определенную папку. Текст обработчика будет такой:
Код 1C v 8.х Процедура КоманднаяПанель1Загрузить(Кнопка)
Если Вопрос( "Вы уверены, что хотите загрузить файл?" , РежимДиалогаВопрос. ДаНет)
= КодВозвратаДиалога. Нет Тогда
Возврат ;
КонецЕсли ;
ВсегоСтрок = табЗагрузки. Количество( ) ;
номСтр = 1 ;
Для каждого стрТЗ Из табЗагрузки Цикл
Состояние( "Обработано: " + Окр( номСтр * 100 / ВсегоСтрок) + "%" ) ;
номСтр = номСтр + 1 ;
ОбработкаПрерыванияПользователя( ) ;
Если стрТЗ. не_загружать Тогда
Продолжить;
КонецЕсли ;
объект1 С = вернутьТовар( стрТЗ) ;
Если объект1 С = Неопределено Тогда
Возврат ;
КонецЕсли ;
Если Не ЗаписатьЭлементСпр( объект1 С) Тогда
Сообщить( "Загрузка прервана!" , СтатусСообщения. ОченьВажное) ;
Возврат ;
КонецЕсли ;
стрТЗ. не_загружать = Истина ;
КонецЦикла ;
КонецПроцедуры
В приведенном коде две новые функции «вернутьТовар» и «ЗаписатьЭлементСпр». Вот их текст:
Код 1C v 8.х Функция вернутьТовар(стрТабФайла)
Артикул = стрТабФайла. product_sku;
Если Не ЗначениеЗаполнено( Артикул) Тогда
Сообщить( "В строке " + стрТабФайла. номер_строки + " не заполнен product_sku" ,
СтатусСообщения. ОченьВажное) ;
Возврат Неопределено ;
КонецЕсли ;
Запрос = Новый Запрос( "ВЫБРАТЬ
| Номенклатура.Ссылка
|ИЗ
| Справочник.Номенклатура КАК Номенклатура
|ГДЕ
| Номенклатура.Артикул = &Артикул" ) ;
Запрос. УстановитьПараметр( "Артикул" , Артикул) ;
Выборка = Запрос. Выполнить( ) . Выбрать( ) ;
Если Выборка. Следующий( ) Тогда
Возврат Выборка. Ссылка. ПолучитьОбъект( ) ;
Иначе
ЭтоНовый = Истина ;
объект1 С = Справочники. Номенклатура. СоздатьЭлемент( ) ;
объект1 С. Артикул = Артикул;
объект1 С. Наименование = стрТабФайла. product_name;
объект1 С. Родитель = вернутьРодителяТовара( стрТабФайла. category_path) ;
Возврат объект1 С;
КонецЕсли ;
КонецФункции
Функция ЗаписатьЭлементСпр(Спр)
Попытка
Спр. Записать( ) ;
Исключение
Сообщить( "При записи элемента справочника " + Спр + " возникла ошибка: " + ОписаниеОшибки( ) , СтатусСообщения. ОченьВажное) ;
Возврат Ложь ;
КонецПопытки ;
Возврат Истина ;
КонецФункции
И осталась последняя новая функция для обработки родителя товара вернутьРодителяТовара. Текст её смотрите ниже. Комментарии по тексту.
Код 1C v 8.х Функция вернутьРодителяТовара(стрКатегории)
Родитель = ПапкаЗагрузкиВыгрузкиТоваров;
масРодителей = РазложитьСтрокуВМассивПодстрок( стрКатегории, "/" ) ;
Для каждого Род Из масРодителей Цикл
РодСс = Справочники. Номенклатура. НайтиПоНаименованию( Род, Истина ) ;
Если РодСс. Пустая( ) Тогда
НовРод = Справочники. Номенклатура. СоздатьГруппу( ) ;
НовРод. Наименование = Род;
НовРод. Родитель = Родитель;
Если Не ЗаписатьЭлементСпр( НовРод) Тогда
Возврат Неопределено ;
КонецЕсли ;
Родитель = НовРод. Ссылка;
Иначе
Родитель = РодСс;
КонецЕсли ;
КонецЦикла ;
Возврат Родитель;
КонецФункции
Все. Конечно, в реальной жизни еще много чего нужно будет дописать, но не все сразу. Такой шаблон можно использовать как отправную точку.
Скачивать файлы может только зарегистрированный пользователь!
Успехов в разработке!
Источник Категория:
Текстовый документ Импорт документа 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.х ДиалогОткрытияФайла = Новый ДиалогВыбораФайла( РежимДиалогаВыбораФайла. Открытие) ;
ДиалогОткрытияФайла. Выбрать( ) ;
Файл = Новый Файл( ДиалогОткрытияФайла. ПолноеИмяФайла) ;
Текст = "Файл: " + Файл. Имя;
Текст = Текст + Символы. ПС + "Расширение: " + Файл. Расширение;
Текст = Текст + Символы. ПС + "Полное имя: " + Файл. ПолноеИмя;
Текст = Текст + Символы. ПС + "Путь: " + Файл. Путь;
Текст = Текст + Символы. ПС + "Размер: " + Файл. Размер( ) + " байт" ;
Текст = Текст + ? ( Файл. ПолучитьНевидимость( ) , Символы. ПС + "Невидимый. " , "" ) ;
Текст = Текст + ? ( Файл. ПолучитьТолькоЧтение( ) , Символы. ПС + "Только чтение." , "" ) ;
Текст = Текст + Символы. ПС + "Последнее изменение: " + Файл. ПолучитьВремяИзменения( ) ;
Сообщить( Текст) ;
Код 1C v 7.x Сообщить( "ИНФОРМАЦИЯ О ОТКРЫТОМ ФАЙЛЕ!" , "I" ) ;
Сообщить( "Путь к открытому файлу - " + папк + файл) ;
ИмяВыбрФайла= папк+ файл;
ФС. АтрибутыФайла( ИмяВыбрФайла, A, B, C, D, E, F) ;
сообщить( "Размер Файла - " + A) ;
сообщить( "Количество записей - " + НомС + " , Количество полей - " + КолП , "!" ) ;
сообщить( "Время Создания - " + C) ;
сообщить( "Время Последннго Доступа - " + D) ;
сообщить( "Время Последней Записи - " + E) ;
сообщить( "Расширенное Имя Файла - " + F) ;
Категория:
Работа с Файлами и Каталогами Выбрать Остатки и Обороты по указанным счетам, отбор по субконто и выгрузка результата в EXCEL Код 1C v 8.х Запрос= Новый Запрос;
Запрос. Текст= "
|ВЫБРАТЬ
| ХозрасчетныйОстаткиИОбороты.Счет,
| ХозрасчетныйОстаткиИОбороты.Субконто1,
| ХозрасчетныйОстаткиИОбороты.Субконто2,
| ХозрасчетныйОстаткиИОбороты.Субконто3,
| ХозрасчетныйОстаткиИОбороты.Организация,
| ХозрасчетныйОстаткиИОбороты.СуммаОборот,
| ХозрасчетныйОстаткиИОбороты.СуммаОборотДт,
| ХозрасчетныйОстаткиИОбороты.СуммаОборотКт
|ИЗ
| РегистрБухгалтерии.Хозрасчетный.ОстаткиИОбороты(
| &ДатаНач,
| &ДатаКон,
| Период,
| ,
| Счет В (&Cчета),
| ," ;
Если Не Контрагент. Пустая( ) Тогда
Запрос. Текст= Запрос. Текст+ "
| Субконто1 = &Контрагент
| ИЛИ Субконто2 = &Договор" ;
КонецЕсли ;
Запрос. Текст= Запрос. Текст+ "
|) КАК ХозрасчетныйОстаткиИОбороты
|" ;
СписокСчетов= Новый СписокЗначений;
СписокСчетов. Добавить( ПланыСчетов. Хозрасчетный. РасчетыСПоставщикамиИПодрядчиками) ;
СписокСчетов. Добавить( ПланыСчетов. Хозрасчетный. РасчетыПоАвансамВыданным) ;
Запрос. УстановитьПараметр( "Cчета" , СписокСчетов) ;
Запрос. УстановитьПараметр( "ДатаКон" , ДатаК) ;
Запрос. УстановитьПараметр( "ДатаНач" , ДатаН) ;
Запрос. УстановитьПараметр( "Договор" , Договор) ;
Запрос. УстановитьПараметр( "Контрагент" , Контрагент) ;
Результат = Запрос. Выполнить( ) ;
ТабДок= ЭлементыФормы. ТД;
ТабДок. Очистить( ) ;
ПечатьТЗвТаб( ТабДок, Результат) ;
Режим = РежимДиалогаВыбораФайла. Сохранение;
ДиалогОткрытияФайла = Новый ДиалогВыбораФайла( Режим) ;
ДиалогОткрытияФайла. ПолноеИмяФайла = "" ;
Фильтр = "Excel(*.xls)|*.xls" ;
ДиалогОткрытияФайла. Фильтр = Фильтр;
ДиалогОткрытияФайла. МножественныйВыбор = Ложь ;
ДиалогОткрытияФайла. Заголовок = "Выберите куда сохранить файл Excel" ;
Если ДиалогОткрытияФайла. Выбрать( ) Тогда
ПутьКФайлу = ДиалогОткрытияФайла. ПолноеИмяФайла;
КонецЕсли ;
ТабДок. Записать( ПутьКФайлу, ТипФайлаТабличногоДокумента. XLS97) ;
Категория:
Запросы Пример загрузки данных из Текстового файла, документа Файл для загрузки содержит данные вида(КодФизЛица, ФизЛицо, Сумма):
000000513~Петров Юрий Викторович~150
000000184~Иванов Александр Юрьевич~50
Код 1C v 8.х
Режим = РежимДиалогаВыбораФайла. Открытие;
ДиалогОткрытияФайла = Новый ДиалогВыбораФайла( Режим) ;
ДиалогОткрытияФайла. ПолноеИмяФайла = "" ;
Фильтр = "Текст(*.txt)|*.txt" ;
ДиалогОткрытияФайла. Фильтр = Фильтр;
ДиалогОткрытияФайла. МножественныйВыбор = Ложь ;
ДиалогОткрытияФайла. Заголовок = "Выберите файл для загрузки" ;
Если ДиалогОткрытияФайла. Выбрать( ) Тогда
ПутьКФайлу = ДиалогОткрытияФайла. ПолноеИмяФайла;
КонецЕсли ;
ВидУдерж= Неопределено ;
МассивТипов = Новый Массив;
МассивТипов. Добавить( Тип( "ПланВидовРасчетаСсылка.УдержанияОрганизаций" ) ) ;
ОписаниеВозможныхТипов = Новый ОписаниеТипов( МассивТипов) ;
Если ВвестиЗначение( ВидУдерж, "Выберите вид удержания" , ОписаниеВозможныхТипов) Тогда
Если Удержания. Количество( ) > 0 тогда
Предупреждение( "Внимание! В таблице уже есть данные, новые данные Добавлены к существующим данным!" ) ;
КонецЕсли ;
текдок= Новый ТекстовыйДокумент;
текдок. Прочитать( ПутьКФайлу) ;
Для Ном= 1 по текдок. КоличествоСтрок( ) цикл
Стр = текдок. ПолучитьСтроку( Ном) ;
СтрМ= РазложитьСтрокуВМассивПодстрок( стр, "~" ) ;
НовСтр= Удержания. Добавить( ) ;
Физик = Справочники. ФизическиеЛица. НайтиПоКоду( СтрМ[0 ]) ;
Если СокрЛП( Физик. Наименование) = СокрЛП( СтрМ[1 ]) тогда
НовСтр. Физлицо = Физик;
Иначе
Сообщить( "В справочнике Физ. Лиц не найден " + СтрМ[1 ], СтатусСообщения. ОченьВажное) ;
КонецЕсли ;
НовСтр. ВидРасчета= ВидУдерж;
НовСтр. ДатаНачала= РабочаяДата;
НовСтр. ДатаОкончания= РабочаяДата;
НовСтр. Показатель1 = СтрМ[2 ];
НовСтр. Результат= СтрМ[2 ];
КонецЦикла ;
КонецЕсли ;
Категория:
Текстовый документ Пример вызова диалога открытия Файла Код 1C v 8.х Режим = РежимДиалогаВыбораФайла. Открытие;
ДиалогОткрытияФайла = Новый ДиалогВыбораФайла( Режим) ;
ДиалогОткрытияФайла. ПолноеИмяФайла = "" ;
Фильтр = "Текст(*.txt)|*.txt" ;
ДиалогОткрытияФайла. Фильтр = Фильтр;
ДиалогОткрытияФайла. МножественныйВыбор = Ложь ;
ДиалогОткрытияФайла. Заголовок = "Выберите файл" ;
Если ДиалогОткрытияФайла. Выбрать( ) Тогда
ВыгружатьВ = ДиалогОткрытияФайла. ПолноеИмяФайла;
КонецЕсли ;
Категория:
Работа с Файлами и Каталогами Сохранение отчета в Excel и его открытие Код 1C v 8.х ИмяФайла = "Отчет.xls" ;
ДиалогОткрытияФайла = Новый ДиалогВыбораФайла( РежимДиалогаВыбораФайла. Сохранение) ;
ДиалогОткрытияФайла. ПолноеИмяФайла = ИмяФайла;
ДиалогОткрытияФайла. Каталог = КаталогВременныхФайлов( ) ;
ДиалогОткрытияФайла. Фильтр = "Файлы Microsoft Excel (*.xls)|*.xls|Все файлы (*.*)|*.*" ;
ДиалогОткрытияФайла. МножественныйВыбор = Ложь ;
Если ДиалогОткрытияФайла. Выбрать( ) тогда
ЭлементыФормы. ПолеОтчета. Записать( ДиалогОткрытияФайла. ПолноеИмяФайла, ТипФайлаТабличногоДокумента. XLS) ;
ДокExcel = ПолучитьCOMОбъект( "" , "Excel.Application" ) ;
ДокExcel. Workbooks. Open( ДиалогОткрытияФайла. ПолноеИмяФайла) ;
ДокExcel. Visible = 1 ;
КонецЕсли ;
Категория:
Работа с Microsoft Office и OpenOffice