Обработка заполнения документа из 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 1164 10.07.19 11:39 Сейчас в теме
(8)
Ошибка при вызове метода контекста (Cells): Произошла исключительная ситуация (0x800a03ec)

Нет нулевой колонки. Есть колонка с номером 1 или с еретической буквой "A". При попытке обратиться к нулевой колонке будет ошибка.
22. Greek26rusa 2 10.07.19 12:04 Сейчас в теме
(20)а как тогда штрих код обращается к 0 колонке?
27. mkalimulin 1164 10.07.19 14:16 Сейчас в теме
(22) Никак не обращается. Поставьте строчку со штрих кодом в самое начало и получите ту же ошибку.
28. mkalimulin 1164 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 1164 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 21 10.07.19 12:31 Сейчас в теме
https://infostart.ru/public/341855/ - Загружайте как тут, скопируйте код прям, и потом разбирайте тз уже на нужные реквизиты. Там где возврат Таблица результат, не возвращайте её, а обработайте как необходимо
user811769; +1 Ответить
30. dakork 33 10.07.19 16:37 Сейчас в теме
Рекомендую использовать https://infostart.ru/public/616875/ на выходе получите полноценную ТЗ, которую можно обрабатывать
32. kust-snb 12.07.19 11:03 Сейчас в теме
Проверил, работает ваш код. Ошибка 0x800a03ec - это, вероятно, обращение к несуществующему столбцу с номером - 0. Если проблема не решена, покажите реальную excel таблицу на которой спотыкается выполнение.
Оставьте свое сообщение

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