Обработка заполнения документа из excel

1. Greek26rusa 2 10.07.19 10:15 Сейчас в теме
Добрый день. Помогите разобраться с загрузкой

Код
Перем Команда_Заполнение;
Перем Sheet;

Функция ПолучитьОписаниеТЗ()
   ТЗ = Новый ТаблицаЗначений();
   ТЗ.Колонки.Добавить("ВидНоменклатурыСтрока");
   ТЗ.Колонки.Добавить("ВидНоменклатуры");
   ТЗ.Колонки.Добавить("Артикул");
   ТЗ.Колонки.Добавить("Наименование");
   ТЗ.Колонки.Добавить("Спецификация");
   ТЗ.Колонки.Добавить("МеталлСтрока");
   ТЗ.Колонки.Добавить("Металл");
   ТЗ.Колонки.Добавить("ЦветСтрока");
   ТЗ.Колонки.Добавить("Цвет");
   ТЗ.Колонки.Добавить("ПробаСтрока");
   ТЗ.Колонки.Добавить("Проба");
   ТЗ.Колонки.Добавить("РазмерСтрока");
   ТЗ.Колонки.Добавить("Размер");
   ТЗ.Колонки.Добавить("КоличествоШт");
   ТЗ.Колонки.Добавить("Количество");
   ТЗ.Колонки.Добавить("СтоимостьЗакупочная");
   ТЗ.Колонки.Добавить("СтоимостьВРознице");
   ТЗ.Колонки.Добавить("ШтрихКод");
   ТЗ.Колонки.Добавить("ВидЕИЦены");
   ТЗ.Колонки.Добавить("СтрКлючИзделие");
   ТЗ.Колонки.Добавить("СтранаПроисхождения");
    ТЗ.Колонки.Добавить("Комментарий");
   ТЗ.Колонки.Добавить("НомерГТД");
   ТЗ.Колонки.Добавить("Поставщик");
   ТЗ.Колонки.Добавить("Производитель");
   ТЗ.Колонки.Добавить("ЦветЦиферблата");
   ТЗ.Колонки.Добавить("КатегорияКамней");
   ТЗ.Колонки.Добавить("ВнешнийВид");
   ТЗ.Колонки.Добавить("Родитель");
   ТЗ.Колонки.Добавить("ПроцентНаценки");
   ТЗ.Колонки.Добавить("ЦенаРозница");
   ТЗ.Колонки.Добавить("ЦенаЗакупка");
   ТЗ.Колонки.Добавить("Весовой");
   ТЗ.Колонки.Добавить("КоллекцияИзделия");
   ТЗ.Колонки.Добавить("ШтрихКодПоставщика");
   
   Возврат ТЗ;
КонецФункции   

// Интерфейс для регистрации обработки.
// Вызывается при добавлении обработки в справочник "ВнешниеОбработки"
//
// Возвращаемое значение:
// Структура:
// Вид - строка - возможные значения:   "ДополнительнаяОбработка"
//                              "ДополнительныйОтчет"
//                              "ЗаполнениеОбъекта"
//                              "Отчет"
//                              "ПечатнаяФорма"
//                              "СозданиеСвязанныхОбъектов"
//
// Назначение - массив строк имен объектов метаданных в формате:
//         <ИмяКлассаОбъектаМетаданного>.[ * | <ИмяОбъектаМетаданных>]
//         Например, "Документ.СчетЗаказ" или "Справочник.*"
//         Прим. параметр имеет смысл только для назначаемых обработок
//
// Наименование - строка - наименование обработки, которым будет заполнено
//                  наименование справочника по умолчанию - краткая строка для
//                  идентификации обработки администратором
//
// Версия - строка - версия обработки в формате <старший номер>.<младший номер>
//               используется при загрузке обработок в информационную базу
// БезопасныйРежим – Булево – Если истина, обработка будет запущена в безопасном режиме.
//                     Более подбробная информация в справке.
//
// Информация - Строка- краткая информация по обработке, описание обработки
//
// ВерсияБСП - Строка - Минимальная версия БСП, на которую рассчитывает код
// дополнительной обработки. Номер версии БСП задается в формате «РР.ПП.ВВ.СС»
// (РР – старший номер редакции; ПП – младший номер ре-дакции; ВВ – номер версии; СС – номер сборки).
//
// Команды - ТаблицаЗначений - команды, поставляемые обработкой, одная строка таблицы соотвествует
//                     одной команде
//            колонки: 
//             - Представление - строка - представление команды конечному пользователю
//             - Идентификатор - строка - идентефикатор команды. В случае печатных форм
//                                 перечисление через запятую списка макетов
//             - Использование - строка - варианты запуска обработки:
//                  "ОткрытиеФормы" - открыть форму обработки
//                  "ВызовКлиентскогоМетода" - вызов клиентского экспортного метода из формы обработки
//                  "ВызовСерверногоМетода" - вызов серверного экспортного метода из модуля объекта обработки
//             - ПоказыватьОповещение – Булево – если Истина, требуется оказывать оповещение при начале
//                        и при окончании запуска обработки. Прим. Имеет смысл только
//                        при запуске обработки без открытия формы.
//             - Модификатор – строка - для печатных форм MXL, которые требуется
//                              отображать в форме ПечатьДокументов подсистемы Печать
//                              требуется установить как "ПечатьMXL"
//
Функция СведенияОВнешнейОбработке() Экспорт
   
   ПараметрыРегистрации = Новый Структура;
   
   ПараметрыРегистрации.Вставить("Вид", "ЭлектроннаяНакладная");
   ПараметрыРегистрации.Вставить("Назначение", ПолучитьНазначениеОбработки());
   ПараметрыРегистрации.Вставить("Наименование", НСтр("ru = 'Загрузка Шарафетдинов (xls)'"));
   ПараметрыРегистрации.Вставить("Версия", "1.0");
   ПараметрыРегистрации.Вставить("БезопасныйРежим", Истина);
   ПараметрыРегистрации.Вставить("Информация", НСтр("ru = 'Обработка заполнения документа ""Документ Приемка товара"".'"));
   ПараметрыРегистрации.Вставить("ВерсияБСП", "2.0.1.3");
   ПараметрыРегистрации.Вставить("ТипФайлаЭН", "Файл данных (*.xls, *.xlsx)|*.xls; *.xlsx");
   ТаблицаКоманд = ПолучитьТаблицуКоманд();
   
   ДобавитьКоманду(ТаблицаКоманд,
               НСтр("ru = 'Заполнить'"),
               Команда_Заполнение,
               "ВызовСерверногоМетода",
               Истина);
   
   ПараметрыРегистрации.Вставить("Команды", ТаблицаКоманд);
   
   Возврат ПараметрыРегистрации;
КонецФункции

// Интерфейс для запуска логики обработки
//
// Параметры
// ОбъектыНазначения - массив -  ссылки на объекты информационной базы, для которых требуется
//               вызвать обработку
// ПараметрыВыполненияКоманды - структура - структура со свойством ДополнительнаяОбработкаСсылка (ссылка на
// элемент справочника ДополнительныеОтчетыИОбработки, который связан с данной дополнительной обработкой)
//
Процедура ВыполнитьКоманду(ИдентификаторКоманды, ПараметрыВыполненияКоманды) Экспорт
КонецПроцедуры

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

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

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

Функция ПолучитьТаблицуДанных(ПараметрыПоУмолчанию, ПутьКФайлуИзделий) Экспорт
   ВремКаталог = КаталогВременныхФайлов() + "temp_" + новый УникальныйИдентификатор() + "";
   СоздатьКаталог(ВремКаталог);
    ДвоичныеДанные = ПолучитьИзВременногоХранилища(ПутьКФайлуИзделий);
   ПутьКФайлуИзделий = ВремКаталог + "i.xls";
   ДвоичныеДанные.Записать(ПутьКФайлуИзделий);
    ОтборПоВставкам = Новый Структура("СерияНоменклатуры");
    Попытка
      Ea = ПолучитьCOMОбъект(ПутьКФайлуИзделий);
   Исключение
      Ea = NULL;
      Отказ = Истина;
      Сообщить("Ошибка при установке соединения с COM-объектом: переустановите Excel", СтатусСообщения.Важное);
   КонецПопытки;   
    Sheet = Ea.ActiveSheet;
   ТЗ=ЗаполнитьТаблицу(Sheet,ПараметрыПоУмолчанию);
   
   Ea.Close();
   Ea = NULL;
   
   Возврат ТЗ;
КонецФункции   

Функция Эксель(Стр,Столб)
      Значение = СокрЛП(Sheet.Cells(Стр,Столб).Value);
      Значение = СтрЗаменить(Значение,Символы.НПП,"");
      Возврат Значение;
   КонецФункции
   
   Функция ЭксельЧисло(Стр,Столб)
      Попытка
      Значение = Эксель(Стр,Столб);
      Значение = СтрЗаменить(Значение,",", ".");
      Значение = СтрЗаменить(Значение," ", "");
      Значение = СтрЗаменить(Значение,"-", ".");
      ЗначениеЧисло = Число(Значение);
   Исключение
      ЗначениеЧисло=0;
   КонецПопытки;
   
      Возврат ЗначениеЧисло;
   КонецФункции
   
   
   Функция Разложить(Значение,Стр)
      Массив = Новый Массив;
      Массив = ОбщегоНазначения.РазложитьСтрокуВМассивПодстрок(Значение, Стр);
      Возврат Массив;
   КонецФункции
   
   
Показать полностью



Я ПОНИМАЮ ЧТО ПРОБЛЕМА ИМЕННО ТУТ
Код
   Функция ЗаполнитьТаблицу(Sheet,ПараметрыПоУмолчанию)
   ТЗ = ПолучитьОписаниеТЗ();
   //0. Здесь задаются номера столбцов для стабильных характеристик
   НомерСтроки = 24;
   СтолбецИтогов = 0;
   СтолбецШтрихКода = 13;
   СтолбецГТД = 0;
   СтолбецСтрана = 0;
   СтолбецВес = 33;
   СтолбецШтук = 25;
   СтолбецЦена = 33;
   СтолбецБезНДС = 0; //если нужно потом пересчитывать цену с ндс, то заполняем, иначе 0
   СтолбецСНДС = 44;   
   СтолбецЗначения = 3;
   
   
   
   //
   //      
   //Пока Эксель(НомерСтроки,СтолбецИтогов) <> "Всего по накладной" Цикл
   //   Если Эксель(НомерСтроки,СтолбецИтогов) = "Итого"  Тогда
   //   Если Эксель(НомерСтроки+1,СтолбецИтогов)= "Всего по накладной" Тогда
   //         Прервать;
   //   Иначе
   //       НомерСтроки = НомерСтроки + 5;
   //   КонецЕсли;   
   //   КонецЕсли;
   //   // 1. сначала разберем массив с нестабильными характеристиками
   //   //Сообщить(НомерСтроки);
   //   Значение = Эксель(НомерСтроки,СтолбецЗначения);
   //   Массив = Разложить(Значение," ");
   //   Кол=Массив.Количество();
   //   
   //   ВидНоменклатуры=Массив[0];
   //    //Массив = Разложить(Значение,"(");
   //   Артикул = СокрЛП(СтрЗаменить(Массив[1],",",""));
   //   Спецификация = "";
   //   Проба="";
   //   Размер="";
   //   //Если Массив.Количество()>1 тогда
   //   //   Массив1=Разложить(СокрЛП(СтрЗаменить(СтрЗаменить(Массив[1],"(",""),")","")),";");
   //   //   Попытка
   //   //      Количество=Число(СокрЛП(Массив1[0]));
   //   //   Исключение
   //   //      Количество=0;
   //   //   КонецПопытки;
   //   //   Проба=?(Массив1.Количество()>1,СокрЛП(Массив1[1]),"");
   //   //   Спецификация=?(Массив1.Количество()>2,СокрЛП(Массив1[2]),"");
   //   //   ГТД=?(Массив1.Количество()>3,СокрЛП(Массив1[3]),"");
   //   //КонецЕсли;
   //   Если Проба = "585" ИЛИ Проба = "750" ИЛИ Проба = "350" Тогда
   //      Металл = "Золото";
   //   ИначеЕсли Проба = "925" ИЛИ Проба = "375" Тогда
   //      Металл = "Серебро";
   //   Иначе   
   //      Металл = ПараметрыПоУмолчанию.Металл;
   //      Проба = ПараметрыПоУмолчанию.Проба;
   //   КонецЕсли;
   //
   //   
   //   // 2. теперь заполним стабильные характеристики
   //   ШК = ?(СтолбецШтрихКода=0,"",Эксель(НомерСтроки,СтолбецШтрихКода));   
   //   //ГТД = ?(СтолбецГТД=0,ПараметрыПоУмолчанию.НомерГТД,Эксель(НомерСтроки,СтолбецГТД));
   //   Страна=?(СтолбецСтрана=0,ПараметрыПоУмолчанию.СтранаПроисхождения,Эксель(НомерСтроки,СтолбецСтрана));
   //   КоличествоШт = ЭксельЧисло(НомерСтроки,СтолбецШтук);
   //   Количество = ЭксельЧисло(НомерСтроки,СтолбецВес);
   //   Цена = ЭксельЧисло(НомерСтроки,СтолбецЦена);
   //   Сумма=ЭксельЧисло(НомерСтроки,СтолбецСНДС);
   //   
   //   // 3. обработаем ситуации с ошибками из-за округления
   //   Если СтолбецБезНДС>0 тогда
   //       СуммаБезНДС=ЭксельЧисло(НомерСтроки,СтолбецБезНДС);
   //       Если СуммаБезНДС=Цена*КоличествоШт тогда
   //          Цена = Сумма/КоличествоШт;
   //       Иначе
   //          Цена = Сумма/Количество;
   //       КонецЕсли;
   //   КонецЕсли;
   //   //Количество = Количество / КоличествоШт;
   //   КолОстаток = Количество*КоличествоШт-Окр(Количество,2)*(КоличествоШт-1);
   //   Сумма = Сумма / КоличествоШт;
   //   СуммаОстаток = Сумма*КоличествоШт-Окр(Сумма,2)*(КоличествоШт-1);
   //   
   //   // 4. заполним таблицу значений
   //   Пока КоличествоШт >= 1  Цикл
   //      СтрокаТЗ = ТЗ.Добавить();
   //      СтрокаТЗ.Артикул                         = Строка(Артикул);
   //      СтрокаТЗ.Наименование                       = Строка(Артикул);
   //      СтрокаТЗ.ВидНоменклатурыСтрока            = Строка(ВидНоменклатуры);
   //      СтрокаТЗ.МеталлСтрока                     = Строка(Металл);
   //      СтрокаТЗ.ПробаСтрока                      = Строка(Проба);
   //      СтрокаТЗ.ЦветСтрока                       = Строка(?(ПараметрыПоУмолчанию.Цвет = Справочники.КлассификаторЦветов.ПустаяСсылка(),Справочники.КлассификаторЦветов.Неопределен,ПараметрыПоУмолчанию.Цвет));
   //      СтрокаТЗ.Количество                       = ?(КоличествоШт=1,КолОстаток,Количество);
   //      СтрокаТЗ.КоличествоШт                     = 1;
   //      СтрокаТЗ.РазмерСтрока                     = Строка(СтрЗаменить(Размер,".",","));
   //      Если Цена = Сумма Тогда 
   //      Иначе
   //         Если КоличествоШт > 1 Тогда
   //            Сумма = Цена * Количество;
   //         КонецЕсли;
   //      КонецЕсли;   
   //      СтрокаТЗ.Родитель                      = ПараметрыПоУмолчанию.Родитель;
   //      СтрокаТЗ.ВнешнийВид                    = ПараметрыПоУмолчанию.ВнешнийВид;
   //      СтрокаТЗ.КатегорияКамней               = ПараметрыПоУмолчанию.КатегорияКамней;
   //      СтрокаТЗ.ЦветЦиферблата                = ПараметрыПоУмолчанию.ЦветЦиферблата; 
   //      СтрокаТЗ.Производитель                 = ПараметрыПоУмолчанию.Производитель; 
   //      СтрокаТЗ.Поставщик                     = ПараметрыПоУмолчанию.Поставщик;
   //      СтрокаТЗ.Комментарий                   = ПараметрыПоУмолчанию.Комментарий; 
   //      СтрокаТЗ.КоллекцияИзделия              = ПараметрыПоУмолчанию.КоллекцияИзделия;
   //      СтрокаТЗ.СтранаПроисхождения           = Страна;
   //      СтрокаТЗ.ЦенаЗакупка                = Цена;
   //      СтрокаТЗ.СтоимостьЗакупочная            = ?(КоличествоШт=1,СуммаОстаток,Сумма);
   //      СтрокаТЗ.Спецификация                  = Спецификация;
   //      //СтрокаТЗ.НомерГТД                  = ГТД;
   //      СтрокаТЗ.ШтрихКодПоставщика=ШК;
   //      КоличествоШт = КоличествоШт - 1;
   //    КонецЦикла;
   //   НомерСтроки = НомерСтроки + 1;   
   //КонецЦикла;   

   //   Возврат ТЗ;

   
   
   
   
   
   
   
   Пока Эксель(НомерСтроки,СтолбецИтогов) <> "" Цикл
      //Если Эксель(НомерСтроки,СтолбецИтогов) = "Итого"  Тогда
      //   Если Эксель(НомерСтроки+1,СтолбецИтогов)= "Всего по накладной" Тогда
      //      Прервать;
      //   Иначе
      //       НомерСтроки = НомерСтроки + 5;
      //   КонецЕсли;   
      //КонецЕсли;
      // 1. сначала разберем массив с нестабильными характеристиками
      //Сообщить(НомерСтроки);
      Значение = Эксель(НомерСтроки,СтолбецЗначения);
      Массив = Разложить(Значение," ");
      Кол=Массив.Количество();
      ВидНоменклатуры=Массив[0];
      Массив = Разложить(Значение,"(");
      Артикул = СокрЛП(СтрЗаменить(Массив[0],ВидНоменклатуры,""));
      Спецификация = "";
      Проба="";
      Размер="";
      Если Массив.Количество()>1 тогда
         Массив1=Разложить(СокрЛП(СтрЗаменить(СтрЗаменить(Массив[1],"(",""),")","")),";");
         Попытка
            Количество=Число(СокрЛП(Массив1[0]));
         Исключение
            Количество=0;
         КонецПопытки;
         Проба=?(Массив1.Количество()>1,СокрЛП(Массив1[1]),"");
         Спецификация=?(Массив1.Количество()>2,СокрЛП(Массив1[2]),"");
         ГТД=?(Массив1.Количество()>3,СокрЛП(Массив1[3]),"");
      КонецЕсли;
      Если Проба = "585" ИЛИ Проба = "750" ИЛИ Проба = "350" Тогда
         Металл = "Золото";
      ИначеЕсли Проба = "925" ИЛИ Проба = "375" Тогда
         Металл = "Серебро";
      Иначе   
         Металл = ПараметрыПоУмолчанию.Металл;
         Проба = ПараметрыПоУмолчанию.Проба;
      КонецЕсли;
   
      
      // 2. теперь заполним стабильные характеристики
      ШК = ?(СтолбецШтрихКода=0,"",Эксель(НомерСтроки,СтолбецШтрихКода));   
      //ГТД = ?(СтолбецГТД=0,ПараметрыПоУмолчанию.НомерГТД,Эксель(НомерСтроки,СтолбецГТД));
      Страна=?(СтолбецСтрана=0,ПараметрыПоУмолчанию.СтранаПроисхождения,Эксель(НомерСтроки,СтолбецСтрана));
      КоличествоШт = ЭксельЧисло(НомерСтроки,СтолбецШтук);
      Количество = ЭксельЧисло(НомерСтроки,СтолбецВес);
      Цена = ЭксельЧисло(НомерСтроки,СтолбецЦена);
      Сумма=ЭксельЧисло(НомерСтроки,СтолбецСНДС);
      
      // 3. обработаем ситуации с ошибками из-за округления
      Если СтолбецБезНДС>0 тогда
          СуммаБезНДС=ЭксельЧисло(НомерСтроки,СтолбецБезНДС);
          Если СуммаБезНДС=Цена*КоличествоШт тогда
             Цена = Сумма/КоличествоШт;
          Иначе
             Цена = Сумма/Количество;
          КонецЕсли;
      КонецЕсли;
      //Количество = Количество / КоличествоШт;
      КолОстаток = Количество*КоличествоШт-Окр(Количество,2)*(КоличествоШт-1);
      Сумма = Сумма / КоличествоШт;
      СуммаОстаток = Сумма*КоличествоШт-Окр(Сумма,2)*(КоличествоШт-1);
      
      // 4. заполним таблицу значений
      Пока КоличествоШт >= 1  Цикл
         СтрокаТЗ = ТЗ.Добавить();
         СтрокаТЗ.Артикул                         = Строка(Артикул);
         СтрокаТЗ.Наименование                       = Строка(Артикул);
         СтрокаТЗ.ВидНоменклатурыСтрока            = Строка(ВидНоменклатуры);
         СтрокаТЗ.МеталлСтрока                     = Строка(Металл);
         СтрокаТЗ.ПробаСтрока                      = Строка(Проба);
         СтрокаТЗ.ЦветСтрока                       = Строка(?(ПараметрыПоУмолчанию.Цвет = Справочники.КлассификаторЦветов.ПустаяСсылка(),Справочники.КлассификаторЦветов.Неопределен,ПараметрыПоУмолчанию.Цвет));
         СтрокаТЗ.Количество                       = ?(КоличествоШт=1,КолОстаток,Количество);
         СтрокаТЗ.КоличествоШт                     = 1;
         СтрокаТЗ.РазмерСтрока                     = Строка(СтрЗаменить(Размер,".",","));
         Если Цена = Сумма Тогда 
         Иначе
            Если КоличествоШт > 1 Тогда
               Сумма = Цена * Количество;
            КонецЕсли;
         КонецЕсли;   
         СтрокаТЗ.Родитель                      = ПараметрыПоУмолчанию.Родитель;
         СтрокаТЗ.ВнешнийВид                    = ПараметрыПоУмолчанию.ВнешнийВид;
         СтрокаТЗ.КатегорияКамней               = ПараметрыПоУмолчанию.КатегорияКамней;
         СтрокаТЗ.ЦветЦиферблата                = ПараметрыПоУмолчанию.ЦветЦиферблата; 
         СтрокаТЗ.Производитель                 = ПараметрыПоУмолчанию.Производитель; 
         СтрокаТЗ.Поставщик                     = ПараметрыПоУмолчанию.Поставщик;
         СтрокаТЗ.Комментарий                   = ПараметрыПоУмолчанию.Комментарий; 
         СтрокаТЗ.КоллекцияИзделия              = ПараметрыПоУмолчанию.КоллекцияИзделия;
         СтрокаТЗ.СтранаПроисхождения           = Страна;
         СтрокаТЗ.ЦенаЗакупка                = Цена;
         СтрокаТЗ.СтоимостьЗакупочная            = ?(КоличествоШт=1,СуммаОстаток,Сумма);
         СтрокаТЗ.Спецификация                  = Спецификация;
         СтрокаТЗ.НомерГТД                  = ГТД;
         СтрокаТЗ.ШтрихКодПоставщика=ШК;
         КоличествоШт = КоличествоШт - 1;
       КонецЦикла;
      НомерСтроки = НомерСтроки + 1;   
   КонецЦикла;   

      Возврат ТЗ;
   КонецФункции
   
Показать полностью

Команда_Заполнение = "Заполнить";
Прикрепленные файлы:
шараф.xls
По теме из базы знаний
Вознаграждение за ответ
Показать полностью
Ответы
В избранное Подписаться на ответы Сортировка: Древо развёрнутое
Свернуть все
4. VictorRGB2 13 10.07.19 10:31 Сейчас в теме
(1) таки в чем проблема?

и читать не форматированный код трудно, оформите красиво

могу предположить, что не читает данные или читает, но как-то не так... возможно проблема в цикле
Пока Эксель(НомерСтроки,СтолбецИтогов) <> "" Цикл
куда передается СтолбецИтогов = 0, фактически это колонка таблицы эксель, которая по определению не может быть нулевой
dachnik; Asaharu; +2 Ответить
33. werik 12.07.19 19:07 Сейчас в теме
На выходе готовая ТЗ.
ИмяФайлаПриемника = Путь к файлу.

ТЗ = Неопределено;
Лист = Неопределено;
НомерПервойСтроки = 2;
НомерПервойКолонки = 1;
КолвоКолонок = 0;
КолвоСтрок = 0;
XLSОбъект = Неопределено;

Если XLSОбъект = Неопределено Тогда
XLSОбъект = Новый COMОбъект("Excel.Application");
XLSОбъект.Visible = Ложь;
XLSОбъект.DisplayAlerts = Ложь;
КонецЕсли;

Попытка
Book = XLSОбъект.Workbooks.Open(ИмяФайлаПриемника, , Истина);
Исключение
Сообщить ("Проблемы с подключением к Excel" );
//Возврат Неопределено;
КонецПопытки;

Лист = Book.Sheets(1);
КолвоКолонок = Лист.Cells(1,1).SpecialCells(11).Column;
КолвоСтрок = Лист.Cells(1,1).SpecialCells(11).Row;


Если ТЗ = Неопределено Тогда
ТЗ = Новый ТаблицаЗначений;
Для Счетчик = 1 По КолвоКолонок Цикл
ТЗ.Колонки.Добавить("Колонка"+Счетчик, Новый ОписаниеТипов("Строка"));
КонецЦикла;
КонецЕсли;
Для Счетчик = НомерПервойСтроки По КолвоСтрок Цикл
НоваяСтрока = ТЗ.Добавить();
КонецЦикла;

Область = Лист.Range(Лист.Cells(НомерПервойСтроки,НомерПервойКолонки), Лист.Cells(КолвоСтрок,КолвоКолонок));
Данные = Область.Value.Выгрузить();

Для Счетчик = 0 По КолвоКолонок-1 Цикл
ТЗ.ЗагрузитьКолонку(Данные[Счетчик], Счетчик);
КонецЦикла;
Лист = Неопределено;
2. platonov.e 158 10.07.19 10:23 Сейчас в теме
Вы предлагаете прочитать весь код обработки без какого либо форматирования, понять как она работает и рассказать вам?
3. user811769 13 10.07.19 10:23 Сейчас в теме
А что конкретно не понятно? И ещё, мил человек, оформи ты блок кода тэгами CODE (кнопка </>)
5. Greek26rusa 2 10.07.19 10:33 Сейчас в теме
6. platonov.e 158 10.07.19 10:33 Сейчас в теме
7. Greek26rusa 2 10.07.19 10:34 Сейчас в теме
8. Greek26rusa 2 10.07.19 10:36 Сейчас в теме
Заполнение ТЧ не произведено!
Ошибка при вызове метода контекста (Cells): Произошла исключительная ситуация (0x800a03ec)
Ошибка при загрузке!
9. platonov.e 158 10.07.19 10:40 Сейчас в теме
(8) Что в строке ниже лежит в Cells посмотрите в отладке
Значение = СокрЛП(Sheet.Cells(Стр,Столб).Value)
10. Greek26rusa 2 10.07.19 10:44 Сейчас в теме
(9)не показывает, я поставил точку видимо не доходит
11. platonov.e 158 10.07.19 10:48 Сейчас в теме
(10) ну так ставьте точку в самом начале и идите и смотрите что происходит
13. Greek26rusa 2 10.07.19 10:52 Сейчас в теме
(11)к сожалению не получается так. обработка привязана к профилю и так не отследить проблему. я ставлю точки ничего не срабатывает
14. most_fucking 10.07.19 10:54 Сейчас в теме
(13) а Скопировать эту обработку нельзя? Или создать новую и скопировать код, который нужен
17. Greek26rusa 2 10.07.19 11:12 Сейчас в теме
(14)что мне даст новая обработка?) дела в формате файла . если я сделаю код как в рабочей тогда форматировать нужно exel для корректной загрузки
15. most_fucking 10.07.19 10:54 Сейчас в теме
(13) Возможно даже в другой базе делать это
20. mkalimulin 1148 10.07.19 11:39 Сейчас в теме
(8)
Ошибка при вызове метода контекста (Cells): Произошла исключительная ситуация (0x800a03ec)

Нет нулевой колонки. Есть колонка с номером 1 или с еретической буквой "A". При попытке обратиться к нулевой колонке будет ошибка.
22. Greek26rusa 2 10.07.19 12:04 Сейчас в теме
(20)а как тогда штрих код обращается к 0 колонке?
27. mkalimulin 1148 10.07.19 14:16 Сейчас в теме
(22) Никак не обращается. Поставьте строчку со штрих кодом в самое начало и получите ту же ошибку.
28. mkalimulin 1148 10.07.19 14:20 Сейчас в теме
(22) Вернее, не всю строчку, а ее часть. Вся строка проверяет на 0 и даёт пустой штрих код без обращения к excel.
29. Greek26rusa 2 10.07.19 16:30 Сейчас в теме
(28)Изменил итоговую колонку она находится в 24 столбце

//0. Здесь задаются номера столбцов для стабильных характеристик
НомерСтроки = 24;
СтолбецИтогов = 24;
СтолбецШтрихКода = 13;
СтолбецГТД = 0;
СтолбецСтрана = 0;
СтолбецВес = 33;
СтолбецШтук = 25;
СтолбецЦена = 33;
СтолбецБезНДС = 0; //если нужно потом пересчитывать цену с ндс, то заполняем, иначе 0
СтолбецСНДС = 44;
СтолбецЗначения = 3;



Ошибка таже
31. mkalimulin 1148 10.07.19 17:01 Сейчас в теме
(29) Значит файл не открылся. Или открылся, но на такой странице, где нет 24 строк. Вы же только 24-ую строчку загружаете.
Или нет 44 колонки.
12. Greek26rusa 2 10.07.19 10:49 Сейчас в теме
для такого файла используем такой код все что вверху все один в один




   Функция ЗаполнитьТаблицу(Sheet,ПараметрыПоУмолчанию)
	ТЗ = ПолучитьОписаниеТЗ();
	//0. Здесь задаются номера столбцов для стабильных характеристик
	НомерСтроки = 22;
	СтолбецИтогов = 7;
	СтолбецШтрихКода = 0;
	СтолбецГТД = 0;
	СтолбецСтрана = 0;
	СтолбецВес = 10;
	СтолбецШтук = 8;
	СтолбецЦена = 11;
	СтолбецБезНДС = 12; //если нужно потом пересчитывать цену с ндс, то заполняем, иначе 0
	СтолбецСНДС = 15;   
	СтолбецЗначения = 2;
	
	Пока Эксель(НомерСтроки,СтолбецИтогов) <> "Всего по накладной:" Цикл
		Если Эксель(НомерСтроки,СтолбецИтогов) = "ИТОГО:"  Тогда
			Если Эксель(НомерСтроки+1,СтолбецИтогов)= "Всего по накладной:" Тогда
				Прервать;
			Иначе
			 	НомерСтроки = НомерСтроки + 5;
			КонецЕсли;	
		КонецЕсли;
		// 1. сначала разберем массив с нестабильными характеристиками
		//Сообщить(НомерСтроки);
		Значение = Эксель(НомерСтроки,СтолбецЗначения);
		Массив = Разложить(Значение," ");
		Кол=Массив.Количество();
		
		ВидНоменклатуры=Массив[0];
		Артикул = СокрЛП(СтрЗаменить(Массив[1],",",""));
		Спецификация = "";
		Проба=Эксель(НомерСтроки,3);
		ЭтоРазмер=ложь; ЭтоВставка=ложь;  Размер="";
		Для к=2 по Массив.Количество()-1 цикл
			Если Найти(Массив[к],"вставка")>0 тогда
				ЭтоВставка=Истина; ЭтоРазмер=Ложь;
			ИначеЕсли Найти(Массив[к],"размер")>0 тогда
				ЭтоРазмер=истина; ЭтоВставка=Ложь;
			ИначеЕсли ЭтоРазмер тогда
				Размер=Размер+?(Размер="",""," ")+Массив[к];
			ИначеЕсли ЭтоВставка тогда
				Спецификация=Спецификация+?(Спецификация="",""," ")+Массив[к];
			КонецЕсли;
					КонецЦикла;
		

			
		//Размер=?(Найти(Массив[5],"разм")>0,СтрЗаменить(Массив[6],";",""),""); 
		Если Проба = "585" ИЛИ Проба = "750" ИЛИ Проба = "350" Тогда
			Металл = "Золото";
		ИначеЕсли Проба = "925" ИЛИ Проба = "375" Тогда
			Металл = "Серебро";
		Иначе	
			Металл = ПараметрыПоУмолчанию.Металл;
			Проба = ПараметрыПоУмолчанию.Проба;
		КонецЕсли;

		
		
		// 2. теперь заполним стабильные характеристики
		ШК = ?(СтолбецШтрихКода=0,"",Эксель(НомерСтроки,СтолбецШтрихКода));	
		ГТД = ?(СтолбецГТД=0,ПараметрыПоУмолчанию.НомерГТД,Эксель(НомерСтроки,СтолбецГТД));
		Страна=?(СтолбецСтрана=0,ПараметрыПоУмолчанию.СтранаПроисхождения,Эксель(НомерСтроки,СтолбецСтрана));
		КоличествоШт = ЭксельЧисло(НомерСтроки,СтолбецШтук);
		Количество = ЭксельЧисло(НомерСтроки,СтолбецВес);
		Цена = ЭксельЧисло(НомерСтроки,СтолбецЦена);
		Сумма=ЭксельЧисло(НомерСтроки,СтолбецСНДС);
		
		// 3. обработаем ситуации с ошибками из-за округления
		Если СтолбецБезНДС>0 тогда
			 СуммаБезНДС=ЭксельЧисло(НомерСтроки,СтолбецБезНДС);
			 Если СуммаБезНДС=Цена*КоличествоШт тогда
				 Цена = Сумма/КоличествоШт;
			 Иначе
				 Цена = Сумма/Количество;
			 КонецЕсли;
		КонецЕсли;
		Количество = Количество / КоличествоШт;
		КолОстаток = Количество*КоличествоШт-Окр(Количество,2)*(КоличествоШт-1);
		Сумма = Сумма / КоличествоШт;
		СуммаОстаток = Сумма*КоличествоШт-Окр(Сумма,2)*(КоличествоШт-1);
		
		// 4. заполним таблицу значений
		Пока КоличествоШт >= 1  Цикл
			СтрокаТЗ = ТЗ.Добавить();
			СтрокаТЗ.Артикул                    	  = Строка(Артикул);
			СтрокаТЗ.Наименование                  	  = Строка(Артикул);
			СтрокаТЗ.ВидНоменклатурыСтрока            = Строка(ВидНоменклатуры);
			СтрокаТЗ.МеталлСтрока                     = Строка(Металл);
			СтрокаТЗ.ПробаСтрока                      = Строка(Проба);
			СтрокаТЗ.ЦветСтрока                       = Строка(?(ПараметрыПоУмолчанию.Цвет = Справочники.КлассификаторЦветов.ПустаяСсылка(),Справочники.КлассификаторЦветов.Неопределен,ПараметрыПоУмолчанию.Цвет));
			СтрокаТЗ.Количество                       = ?(КоличествоШт=1,КолОстаток,Количество);
			СтрокаТЗ.КоличествоШт                     = 1;
			СтрокаТЗ.РазмерСтрока                     = Строка(СтрЗаменить(Размер,".",","));
			Если Цена = Сумма Тогда 
			Иначе
				Если КоличествоШт > 1 Тогда
					Сумма = Цена * Количество;
				КонецЕсли;
			КонецЕсли;	
			СтрокаТЗ.Родитель                      = ПараметрыПоУмолчанию.Родитель;
			СтрокаТЗ.ВнешнийВид                    = ПараметрыПоУмолчанию.ВнешнийВид;
			СтрокаТЗ.КатегорияКамней               = ПараметрыПоУмолчанию.КатегорияКамней;
			СтрокаТЗ.ЦветЦиферблата                = ПараметрыПоУмолчанию.ЦветЦиферблата; 
			СтрокаТЗ.Производитель                 = ПараметрыПоУмолчанию.Производитель; 
			СтрокаТЗ.Поставщик                     = ПараметрыПоУмолчанию.Поставщик;
			СтрокаТЗ.Комментарий                   = ПараметрыПоУмолчанию.Комментарий; 
			СтрокаТЗ.КоллекцияИзделия              = ПараметрыПоУмолчанию.КоллекцияИзделия;
			СтрокаТЗ.СтранаПроисхождения           = Страна;
			СтрокаТЗ.ЦенаЗакупка 				   = Цена;
			СтрокаТЗ.СтоимостьЗакупочная   		   = ?(КоличествоШт=1,СуммаОстаток,Сумма);
			СтрокаТЗ.Спецификация                  = Спецификация;
			СтрокаТЗ.НомерГТД					   = ГТД;
			СтрокаТЗ.ШтрихКодПоставщика=ШК;
			КоличествоШт = КоличествоШт - 1;
	    КонецЦикла;
		НомерСтроки = НомерСтроки + 1;	
	КонецЦикла;	

	   Возврат ТЗ;
КонецФункции

Показать
Прикрепленные файлы:
16. VictorRGB2 13 10.07.19 11:12 Сейчас в теме
(12)
Пока Эксель(НомерСтроки,СтолбецИтогов) <> "Всего по накладной:" Цикл


здесь СтолбецИтогов = 7;
а в проблемном коде СтолбецИтогов = 0;
СтолбецИтогов - фактически это колонка таблицы эксель, которая по определению не может быть нулевой
поэтому и до чтения значения в ячейке не доходит - читать негде...
18. Greek26rusa 2 10.07.19 11:13 Сейчас в теме
(16) в 7 столбец кладу тогда?
19. VictorRGB2 13 10.07.19 11:16 Сейчас в теме
(18) откуда мне знать то ))
это вам надо понимать по структуре файла, какой столбец читать - такой номер и присвоить переменной СтолбецИтогов
21. Greek26rusa 2 10.07.19 12:03 Сейчас в теме
(19)

Исправил проблему столбцов ну проблема не там)

Заполнение ТЧ не произведено!
Ошибка при вызове метода контекста (Cells): Произошла исключительная ситуация (0x800a03ec)
Ошибка при загрузке!
24. VictorRGB2 13 10.07.19 13:22 Сейчас в теме
(21) смотрите, что тут Sheet = Ea.ActiveSheet;

возможно нужно не активный лист использовать, а по номеру или по имени задавать.
25. Greek26rusa 2 10.07.19 13:32 Сейчас в теме
(24)Можно как то развернуто) ткнуть)
26. VictorRGB2 13 10.07.19 13:41 Сейчас в теме
(25) ну вы, блин, даете ...
Функция ПолучитьТаблицуДанных(ПараметрыПоУмолчанию, ПутьКФайлуИзделий) Экспорт
   ВремКаталог = КаталогВременныхФайлов() + "temp_" + новый УникальныйИдентификатор() + "";
   СоздатьКаталог(ВремКаталог);
    ДвоичныеДанные = ПолучитьИзВременногоХранилища(ПутьКФайлуИзделий);
   ПутьКФайлуИзделий = ВремКаталог + "i.xls";
   ДвоичныеДанные.Записать(ПутьКФайлуИзделий);
    ОтборПоВставкам = Новый Структура("СерияНоменклатуры");
    Попытка
      Ea = ПолучитьCOMОбъект(ПутьКФайлуИзделий); // ВОТ - подключаемся к файлу
   Исключение
      Ea = NULL; // ВОТ - неудачная попытка
      Отказ = Истина;
      Сообщить("Ошибка при установке соединения с COM-объектом: переустановите Excel", СтатусСообщения.Важное);
   КонецПопытки;   
    Sheet = Ea.ActiveSheet; // ВОТ - даже если попытка неудачная, все равно лезем в файл, а как в него залезть, если подключиться не удалось?
                                            // ВОТ - тут надо проверять на ОТКАЗ предварительно, и уже потом переходить к листу
   ТЗ=ЗаполнитьТаблицу(Sheet,ПараметрыПоУмолчанию);
   
   Ea.Close();
   Ea = NULL;
   
   Возврат ТЗ;
КонецФункции   
Показать


примерно так по идее должно быть
	//подключаемся к эксел
	Попытка
		Excel = Новый COMОбъект("Excel.Application");
		Excel.WorkBooks.Open(Объект.ИмяФайла);
		Состояние("Обработка файла Microsoft Excel...");
	Исключение
		Сообщить("Ошибка при открытии файла с помощью Excel! Загрузка не будет произведена!");
		Сообщить(ОписаниеОшибки());
		Возврат;
	КонецПопытки;
		
	Попытка 
    	//Открываем необходимый лист
    	Excel.Sheets(1).Select();  // лист 1, по умолчанию  
	Исключение
		//Закрываем Excel
	    Excel.ActiveWorkbook.Close(); 	
		Excel = 0;
		Сообщить("Файл "+Строка(Объект.ИмяФайла)+" не соответствует необходимому формату! Первый лист не найден!");
		Возврат;
	КонецПопытки;	
Показать
user811769; +1 Ответить
23. BigRig 22 10.07.19 12:31 Сейчас в теме
https://infostart.ru/public/341855/ - Загружайте как тут, скопируйте код прям, и потом разбирайте тз уже на нужные реквизиты. Там где возврат Таблица результат, не возвращайте её, а обработайте как необходимо
user811769; +1 Ответить
30. dakork 32 10.07.19 16:37 Сейчас в теме
Рекомендую использовать https://infostart.ru/public/616875/ на выходе получите полноценную ТЗ, которую можно обрабатывать
32. kust-snb 12.07.19 11:03 Сейчас в теме
Проверил, работает ваш код. Ошибка 0x800a03ec - это, вероятно, обращение к несуществующему столбцу с номером - 0. Если проблема не решена, покажите реальную excel таблицу на которой спотыкается выполнение.
Оставьте свое сообщение
Вакансии
Программист 1С
Москва
зарплата от 180 000 руб. до 220 000 руб.
Полный день

Аналитик 1С / Бизнес-аналитик
Нижний Новгород
зарплата от 100 000 руб. до 250 000 руб.
Временный (на проект)

Программист 1С
Москва
зарплата от 250 000 руб.
Полный день

Программист 1C
Волгоград
зарплата от 200 000 руб.
Полный день

Аналитик
Санкт-Петербург
зарплата от 200 000 руб. до 250 000 руб.
Полный день