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

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

23.03.2016, 10:19. Просмотров 3278. Ответов 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
GreenkA
24.03.2016, 13:22     Внешняя обработка, создание формы
  #41

Не по теме:

Цитата Сообщение от DEaD_EGOR Посмотреть сообщение
Jackshi, GreenkO это Ольга))
я думала, по аваторке видно, но видно не всем:ghaha:

0
Jackshi
59 / 59 / 6
Регистрация: 16.01.2013
Сообщений: 155
24.03.2016, 13:26 42
DEaD_EGOR, Скорее всего ПеречислениеСсылка.СтавкаНДС

Не по теме:

Добавлено через 2 минуты
Буду знать))) 8-)

Добавлено через 1 минуту
Не думал что бывают такие красивые программистки)))

1
GreenkA
Модератор
Эксперт 1С
2990 / 1911 / 520
Регистрация: 25.06.2009
Сообщений: 6,781
24.03.2016, 13:28 43
DEaD_EGOR, если ругается на Ставку, значит поле в документе называется иначе.
И да, проверьте тип, может надо искать нужное значение в Перечислении или Справочнике.

Добавлено через 1 минуту

Не по теме:

Jackshi, спасибо) но давайте придерживаться темы

1
DEaD_EGOR
0 / 0 / 0
Регистрация: 15.03.2016
Сообщений: 103
24.03.2016, 13:28  [ТС] 44
Jackshi, Так и есть. А путь к данным "Объект.Товары.СтавкаНДС"
0
GreenkA
Модератор
Эксперт 1С
2990 / 1911 / 520
Регистрация: 25.06.2009
Сообщений: 6,781
24.03.2016, 13:33 45
DEaD_EGOR, значит исправьте Ставку на СтавкуНДС в коде и подбирайте нужное значение.
Вроде этого
1C
1
2
3
 Если СтавкаНДС = 20 Тогда
   НовСтрока.СтавкаНДС = ПредопределенноеЗначение("Перечисление.СтавкиНДС.20");
 КонецЕсли;
Где СтавкаНДС - значение из экселя типа Число.

Кликните здесь для просмотра всего текста
ПредопределенноеЗначение(...) - позволяет обращаться к Перечислениям и преопределенным элементам справочников на клиенте. При выполнении кода на сервере можно обращаться напрямую через Перечисления.СтавкиНДС.20, так же и со Справочниками.
1
DEaD_EGOR
0 / 0 / 0
Регистрация: 15.03.2016
Сообщений: 103
24.03.2016, 13:33  [ТС] 46
Всё. Разобрался. Больше не ругается, но заполняется только колонка Цена)))) остальное пусто... Опять что-то не так..
0
Jackshi
59 / 59 / 6
Регистрация: 16.01.2013
Сообщений: 155
24.03.2016, 13:35 47
Ошибочка
1
GreenkA
Модератор
Эксперт 1С
2990 / 1911 / 520
Регистрация: 25.06.2009
Сообщений: 6,781
24.03.2016, 13:36 48
DEaD_EGOR, думаю, дело в типах. Может еще дробные части есть в количестве?
1
Jackshi
59 / 59 / 6
Регистрация: 16.01.2013
Сообщений: 155
24.03.2016, 13:36 49
1C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
    Для НС = 2 по ФайлСтрок Цикл  // НС указываем с какой строки начинать обработку       
 
        НоваяСтрока = мФорма.Товары.Добавить();
        мНоменклатура = ПолучитьНоменклатуруНаСервере(Excel.Cells(НС, 2).Text);
 
  
//        НоваяСтрока = ТабЗнач.Добавить();
//        НоваяСтрока.Номенклатура = Excel.Cells(НС, 2).Text;
        
        НоваяСтрока.Количество = Excel.Cells(НС, 3).Text;
        
        НоваяСтрока.Цена = Excel.Cells(НС, 4).Text;
        Если Найти(Строка(Excel.Cells(НС, 6).Text),"10")>0 Тогда
            НоваяСтрока.СтавкаНДС = Перечисления.СтавкиНДС.НДС10;
        ИначеЕсли Найти(Строка(Excel.Cells(НС, 6).Text),"20")>0 Тогда
            НоваяСтрока.СтавкаНДС = Перечисления.СтавкиНДС.НДС20;
        ИначеЕсли Найти(Строка(Excel.Cells(НС, 6).Text),"18")>0 Тогда
            НоваяСтрока.СтавкаНДС = Перечисления.СтавкиНДС.НДС18;
        КонецЕсли;
    КонецЦикла;

Возможно так:
1C
1
2
3
Перечисления.СтавкиНДС.НДС_10
Перечисления.СтавкиНДС.НДС_18
Перечисления.СтавкиНДС.НДС_20
1
GreenkA
Модератор
Эксперт 1С
2990 / 1911 / 520
Регистрация: 25.06.2009
Сообщений: 6,781
24.03.2016, 13:37 50
Jackshi, мы ж на клиенте заполняем, надо обращаться к перечислениям через ПредопределенноеЗначение()
0
DEaD_EGOR
0 / 0 / 0
Регистрация: 15.03.2016
Сообщений: 103
24.03.2016, 13:39  [ТС] 51
Jackshi, Слава Богу, неужели я сделал что то так, как нужно... щас сверил, как Вы и написали))) Прогресс на лицо.. (Был бы..)
0
Jackshi
59 / 59 / 6
Регистрация: 16.01.2013
Сообщений: 155
24.03.2016, 13:40 52
GreenkO, точно ПредопределенноеЗначение()
0
DEaD_EGOR
0 / 0 / 0
Регистрация: 15.03.2016
Сообщений: 103
24.03.2016, 13:56  [ТС] 53
GreenkO, Количество Тип-число, Точность-3. в экселе записан как 1200,000...
0
Jackshi
59 / 59 / 6
Регистрация: 16.01.2013
Сообщений: 155
24.03.2016, 13:58 54
1C
1
НоваяСтрока.Количество = Число(Excel.Cells(НС, 3).Text)
1
DEaD_EGOR
0 / 0 / 0
Регистрация: 15.03.2016
Сообщений: 103
24.03.2016, 15:20  [ТС] 55
Jackshi, с Числом я разобрался. даже переделал. чтоб корректно читалось
1C
1
2
мЧисло = СтрЗаменить(Excel.Cells(НС, 3).Text," ", "");
        НоваяСтрока.Количество = Число(мЧисло);
Но в итоге не читается номенклатура.. я пробовал сделать так
1C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
НоваяСтрока.Номенклатура = ЗагрузитьПрайсНаСервере(Excel.Cells(НС, 2).Text,мФорма);
 
&НаСервере
Функция ЗагрузитьПрайсНаСервере (Таблица,мФорма);
    
    Для Каждого СТР из Таблица Цикл
        НоваяСтрока = мФорма.Товары.Добавить();
        мНоменклатура = Справочники.Номенклатура.НайтиПоНаименованию(Стр.Номенклатура);
        Если мНоменклатура <> Справочники.Номенклатура.ПустаяСсылка() Тогда
        Новаястрока.Номенклатура = мНоменклатура;
        Иначе Новаястрока.Номенклатура = СоздатьНоменклатуруНаСервере(СТР.Номенклатура);
        КонецЕсли;
                
    КонецЦикла;
    Возврат Новаястрока.Номенклатура;
    
КонецФункции
выдаёт "ошибка отображения типов отсутствует отображение для типа 'управляемаяформа'". Я так понял, потому как у нас заполнение выполняется На клиенте, поэтому ошибка выдаётся?
0
GreenkA
Модератор
Эксперт 1С
2990 / 1911 / 520
Регистрация: 25.06.2009
Сообщений: 6,781
24.03.2016, 15:23 56
DEaD_EGOR, я же вам написала код, там и номенклатура создается, если надо, смотрите выше
1
DEaD_EGOR
0 / 0 / 0
Регистрация: 15.03.2016
Сообщений: 103
24.03.2016, 15:25  [ТС] 57
GreenkO, Ольга, прошу простить, возможно пропустил. щас поищу...
0
GreenkA
24.03.2016, 15:27
  #58

Не по теме:

DEaD_EGOR, в этой теме вы упорно игнорируете мои замечания/предложения

0
DEaD_EGOR
0 / 0 / 0
Регистрация: 15.03.2016
Сообщений: 103
24.03.2016, 16:03  [ТС] 59
GreenkO, Ольга, я, чесслово, ни в коем рази не игнорирую. Просто сотрудники IT на моём рабочем месте сегодня что то делают, у меня проблемы с интернетом и вследствие этого я пропускаю сообщения...

Добавлено через 16 минут
GreenkO, Странно, сделал точно так же, но номенклатура всё равно не загружается в обработку.... Видимо я где то опять ошибся
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
&НаКлиенте 
Процедура ИмяФайлаНачалоВыбора(Элемент, СтандартнаяОбработка)
    
    ДиалогВыбора = Новый ДиалогВыбораФайла(РежимДиалогаВыбораФайла.Открытие);
    ДиалогВыбора.Заголовок = "Выберите файл";
        
    Если ДиалогВыбора.Выбрать() Тогда
        Объект.ИмяФайла = ДиалогВыбора.ПолноеИмяФайла;
    Иначе   
         Возврат;
    КонецЕсли;
    
КонецПроцедуры
 
&НаКлиенте
Процедура ЗагрузитьФайлНаКлиенте(мФорма)
                 
    //подключаемся к эксель
    Попытка
        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),"10")>0 Тогда
            НоваяСтрока.СтавкаНДС = ПредопределенноеЗначение("Перечисление.СтавкиНДС.НДС10");
        ИначеЕсли Найти(Строка(Excel.Cells(НС, 6).Text),"20")>0 Тогда
            НоваяСтрока.СтавкаНДС = ПредопределенноеЗначение("Перечисление.СтавкиНДС.НДС20");
        ИначеЕсли Найти(Строка(Excel.Cells(НС, 6).Text),"18")>0 Тогда
            НоваяСтрока.СтавкаНДС = ПредопределенноеЗначение("Перечисление.СтавкиНДС.НДС18");
        КонецЕсли;
    КонецЦикла;   
                
     // Закрыть COM соединение для экономии памяти
     Excel.Application.Quit();
             
     //Если Клиент тогда   
     //мФорма.Модифицированность = Истина;
     //мФОрма.ЦеныИВалюта = "НДС сверху";
     //КонецЕсли
                         
 КонецПроцедуры
   
&НаКлиенте
Процедура ЗагрузитьФайл(Команда)
    
     //Создаём формму документа
     мФорма = ПолучитьФорму("Документ.РеализацияТоваровУслуг.Форма.ФормаДокументаТовары");
     //ФормаОбъект = мФорма.Объект;                                                                             
     ЗагрузитьФайлНаКлиенте(мФорма);
     мФорма.Открыть();
 
КонецПроцедуры
 
  &НаСервере
Функция ПолучитьНоменклатуруНаСервере(Наименование)
       мНоменклатура  = Справочники.Номенклатура.НайтиПоНаименованию(Наименование);
        Если мНоменклатура <> Справочники.Номенклатура.ПустаяСсылка() Тогда
         Возврат мНоменклатура;
      Иначе 
       мНоменклатура  = Справочники.Номенклатура.СоздатьЭлемент();
       мНоменклатура.Наименование = Наименование;
       мНоменклатура.Записать();
       Возврат мНоменклатура.Ссылка;
      КонецЕсли;
 
КонецФункции
Как я понял по отладчику, не определяется переменная мНоменклатура.... Такое ощущение, что эта функция не срабатывает при загрузке обработки...

Добавлено через 13 минут
Вернее, определяется номенклатура но не выводится в форму
0
Jackshi
59 / 59 / 6
Регистрация: 16.01.2013
Сообщений: 155
24.03.2016, 16:13 60
DEaD_EGOR, Нужно же вставить
Нужно так:
1C
1
НоваяСтрока.Номенклатура = ПолучитьНоменклатуруНаСервере(Excel.Cells(НС, 2).Text);
Добавлено через 27 секунд
а у тебя так:

1C
1
мНоменклатура = ПолучитьНоменклатуруНаСервере(Excel.Cells(НС, 2).Text);
1
24.03.2016, 16:13
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
24.03.2016, 16:13

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

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

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


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

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

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