8.х Вопрос по внешней обработке.

Тема в разделе "Отчеты и обработки для "1С:Предприятие 8"", создана пользователем alexander4321, 15 янв 2014.

  1. TopicStarter Overlay
    alexander4321
    Offline

    alexander4321

    Регистрация:
    19 мар 2013
    Сообщения:
    43
    Симпатии:
    0
    Баллы:
    1
    Добрый день! Покупатель присылает заявку в Excel. Требуется на основании этого файла создать документ поступления (к нам) и реализации товара этому покупателю. За основу взял код из аналогичной внешней обработки. Попытался переделать ту часть кода, где указывается, что из каких ячеек файла брать. Вот переделанный код:
    Процедура Кнопка1Нажатие(Элемент)
    Если Вопрос("Табличная часть будет очищена. Заполнить данные из файла, продолжить?",РежимДиалогаВопрос.ДаНет,,КодВозвратаДиалога.Нет)=КодВозвратаДиалога.Нет Тогда
    Возврат;
    КонецЕсли;
    Сообщить("Открытие Excel-файла...");
    ТЧ_Пост.Очистить();
    ОбъектExcel =Неопределено;
    РабочаяКнига=Неопределено;
    Листы =Неопределено;
    СписокЛистов= Новый СписокЗначений();
    ФС = Новый Файл(ИмяФайла);
    Если ФС.Существует()=Истина Тогда
    ОбъектExcel= Новый COMОбъект("Excel.Application");
    РабочаяКнига=ОбъектExcel.Workbooks.Open(СокрЛП(ИмяФайла));
    Лист=РабочаяКнига.WorkSheets(1);
    Для СчЛ=1 По Лист.UsedRange.Rows.Count Цикл
    Сообщить("Чтение строки "+СчЛ);
    Попытка
    НомСтрТЗ = Число(СокрЛП(Лист.Cells(СчЛ,1).Value));
    СтрТЧ = ТЧ_Пост.Добавить();
    СтрТЧ.АртикулЗаказа = СокрЛП(Лист.Cells(СчЛ,6).Value);
    СтрТЧ.АртикулПоставки = СокрЛП(Лист.Cells(СчЛ,6).Value);
    СтрТЧ.Производитель = СокрЛП(Лист.Cells(СчЛ,4).Value);
    СтрТЧ.Товар = СокрЛП(Лист.Cells(СчЛ,7).Value);
    Номенклатура= НайтиНоменклатуру(СтрТЧ.АртикулПоставки,СтрТЧ.Товар,СтрТЧ.Производитель);
    СтрТЧ.Номенклатура = Номенклатура.Ссылка;
    СтрТЧ.Оптовик = СокрЛП(Лист.Cells(СчЛ,16).Value);
    Контрагент = НайтиКонтрагента(СтрТЧ.Оптовик);
    СтрТЧ.Контрагент = Контрагент.Ссылка;
    СтрТЧ.Количество = Число(СокрЛП(Лист.Cells(СчЛ,9).Value));
    СтрТЧ.Сумма = Число(СокрЛП(Лист.Cells(СчЛ,13).Value));
    СтрТЧ.Цена = Число(СокрЛП(Лист.Cells(СчЛ,12).Value));
    СтрТЧ.ЦенаРеализации = Число(СокрЛП(Лист.Cells(СчЛ,12).Value));
    СтрТЧ.СуммаРеализации = Число(СокрЛП(Лист.Cells(СчЛ,13).Value));
    СтрТЧ.Склад = ПолучитьСклад(СтрТЧ.Контрагент.Ссылка);
    КонецЕсли;
    Исключение
    КонецПопытки;
    КонецЦикла;
    РабочаяКнига.Close();
    Сообщить("Excel-файл закрыт");
    КонецЕсли;
    КонецПроцедуры
    Синтакс контроль выдает ошибку. В коде (Лист.Cells(СчЛ,12) цифрами обозначал номера столбцов, из которых нужно читать данные.
  2. nickpugachev
    Offline

    nickpugachev Профессионал в 1С Команда форума

    Регистрация:
    28 май 2012
    Сообщения:
    3.266
    Симпатии:
    131
    Баллы:
    104
    у вас там в ячейке скорее всего число, поэтому либо не делайте преодразований, либо учитывайте, что 1с при неявном переводе числа в строку вставляет неразрывные пробелы в качестве разделителя разрядов

    Код:
    СтрТЧ.Цена = Число(СтрЗаменить(СокрЛП(Лист.Cells(СчЛ,12).Value), Символы.НПП, ""));
  3. TopicStarter Overlay
    alexander4321
    Offline

    alexander4321

    Регистрация:
    19 мар 2013
    Сообщения:
    43
    Симпатии:
    0
    Баллы:
    1
    Не спеша посидел, подумал. В итоге не стал удалять никакие строки из кода оригинала, а просто заменил номера ячеек. В случае ненужных ячеек записывал заведомо неиспользуемый столбец, например, 50. Вот получившийся код:
    Код:
    Процедура Кнопка1Нажатие(Элемент)
    Если Вопрос("Табличная часть будет очищена. Заполнить данные из файла, продолжить?",РежимДиалогаВопрос.ДаНет,,КодВозвратаДиалога.Нет)=КодВозвратаДиалога.Нет Тогда
    Возврат;
    КонецЕсли;
    Сообщить("Открытие Excel-файла...");
    ТЧ_Пост.Очистить();
    ОбъектExcel =Неопределено;
    РабочаяКнига=Неопределено;
    Листы =Неопределено;
    СписокЛистов= Новый СписокЗначений();
    ФС = Новый Файл(ИмяФайла);
    Если ФС.Существует()=Истина Тогда
    ОбъектExcel= Новый COMОбъект("Excel.Application");    
    РабочаяКнига=ОбъектExcel.Workbooks.Open(СокрЛП(ИмяФайла));
    Лист=РабочаяКнига.WorkSheets(1);
    Для СчЛ=1 По Лист.UsedRange.Rows.Count Цикл
    Сообщить("Чтение строки "+СчЛ);
    Попытка
    НомСтрТЗ = Число(СокрЛП(Лист.Cells(СчЛ,1).Value));
    Если (НомСтрТЗ<>0) и (Найти(СокрЛП(Лист.Cells(СчЛ,16).Value),"====")<>0)Тогда
    СтрТЧ = ТЧ_Пост.Добавить();
    СтрТЧ.АртикулЗаказа = СокрЛП(Лист.Cells(СчЛ,6).Value);
    Если СокрЛП(Лист.Cells(СчЛ,50).Value)<>"" Тогда
    НачАрт = Найти(СокрЛП(Лист.Cells(СчЛ,50).Value),"{{")+2;
    КонАрт = Найти(СокрЛП(Лист.Cells(СчЛ,50).Value),"}}")-1;
    СтрТЧ.АртикулПоставки = Сред(СокрЛП(Лист.Cells(СчЛ,7).Value),НачАрт,КонАрт-НачАрт+1);
    Иначе
    СтрТЧ.АртикулПоставки = СокрЛП(Лист.Cells(СчЛ,6).Value);
    КонецЕсли;
    НачПр=Прав(СокрЛП(Лист.Cells(СчЛ,4).Value),СтрДлина(СокрЛП(Лист.Cells(СчЛ,4).Value))-Найти(СокрЛП(Лист.Cells(СчЛ,4).Value),"="));
    СтрТЧ.Производитель =  Лев(НачПр,Найти(НачПр,"=")-1);
    СтрТЧ.Товар = СокрЛП(Лист.Cells(СчЛ,7).Value);
    Номенклатура= НайтиНоменклатуру(СтрТЧ.АртикулПоставки,СтрТЧ.Товар,СтрТЧ.Производитель);
    СтрТЧ.Номенклатура = Номенклатура.Ссылка;
    СтрТЧ.Оптовик = Сред(СокрЛП(Лист.Cells(СчЛ,16).Value),1,Найти(СокрЛП(Лист.Cells(СчЛ,16).Value),"====")-1);
    Контрагент = НайтиКонтрагента(СтрТЧ.Оптовик);
    СтрТЧ.Контрагент = Контрагент.Ссылка;
    СтрТЧ.Количество = Число(СокрЛП(Лист.Cells(СчЛ,9).Value));
    СтрТЧ.Сумма = Число(СокрЛП(Лист.Cells(СчЛ,13).Value));
    СтрТЧ.Цена = ?(СтрТЧ.Количество<>0,СтрТЧ.Сумма/СтрТЧ.Количество,0);
    СтрТЧ.ЦенаРеализации = Число(СокрЛП(Лист.Cells(СчЛ,12).Value));
    СтрТЧ.СуммаРеализации = СтрТЧ.Количество*СтрТЧ.ЦенаРеализации;
    СтрТЧ.Склад = ПолучитьСклад(СтрТЧ.Контрагент.Ссылка);
    КонецЕсли;
    Исключение 
    КонецПопытки;
    КонецЦикла;
    РабочаяКнига.Close();
    Сообщить("Excel-файл закрыт");
    КонецЕсли;
    КонецПроцедуры
    Этот код работает, но почему-то не срабатывает функция по преобразованию артикулов товара:
    Код:
    Функция ПроверитьАртикул(НомАртикул)
    Арт = НомАртикул;
    Арт = СтрЗаменить(Арт," ",""); //пробел - код 32
    Арт = СтрЗаменить(Арт,"-","");
    Арт = СтрЗаменить(Арт,",","");
    Арт = СтрЗаменить(Арт,".","");
    Арт = СтрЗаменить(Арт,"\","");
    Арт = СтрЗаменить(Арт,"/","");
    Арт = СтрЗаменить(Арт,"/","");
    Арт = СтрЗаменить(Арт,"_","");
    Арт = СтрЗаменить(Арт,")","");
    Арт = СтрЗаменить(Арт,"(","");
    Арт = СтрЗаменить(Арт,"+","");
    Арт = СтрЗаменить(Арт,"=","");
    Арт = СтрЗаменить(Арт,"*","");
    Арт = СтрЗаменить(Арт,"@","");
    Арт = СтрЗаменить(Арт,"[","");
    Арт = СтрЗаменить(Арт,"]","");
    Арт = СтрЗаменить(Арт,"{","");
    Арт = СтрЗаменить(Арт,"}","");
    Арт = СтрЗаменить(Арт," ",""); //символ с кодом 160
    //Буквы
    Арт = ВРег(Арт);
    Арт = СтрЗаменить(Арт,"А","A");
    Арт = СтрЗаменить(Арт,"В","B");
    Арт = СтрЗаменить(Арт,"С","C");
    Арт = СтрЗаменить(Арт,"Е","E");
    Арт = СтрЗаменить(Арт,"О","O");
    Арт = СтрЗаменить(Арт,"К","K");
    Арт = СтрЗаменить(Арт,"Р","P");
    Арт = СтрЗаменить(Арт,"Н","H");
    Арт = СтрЗаменить(Арт,"Х","X");
    Арт = СтрЗаменить(Арт,"М","M");
    Возврат Арт; 
    КонецФункции
    В "оригинальной" обработке эта функция прекрасно работала. В коде я поменял только номера столбцов, ничего другого не трогал. Вот код "оригинальной" обработки:
    Код:
    Процедура Кнопка1Нажатие(Элемент)
    Если Вопрос("Табличная часть будет очищена. Заполнить данные из файла, продолжить?",РежимДиалогаВопрос.ДаНет,,КодВозвратаДиалога.Нет)=КодВозвратаДиалога.Нет Тогда
    Возврат;
    КонецЕсли;
    Сообщить("Открытие Excel-файла...");
    ТЧ_Пост.Очистить();
    ОбъектExcel =Неопределено;
    РабочаяКнига=Неопределено;
    Листы =Неопределено;
    СписокЛистов= Новый СписокЗначений();
    ФС = Новый Файл(ИмяФайла);
    Если ФС.Существует()=Истина Тогда
    ОбъектExcel= Новый COMОбъект("Excel.Application");    
    РабочаяКнига=ОбъектExcel.Workbooks.Open(СокрЛП(ИмяФайла));
    Лист=РабочаяКнига.WorkSheets(1);
    Для СчЛ=1 По Лист.UsedRange.Rows.Count Цикл
    Сообщить("Чтение строки "+СчЛ);
    Попытка
    НомСтрТЗ = Число(СокрЛП(Лист.Cells(СчЛ,1).Value));
    Если (НомСтрТЗ<>0) и (Найти(СокрЛП(Лист.Cells(СчЛ,5).Value),"====")<>0)Тогда
    СтрТЧ = ТЧ_Пост.Добавить();
    СтрТЧ.АртикулЗаказа = СокрЛП(Лист.Cells(СчЛ,4).Value);
    Если СокрЛП(Лист.Cells(СчЛ,7).Value)<>"" Тогда
    НачАрт = Найти(СокрЛП(Лист.Cells(СчЛ,7).Value),"{{")+2;
    КонАрт = Найти(СокрЛП(Лист.Cells(СчЛ,7).Value),"}}")-1;
    СтрТЧ.АртикулПоставки = Сред(СокрЛП(Лист.Cells(СчЛ,7).Value),НачАрт,КонАрт-НачАрт+1);
    Иначе
    СтрТЧ.АртикулПоставки = СокрЛП(Лист.Cells(СчЛ,4).Value);
    КонецЕсли;
    НачПр=Прав(СокрЛП(Лист.Cells(СчЛ,27).Value),СтрДлина(СокрЛП(Лист.Cells(СчЛ,27).Value))-Найти(СокрЛП(Лист.Cells(СчЛ,27).Value),"="));
    СтрТЧ.Производитель =  Лев(НачПр,Найти(НачПр,"=")-1);
    СтрТЧ.Товар = СокрЛП(Лист.Cells(СчЛ,6).Value);
    Номенклатура= НайтиНоменклатуру(СтрТЧ.АртикулПоставки,СтрТЧ.Товар,СтрТЧ.Производитель);
    СтрТЧ.Номенклатура = Номенклатура.Ссылка;
    СтрТЧ.Оптовик = Сред(СокрЛП(Лист.Cells(СчЛ,5).Value),1,Найти(СокрЛП(Лист.Cells(СчЛ,5).Value),"====")-1);
    Контрагент = НайтиКонтрагента(СтрТЧ.Оптовик);
    СтрТЧ.Контрагент = Контрагент.Ссылка;
    СтрТЧ.Количество = Число(СокрЛП(Лист.Cells(СчЛ,8).Value));
    СтрТЧ.Сумма = Число(СокрЛП(Лист.Cells(СчЛ,13).Value));
    СтрТЧ.Цена = ?(СтрТЧ.Количество<>0,СтрТЧ.Сумма/СтрТЧ.Количество,0);
    СтрТЧ.ЦенаРеализации = Число(СокрЛП(Лист.Cells(СчЛ,22).Value));
    СтрТЧ.СуммаРеализации = СтрТЧ.Количество*СтрТЧ.ЦенаРеализации;
    СтрТЧ.Склад = ПолучитьСклад(СтрТЧ.Контрагент.Ссылка);
    КонецЕсли;
    Исключение 
    КонецПопытки;
    КонецЦикла;
    РабочаяКнига.Close();
    Сообщить("Excel-файл закрыт");
    КонецЕсли;
    КонецПроцедуры
  4. nickpugachev
    Offline

    nickpugachev Профессионал в 1С Команда форума

    Регистрация:
    28 май 2012
    Сообщения:
    3.266
    Симпатии:
    131
    Баллы:
    104
    откуда вызывается эта функция? ни в исходном коде загрузки, ни в вашем исправленном ее вызова нет.
  5. TopicStarter Overlay
    alexander4321
    Offline

    alexander4321

    Регистрация:
    19 мар 2013
    Сообщения:
    43
    Симпатии:
    0
    Баллы:
    1
    Почему то в окне обработки (исправленной) в некоторых артикулах появились пробелы. Но в документах поступления и реализации все нормально. Сейчас попробовал, как документы создаются, на первый взгляд все нормально. Завтра у бухгалтера спрошу. Видимо, меня смутило, что в окне обработки артикул видоизменился (пробелы появились).
    Спасибо за помощь!
  6. nickpugachev
    Offline

    nickpugachev Профессионал в 1С Команда форума

    Регистрация:
    28 май 2012
    Сообщения:
    3.266
    Симпатии:
    131
    Баллы:
    104
    скорее всего, опять же, там появились неразрывные пробелы
    в эту функцию добавьте строку
    Код:
    Арт = СтрЗаменить(Арт,Символы.НПП,"");
    и они с большой вероятностью пропадут
  7. TopicStarter Overlay
    alexander4321
    Offline

    alexander4321

    Регистрация:
    19 мар 2013
    Сообщения:
    43
    Симпатии:
    0
    Баллы:
    1
    Не пропали. Использовал переменные артикула заказа и артикула поставки
    Код:
    АртикулЗаказа = СтрЗаменить(АртикулЗаказа,Символы.НПП,"");
    АртикулПоставки = СтрЗаменить(АртикулПоставки,Символы.НПП,"");
    Увидел еще один косячок. В "оригинальной" обработке название производителя бралось поиском значения после символа =
    Код:
    СтрТЧ.Производитель =  Лев(НачПр,Найти(НачПр,"=")-1);
    А мне нужно просто брать это значение из 4 столбца. Не подскажете, как правильно переписать эту строчку? Спасибо!
  8. nickpugachev
    Offline

    nickpugachev Профессионал в 1С Команда форума

    Регистрация:
    28 май 2012
    Сообщения:
    3.266
    Симпатии:
    131
    Баллы:
    104
    Код:
    СтрТЧ.Производитель = СокрЛП(Лист.Cells(СчЛ,4).Value);
  9. TopicStarter Overlay
    alexander4321
    Offline

    alexander4321

    Регистрация:
    19 мар 2013
    Сообщения:
    43
    Симпатии:
    0
    Баллы:
    1
    Закомментировал
    Код:
    //НачПр=Прав(СокрЛП(Лист.Cells(СчЛ,4).Value),СтрДлина(СокрЛП(Лист.Cells(СчЛ,4).Value))-Найти(СокрЛП(Лист.Cells(СчЛ,4).Value),"="));
    //СтрТЧ.Производитель =  Лев(НачПр,Найти(НачПр,"=")-1);
    Добавил строку
    Код:
    СтрТЧ.Производитель =  СокрЛП(Лист.Cells(СчЛ,4).Value);
    Все работает. Спасибо!

Поделиться этой страницей