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

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

23.03.2016, 10:19. Просмотров 4272. Ответов 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
QA
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
23.03.2016, 10:19
Ответы с готовыми решениями:

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

1С ЗУП 3.1 Внешняя обработка печатной формы для Кадровый документ списком
Здравствуйте! Подскажите пожалуйста, кто знает, как правильно добраться до поля Сотрудник.Код (ниже...

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

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

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

72
SHIFT_969
Злой самаритянин
179 / 180 / 94
Регистрация: 24.04.2014
Сообщений: 686
Завершенные тесты: 1
23.03.2016, 10:37 2
Цитата Сообщение от DEaD_EGOR Посмотреть сообщение
мДокумент = Документы.РеализацияТоваровУслуг.СоздатьДокумент();
Сначала ты правильно написал. Создаешь документ. В переменной мДокумент у тебя тип ДокументОбъект. Через него работают с данными документа. Создаешь, заполняешь реквизиты, потом делаешь мДокумент.Записать(). Потом открываешь форму.
1
DEaD_EGOR
0 / 0 / 0
Регистрация: 15.03.2016
Сообщений: 103
23.03.2016, 10:45  [ТС] 3
SHIFT_969, мне не нужно создавать документ.. мне необходимо, чтобы заполнялась форма документа из внешней обработки... То есть, запускаю обработку, выбираю эксель док, он читает на сервере, заполняет форму и выводит её на экран... У меня на экран всё выводит но форма не заполнена из документа.. В этом и проблема...
0
Jackshi
59 / 59 / 6
Регистрация: 16.01.2013
Сообщений: 155
23.03.2016, 10:59 4
DEaD_EGOR,

1C
1
КопироватьДанныеФормы(ФормаОбъект,Мформа.Объект)
проверь что возвращает эта функция?
1
23.03.2016, 10:59
DEaD_EGOR
0 / 0 / 0
Регистрация: 15.03.2016
Сообщений: 103
23.03.2016, 11:04  [ТС] 5
Jackshi, Эммм, а как проверить? я только учусь программированию... Я запустил отладчик, но на этом пункте мне ничего не подсвечивает.... Вернее подсвечивает просто значение "Истина"
0
Jackshi
59 / 59 / 6
Регистрация: 16.01.2013
Сообщений: 155
23.03.2016, 11:10 6
1C
1
Результат = КопироватьДанныеФормы(ФормаОбъект,Мформа.Объект);
сделай и посмотри что в "Результат"
1
GreenkA
Форумчанин
Эксперт 1С
3004 / 1928 / 520
Регистрация: 25.06.2009
Сообщений: 6,817
23.03.2016, 11:13 7
DEaD_EGOR,
&НаСервере
Процедура ЗагрузитьФайлНаСервере (ФормаОбъект)
Чтение данных из Excel надо делать на клиенте. Для файловой базы все будет нормально, но для серверной - нет.

Для заполнения формы - просто получайте ее и заполняйте на клиенте, потом открывайте.

У вас в процедуре загрузки из эксель нет обращения к форме вообще. ТабЗнач - новая таблица значений, по структуре она соответствует какому-либо реквизиту формы?
1
DEaD_EGOR
0 / 0 / 0
Регистрация: 15.03.2016
Сообщений: 103
23.03.2016, 11:15  [ТС] 8
Jackshi, Результат - Истина

Добавлено через 2 минуты
GreenkO, Ольга, вообще мне так объяснили. "мы получаем форму, ее передаем на сервер, на сервере заполняем, возвращаем на клиент и открываем ее"
0
GreenkA
Форумчанин
Эксперт 1С
3004 / 1928 / 520
Регистрация: 25.06.2009
Сообщений: 6,817
23.03.2016, 11:17 9
DEaD_EGOR, кто так объяснил?
1
Jackshi
59 / 59 / 6
Регистрация: 16.01.2013
Сообщений: 155
23.03.2016, 11:17 10
DEaD_EGOR,

1C
1
НоваяСтрока.Номенклатура = Excel.Cells(НС, 2).Text;
Здесь получаешь строку, а в таб. часть документа нужна ссылка на номенклатуру.
1
DEaD_EGOR
0 / 0 / 0
Регистрация: 15.03.2016
Сообщений: 103
23.03.2016, 11:19  [ТС] 11
GreenkO, человек, поставивший мне эту задачу. Я-стажёр, мне дают задания для обучения 1с..)
0
GreenkA
Форумчанин
Эксперт 1С
3004 / 1928 / 520
Регистрация: 25.06.2009
Сообщений: 6,817
23.03.2016, 11:21 12
DEaD_EGOR, зачем? если можно все сделать на клиенте...
1
DEaD_EGOR
0 / 0 / 0
Регистрация: 15.03.2016
Сообщений: 103
23.03.2016, 11:27  [ТС] 13
Jackshi, Ну как я понял, мы из документа считываем значения и вставляем их в форму....
1C
1
НоваяСтрока.Номенклатура = Excel.Cells(НС, 2).Text;
этим мы считали значение из экселя... Так?

Добавлено через 1 минуту
GreenkO, Как я понял из лазания по форумам, если на клиенте это делать, то процесс обработки будет занимать длительное время... Потому и основные процессы выполняются на сервере, чтоб клиент не загружать

Добавлено через 3 минуты
GreenkO,
Цитата Сообщение от GreenkO Посмотреть сообщение
&НаСервере
Процедура ЗагрузитьФайлНаСервере (ФормаОбъект)
Чтение данных из Excel надо делать на клиенте. Для файловой базы все будет нормально, но для серверной - нет.
При изменении регистра на "На клиенте", начинает ругаться "Тип не определен (ТаблицаЗначений)
ТабЗнач = Новый <<?>>ТаблицаЗначений; (Проверка: Тонкий клиент)"
0
GreenkA
Форумчанин
Эксперт 1С
3004 / 1928 / 520
Регистрация: 25.06.2009
Сообщений: 6,817
23.03.2016, 11:28 14
DEaD_EGOR, вы же форму заполняете? зачем вам новая таблица значений. выше я спрашивала про наличие соответствующих реквизитов в форме.
1
DEaD_EGOR
0 / 0 / 0
Регистрация: 15.03.2016
Сообщений: 103
23.03.2016, 11:44  [ТС] 15
GreenkO,форма обработки содержит только реквизит ИмяФайла... то есть, я выбираю файл, после нажатия на кнопку Загрузить, выдаётся окно документа нового. А по модулю, форма временная создаётся на сервере и, после того, как её возвращает на клиента, отображается на экране

Добавлено через 3 минуты
Саму обработку я делал по принципу как тут

Добавлено через 9 минут
Только в форму обработки у меня данные не записываются..
0
Jackshi
59 / 59 / 6
Регистрация: 16.01.2013
Сообщений: 155
23.03.2016, 11:53 16
DEaD_EGOR,

1C
1
    ТабЗнач = ФормаОбъект.Товары;
1C
1
 НоваяСтрока.Номенклатура = Excel.Cells(НС, 2).Text;
если здесь название номенклатуры, тогда нужно так.
1C
1
 НоваяСтрока.Номенклатура = Справочники.Номенклатура.найтиПоНаименованию(Excel.Cells(НС, 2).Text);
может оказаться что такой номенклатуры нет, тогда придется создать номенклатуру.
1
DEaD_EGOR
0 / 0 / 0
Регистрация: 15.03.2016
Сообщений: 103
23.03.2016, 11:59  [ТС] 17
Jackshi, Спасибо, это в задании тоже есть, но я ещё не дошёл до этого. у меня проблема именно с заполнением формы из документа Эксель..
0
Jackshi
59 / 59 / 6
Регистрация: 16.01.2013
Сообщений: 155
23.03.2016, 12:10 18
DEaD_EGOR, ну так чтобы заполнить документ нужно заполнить документ, а не таблицу значений, как выше писал(а) GreenkO.
1
DEaD_EGOR
0 / 0 / 0
Регистрация: 15.03.2016
Сообщений: 103
23.03.2016, 12:14  [ТС] 19
Jackshi, То есть, в данном случае, мы после чтения экселя, создаём документ
1C
1
2
 мДокумент = Документы.РеализацияТоваровУслуг.СоздатьДокумент();
     НоваяСтрока = мДокумент.Товары.Добавить();
, затем получаем форму этого документа
1C
1
2
 мФорма = ПолучитьФорму("Документ.РеализацияТоваровУслуг.Форма.ФормаДокументаТовары");
     ФормаОбъект = мФорма.Объект;
и заполняем её.. так?
0
Jackshi
59 / 59 / 6
Регистрация: 16.01.2013
Сообщений: 155
23.03.2016, 12:19 20
1C
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
&НаСервере
Процедура ЗагрузитьФайлНаСервере (ФормаОбъект)
    
    
    //подключаемся к эксель
    Попытка
        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();
                
 КонецПроцедуры
Ну и не забываем про совпадение типов реквизитов.

И да, чтение ексельки лучше на клиенте
1
23.03.2016, 12:19
Answers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
23.03.2016, 12:19

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

Внешняя обработка
Здравствуйте, конфигурация УТ 10.3, создал внешнюю обработку для отправки вложений по почте. Как...

Внешняя Обработка
добрый день! Очень нужна помощь.В 1с8.2 есть справочник контрагенты.Необходимо в наименовании...


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

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

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