Доброго времени суток. Конфигурация УПП 2 , версия 8.3.
Есть такая задача: необходимо заполнить табличную часть "Товары" документа ПоступленияТоваровУслуг, через обработку ЧтениеЭксель, где в табличной части "Данные" заполнены определенные реквизиты которые могут отличаться от порядка реквизитов в табличной части "Товары".
Вопрос: Как в обработке получить данные о документе, который вызвал обработку, и как заполнить подходящие поля из таблицы "Данные" в таблицу "Товары" документа, при условии что документ может быть еще не проведен или же записан.
Код обработчика, который есть пока что.
&НаКлиенте
Процедура ФайлНачалоВыбора(Элемент, ДанныеВыбора, СтандартнаяОбработка)
Объект.Файл = "";
//Диалог выбора файла
ДиалогВыбора = Новый ДиалогВыбораФайла(РежимДиалогаВыбораФайла.Открытие);
//ДиалогВыбора.Заголовок = “Выберите файл”;
Если ДиалогВыбора.Выбрать() Тогда
Объект.Файл = ДиалогВыбора.ПолноеИмяФайла;
КонецЕсли;
КонецПроцедуры
&НаКлиенте
Процедура Прочитать(Команда)
Объект.Данные.Очистить();
//подключаемся к эксель
Попытка
Excel = Новый COMОбъект("Excel.Application");
Excel.WorkBooks.Open(Объект.Файл);
Состояние("Обработка файла Microsoft Excel...");
Исключение
Сообщить("Ошибка при открытии файла с помощью Excel! Загрузка не будет произведена!");
Сообщить(ОписаниеОшибки());
Возврат;
КонецПопытки;
//Открываем необходимый лист
Попытка
Excel.Sheets(1).Select(); // лист 1, по умолчанию
Исключение
//Закрываем Excel
Excel.ActiveWorkbook.Close();
Excel = 0;
Сообщить("Файл "+Строка(Объект.Файл)+" не соответствует необходимому формату! Первый лист не найден!");
Excel.ОтменитьТранзакцию();
Возврат;
КонецПопытки;
НС = 2;
Пока НС <= Объект.КоличествоСтрок Цикл
Состояние("Файл "+Строка(Объект.Файл)+": Обрабатывается первый лист "+Строка(Формат(?(Объект.КоличествоСтрок=0,0,((100*НС)/Объект.КоличествоСтрок)),"ЧЦ=3; ЧДЦ=0"))+" %");
НоваяСтрока = Объект.Данные.Добавить();
//заполнение списока значениями
НоваяСтрока.Наименование = Excel.Cells(НС, 1).Text;
НоваяСтрока.Цена = Excel.Cells(НС, 2).Text;
НоваяСтрока.Валюта = Excel.Cells(НС, 3).Text;
НоваяСтрока.Код = Excel.Cells(НС, 4).Text;
НоваяСтрока.НаименованиеДляПечати = Excel.Cells(НС, 5).Text;
НоваяСтрока.Артикул = Excel.Cells(НС, 6).Text;
НоваяСтрока.Количество = Excel.Cells(НС, 7).Text;
НС = НС +1;
КонецЦикла;
//Объект.Файл.Вставить(0,ИмяФайла,ИмяФайла);
//Закрытие Эксель после выполнения процедуры
Excel.DisplayAlerts = 0;
Excel.Quit();
Excel.DisplayAlerts = 1;
КонецПроцедуры
// Здесь начинается вопрос темы.
&НаКлиенте
Процедура ЗаполнитьДокумент(Команда)
ЗаполнитьДокументНаСервере();
КонецПроцедуры
&НаСервере
Процедура ЗаполнитьДокументНаСервере()
//
КонецПроцедуры
&НаКлиенте
Процедура ЗаполнитьИзФайла(Команда)
ПолучитьФорму("Обработка.ЧтениеЭксель.Форма.Форма").Открыть();
КонецПроцедуры
Форма=Документы.ПриобретениеТоваровУслуг.ПолучитьФорму();
DmitryPushkarev @ Сегодня, 13:32
,
Добрый день! Вам необходимо получить объект, не его форму. У вас Управляемые формы?
denis84 @ Сегодня, 13:49
,
Да, Управляемые формы.
Я тут чутка вроде уже начал разбираться и осталась финальная часть вопроса. "Как добавить данные из таблицы Обработки в Таблицу Документа". Вот код кнопки обработчика, который сделал чтобы найти объект документа.
&НаКлиенте
Процедура ЗаполнитьДокумент(Команда)
Форма= ПолучитьФорму("Документ.ПриобретениеТоваровУслуг.Форма.ФормаДокумента");
Если Форма.Открыта()Тогда
ОбъектФормы = Форма.Объект;
КонецЕсли;
ЗаполнитьДокументНаСервере(ОбъектФормы);
Закрыть();
КонецПроцедуры
&НаСервере
Процедура ЗаполнитьДокументНаСервере(ДанныеФормы);
Для Каждого Строка Из Объект.Данные Цикл
Товары = ДанныеФормы.Товары.Добавить();
Товары.Номенклатура = Строка.Наименование;
Товары.Код = Строка.Код;
Товары.Артикул = Строка.Артикул;
КонецЦикла;
КонецПроцедуры
DmitryPushkarev @ Сегодня, 14:41
,
У меня естьтакая процедура(функция), заполнение(корректировка) ТЧ документа Заказ клиента.
На форме обработки кнопка с этой командой.
&НаСервере
Процедура ВыполнитьКоманду(Команда, ОбъектыНазначения)
Для каждого ЗаказКлиента из ОбъектыНазначения Цикл
ЗаказКлиентаОбъект = ЗаказКлиента.ПолучитьОбъект();
Для каждого СтрокаТЗ из ЗаказКлиентаОбъект.Товары Цикл
СтрокаТЗ.ПроцентРучнойСкидки = 5;
СтрокаТЗ.СуммаРучнойСкидки = СтрокаТЗ.Сумма * 0.95;
КонецЦикла;
ЗаказКлиентаОбъект.Записать();
КонецЦикла;
КонецПроцедуры
Функция СведенияОВнешнейОбработке() Экспорт
ДокументНазначение = Новый Массив;
ДокументНазначение.Добавить("Документ.ЗаказКлиента");
ПараметрыОбработки = Новый Структура;
ПараметрыОбработки.Вставить("Вид","ЗаполнениеОбъекта");
ПараметрыОбработки.Вставить("Назначение", ДокументНазначение);
ПараметрыОбработки.Вставить("Наименование","Установить скидки");
ПараметрыОбработки.Вставить("Версия","1.0");
ПараметрыОбработки.Вставить("Информация","Установка ручных скидок в заказе клиента");
ПараметрыОбработки.Вставить("БезопасныйРежим",Истина);
КомандыОбработки = ПолучитьКомандыОбработки ();
ДобавитьКомандуОбработки (КомандыОбработки, " Установить скидки ","ВыполнитьКоманду","ВызовКлиентскогоМетода",Ложь,);
ПараметрыОбработки.Вставить("Команды", КомандыОбработки);
Возврат ПараметрыОбработки;
КонецФункции
Функция ПолучитьКомандыОбработки ()
КомандыОбработки = Новый ТаблицаЗначений;
КомандыОбработки.Колонки.Добавить("Представление", Новый ОписаниеТипов("Строка"));
КомандыОбработки.Колонки.Добавить("Идентификатор", Новый ОписаниеТипов("Строка"));
КомандыОбработки.Колонки.Добавить("Использование", Новый ОписаниеТипов("Строка"));
КомандыОбработки.Колонки.Добавить("ПоказыватьОповещение", Новый ОписаниеТипов("Булево"));
КомандыОбработки.Колонки.Добавить("Модификатор", Новый ОписаниеТипов("Строка"));
Возврат КомандыОбработки;
КонецФункции
Процедура ДобавитьКомандуОбработки(КомандыОбработки, Представление, Идентификатор, Использование, ПоказыватьОповещение = Ложь, Модификатор = "")
НовКоманда = КомандыОбработки.Добавить();
НовКоманда.Представление = Представление;
НовКоманда.Идентификатор = Идентификатор;
НовКоманда.Использование = Использование;
НовКоманда.ПоказыватьОповещение = ПоказыватьОповещение;
НовКоманда.Модификатор = Модификатор;
КонецПроцедуры
&НаСервере
Процедура ВыполнитьКоманду(Команда, ОбъектыНазначения) // ОбъектыНазначения - как берется переменная?
Для каждого ЗаказКлиента из ОбъектыНазначения Цикл
ЗаказКлиентаОбъект = ЗаказКлиента.ПолучитьОбъект(); //Инициализируется объект для каждой итерации объекта назначения - это для всех заказов клиента?
Для каждого СтрокаТЗ из ЗаказКлиентаОбъект.Товары Цикл
СтрокаТЗ.ПроцентРучнойСкидки = 5;
СтрокаТЗ.СуммаРучнойСкидки = СтрокаТЗ.Сумма * 0.95;
КонецЦикла;
ЗаказКлиентаОбъект.Записать();
КонецЦикла;
КонецПроцедуры
DmitryPushkarev @ Сегодня, 15:22
,
Вот ещё вариант:
На форме кнопка с командой:
&НаКлиенте
Процедура ВыполнитьКоманду(ИдентификаторКоманды, ОбъектыНазначенияМассив) Экспорт
Для каждого ТекущаяСтрока из ВладелецФормы.Объект.Материалы Цикл //наш откртый документ "требование"
ТекущаяСтрока.Количество = 100;
Сообщить(ТекущаяСтрока.Количество);
КонецЦикла;
КонецПроцедуры
Функция СведенияОВнешнейОбработке() Экспорт
Назначения = Новый Массив;
Назначения.Добавить("Документ.ТребованиеНакладная");
ПараметрыРегистрации = Новый Структура;
ПараметрыРегистрации.Вставить("Вид","ЗаполнениеОбъекта");
ПараметрыРегистрации.Вставить("Назначение",Назначения);
ПараметрыРегистрации.Вставить("Наименование","Заполнить Документ");
ПараметрыРегистрации.Вставить("Версия","1.0");
ПараметрыРегистрации.Вставить("Информация","Дополнительная обработка табличной части требования");
ПараметрыРегистрации.Вставить("БезопасныйРежим",Истина);
Команды = ПолучитьТаблицуКоманд();
ДобавитьКоманду(Команды, "Заполнить документ","ЗаполнитьДокумент","ВызовКлиентскогоМетода",Ложь,);
ПараметрыРегистрации.Вставить("Команды",Команды);
Возврат ПараметрыРегистрации;
КонецФункции
Функция ПолучитьТаблицуКоманд()
Команды = Новый ТаблицаЗначений;
Команды.Колонки.Добавить("Представление", Новый ОписаниеТипов("Строка"));
Команды.Колонки.Добавить("Идентификатор", Новый ОписаниеТипов("Строка"));
Команды.Колонки.Добавить("Использование", Новый ОписаниеТипов("Строка"));
Команды.Колонки.Добавить("ПоказыватьОповещение", Новый ОписаниеТипов("Булево"));
Команды.Колонки.Добавить("Модификатор", Новый ОписаниеТипов("Строка"));
Возврат Команды;
КонецФункции
Процедура ДобавитьКоманду(ТаблицаКоманд, Представление, Идентификатор, Использование, ПоказыватьОповещение = Ложь, Модификатор = "")
НоваяКоманда = ТаблицаКоманд.Добавить();
НоваяКоманда.Представление = Представление;
НоваяКоманда.Идентификатор = Идентификатор;
НоваяКоманда.Использование = Использование;
НоваяКоманда.ПоказыватьОповещение = ПоказыватьОповещение;
НоваяКоманда.Модификатор = Модификатор;
КонецПроцедуры
В общем получилось сделать заполнение вот таким путем, естественно под свои реквизиты код.
&НаКлиенте
Процедура ЗаполнитьДокумент(Команда)
Форма= ПолучитьФорму("Документ.ПриобретениеТоваровУслуг.Форма.ФормаДокумента");
КопияФормы = Форма.Объект;
ЗаполнитьДокументНаСервере(КопияФормы);
КопироватьДанныеФормы(КопияФормы,
Форма.Объект);
////Объект.Данные.Загрузить(ФормаДокумента.Товары.Выгрузить());
// ФормаНовогоДокумента.Открыть();
Закрыть();
КонецПроцедуры
&НаСервере
Процедура ЗаполнитьДокументНаСервере(ДанныеФормы);
Поступление = ДанныеФормыВЗначение(ДанныеФормы,
Тип("ДокументОбъект.ПриобретениеТоваровУслуг"));
Для Каждого Строка Из Объект.Данные Цикл
НоваяСтрока = Поступление.Товары.Добавить();
НоваяСтрока.Номенклатура = Справочники.Номенклатура.НайтиПоНаименованию(
Строка.Наименование );
НоваяСтрока.КоличествоУпаковок = Строка.Количество;
НоваяСтрока.Цена = Строка.Цена;
ЗначениеВДанныеФормы(Поступление,ДанныеФормы);
КонецЦикла;
КонецПроцедуры
Украинский 1С форум: всё про 1С 8.3, 1С 8.2, 1С 8.1, 1С 8.0, 1С 7.7
https://pro1c.org.ua