1С загрузить данные в табличный часть

1. _7445_ 14.03.19 01:05 Сейчас в теме
Здравствуйте. Я плохо знаю русский. Извините за этого. Я еще новичок в 1С программирование. В УТ 10.3. В документе поступление товаров есть кнопка "Загрузка данных". Кнопка открывает произвольную форму. Который с помощью этой форме пользователь может загрузить данные из файла excel. А в произвольный форме есть кнопка "Заполнить документ" надо что это кнопка реализовало заполнение табличный часть текущего документа. Но кнопка не работает. Как исправится с этим?
Спасибо всем за ранее.
Код из произвольного форму -
Процедура КнопкаВыполнитьНажатие(Кнопка)    
    Если  ДокументОбъект.ТабличнаяЧастьДокумента.Количество() = 0 Тогда
        Предупреждение("Для создания документа необходимо заполнить таблицу",,"Внимание");
        Возврат;
    КонецЕсли;
    //Форму = Документы.ПоступлениеТоваровУслуг.ПолучитьФорму("Форма");
    //Поступление = Форму.ОткрытьМодально();
    //Поступление = Документы.ПоступлениеТоваровУслуг.ПолучитьФорму("ФормаДокумента");
    //ЧастьДокумента = Поступление.ЭлементыФормы.Товары;
    Для Каждого Стр Из ДокументОбъект.ТабличнаяЧастьДокумента Цикл
        СтрокаПоступление = ДокументОбъект.Товары.Добавить();
        СтрокаПоступление.Номенклатура = Справочники.Номенклатура.НайтиПоНаименованию(Стр.Номенклатура,ИСТИНА);
        СтрокаПоступление.Цена = Стр.Цена;
        СтрокаПоступление.ЕдиницаИзмерения = СтрокаПоступление.Номенклатура.ЕдиницаДляОтчетов;
        СтрокаПоступление.Коэффициент = СтрокаПоступление.Номенклатура.ЕдиницаДляОтчетов.Коэффициент;
        СтрокаПоступление.Количество = Стр.Количество;             
        СтрокаПоступление.Сумма =  Стр.Сумма;
        СтрокаПоступление.СтавкаНДС = Перечисления.СтавкиНДС.БезНДС;
    КонецЦикла;
    //ДокументОбъект.Записать();
КонецПроцедуры

Процедура ПутьКФайлуНачалоВыбора(Элемент, СтандартнаяОбработка)
    СтандартнаяОбработка=ложь;
    Диалог = Новый ДиалогВыбораФайла(РежимДиалогаВыбораФайла.Открытие);
    Диалог.Заголовок = "Выберите excel - файл";
    Диалог.ПолноеИмяФайла = ""; 
    Диалог.Фильтр = "Таблицы (*.xls,*.xlsx)|*.xls;*.xlsx;|Microsoft Excel 97/2000/XP/2003 (*.xls)|*.xls|Microsoft Excel 2007/2010 (*.xlsx)|*.xlsx"; 
    Диалог.МножественныйВыбор = Ложь;
    Диалог.Каталог = "\";
    Если Диалог.Выбрать() Тогда
        Предупреждение(Диалог.ПолноеИмяФайла, 10 , "Файл выбран.");
        Элемент.значение = Диалог.ПолноеИмяФайла;
    Иначе
        Предупреждение("Файл не выбран.");
        Возврат;
    КонецЕсли;
КонецПроцедуры

Процедура ЗаполнитьНажатие(Элемент)
    ДокументОбъект.ТабличнаяЧастьДокумента.Очистить();
    ИмяФайла = ПутьКФайлу;
    Если ПустаяСтрока(ИмяФайла) Тогда
        Предупреждение("Для запуска обработки необходимо предварительно выбрать файл Microsoft Excel.");
        Возврат;
    КонецЕсли;
    
    Попытка
        ExcelПриложение = Новый COMОбъект("Excel.Application");
    Исключение
        Сообщить("Ошибка при загрузке Microsoft Excel." + Символы.ПС + ОписаниеОшибки(), СтатусСообщения.Внимание);
        Возврат;
    КонецПопытки;
    
    Попытка
        ExcelПриложение.WorkBooks.Open(ИмяФайла);
    Исключение
        Сообщить("Ошибка открытия файла Microsoft Excel." + ИмяФайла + Символы.ПС + ОписаниеОшибки(), СтатусСообщения.Внимание);
    КонецПопытки;
    
    Попытка
        ExcelПриложение.Sheets(1).Select();
        Версия = Лев(ExcelПриложение.Version,Найти(ExcelПриложение.Version,".")-1);
        Если Версия = "8" тогда
            ExcelПоследняяСтрока   = ExcelПриложение.Cells.CurrentRegion.Rows.Count;
            ExcelПоследняяКолонка = Макс(ExcelПриложение.Cells.CurrentRegion.Columns.Count, 13);
        Иначе
            ExcelПоследняяСтрока   = ExcelПриложение.Cells(1,1).SpecialCells(11).Row;
            ExcelПоследняяКолонка = ExcelПриложение.Cells(1,1).SpecialCells(11).Column;   
        Конецесли;
    Исключение
        Сообщить("Ошибка открытия листа №1 Microsoft Excel." + Символы.ПС + ОписаниеОшибки(), СтатусСообщения.Внимание);
        ExcelПриложение.Quit();
    КонецПопытки;

    КЧ = Новый КвалификаторыЧисла(15,2);
    КС = Новый КвалификаторыСтроки(100);
    Массив = Новый Массив;
    Массив.Добавить(Тип("Строка"));
    ОписаниеТиповС = Новый ОписаниеТипов(Массив, , КС);
    Массив.Очистить();
    Массив.Добавить(Тип("Число"));
    ОписаниеТиповЧ = Новый ОписаниеТипов(Массив, , ,КЧ);
    Массив.Очистить();
    Массив.Добавить(Тип("СправочникСсылка.Номенклатура"));
    ОписаниеТиповНом = Новый ОписаниеТипов(Массив, , ,КЧ);
  
    ТабличнаяЧасть.Очистить();
    ЭлементыФормы.ТабличнаяЧасть.Значение.Очистить();
    
    Процессор = Новый ПроцессорВыводаРезультатаКомпоновкиДанныхВКоллекциюЗначений;
    Процессор.ОтображатьПроцентВывода = Истина;
    Процессор.НачатьВывод();
    Элемент = Новый ЭлементРезультатаКомпоновкиДанных;
    
    Для Строка = 2 По ExcelПоследняяСтрока Цикл
        ОбработкаПрерыванияПользователя();
        ОсновнаяЕдиницаПоКлассификатору = УправлениеПользователями.ПолучитьЗначениеПоУмолчанию(глЗначениеПеременной("глТекущийПользователь"), "ОсновнаяЕдиницаПоКлассификатору");
        
        СтруктураПолей = Новый Структура;
        ПроверитьНоменклатуры = Строка(СокрЛП(ExcelПриложение.Cells(Строка, НоменклатураКол).Value));    
        Запрос = Новый Запрос;
        Запрос.Текст = "ВЫБРАТЬ
        |    Номенклатура.Наименование
        |ИЗ
        |    Справочник.Номенклатура КАК Номенклатура
        |ГДЕ
        |    Номенклатура.Наименование = &Номенклатура";
        Запрос.УстановитьПараметр("Номенклатура",ПроверитьНоменклатуры);
        Выборка = Запрос.Выполнить().Выбрать();
        Если Выборка.Количество() = 0 Тогда
            НоваяНоменклатура = Справочники.Номенклатура.СоздатьЭлемент();
            НоваяНоменклатура.Наименование = ПроверитьНоменклатуры;
            НоваяНоменклатура.НаименованиеПолное = ПроверитьНоменклатуры;                
            НоваяНоменклатура.ВидНоменклатуры = Справочники.ВидыНоменклатуры.НайтиПоРеквизиту("ТипНоменклатуры",Перечисления.ТипыНоменклатуры.Товар);        
            НоваяНоменклатура.БазоваяЕдиницаИзмерения = ОсновнаяЕдиницаПоКлассификатору;
            НоваяНоменклатура.СтавкаНДС = Перечисления.СтавкиНДС.БезНДС;
            Попытка
                НоваяНоменклатура.Записать();
            Исключение
                Сообщить(ОписаниеОшибки());
            КонецПопытки;
            
            НоваяЕдиница = Справочники.ЕдиницыИзмерения.СоздатьЭлемент();
            НоваяЕдиница.Владелец = НоваяНоменклатура.Ссылка;
            НоваяЕдиница.ЕдиницаПоКлассификатору = НоваяНоменклатура.БазоваяЕдиницаИзмерения;
            НоваяЕдиница.Наименование = НоваяНоменклатура.БазоваяЕдиницаИзмерения.Наименование;
            НоваяЕдиница.Коэффициент = 1;
            НоваяЕдиница.Записать();
            
            ПерезаписаннаяНоменклатура = Справочники.Номенклатура.НайтиПоКоду(НоваяНоменклатура.Код).ПолучитьОбъект();
            Единица = Справочники.ЕдиницыИзмерения.Выбрать(,ПерезаписаннаяНоменклатура.Ссылка);
            Единица.Следующий();
            ПерезаписаннаяНоменклатура.ЕдиницаДляОтчетов = Единица.Ссылка;
            ПерезаписаннаяНоменклатура.ЕдиницаИзмеренияМест = Единица.Ссылка;
            ПерезаписаннаяНоменклатура.Записать();
        КонецЕсли;
            
                
        Наименование = СокрЛП(ExcelПриложение.Cells(Строка, НоменклатураКол).Value);
        Количество = ExcelПриложение.Cells(Строка, КоличествоКол).Value;
        Цена = ExcelПриложение.Cells(Строка, ЦенаКол).Value;
        Сумма = ExcelПриложение.Cells(Строка, СуммаКол).Value;
        
        СтруктураПолей.Вставить("Наименование", Наименование);
        СтруктураПолей.Вставить("Количество", Количество);
        СтруктураПолей.Вставить("Цена", Цена);
        СтруктураПолей.Вставить("Сумма", Сумма);
        
        
        Стр = ДокументОбъект.ТабличнаяЧастьДокумента.Добавить();
        Стр.Номенклатура = Справочники.Номенклатура.НайтиПоНаименованию(СокрЛП(Наименование),ИСТИНА);    
        Стр.Количество = Количество;
        Стр.Цена = Цена;
        Стр.Сумма = Сумма;    
        
        Элемент.ПроцентВывода = Строка/ExcelПоследняяСтрока*100;
        Процессор.ВывестиЭлемент(Элемент);
        
    КонецЦикла;
    Процессор.ЗакончитьВывод();
    ExcelПриложение.Quit();
КонецПроцедуры

Процедура ПередОткрытием(Отказ, СтандартнаяОбработка)
     НоменклатураКол = ВосстановитьЗначение("НоменклатураКолонка");
     КоличествоКол = ВосстановитьЗначение("КоличествоКолонка");
     ЦенаКол = ВосстановитьЗначение("ЦенаКолонка");
     СуммаКол = ВосстановитьЗначение("СуммаКолонка");
КонецПроцедуры

Процедура ПередЗакрытием(Отказ, СтандартнаяОбработка) Экспорт
    СохранитьЗначение("НоменклатураКолонка", НоменклатураКол);
    СохранитьЗначение("КоличествоКолонка", КоличествоКол);
    СохранитьЗначение("ЦенаКолонка", ЦенаКол);
    СохранитьЗначение("СуммаКолонка", СуммаКол);
КонецПроцедуры
Показать


Код в документа (Кнопка выполнить нажатие "Загрузка данных") -
Форма = ОткрытьФормуМодально("Документ.ПоступлениеТоваровУслуг.Форма.Форма1",);
    //Форма = ОткрытьФорму("Документ.ПоступлениеТоваровУслуг.Форма.Форма1");
    Для Каждого Стр Из форма.ЭлементыФормы.ТабличнаяЧасть Цикл
        СтрокаПоступление = Товары.Добавить();
        СтрокаПоступление.Номенклатура = Справочники.Номенклатура.НайтиПоНаименованию(Стр.Номенклатура,ИСТИНА);
        СтрокаПоступление.Цена = Стр.Цена;
        СтрокаПоступление.ЕдиницаИзмерения = СтрокаПоступление.Номенклатура.ЕдиницаДляОтчетов;
        СтрокаПоступление.Коэффициент = СтрокаПоступление.Номенклатура.ЕдиницаДляОтчетов.Коэффициент;
        СтрокаПоступление.Количество = Стр.Количество;             
        СтрокаПоступление.Сумма =  Стр.Сумма;
        СтрокаПоступление.СтавкаНДС = Перечисления.СтавкиНДС.БезНДС;
    КонецЦикла;
КонецПроцедуры
Показать
Прикрепленные файлы:
По теме из базы знаний
Ответы
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
2. SedovSU@mail.ru 298 14.03.19 06:43 Сейчас в теме
Первое что нужно сделать это в форме которая осуществляет загрузку сделать реквизит, что то вида ДокументОбъект с типом значения ДокументОбъект.ВашДокумент.
Второе, в обработке где происходит чтение строк у вас уже прописано что добавлять строки в таб. часть переменной ДокументОбъект.

Вот эта процедура не понятна зачем она

Процедура КнопкаВыполнитьНажатие(Кнопка)    
    Если  ДокументОбъект.ТабличнаяЧастьДокумента.Количество() = 0 Тогда
        Предупреждение("Для создания документа необходимо заполнить таблицу",,"Внимание");
        Возврат;
    КонецЕсли;
    //Форму = Документы.ПоступлениеТоваровУслуг.ПолучитьФорму("Форма");
    //Поступление = Форму.ОткрытьМодально();
    //Поступление = Документы.ПоступлениеТоваровУслуг.ПолучитьФорму("ФормаДокумента");
    //ЧастьДокумента = Поступление.ЭлементыФормы.Товары;
    Для Каждого Стр Из ДокументОбъект.ТабличнаяЧастьДокумента Цикл
        СтрокаПоступление = ДокументОбъект.Товары.Добавить();
        СтрокаПоступление.Номенклатура = Справочники.Номенклатура.НайтиПоНаименованию(Стр.Номенклатура,ИСТИНА);
        СтрокаПоступление.Цена = Стр.Цена;
        СтрокаПоступление.ЕдиницаИзмерения = СтрокаПоступление.Номенклатура.ЕдиницаДляОтчетов;
        СтрокаПоступление.Коэффициент = СтрокаПоступление.Номенклатура.ЕдиницаДляОтчетов.Коэффициент;
        СтрокаПоступление.Количество = Стр.Количество;             
        СтрокаПоступление.Сумма =  Стр.Сумма;
        СтрокаПоступление.СтавкаНДС = Перечисления.СтавкиНДС.БезНДС;
    КонецЦикла;
    //ДокументОбъект.Записать();
КонецПроцедуры
Показать


И код который открывает форму обработки нужно проще написать:

Форма = ОткрытьФормуМодально("Документ.ПоступлениеТоваровУслуг.Форма.Форма1",);
Форма.ДокументОбъект = ЭтотОбъект;
Форма.Открыть();
// далее открывалась форма, пользователь что то там заполнил и нажал загрузить, вся загрузка будет идти в переменную ДокументОбъект, эта переменная и есть ваш новый документ

3. m_gin 46 22.03.19 10:16 Сейчас в теме
Процедура КнопкаВыполнитьНажатие привязана к кнопке Заполнить табличный документ?
Надо смотреть в свойствах кнопки.
Оставьте свое сообщение

Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот