Заказы на доработку 1С (сервис удаленной работы)

Хранилище

База знаний
Бесплатные отчеты, обработки, конфигурации, внешние компоненты для 1С Статьи, описание работы, методики по работе с 1С

Здравствуйте, гость ( Вход | Зарегистрироваться )



> Добавление данных в документ по средством обработки , Вопрос о том как это можно реализовать самому          
DmitryPushkarev Подменю пользователя
сообщение 02.07.20, 12:32
Сообщение #1

Молчаливый
*
Группа: Пользователи
Сообщений: 7
Спасибо сказали: 0 раз
Рейтинг: 0

Доброго времени суток. Конфигурация УПП 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;
    
КонецПроцедуры

// Здесь начинается вопрос темы.
&НаКлиенте
Процедура ЗаполнитьДокумент(Команда)
    
    ЗаполнитьДокументНаСервере();
    
КонецПроцедуры

&НаСервере
Процедура ЗаполнитьДокументНаСервере()
    
    //

КонецПроцедуры


Код для открытия формы обработчика в документе ПриобретениеТоваровУслуг
&НаКлиенте
Процедура ЗаполнитьИзФайла(Команда)
    ПолучитьФорму("Обработка.ЧтениеЭксель.Форма.Форма").Открыть();
    
КонецПроцедуры


Как я понял при помощи кода ниже, можно получить открытый документ, но на него нельзя воздействовать на прямую.
  Форма=Документы.ПриобретениеТоваровУслуг.ПолучитьФорму();

P.s: Изучаю 1С - пожалуйста сильно не бейте.

denis84 Подменю пользователя
сообщение 02.07.20, 12:49
Сообщение #2

Оратор
Иконка группы
Группа: Местный
Сообщений: 421
Из: Украина
Спасибо сказали: 133 раз
Рейтинг: 134.5

DmitryPushkarev @ Сегодня, 13:32 * ,
Добрый день! Вам необходимо получить объект, не его форму. У вас Управляемые формы?


DmitryPushkarev Подменю пользователя
сообщение 02.07.20, 13:41
Сообщение #3

Молчаливый
*
Группа: Пользователи
Сообщений: 7
Спасибо сказали: 0 раз
Рейтинг: 0

denis84 @ Сегодня, 13:49 * ,
Да, Управляемые формы.
Я тут чутка вроде уже начал разбираться и осталась финальная часть вопроса. "Как добавить данные из таблицы Обработки в Таблицу Документа". Вот код кнопки обработчика, который сделал чтобы найти объект документа.


&НаКлиенте
Процедура ЗаполнитьДокумент(Команда)
    Форма=  ПолучитьФорму("Документ.ПриобретениеТоваровУслуг.Форма.ФормаДокумента");
    Если Форма.Открыта()Тогда
        ОбъектФормы = Форма.Объект;
    КонецЕсли;
    ЗаполнитьДокументНаСервере(ОбъектФормы);
    
    Закрыть();
КонецПроцедуры

&НаСервере
Процедура ЗаполнитьДокументНаСервере(ДанныеФормы);
    
    
    Для Каждого Строка Из Объект.Данные Цикл
        Товары = ДанныеФормы.Товары.Добавить();
        
        Товары.Номенклатура = Строка.Наименование;
        Товары.Код = Строка.Код;
        Товары.Артикул = Строка.Артикул;
        
        
    КонецЦикла;
        
КонецПроцедуры

denis84 Подменю пользователя
сообщение 02.07.20, 14:07
Сообщение #4

Оратор
Иконка группы
Группа: Местный
Сообщений: 421
Из: Украина
Спасибо сказали: 133 раз
Рейтинг: 134.5

DmitryPushkarev @ Сегодня, 14:41 * ,
У меня естьтакая процедура(функция), заполнение(корректировка) ТЧ документа Заказ клиента.
На форме обработки кнопка с этой командой.
&НаСервере
Процедура ВыполнитьКоманду(Команда, ОбъектыНазначения)
    Для каждого ЗаказКлиента из ОбъектыНазначения Цикл
        ЗаказКлиентаОбъект = ЗаказКлиента.ПолучитьОбъект();
        Для каждого  СтрокаТЗ из ЗаказКлиентаОбъект.Товары Цикл
            СтрокаТЗ.ПроцентРучнойСкидки = 5;
            СтрокаТЗ.СуммаРучнойСкидки = СтрокаТЗ.Сумма * 0.95;
        КонецЦикла;
        ЗаказКлиентаОбъект.Записать();
    КонецЦикла;    
КонецПроцедуры


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

Функция ПолучитьКомандыОбработки ()
    КомандыОбработки = Новый ТаблицаЗначений;
    КомандыОбработки.Колонки.Добавить("Представление", Новый ОписаниеТипов("Строка"));
    КомандыОбработки.Колонки.Добавить("Идентификатор", Новый ОписаниеТипов("Строка"));
    КомандыОбработки.Колонки.Добавить("Использование", Новый ОписаниеТипов("Строка"));
    КомандыОбработки.Колонки.Добавить("ПоказыватьОповещение", Новый ОписаниеТипов("Булево"));
    КомандыОбработки.Колонки.Добавить("Модификатор", Новый ОписаниеТипов("Строка"));
    Возврат КомандыОбработки;
КонецФункции    

Процедура ДобавитьКомандуОбработки(КомандыОбработки, Представление, Идентификатор, Использование, ПоказыватьОповещение = Ложь, Модификатор = "")
    НовКоманда = КомандыОбработки.Добавить();
    НовКоманда.Представление = Представление;
    НовКоманда.Идентификатор = Идентификатор;
    НовКоманда.Использование = Использование;
    НовКоманда.ПоказыватьОповещение = ПоказыватьОповещение;
    НовКоманда.Модификатор = Модификатор;
КонецПроцедуры

DmitryPushkarev Подменю пользователя
сообщение 02.07.20, 14:22
Сообщение #5

Молчаливый
*
Группа: Пользователи
Сообщений: 7
Спасибо сказали: 0 раз
Рейтинг: 0

denis84 @ Сегодня, 15:07 * ,

&НаСервере
Процедура ВыполнитьКоманду(Команда, ОбъектыНазначения)   // ОбъектыНазначения - как берется переменная?
    Для каждого ЗаказКлиента из ОбъектыНазначения Цикл
        ЗаказКлиентаОбъект = ЗаказКлиента.ПолучитьОбъект();   //Инициализируется объект для каждой итерации объекта назначения - это для всех заказов клиента?
        Для каждого  СтрокаТЗ из ЗаказКлиентаОбъект.Товары Цикл
            СтрокаТЗ.ПроцентРучнойСкидки = 5;
            СтрокаТЗ.СуммаРучнойСкидки = СтрокаТЗ.Сумма * 0.95;
        КонецЦикла;
        ЗаказКлиентаОбъект.Записать();    
    КонецЦикла;    
КонецПроцедуры


У Вас получается весь код для существующих документов "ЗаказКлиента", который записывает ручные скидки через обработку?
Попробую что-нибудь использовать из приведенного кода.

denis84 Подменю пользователя
сообщение 02.07.20, 14:35
Сообщение #6

Оратор
Иконка группы
Группа: Местный
Сообщений: 421
Из: Украина
Спасибо сказали: 133 раз
Рейтинг: 134.5

DmitryPushkarev @ Сегодня, 15:22 * ,
Вот ещё вариант:
На форме кнопка с командой:
&НаКлиенте
Процедура ВыполнитьКоманду(ИдентификаторКоманды, ОбъектыНазначенияМассив) Экспорт
    Для каждого  ТекущаяСтрока из ВладелецФормы.Объект.Материалы Цикл     //наш откртый документ "требование"
        ТекущаяСтрока.Количество = 100;
        Сообщить(ТекущаяСтрока.Количество);
    КонецЦикла;    
КонецПроцедуры


и в модуле:

Функция СведенияОВнешнейОбработке() Экспорт
    Назначения = Новый Массив;
    Назначения.Добавить("Документ.ТребованиеНакладная");
    
    ПараметрыРегистрации = Новый Структура;
    ПараметрыРегистрации.Вставить("Вид","ЗаполнениеОбъекта");
    ПараметрыРегистрации.Вставить("Назначение",Назначения);
    ПараметрыРегистрации.Вставить("Наименование","Заполнить Документ");
    ПараметрыРегистрации.Вставить("Версия","1.0");
    ПараметрыРегистрации.Вставить("Информация","Дополнительная обработка табличной части требования");
    ПараметрыРегистрации.Вставить("БезопасныйРежим",Истина);
    
    Команды = ПолучитьТаблицуКоманд();
    ДобавитьКоманду(Команды, "Заполнить документ","ЗаполнитьДокумент","ВызовКлиентскогоМетода",Ложь,);
    
    ПараметрыРегистрации.Вставить("Команды",Команды);
    
    Возврат ПараметрыРегистрации;
    
КонецФункции

Функция ПолучитьТаблицуКоманд()
    Команды = Новый ТаблицаЗначений;
        Команды.Колонки.Добавить("Представление", Новый ОписаниеТипов("Строка"));
    Команды.Колонки.Добавить("Идентификатор", Новый ОписаниеТипов("Строка"));
    Команды.Колонки.Добавить("Использование", Новый ОписаниеТипов("Строка"));
    Команды.Колонки.Добавить("ПоказыватьОповещение", Новый ОписаниеТипов("Булево"));
    Команды.Колонки.Добавить("Модификатор", Новый ОписаниеТипов("Строка"));
    Возврат Команды;
КонецФункции    

Процедура ДобавитьКоманду(ТаблицаКоманд, Представление, Идентификатор, Использование, ПоказыватьОповещение = Ложь, Модификатор = "")
    НоваяКоманда = ТаблицаКоманд.Добавить();
    НоваяКоманда.Представление = Представление;
    НоваяКоманда.Идентификатор = Идентификатор;
    НоваяКоманда.Использование = Использование;
    НоваяКоманда.ПоказыватьОповещение = ПоказыватьОповещение;
    НоваяКоманда.Модификатор = Модификатор;
КонецПроцедуры



DmitryPushkarev Подменю пользователя
сообщение 06.07.20, 15:24
Сообщение #7

Молчаливый
*
Группа: Пользователи
Сообщений: 7
Спасибо сказали: 0 раз
Рейтинг: 0

В общем получилось сделать заполнение вот таким путем, естественно под свои реквизиты код.

&НаКлиенте
Процедура ЗаполнитьДокумент(Команда)
    Форма=  ПолучитьФорму("Документ.ПриобретениеТоваровУслуг.Форма.ФормаДокумента");
    КопияФормы = Форма.Объект;    

    ЗаполнитьДокументНаСервере(КопияФормы);
    КопироватьДанныеФормы(КопияФормы,
    Форма.Объект);
    
      ////Объект.Данные.Загрузить(ФормаДокумента.Товары.Выгрузить());
    // ФормаНовогоДокумента.Открыть();
    
    Закрыть();
КонецПроцедуры

&НаСервере
Процедура ЗаполнитьДокументНаСервере(ДанныеФормы);      
    
      Поступление = ДанныеФормыВЗначение(ДанныеФормы,
      Тип("ДокументОбъект.ПриобретениеТоваровУслуг"));    

    Для Каждого Строка Из Объект.Данные Цикл
        
        
    НоваяСтрока = Поступление.Товары.Добавить();
    НоваяСтрока.Номенклатура = Справочники.Номенклатура.НайтиПоНаименованию(
    Строка.Наименование    );

    НоваяСтрока.КоличествоУпаковок = Строка.Количество;
    НоваяСтрока.Цена = Строка.Цена;
        
    ЗначениеВДанныеФормы(Поступление,ДанныеФормы);    
        
    КонецЦикла;
    
    
КонецПроцедуры


Может кому понадобится или кто увидит ошибку и посоветует изменить.
Так же узнал что такую задачу делают через временное хранилище.

Не нашли ответа на свой вопрос?
Зарегистрируйтесь и задайте новый вопрос.


Ответить Новая тема
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 

RSS Текстовая версия Сейчас: 29.03.24, 11:09
1С Предприятие 8.3, 1С Предприятие 8.2, 1С Предприятие 8.1, 1С Предприятие 8.0, 1С Предприятие 7.7, Литература 1С, Общие вопросы по администрированию 1С, Методическая поддержка 1С - всё в одном месте: на Украинском 1С форуме!