Имя: Пароль:
1C
1С v8
Выгрузка из OpenOffice в 1С
0 Olissen
 
01.11.18
13:05
Здравствуйте,не понимаю как сделать выгрузку из OpenOffice в 1С, гуглю функции, но не могу в них разобраться и они постоянно выходят с кучей ошибок. В общем думаю как создать внешнюю обработку для загрузки того,что есть в OpenOffice Calc в 1С. В итоге результатом работы будет документ УстановкаЦенНоменклатуры. Конфигурация УТ 10.3.
Буду рад любым советам. Всё, что я сделал пока что лишь выбор диалога файла по нажатию на поле ввода где я выбираю сам файл OpenOffice:
[code]
Процедура ВыбратьФайлНачалоВыбора(Элемент, СтандартнаяОбработка)
        Режим=РежимДиалогаВыбораФайла.Открытие;
    ФайловыйДиалог=Новый ДиалогВыбораФайла(Режим);
    ФайловыйДиалог.Фильтр="*.xls|*.xls|*.xlsx|*.xlsx";
        
    Если ФайловыйДиалог.Выбрать() Тогда
        ЭлементыФормы.ВыбратьФайл.Значение=ФайловыйДиалог.ПолноеИмяФайла;
    Иначе Предупреждение("Файл не выбран!");
    КонецЕсли;[/code]
, что делать дальше не знаю :(
2 Базис
 
naïve
01.11.18
13:14
Забудь про применяемое ПО и расскажи на самом простом уровне, но не перепрыгивая, от того что есть к тому, что хочешь.
3 НоваяВолна
 
01.11.18
13:22
(0) Что-то в таком роде я делал
    Попытка
        ScriptControl = СоздатьОбъект("MSScriptControl.ScriptControl");
        ScriptControl.Language = "JavaScript";
        URL = "file:///" + ScriptControl.Eval("encodeURI('" + СтрЗаменить(ИмяФайлаXLS,"\","/") + "')");
        ServiceManager    = ScriptControl.Eval("ServiceManager=new ActiveXObject('com.sun.star.ServiceManager')");
        Массив        = ScriptControl.Eval("Массив=new Array()");
        Properties    = ScriptControl.Eval("Properties=ServiceManager.Bridge_GetStruct('com.sun.star.beans.PropertyValue')");
        Properties.Name    ="Hidden";
        ScriptControl.Eval("Properties.Value=true");
        Массив.push(Properties);
        Desktop        = ServiceManager.CreateInstance("com.sun.star.frame.Desktop");
        Document    = Desktop.LoadComponentFromURL(URL, "_blank", 0, Массив);
        
    Исключение
        Предупреждение("Не удалось создать документ Open Office Calc! Возможно, что Open Office не установлен!"+ ОписаниеОшибки());
        Возврат;
    КонецПопытки;
    
    Sheets    = Document.getSheets();
    Sheet    = Sheets.getByIndex(0);
......................................................

            ПолноеНаименование     = СокрЛП(Sheet.getCellByPosition(1,СчетчикСтрок).String);    
            Артикул             = СокрЛП(Sheet.getCellByPosition(2,СчетчикСтрок).String);    
            ЦенаЗакупа            = СокрЛП(Sheet.getCellByPosition(3,СчетчикСтрок).String);    
            СтавкаНДСфайл        = СокрЛП(Sheet.getCellByPosition(4,СчетчикСтрок).String);
4 Filippov
 
01.11.18
13:42
С использованием табличного документа:
&НаКлиенте
Процедура Прочитать(Команда)
    ПрочитатьНаСервере();
    ПреобразоватьВТЗНаСервере();
КонецПроцедуры

&НаСервере
Процедура ПрочитатьНаСервере()
    ТабДок = Новый ТабличныйДокумент;
    ТабДок.Прочитать(Объект.ИмяФайла);
КонецПроцедуры

ПреобразоватьВТЗНаСервере - поищите как пример обработку ЗагрузкаТДВТЗ.epf (https://drive.google.com/file/d/0B1BcX59caoCsLWxaNGtTc0JBWWM/view)
Полученную таблицу значений разберёте как вам нужно
5 VS-1976
 
01.11.18
13:56
Немного помогу :)

в обработке:

Перем пServiceManager;
Перем пDesktop;
Перем пActiveWorkbook;

Функция Open( ПолныйПуть, НеСкрытыйРежим = Ложь ) Экспорт

    Перем пActiveWorkbook;

    Если пServiceManager <> Неопределено Тогда
        НастройкиОткрытия = Новый COMSafeArray( "VT_VARIANT", 1 );
        PropertyValue = пServiceManager.Bridge_GetStruct( "com.sun.star.beans.PropertyValue" );
        PropertyValue.Name = "Hidden";
        PropertyValue.Value = НеСкрытыйРежим;
        НастройкиОткрытия.SetValue( 0, PropertyValue );

        Попытка
            пActiveWorkbook = пDesktop.LoadComponentFromURL( ConvertToURL( ПолныйПуть ), "_blank", 0, НастройкиОткрытия );

        Исключение
        КонецПопытки;

    КонецЕсли;

    Возврат пActiveWorkbook;

КонецФункции

Функция ConvertToURL( FullPath )

    Возврат пServiceManager.CreateInstance( "com.sun.star.ucb.FileContentProvider" ).getFileURLFromSystemPath( "", FullPath );

КонецФункции

Попытка
    пServiceManager = Новый COMОбъект( "com.sun.star.ServiceManager" );
    пDesktop = пServiceManager.CreateInstance( "com.sun.star.frame.Desktop" );

Исключение
    Сообщить( "Не установлен Open Office" );

КонецПопытки;


Дальше думаю осилишь :)
6 Olissen
 
01.11.18
14:17
(5) это в модуле объекта внешней обработки прописать?
7 VS-1976
 
01.11.18
14:26
(6) Да, я так сделал, что бы можно было не создавать постоянно Office и не хранить инстанс в последующем.
Можно и без этого обойтись, просто запоминать пServiceManager и пDesktop и передавать в функции. Но ты забудешь через время, по этому я и сделал обёртку такую...

У меня в итоге родились такие функции как:

Функция ActiveSheet() Экспорт
Функция ActiveWorkbook() Экспорт
Функция WorkSheets( Index = Неопределено, Document = Неопределено ) Экспорт
Процедура Close( Document, CloseModified = Истина ) Экспорт
Процедура Save( Document = Неопределено, FullPath = Неопределено, Перезаписывать = Истина ) Экспорт
Функция Cells( Row = Неопределено, Column = Неопределено, Sheet = Неопределено ) Экспорт
Функция Value( Row, Column, Sheet = Неопределено ) Экспорт
Процедура SetValue( Row, Column, Value, Sheet = Неопределено ) Экспорт
Функция UsedRange( Sheet = Неопределено ) Экспорт

Эти обёртки что бы можно было работать примерно как с Excel...
8 youalex
 
01.11.18
14:55
ТабличныйДокумент (SpreadsheetDocument)
Прочитать (Read)
Вариант синтаксиса: Из файла

Синтаксис:

Прочитать(<ИмяФайла>, <СпособЧтенияЗначений>)
Параметры:

<ИмяФайла> (обязательный)

Тип: Строка.
Имя файла табличного документа.
<СпособЧтенияЗначений> (необязательный)

Тип: СпособЧтенияЗначенийТабличногоДокумента.
Определяет, каким образом нужно интерпретировать значения, считываемые из исходного документа XLS, XLSX или ODS.
9 Olissen
 
01.11.18
15:05
(5) а не могли бы вы пояснить код, я просто никогда с подобным не сталкивался, если не затруднит конечно же...
10 VS-1976
 
01.11.18
15:08
(9) Тебе же в (8) показали как грузить документ с табличный, а там выбирай значения и всё. Главное что бы платформа позволяла ( режим совместимости ). Но такая возможность давно появилась...
11 Olissen
 
01.11.18
16:33
Попробовал:
[code]
ТабДок=Новый ТабличныйДокумент(ВыбратьФайл);
     ТабДок.Прочитать(ВыбратьФайл,СпособЧтенияЗначенийТабличногоДокумента.Значение);
            ТабДок.Вывести(ТабличноеПоле1);
[/code]
Выскочила ошибка:
Конструктор не найден
     ТабДок=Новый <<?>>ТабличныйДокумент(ВыбратьФайл); (Проверка: Толстый клиент (обычное приложение))
12 VS-1976
 
01.11.18
16:48
(11) Новичок что ли?..

ТабДок = Новый ТабличныйДокумент;
ТабДок.Прочитать( ВыбратьФайл, СпособЧтенияЗначенийТабличногоДокумента.Значение, ТипФайлаТабличногоДокумента.ODS );
ТабДок.Вывести();
13 VS-1976
 
01.11.18
16:49
(12) Точнее

ТабДок = Новый ТабличныйДокумент;
ТабДок.Прочитать( ВыбратьФайл, СпособЧтенияЗначенийТабличногоДокумента.Значение, ТипФайлаТабличногоДокумента.ODS );
ТабДок.Показать( "Прочитанный документ" );
14 Olissen
 
01.11.18
17:10
(13) Да,я нуб, только неделю стажируюсь. Теперь надо,чтобы всё это оказалось в  документе "УстановкаЦенНоменклатуры". Это надо в самом документе прописывать или что-то через таблицу значений делать?
15 Garykom
 
гуру
01.11.18
17:18
Проблема в том что эта задача для "нуба" невыполнима в любые разумные сроки.

Если же цель изучение 1С и программирования то задачка излишне сложна, она решается после от пары месяце до полугода изучения 1С.

Короче сначала попробуй что попроще и по отдельности ну например просто документ программно создавать/заполнять.

А перед этим номенклатуру искать по наименованию/коду/артикулу/ШК (с учетом группировки) или создавать если ее нет с заполнением всех требуемых реквизитов.
16 Olissen
 
01.11.18
17:32
(15) Ну мне просто на стажировке кинули эту задачу. Весь день мучаюсь... ещё один друг, тоже стажёр только на месяц дольше меня тут работает чуть подсказывает,но окончательного решения добиться не можем,уже весь день мучаюсь... особых ограничений по срокам не задавали мне. Но всё равно хочется разобраться и решить её. А не знает никто есть ли вариант через ТаблицуЗначений что-то придумать. Я сейчас поставил на форму обработки ПолеТабличногоДокумента и туда закидываю вот так:
[code]

ЭлементыФормы.табдок.Прочитать(ВыбратьФайл);

[/code]

Теперь мне сказали что надо в том,что вывелось пройти в цикле и потом присвоить как-то документу,слишком мутно.
17 Garykom
 
гуру
01.11.18
17:40
(16) >Весь день мучаюсь...

А теперь представь что так мучаться каждый день придется примерно пару месяцев. И подумай оно тебе надо?
18 Garykom
 
гуру
01.11.18
17:42
(17)+ Да учти что за пару месяцев у тебя будет вроде бы и рабочтающее но нифига не рабочее решение.

Потому что все криво-косо, куча ситуаций не предусмотрено и неудобно для пользователей.

А вот чтобы получить рабочее решение (за которое готовы платить клиенты или работодатель) придется мучаться примерно пару лет.
19 НоваяВолна
 
01.11.18
23:46
(16) и ты решил что форум поможет двум ламерам остаться на работе? .. вы ошиблись!  Форум может помочь, но думать придется самому