8.х Внешняя обработка для чтения Excel файлов

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

  1. TopicStarter Overlay
    alexander4321
    Offline

    alexander4321

    Регистрация:
    19 мар 2013
    Сообщения:
    43
    Симпатии:
    0
    Баллы:
    1
    Добрый день! Требуется изменить код внешней обработки для чтения Excel файлов. В частности, в Excel файле в определенном столбце название производителя указано в скобках
    Код:
    3C (CAR-DEX)
    
    В данном случае производителем является CAR-DEX.
    На данный момент код чтения из данного столбца имеет вид
    Код:
    СтрТЧ.Производитель =  СокрЛП(Лист.Cells(СчЛ,2).Value);
    Нужно, чтобы за название производителя бралось то, что внутри скобок. Спасибо!
  2. nbIpKuH_BaH9I
    Online

    nbIpKuH_BaH9I Модераторы Команда форума Модератор

    Регистрация:
    16 сен 2009
    Сообщения:
    6.991
    Симпатии:
    399
    Баллы:
    104
    Т.е. у Вас в файле ексель наименование в скобках указано? Если так, то просто отсеките первый и последний символ и все.
  3. TopicStarter Overlay
    alexander4321
    Offline

    alexander4321

    Регистрация:
    19 мар 2013
    Сообщения:
    43
    Симпатии:
    0
    Баллы:
    1
    А можно образец кода? Не знаю синтаксис языка 1С. Спасибо!
  4. TopicStarter Overlay
    alexander4321
    Offline

    alexander4321

    Регистрация:
    19 мар 2013
    Сообщения:
    43
    Симпатии:
    0
    Баллы:
    1
    Производитель указан в скобках, но перед и после скобок могут быть еще и другие символы. Нужно именно то, что внутри скобок.
  5. nbIpKuH_BaH9I
    Online

    nbIpKuH_BaH9I Модераторы Команда форума Модератор

    Регистрация:
    16 сен 2009
    Сообщения:
    6.991
    Симпатии:
    399
    Баллы:
    104
    Ну если так как я говорил. То что-то типа этого
    Код:
    СтрТЧ.Производитель =  СокрЛП(Прав(Лев(Лист.Cells(СчЛ,2).Value), СтрДлина(СокрЛП(Лист.Cells(СчЛ,2).Value)) - 1), СтрДлина(СокрЛП(Лист.Cells(СчЛ,2).Value)) - 1));
    Писал на коленке.
  6. nbIpKuH_BaH9I
    Online

    nbIpKuH_BaH9I Модераторы Команда форума Модератор

    Регистрация:
    16 сен 2009
    Сообщения:
    6.991
    Симпатии:
    399
    Баллы:
    104
    Могу ошибиться. Проверьте...
  7. nbIpKuH_BaH9I
    Online

    nbIpKuH_BaH9I Модераторы Команда форума Модератор

    Регистрация:
    16 сен 2009
    Сообщения:
    6.991
    Симпатии:
    399
    Баллы:
    104
    Здесь тогда сложнее. А если будет еще скобка где нибудь. Тогда уже ничего не сделаешь. Это же строка обычная.
  8. nbIpKuH_BaH9I
    Online

    nbIpKuH_BaH9I Модераторы Команда форума Модератор

    Регистрация:
    16 сен 2009
    Сообщения:
    6.991
    Симпатии:
    399
    Баллы:
    104
    Если в ячейке всегда что то типа этого (по шаблону) "лдвыаов (выадлвыожд)". То, то что в скобках можно выдернуть легко.
  9. jonsony
    Offline

    jonsony Опытный в 1С Заблокирован

    Регистрация:
    16 апр 2009
    Сообщения:
    224
    Симпатии:
    25
    Баллы:
    29
    а можно так
    Код:
    СтрТЧ.Производитель =  СокрЛП(Сред(СокрЛП(Лист.Cells(СчЛ,2).Value),2,СтрДлина(СокрЛП(Лист.Cells(СчЛ,2).Value-2));
    
  10. TopicStarter Overlay
    alexander4321
    Offline

    alexander4321

    Регистрация:
    19 мар 2013
    Сообщения:
    43
    Симпатии:
    0
    Баллы:
    1
    Попробовал первый и второй вариант: в одном случае требует запятую поставить, в другом скобку (пробовал, не помогло).
    Вот весь текст процедуры (добавил оба варианта кода):
    Код:
    Процедура Кнопка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(СчЛ,2).Value);
                        СтрТЧ.Производитель =  СокрЛП(Сред(СокрЛП(Лист.Cells(СчЛ,2).Value),2,СтрДлина(СокрЛП(Лист.Cells(СчЛ,2).Value-2));
                        //СтрТЧ.Производитель =  СокрЛП(Прав(Лев(Лист.Cells(СчЛ,2).Value), СтрДлина(СокрЛП(Лист.Cells(СчЛ,2).Value)) - 1), СтрДлина(СокрЛП(Лист.Cells(СчЛ,2).Value)) - 1));
                        СтрТЧ.Товар = СокрЛП(Лист.Cells(СчЛ,3).Value);
                        Номенклатура= НайтиНоменклатуру(СтрТЧ.АртикулПоставки,СтрТЧ.Товар,СтрТЧ.Производитель);
                        СтрТЧ.Номенклатура = Номенклатура.Ссылка;
                        СтрТЧ.Оптовик = Сред(СокрЛП(Лист.Cells(СчЛ,7).Value),1,Найти(СокрЛП(Лист.Cells(СчЛ,7).Value),"====")-1);
                        Контрагент = НайтиКонтрагента(СтрТЧ.Оптовик);
                        СтрТЧ.Контрагент = Контрагент.Ссылка;
                        СтрТЧ.Количество = Число(СокрЛП(Лист.Cells(СчЛ,4).Value));
                        СтрТЧ.Сумма = Число(СокрЛП(Лист.Cells(СчЛ,6).Value));
                        СтрТЧ.Цена = ?(СтрТЧ.Количество<>0,СтрТЧ.Сумма/СтрТЧ.Количество,0);
                        СтрТЧ.ЦенаРеализации = Число(СокрЛП(Лист.Cells(СчЛ,5).Value));
                        СтрТЧ.СуммаРеализации = СтрТЧ.Количество*СтрТЧ.ЦенаРеализации;
                        СтрТЧ.Склад = ПолучитьСклад(СтрТЧ.Контрагент.Ссылка);
                    КонецЕсли;
                Исключение   
                КонецПопытки;
            КонецЦикла;
            РабочаяКнига.Close();
            Сообщить("Excel-файл закрыт");
        КонецЕсли;
    КонецПроцедуры
    
  11. nbIpKuH_BaH9I
    Online

    nbIpKuH_BaH9I Модераторы Команда форума Модератор

    Регистрация:
    16 сен 2009
    Сообщения:
    6.991
    Симпатии:
    399
    Баллы:
    104
    Что именно не помогло? Ошибка? В платформе есть встроенная проверка на синтаксис. Она показывает на ошибки.
  12. TopicStarter Overlay
    alexander4321
    Offline

    alexander4321

    Регистрация:
    19 мар 2013
    Сообщения:
    43
    Симпатии:
    0
    Баллы:
    1
    Вот текст ошибки
    Код:
    {Форма.Форма.Форма(196,68)}: Ожидается символ ','
                        СтрТЧ.Производитель =  СокрЛП(Прав(Лев(Лист.Cells(СчЛ,2).Value<<?>>), СтрДлина(СокрЛП(Лист.Cells(СчЛ,2).Value)) - 1), СтрДлина(СокрЛП(Лист.Cells(СчЛ,2).Value)) - 1)); (Проверка: Толстый клиент (обычное приложение))
    
    
    Если ставлю запятую в указанное место, то уже выдает ошибку "Ожидается выражение..."
  13. nbIpKuH_BaH9I
    Online

    nbIpKuH_BaH9I Модераторы Команда форума Модератор

    Регистрация:
    16 сен 2009
    Сообщения:
    6.991
    Симпатии:
    399
    Баллы:
    104
    Замените на это
    Код:
    ЗначениеЯчейки =Лист.Cells(СчЛ,2).Value;
    ЛевоеЗначение = Лев((СокрЛП(ЗначениеЯчейки)), СтрДлина(СокрЛП(ЗначениеЯчейки) - 1));
    ПравоеЗначение = Прав((СокрЛП(ЛевоеЗначение)), СтрДлина(СокрЛП(ЛевоеЗначение) - 1));
    СтрТЧ.Производитель =  СокрЛП(ПравоеЗначение);
    
    Также пишу на коленке
  14. TopicStarter Overlay
    alexander4321
    Offline

    alexander4321

    Регистрация:
    19 мар 2013
    Сообщения:
    43
    Симпатии:
    0
    Баллы:
    1
    Так синтаксических ошибок не выдает. Сейчас буду пробовать. Спасибо!
  15. TopicStarter Overlay
    alexander4321
    Offline

    alexander4321

    Регистрация:
    19 мар 2013
    Сообщения:
    43
    Симпатии:
    0
    Баллы:
    1
    Попробовал сегодня, не получилось. Все значения, которые запрашиваются до этого кода (номер строки, артикул поставки) выводятся в окне обработки. Данные, вычисляемые этим кодом, и последующими строками кода - не выводятся. Вот код всей процедуры, строку оригинального кода, где название производителя берется просто из ячейки, я закомментировал. Ниже этой строки я вставил присланный вами код для определения названия производителя внутри скобок.
    Код:
    Процедура Кнопка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;
                        ЛевоеЗначение = Лев((СокрЛП(ЗначениеЯчейки)), СтрДлина(СокрЛП(ЗначениеЯчейки) - 1));
                        ПравоеЗначение = Прав((СокрЛП(ЛевоеЗначение)), СтрДлина(СокрЛП(ЛевоеЗначение) - 1));
                        СтрТЧ.Производитель =  СокрЛП(ПравоеЗначение);
                        СтрТЧ.Товар = СокрЛП(Лист.Cells(СчЛ,7).Value);
                        Номенклатура= НайтиНоменклатуру(СтрТЧ.АртикулПоставки,СтрТЧ.Товар,СтрТЧ.Производитель);
                        СтрТЧ.Номенклатура = Номенклатура.Ссылка;
                        СтрТЧ.Оптовик = Сред(СокрЛП(Лист.Cells(СчЛ,16).Value),1,Найти(СокрЛП(Лист.Cells(СчЛ,16).Value),"====")-1);
                        Контрагент = НайтиКонтрагента(СтрТЧ.Оптовик);
                        СтрТЧ.Контрагент = Контрагент.Ссылка;
                        СтрТЧ.Количество = Число(СокрЛП(Лист.Cells(СчЛ,9).Value));
                        СтрТЧ.Сумма = Число(СокрЛП(Лист.Cells(СчЛ,13).Value));
                        СтрТЧ.Цена = ?(СтрТЧ.Количество<>0,СтрТЧ.Сумма/СтрТЧ.Количество,0);
                        //СтрТЧ.Цена = Число(СтрЗаменить(СокрЛП(Лист.Cells(СчЛ,12).Value), Символы.НПП, ""));
                        СтрТЧ.ЦенаРеализации = Число(СокрЛП(Лист.Cells(СчЛ,12).Value));
                        СтрТЧ.СуммаРеализации = СтрТЧ.Количество*СтрТЧ.ЦенаРеализации;
                        СтрТЧ.Склад = ПолучитьСклад(СтрТЧ.Контрагент.Ссылка);
                    КонецЕсли;
                Исключение   
                КонецПопытки;
            КонецЦикла;
            РабочаяКнига.Close();
            Сообщить("Excel-файл закрыт");
        КонецЕсли;
    КонецПроцедуры
    

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