Форум программистов, компьютерный форум, киберфорум
Наши страницы
1С: Собственные программы
Войти
Регистрация
Восстановить пароль
 
 
Рейтинг 4.94/16: Рейтинг темы: голосов - 16, средняя оценка - 4.94
DEaD_EGOR
0 / 0 / 0
Регистрация: 15.03.2016
Сообщений: 103
1

Внешняя обработка, создание формы

23.03.2016, 10:19. Просмотров 3262. Ответов 72
Метки нет (Все метки)

Всем доброго времени суток. Народ, подскажите, пишу с нуля внешнюю обработку для загрузки данных в документ из файлов Excel.. Проблема возникла в моменте создания формы.
Задача такая-"Обработка читает документ и на основании прочтённого создаёт документ Реализации товаров. При написании кода в модуле Сначала в объекте нужно заполнить все, что нужно для формы, потом нужно сделать вызов на клиент, на сервере поместить объект в реквизит и получить его на клиенте..."

Имею кусок уже написанного кода
1C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
&НаСервере
Процедура ЗагрузитьФайлНаСервере ()
 
(тут много кода по открытию и чтению эксель-документа) 
 
 //Создаём новый документ и списываем в него данные
     мДокумент = Документы.РеализацияТоваровУслуг.СоздатьДокумент();
     НоваяСтрока = мДокумент.Товары.Добавить();
 
//Создаём форму документа
     Если НЕ ЗначениеЗаполнено(Объект.ИмяФайла) Тогда
        Сообщить("Не выбран файл загрузки!");
    Иначе       
        ИмяФайла = Объект.ИмяФайла; 
    мФорма = ПолучитьФорму("Документ.РеализацияТоваровУслуг.Форма.ФормаДокументаТовары");
    ДокОбъект = мФорма.Объект;
постоянно ругается на то, что "Процедура или функция с указанным именем не определена (ПолучитьФорму)"

как реализовать вызов на клиент?

Добавлено через 13 минут
Прошу прощения, сам разобрался))

Добавлено через 16 часов 52 минуты
Собственно, вопрос с загрузкой формы я решил. Теперь возник вопрос, какой набор команд необходим для заполнения формы?
Сам код выглядит вот так:
1C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
&НаСервере
Процедура ЗагрузитьФайлНаСервере (ФормаОбъект)
    
    
    //подключаемся к эксель
    Попытка
        Excel = Новый COMОбъект("Excel.Application");
        Книга = Excel.WorkBooks.Open(Объект.ИмяФайла);
    Исключение
        Сообщить("Ошибка при открытии файла с помощью Excel! Загрузка не будет произведена!");
        Сообщить(ОписаниеОшибки());
        Возврат;
    КонецПопытки;
        
    Попытка 
        //Открываем необходимый лист
        Excel.Sheets(1).Select();  // лист 1, по умолчанию  
    Исключение
        //Закрываем Excel
        Excel.ActiveWorkbook.Close();   
        Excel = 0;
        Сообщить("Файл "+Строка(Объект.ИмяФайла)+" не соответствует необходимому формату! Первый лист не найден!");
        ОтменитьТранзакцию();
        Возврат;
    КонецПопытки;   
    
 
    //Получим количество строк и колонок.
    //В разных версиях Excel получаются по-разному, поэтому сначала определим версию Excel
    Версия = Лев(Excel.Version,Найти(Excel.Version,".")-1);
    Если Версия = "8" тогда
        ФайлСтрок   = Excel.Cells.CurrentRegion.Rows.Count;
        ФайлКолонок = Макс(Excel.Cells.CurrentRegion.Columns.Count, 13);
    Иначе
        ФайлСтрок   = Excel.Cells(1,1).SpecialCells(11).Row;
        ФайлКолонок = Excel.Cells(1,1).SpecialCells(11).Column;   
    Конецесли;
    
    //// Создание колонок табличного документа
    ТабЗнач = Новый ТаблицаЗначений;
    ТабЗнач.Колонки.Добавить("Артикул"); 
    ТабЗнач.Колонки.Добавить("Номенклатура"); 
    ТабЗнач.Колонки.Добавить("Количество"); 
    ТабЗнач.Колонки.Добавить("Цена");
    ТабЗнач.Колонки.Добавить("Ставка"); 
        
    //считываем первую строку и генерируем колонки  
            
    Для НС = 2 по ФайлСтрок Цикл  // НС указываем с какой строки начинать обработку        
            
        НоваяСтрока = ТабЗнач.Добавить();       
        НоваяСтрока.Номенклатура = Excel.Cells(НС, 2).Text;
        НоваяСтрока.Количество = Excel.Cells(НС, 3).Text;
        НоваяСтрока.Цена= Excel.Cells(НС, 4).Text;
        НоваяСтрока.Ставка= Excel.Cells(НС, 6).Text;
                            
    КонецЦикла;   
                
     // Закрыть COM соединение для экономии памяти
     Excel.Application.Quit();
                
 КонецПроцедуры
 
 &НаСервере
 Процедура ЗаполнитьНаСервере (ФормаОбъект)
     
     
     
 КонецПроцедуры
 
 
&НаКлиенте 
Процедура ИмяФайлаНачалоВыбора(Элемент, СтандартнаяОбработка)
    
    ДиалогВыбора = Новый ДиалогВыбораФайла(РежимДиалогаВыбораФайла.Открытие);
    ДиалогВыбора.Заголовок = "Выберите файл";
        
    Если ДиалогВыбора.Выбрать() Тогда
        Объект.ИмяФайла = ДиалогВыбора.ПолноеИмяФайла;
    КонецЕсли;
    
КонецПроцедуры
 
&НаКлиенте
Процедура ЗагрузитьФайл(Команда)
    
     мФорма = ПолучитьФорму("Документ.РеализацияТоваровУслуг.Форма.ФормаДокументаТовары");
     ФормаОбъект = мФорма.Объект;
     ЗагрузитьФайлНаСервере (ФормаОбъект);  
     КопироватьДанныеФормы(ФормаОбъект,Мформа.Объект);
     мФорма.Модифицированность = Истина;
     мФОрма.ЦеныИВалюта = "НДС сверху";
     Мформа.Открыть();
     МФорма.ЦеныИВалюта = "НДС сверху";
    
КонецПроцедуры
Подскажите неучу...
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
23.03.2016, 10:19
Ответы с готовыми решениями:

Внешняя обработка, создание документа Заказ Поставщику
Здравствуйте, подскажите, пожалуйста! Во внешней обработке создаю Заказ...

Внешняя обработка
Здравствуйте! как из формы внешней обработки сформировать типовой отчет и...

Внешняя обработка
Нужно создать внешнюю обработку. Ввести в поле ввода дату. По кнопке...

Внешняя обработка
Всем привет! Помогите пожалуйста составить такой вот код - (перебирает целые...

Внешняя обработка печати
Добрый день, не разу не работал со внешней обработкой печати, подскажите что не...

72
DEaD_EGOR
0 / 0 / 0
Регистрация: 15.03.2016
Сообщений: 103
23.03.2016, 12:25  [ТС] 21
Jackshi, Спасибо. А можешь объяснить, почему эксель читать лучше на клиенте а не на сервере?
0
Jackshi
59 / 59 / 6
Регистрация: 16.01.2013
Сообщений: 155
23.03.2016, 12:47 22
Если вдруг базы начнут переводить на скуль, в УФ начнутся проблемы.

Банальный пример: ты хочешь предупредить клиента что файл не выбран. Предупреждение доступно только на клиенте.

С клиента ты можешь обратиться к серверу в любое время, а вот наоборот нет. Если действия можно выполнить на клиенте, то их лучше выполнить на клиенте.
1
DEaD_EGOR
0 / 0 / 0
Регистрация: 15.03.2016
Сообщений: 103
24.03.2016, 10:49  [ТС] 23
Jackshi, ясно, спасибо большое)

Добавлено через 21 час 58 минут
Тут возник ещё вопрос.. как пропарсить полученную таблицу формы, созданной на сервере, и потом данные из неё заполнить автоматически в открывшуюся форму на клиенте?
1C
1
2
3
4
Для Каждого СТР из Таблица Цикл
        
        НоваяСтрока = мФорма.Товары.Добавить();
        мНоменклатура = Справочники.Номенклатура.НайтиПоНаименованию(Стр.Номенклатура);
это считывается и заполняется номенклатура.. а остальные значения (количество, цена..) как заполнить?
0
Jackshi
59 / 59 / 6
Регистрация: 16.01.2013
Сообщений: 155
24.03.2016, 11:46 24
Не понимаю что ты хочешь сделать?!
Ты здесь уже копируешь в форму нужные данные
1C
1
КопироватьДанныеФормы(ФормаОбъект,Мформа.Объект);
Если остальные примитивные типы, то просто:
1C
1
НоваяСтрока.Цена = ексельМексель(1,2).текст
"Ставка" скорее всего ссылка.

Добавлено через 24 минуты
Есть у Таб части документа процедура Загрузить(Таблица).

1C
1
Объект.Товары.Загрузить(ТвояТаблица)
1
DEaD_EGOR
0 / 0 / 0
Регистрация: 15.03.2016
Сообщений: 103
24.03.2016, 11:55  [ТС] 25
Jackshi,
Цитата Сообщение от Jackshi Посмотреть сообщение
Ты здесь уже копируешь в форму нужные данные
То, что я копирую, это я понял... Я не могу понять, почему он заполняет только номенклатуру, хотя в экселе заполен документ полностью?...

Вот весь код на текущий момент..
1C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
&НаКлиенте 
Процедура ИмяФайлаНачалоВыбора(Элемент, СтандартнаяОбработка)
    
    ДиалогВыбора = Новый ДиалогВыбораФайла(РежимДиалогаВыбораФайла.Открытие);
    ДиалогВыбора.Заголовок = "Выберите файл";
        
    Если ДиалогВыбора.Выбрать() Тогда
        Объект.ИмяФайла = ДиалогВыбора.ПолноеИмяФайла;
    Иначе   
         Возврат;
    КонецЕсли;
    
КонецПроцедуры
 
&НаСервере
Процедура ЗагрузитьФайлНаКлиенте(мФорма)
                 
    //подключаемся к эксель
    Попытка
        Excel = Новый COMОбъект("Excel.Application");
        Книга = Excel.WorkBooks.Open(Объект.ИмяФайла);
    Исключение
        Сообщить("Ошибка при открытии файла с помощью Excel! Загрузка не будет произведена!");
        Сообщить(ОписаниеОшибки());
        Возврат;
    КонецПопытки;
        
    Попытка 
        //Открываем необходимый лист
        Excel.Sheets(1).Select();  // лист 1, по умолчанию  
    Исключение
        //Закрываем Excel
        Excel.ActiveWorkbook.Close();   
        Excel = 0;
        Сообщить("Файл "+Строка(Объект.ИмяФайла)+" не соответствует необходимому формату! Первый лист не найден!");
        Возврат;
    КонецПопытки;   
                 
    //Получим количество строк и колонок.
    //В разных версиях Excel получаются по-разному, поэтому сначала определим версию Excel
    Версия = Лев(Excel.Version,Найти(Excel.Version,".")-1);
    Если Версия = "8" тогда
        ФайлСтрок   = Excel.Cells.CurrentRegion.Rows.Count;
        ФайлКолонок = Макс(Excel.Cells.CurrentRegion.Columns.Count, 13);
    Иначе
        ФайлСтрок   = Excel.Cells(1,1).SpecialCells(11).Row;
        ФайлКолонок = Excel.Cells(1,1).SpecialCells(11).Column;   
    Конецесли;
      
    //// Создание колонок табличного документа
     ТабЗнач = Новый ТаблицаЗначений;
     ТабЗнач.Колонки.Добавить("Номенклатура"); 
     ТабЗнач.Колонки.Добавить("Количество"); 
     ТабЗнач.Колонки.Добавить("Цена");
     ТабЗнач.Колонки.Добавить("Ставка"); 
 
    //считываем первую строку и генерируем колонки  
    Для НС = 2 по ФайлСтрок Цикл  // НС указываем с какой строки начинать обработку        
            
        НоваяСтрока = ТабЗнач.Добавить();
        НоваяСтрока.Номенклатура = Excel.Cells(НС, 2).Text;
        
        НоваяСтрока.Количество = Excel.Cells(НС, 3).Text;
        
        НоваяСтрока.Цена = Excel.Cells(НС, 4).Text;
        НоваяСтрока.Ставка = Excel.Cells(НС, 6).Text;
                            
    КонецЦикла;   
                
     // Закрыть COM соединение для экономии памяти
     Excel.Application.Quit();
     
     ЗагрузитьПрайсНаСервере(ТабЗнач,мФорма);
     
     //#Если Клиент тогда   
     //КопироватьДанныеФормы(ФормаОбъект,мФорма);
     //мФорма.Модифицированность = Истина;
     //мФОрма.ЦеныИВалюта = "НДС сверху";
     //Мформа.Открыть();
     //МФорма.ЦеныИВалюта = "НДС сверху";
     //#КонецЕсли
                         
 КонецПроцедуры
 
&НаКлиенте
Процедура ЗагрузитьФайл(Команда)
    
     //Создаём формму документа
     мФорма = ПолучитьФорму("Документ.РеализацияТоваровУслуг.Форма.ФормаДокументаТовары");
     ФормаОбъект = мФорма.Объект;                                                                             
     
     ЗагрузитьФайлНаКлиенте(ФормаОбъект);
     КопироватьДанныеФормы(ФормаОбъект, мФорма.Объект);
     мФорма.Открыть();
 
КонецПроцедуры
     
&НаСервере
Функция ЗагрузитьПрайсНаСервере (Таблица,мФорма);
    
    Для Каждого СТР из Таблица Цикл
        
        НоваяСтрока = мФорма.Товары.Добавить();
        мНоменклатура = Справочники.Номенклатура.НайтиПоНаименованию(Стр.Номенклатура);
        Если мНоменклатура <> Справочники.Номенклатура.ПустаяСсылка() Тогда
        Новаястрока.Номенклатура = мНоменклатура;
        Иначе Новаястрока.Номенклатура = СоздатьНоменклатуруНаСервере(СТР.Номенклатура);
        КонецЕсли;
        
        мКоличество = мФорма.Товары.Загрузить(Таблица);
        //мКоличество = ;  
        //Если мКоличество = 0 Тогда
        //  Новаястрока.Количество = мНоменклатура;
        //Иначе Новаястрока.Номенклатура = СоздатьНоменклатуруНаСервере(СТР.Номенклатура);
        //КонецЕсли;
 
        КонецЦикла;
    
КонецФункции
 
&НаСервере  
Функция СоздатьНоменклатуруНаСервере (Наименование)
    
    
    
КонецФункции
0
Jackshi
59 / 59 / 6
Регистрация: 16.01.2013
Сообщений: 155
24.03.2016, 12:27 26
СП никто не отменял. Ctrl+Shift+F1


Табличная часть (Tabular section)
Загрузить (Load)
Синтаксис:

Загрузить(<Таблица>)
Параметры:

<Таблица> (обязательный)

Тип: ТаблицаЗначений.
Таблица значений, откуда загружается табличная часть. Колонки таблиц совмещаются по именам.
Описание:

Загружает табличную часть из таблицы значений. При этом все прежние строки табличной части удаляются. При загрузке значения в колонках табличной части заполняются значениями из колонок таблицы значений с совпадающими именами.

Доступность:

Сервер, толстый клиент, внешнее соединение, мобильное приложение(сервер).
Примечание:

Использование метода допустимо только в том случае, если табличная часть получена из свойства объекта. Если табличная часть получена из свойства ссылки (или выборки), то использование этого метода будет вызывать ошибку выполнения.
Пример:

Состав.Загрузить(ТаблицаСостава);

Добавлено через 1 минуту
Это процедура. Она ничего не возвращает.

Добавлено через 1 минуту
Отладку смотри что в Таблице, имена колонок Таблицы и Таб. части
1
DEaD_EGOR
0 / 0 / 0
Регистрация: 15.03.2016
Сообщений: 103
24.03.2016, 12:35  [ТС] 27
Jackshi, Это я видел.. просто когда вставляю
1C
1
мКоличество = Объект.Количество.Загрузить(Таблица);
, мне в отладке показывает Поле "Количество" не найдено... Логично рассудить. что я указываю неправильно адрес, откуда будет производиться загрузка... А тогда адрес каким образом указать? Просто указать адрес таблицы значений?
Я понимаю, что я олень в 1с, потому и хочу разобраться...
0
Jackshi
59 / 59 / 6
Регистрация: 16.01.2013
Сообщений: 155
24.03.2016, 12:47 28
Замени на это
1C
1
Объект.Загрузить(Таблица);
1
DEaD_EGOR
0 / 0 / 0
Регистрация: 15.03.2016
Сообщений: 103
24.03.2016, 12:51  [ТС] 29
Jackshi, мне выдал Метод объекта не обнаружен (Загрузить)
Объект.Загрузить(Таблица);
0
GreenkA
Модератор
Эксперт 1С
2990 / 1911 / 520
Регистрация: 25.06.2009
Сообщений: 6,781
24.03.2016, 13:05 30
1C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
//// Создание колонок табличного документа
     ТабЗнач = Новый ТаблицаЗначений;
     ТабЗнач.Колонки.Добавить("Номенклатура"); 
     ТабЗнач.Колонки.Добавить("Количество"); 
     ТабЗнач.Колонки.Добавить("Цена");
     ТабЗнач.Колонки.Добавить("Ставка"); 
 
    //считываем первую строку и генерируем колонки  
    Для НС = 2 по ФайлСтрок Цикл  // НС указываем с какой строки начинать обработку        
            
        НоваяСтрока = ТабЗнач.Добавить();
        НоваяСтрока.Номенклатура = Excel.Cells(НС, 2).Text;
        
        НоваяСтрока.Количество = Excel.Cells(НС, 3).Text;
        
        НоваяСтрока.Цена = Excel.Cells(НС, 4).Text;
        НоваяСтрока.Ставка = Excel.Cells(НС, 6).Text;
                            
    КонецЦикла;
DEaD_EGOR, зачем вы создаете таблицу значений? вам же писали, что можно сразу заполнять табличную часть документа.

И если использовать метод Загрузить(), то надо прописывать табличную часть/таблицу, куда загружаем, а не просто Объект.

Добавлено через 1 минуту
DEaD_EGOR,
&НаСервере
Процедура ЗагрузитьФайлНаКлиенте(мФорма)
это как? Процедура называется ...НаКлиенте, но выполняем ее все равно на сервере?)
1
Jackshi
59 / 59 / 6
Регистрация: 16.01.2013
Сообщений: 155
24.03.2016, 13:06 31
DEaD_EGOR, не заметил что ты в цикле пытаешься загрузить))))
Так это не будет работать(по идее не должно). Работает только если эта таб. часть находится на форме, где исполняется код.

как то так, указывай каждую:
1C
1
2
3
4
5
6
7
8
Если мНоменклатура <> Справочники.Номенклатура.ПустаяСсылка() Тогда
   Новаястрока.Номенклатура = мНоменклатура;
Иначе
   Новаястрока.Номенклатура = СоздатьНоменклатуруНаСервере(СТР.Номенклатура);
КонецЕсли;
Новаястрока.Цена = Стр.Цена;
Новаястрока.Количество = Стр.Количество;
..........................................
1
GreenkA
Модератор
Эксперт 1С
2990 / 1911 / 520
Регистрация: 25.06.2009
Сообщений: 6,781
24.03.2016, 13:07 32
DEaD_EGOR, все намного проще, если делать все на клиенте:
1C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
&НаКлиенте
Процедура ЗагрузитьФайлНаКлиенте(мФорма)
                 
    //подключаемся к эксель
    Попытка
        Excel = Новый COMОбъект("Excel.Application");
        Книга = Excel.WorkBooks.Open(Объект.ИмяФайла);
    Исключение
        Сообщить("Ошибка при открытии файла с помощью Excel! Загрузка не будет произведена!");
        Сообщить(ОписаниеОшибки());
        Возврат;
    КонецПопытки;
        
    Попытка 
        //Открываем необходимый лист
        Excel.Sheets(1).Select();  // лист 1, по умолчанию  
    Исключение
        //Закрываем Excel
        Excel.ActiveWorkbook.Close();   
        Excel = 0;
        Сообщить("Файл "+Строка(Объект.ИмяФайла)+" не соответствует необходимому формату! Первый лист не найден!");
        Возврат;
    КонецПопытки;   
                 
    //Получим количество строк и колонок.
    //В разных версиях Excel получаются по-разному, поэтому сначала определим версию Excel
    Версия = Лев(Excel.Version,Найти(Excel.Version,".")-1);
    Если Версия = "8" тогда
        ФайлСтрок   = Excel.Cells.CurrentRegion.Rows.Count;
        ФайлКолонок = Макс(Excel.Cells.CurrentRegion.Columns.Count, 13);
    Иначе
        ФайлСтрок   = Excel.Cells(1,1).SpecialCells(11).Row;
        ФайлКолонок = Excel.Cells(1,1).SpecialCells(11).Column;   
    Конецесли;
      
    //считываем первую строку и генерируем колонки  
    Для НС = 2 по ФайлСтрок Цикл  // НС указываем с какой строки начинать обработку       
 
        НоваяСтрока = мФорма.Товары.Добавить();
        мНоменклатура = ПолучитьНоменклатуруНаСервере(Excel.Cells(НС, 2).Text);
 
  
//        НоваяСтрока = ТабЗнач.Добавить();
//        НоваяСтрока.Номенклатура = Excel.Cells(НС, 2).Text;
        
        НоваяСтрока.Количество = Excel.Cells(НС, 3).Text;
        
        НоваяСтрока.Цена = Excel.Cells(НС, 4).Text;
        НоваяСтрока.Ставка = Excel.Cells(НС, 6).Text;
                            
    КонецЦикла;   
                
     // Закрыть COM соединение для экономии памяти
     Excel.Application.Quit();
     
КонецПроцедуры
 
&НаКлиенте
Процедура ЗагрузитьФайл(Команда)
    
     //Создаём формму документа
     мФорма = ПолучитьФорму("Документ.РеализацияТоваровУслуг.Форма.ФормаДокументаТовары");
   //  ФормаОбъект = мФорма.Объект;                                                                             
     
     ЗагрузитьФайлНаКлиенте(мФорма);
     мФорма.Открыть();
 
КонецПроцедуры
 
&НаСервере
Функция ПолучитьНоменклатуруНаСервере(Наименование)
 мНоменклатура  = Справочники.Номенклатура.НайтиПоНаименованию(Наименование);
        Если мНоменклатура <> Справочники.Номенклатура.ПустаяСсылка() Тогда
         Возврат мНоменклатура;
      Иначе 
       мНоменклатура  = Справочники.Номенклатура.СоздатьЭлемент();
       мНоменклатура.Наименование = Наименование;
       мНоменклатура.Записать();
       Возврат мНоменклатура.Ссылка;
      КонецЕсли;
 
КонецФункции
1
DEaD_EGOR
0 / 0 / 0
Регистрация: 15.03.2016
Сообщений: 103
24.03.2016, 13:09  [ТС] 33
GreenkO, Я просто уже запутываюсь в этой обработке. Мне говорили, что лучше писать её с нуля самому, но так как знаниев не хватает, приходится по гуглу рыскать, вставлять себе и прорабатывать эти варианты... Чуйствую, не для меня эта работа. надо либо основательно сначала учиться, либо искать что-то новое.(((
0
Jackshi
59 / 59 / 6
Регистрация: 16.01.2013
Сообщений: 155
24.03.2016, 13:14 34
DEaD_EGOR, все так начинали, не расстраивайся, соберись, читай и делай. Москва не сразу строилась

Добавлено через 1 минуту
Недавно почитал свои старые темы, стало стыдно.......
1
DEaD_EGOR
0 / 0 / 0
Регистрация: 15.03.2016
Сообщений: 103
24.03.2016, 13:16  [ТС] 35
Jackshi, Да я уже 4й день над этой задачей бьюсь(( Если знаний основ нет, то проблема "делать" островата...

Добавлено через 1 минуту
мне тут вообще вот так посоветовали делать..
1C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
Сделай так
&НаКлиенте
Процедура ПутьКФайлуНачалоВыбора(Элемент, ДанныеВыбора, СтандартнаяОбработка)
    
    
    ДиалогВыбора = Новый ДиалогВыбораФайла(РежимДиалогаВыбораФайла.Открытие);
    ДиалогВыбора.Фильтр =  "Все форматы (*.xls;*.xlsx;*.dbf;*mxl)|*.xls;*.xlsx;*.dbf;*.mxl|" 
    + "Формат Excel 2003 (*.xls)|*.xls|"
    + "Формат Excel 2007 (да) 2010 (нет  делать)(*.xlsx)|*.xlsx|"
    + "Формат MXL Делать (*.mxl)|*.mxl|"
    + "Формат DBF (*.dbf)|*.dbf|";
 
    ДиалогВыбора.Заголовок = "Выберите файл ...";
    ДиалогВыбора.ИндексФильтра               = 0;
    //ДиалогВыбора.ПолноеИмяФайла              = Элемент.Значение;
 
    ДиалогВыбора.ПолноеИмяФайла              = Объект.ПутьКФайлу;
    ДиалогВыбора.ПроверятьСуществованиеФайла = Ложь;
    ДиалогВыбора.МножественныйВыбор          = Ложь;
    Если ДиалогВыбора.Выбрать() Тогда                                            
        
        //Элемент.Значение = ДиалогВыбора.ПолноеИмяФайла;
 
        Объект.ПутьКФайлу = ДиалогВыбора.ПолноеИмяФайла;
        ПутьКФайлуПриИзменении(Элемент);
        
        ФайлНаДиске = Новый Файл(ДиалогВыбора.ПолноеИмяФайла);
        Если нРег(ФайлНаДиске.Расширение) = ".xls" Тогда
            ////////ЗагрузкаФайла_Эксель();
 
            Результат = ЗагрузкаФайла_Эксель();
        ИначеЕсли нРег(ФайлНаДиске.Расширение) = ".xlsx" Тогда
            //ЗагрузкаФайлаЭксель_2007_2010();
 
        ИначеЕсли нРег(ФайлНаДиске.Расширение) = ".mxl" Тогда
            
        ИначеЕсли нРег(ФайлНаДиске.Расширение) = ".dbf" Тогда
            
        КонецЕсли;
        
    КонецЕсли;
    
КонецПроцедуры
 
Функция  ЗагрузкаФайла_Эксель()
    
    //Попытка    
 
    Попытка
        Excel = новый COMОбъект("Excel.Application");
    Исключение
        Сообщить("Похоже, Excel на компьютере не установлен. Необходимо выполнить установку/переустановку Excel.");
        Возврат Ложь;
    КонецПопытки; 
    //Тут надо почистить промежуточную табличку
 
    н=0;
    удалить=0; 
    УдаляемыеРеквизиты = Новый Массив();
 
    Для й=1 по Объект.КолонкиИсточника.Количество() Цикл
        н=н+1;
        ЭлементДляУдаления = Элементы.Найти(СокрЛП("Колонка"+строка(н)));
        Если Не ЭлементДляУдаления = Неопределено Тогда
            УдаляемыеРеквизиты.Добавить(ЭлементДляУдаления.ПутьКДанным);
            Элементы.Удалить(ЭлементДляУдаления);
            Удалить = 1;
        КонецЕсли;    
    КонецЦикла//Очистить
 
    Если Удалить =1 Тогда
        ИзменитьРеквизиты(, УдаляемыеРеквизиты);
    КонецЕсли;    
    
    Excel.Workbooks.Open(Объект.ПутьКФайлу);
    Если Не ЗначениеЗаполнено(Объект.НазванияСтраниц) Тогда
        НомерЛиста         = 1;
        Excel.Sheets(НомерЛиста).select(); 
        Excel.DisplayAlerts = 0;
        Версия = Лев(Excel.Version,Найти(Excel.Version,".")-1);
        Если Версия = "8" тогда
            ФайлСтрок   = Excel.Cells.CurrentRegion.Rows.Count;
            ФайлКолонок = Макс(Excel.Cells.CurrentRegion.Columns.Count, 13);
        Иначе
            ФайлСтрок   = Excel.Cells(1,1).SpecialCells(11).Row;
            ФайлКолонок = Excel.Cells(1,1).SpecialCells(11).Column;   
        Конецесли;
        Объект.КонечнаяСтрока=ФайлСтрок;
        Объект.КоличествоКолонок=ФайлКолонок;
        Если Объект.КоличествоКолонок<>0 Тогда
            ЗаполнитьЗначенияКолонок();
        КонецЕсли;
        мЭтотОбъект=РеквизитФормыВЗначение("Объект");
        Лист = Excel.Worksheets(НомерЛиста);
        ///////////////////////////////////////////////////////// реквизиты
 
        МассивРеквизитов = Новый Массив;
        МассивРеквизитов.Очистить();
        н=0;
        Для Каждого Колонка Из Объект.КолонкиИсточника Цикл
            н=н+1;
            МассивРеквизитов.Добавить(Новый РеквизитФормы(СокрЛП("Колонка"+строка(н)),Новый ОписаниеТипов("Строка"),"ТаблицаСДанными",СокрЛП(Колонка.Колонка)));
        КонецЦикла;
        
        ИзменитьРеквизиты(МассивРеквизитов);
        
        Результат = мЭтотОбъект.Читать_Эксель(Объект.КолонкиИсточника,Лист,Элементы,ТаблицаСДанными);
        Для Каждого Колонка Из Результат.Колонки Цикл
            Если Колонка.Имя="НомЭксель" Тогда Продолжить; КонецЕсли;
            НовыйЭлемент = Элементы.Добавить(Колонка.Имя, Тип("ПолеФормы"), Элементы.ТаблицаСДанными);
            НовыйЭлемент.Вид = ВидПоляФормы.ПолеВвода;
            НовыйЭлемент.ПутьКДанным = "ТаблицаСДанными." + Колонка.Имя;
        КонецЦикла;  
        
        ЗначениеВРеквизитФормы(Результат, "ТаблицаСДанными");
        
        //выбор листа
 
    Иначе
        
    КонецЕсли;
    КоличествоСтраниц=0;
    КоличествоСтраниц = Excel.Worksheets.Count;
    //ЭлементыФормы.СтрокаКоличествоСтраниц.Значение=КоличествоСтраниц;
 
    Если Не ЗначениеЗаполнено(Объект.НазванияСтраниц) Тогда
        Список=Новый СписокЗначений;
        Для i=1 По Excel.Worksheets.Count Цикл
            Список.Добавить(Excel.Worksheets(i).Name);
        КонецЦикла;
        Если Список.Количество() > 0 Тогда
            //Объект.НазванияСтраниц = Список.получить(Число(Список.Количество()-1)); 
 
            Объект.НазванияСтраниц = Список.получить(0); 
        КонецЕсли; 
    Иначе
        Для i=1 По Excel.Worksheets.Count Цикл
            Если СокрЛП(Объект.НазванияСтраниц)=СокрЛП(Excel.Worksheets(i).Name) Тогда
                НомерЛиста = Число(i);
            КонецЕсли;
        КонецЦикла;
        Если НомерЛиста=Неопределено или НомерЛиста=0 Тогда
        НомерЛиста=1;
        КонецЕсли;
        Excel.Sheets(НомерЛиста).select(); 
        Excel.DisplayAlerts = 0;
        Версия = Лев(Excel.Version,Найти(Excel.Version,".")-1);
        Если Версия = "8" тогда
            ФайлСтрок   = Excel.Cells.CurrentRegion.Rows.Count;
            ФайлКолонок = Макс(Excel.Cells.CurrentRegion.Columns.Count, 13);
        Иначе
            ФайлСтрок   = Excel.Cells(1,1).SpecialCells(11).Row;
            ФайлКолонок = Excel.Cells(1,1).SpecialCells(11).Column;   
        Конецесли;
        
        Объект.КонечнаяСтрока=ФайлСтрок;
        Объект.КоличествоКолонок=ФайлКолонок;
        Если Объект.КоличествоКолонок<>0 Тогда
            ЗаполнитьЗначенияКолонок();
        КонецЕсли;
        мЭтотОбъект=РеквизитФормыВЗначение("Объект");
        Лист = Excel.Worksheets(НомерЛиста);
        ///////////////////////////////////////////////////////// реквизиты
 
        МассивРеквизитов = Новый Массив;
        МассивРеквизитов.Очистить();
        н=0;
        Для Каждого Колонка Из Объект.КолонкиИсточника Цикл
            н=н+1;
            
            МассивРеквизитов.Добавить(Новый РеквизитФормы(СокрЛП("Колонка"+строка(н)),Новый ОписаниеТипов("Строка"),"ТаблицаСДанными",СокрЛП(Колонка.Колонка)));
        КонецЦикла;
        
        ИзменитьРеквизиты(МассивРеквизитов);
        
        Результат = мЭтотОбъект.Читать_Эксель(Объект.КолонкиИсточника,Лист,Элементы,ТаблицаСДанными);
        Для Каждого Колонка Из Результат.Колонки Цикл
            Если Колонка.Имя="НомЭксель" Тогда
                Продолжить; 
            КонецЕсли;
            НовыйЭлемент = Элементы.Добавить(Колонка.Имя, Тип("ПолеФормы"), Элементы.ТаблицаСДанными);
            НовыйЭлемент.Вид = ВидПоляФормы.ПолеВвода;
            НовыйЭлемент.ПутьКДанным = "ТаблицаСДанными." + Колонка.Имя;
        КонецЦикла;  
        
        ЗначениеВРеквизитФормы(Результат, "ТаблицаСДанными");
        
    КонецЕсли;
    //Исключение
 
    //    Сообщить("Ошибка при открытии/чтении файла " + Объект.ЗагружаемыйФайл + "." + Символы.ПС + ОписаниеОшибки(), СтатусСообщения.Внимание);
 
    //КонецПопытки;
 
    Excel.ActiveWorkbook.Close();
    Excel.Quit();
    Возврат Истина;
 
КонецФункции
Ещё хлеще))
0
Jackshi
59 / 59 / 6
Регистрация: 16.01.2013
Сообщений: 155
24.03.2016, 13:16 36
Скопируй то что GreenkO написал(а).
1
GreenkA
24.03.2016, 13:17
  #37

Не по теме:

DEaD_EGOR, Jackshi прав, многие так начинали. Может у кого-то и был 1С в универе/техникуме, у меня не было. Сама читала пособие Радченко, по урокам делала конфигурацию, но для реальных задач мне это не помогло) Сама помню, как с элементарными задачами сидела по дня три... Тоже тренировалась на отчетах/обработках. Все получится, главное не падать духом)

0
DEaD_EGOR
0 / 0 / 0
Регистрация: 15.03.2016
Сообщений: 103
24.03.2016, 13:18  [ТС] 38
GreenkO, Если это применять, ругается на отсутствие поле объекта Ставка (Поле объекта не обнаружено (Ставка)). В форме документа эта колонка присутствует, а в екселе "% НДС". Я так понимаю, что надо ещё прописать условие, что поле Ставка= полю % НДС?
0
GreenkA
Модератор
Эксперт 1С
2990 / 1911 / 520
Регистрация: 25.06.2009
Сообщений: 6,781
24.03.2016, 13:20 39
DEaD_EGOR, у вас для функции ЗагрузкаФайла_Эксель() не прописано выполнение на клиенте. Если ничего не прописать - то процедуры/функции автоматически будут выполняться на сервере.

Добавлено через 1 минуту
DEaD_EGOR, нет, вряд ли, надо смотреть как называется Колонка в документе, именно имя, а не синоним. Может СтавкаНДС?
И еще, те значения, что вы считываете из экселя какой тип имеют? Число?
1
DEaD_EGOR
0 / 0 / 0
Регистрация: 15.03.2016
Сообщений: 103
24.03.2016, 13:22  [ТС] 40

Не по теме:

Jackshi, GreenkO это Ольга)) Она мне в прошлый раз очень помогла.. С созданием новой конфигурации..



Добавлено через 1 минуту
GreenkO, и число и строка... там считывается номенклатура, количество, сумма, ставка, артикул....
0
24.03.2016, 13:22
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
24.03.2016, 13:22

Внешняя обработка из Далион
Ситуация такая имеется обработка из 1С:8 далион, надо переделать в 1С:8...

Внешняя обработка для копирования документов
Здраствуйте, создаю внешнюю обработку для копирования документов. Не могу...

Внешняя обработка 1С, ввод и вывод числа пользователю
Всем привет! Помогите, пожалуйста, сделать внешнюю обработку в 1С. Необходимо...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
40
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2019, vBulletin Solutions, Inc.
Рейтинг@Mail.ru