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

Хранилище

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

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



> Загрузка выписок из клиент банка в формате excel , для бух 2.0          
burza Подменю пользователя
сообщение 30.10.19, 9:12
Сообщение #1

Оратор
*****
Группа: Пользователи
Сообщений: 312
Спасибо сказали: 1 раз
Рейтинг: 1

есть внешняя обработка для каждого банка вот это для укрсиба (exel) тут обрабатываем и передаем в основную выгрузку
Код
Функция ИмпортXLXS(ПараметрыФормата) 

    
    ИмяФайла = ПараметрыФормата.ИмяФайла;

    Попытка    
        Excel = Новый COMОбъект("Excel.Application");
        WB   =  Excel.Workbooks.Open(ИмяФайла);
        WS = WB.Worksheets(1);
        arr = WS.UsedRange.Value;
        WB.Close(0);
        
    Исключение
     Возврат Неопределено;    
    КонецПопытки;
    
    
    МассивКолонок = arr.Выгрузить();
    ВсегоСтрок = (МассивКолонок.Получить(0).Количество()) - 1;
    
    
    тзВыписка =  Новый ТаблицаЗначений;
    тзВыписка.Колонки.Добавить("НомерПП");
    тзВыписка.Колонки.Добавить("Приход");
    тзВыписка.Колонки.Добавить("Расход");
    тзВыписка.Колонки.Добавить("ОКПО",Новый ОписаниеТипов("Число"));
    тзВыписка.Колонки.Добавить("Контрагент");
    тзВыписка.Колонки.Добавить("МФО");
    тзВыписка.Колонки.Добавить("РСчет");
    тзВыписка.Колонки.Добавить("Содержание");
    тзВыписка.Колонки.Добавить("ДатаПП");


    Для СтрокаТП = 0 По ВсегоСтрок Цикл
        
        НовСтрока = тзВыписка.Добавить();
        
        НовСтрока.Контрагент    = СокрЛП(МассивКолонок.Получить(10).Получить(СтрокаТП));
        НовСтрока.ОКПО            = СокрЛП(МассивКолонок.Получить(9).Получить(СтрокаТП));
        НовСтрока.МФО             = СокрЛП(МассивКолонок.Получить(1).Получить(СтрокаТП));
        НовСтрока.РСчет            = СокрЛП(МассивКолонок.Получить(8).Получить(СтрокаТП));
        НовСтрока.НомерПП         = СокрЛП(МассивКолонок.Получить(11).Получить(СтрокаТП));
        НовСтрока.ДатаПП        = СокрЛП(МассивКолонок.Получить(12).Получить(СтрокаТП));
        НовСтрока.Содержание     = СокрЛП(МассивКолонок.Получить(15).Получить(СтрокаТП));
        НовСтрока.Приход         = СокрЛП(МассивКолонок.Получить(14).Получить(СтрокаТП));
        НовСтрока.Расход         = СокрЛП(МассивКолонок.Получить(13).Получить(СтрокаТП));


    КонецЦикла;
    

        Возврат тзВыписка;
    
    
КонецФункции


А это уже на форме
Код
&НаСервере
Функция ИмпортВыпискиСервер(АдресХранилища, АдресХранилищаФайла)
    
    
    Если НЕ ТекущийФайлФорматаОбменаСуществует Тогда
        Сообщить("Файл формата " + Объект.ФорматОбмена + " не найден");
        Возврат Неопределено;
    КонецЕсли;    
    
    
    
    ВнешняяОбработкаОбъект = ПодключитьВнешнююОбработку(АдресХранилища);
    
    // 1.1 Сохраняем значения для выбранного формата
    // Вызываем функцию СохранитьЗначения для формата
    
    ПараметрыВызова = Новый Структура;
    ПараметрыВызова.Вставить("Режим",                 "Импорт");
    ПараметрыВызова.Вставить("Организация",         Объект.Организация);
    ПараметрыВызова.Вставить("ТекущееИмяФайла",     Объект.ИмяФайлаИмпорт);
    ПараметрыВызова.Вставить("КодВБанке",             Объект.КодВБанке); // если есть
    ПараметрыВызова.Вставить("ТекущийТипФайла",     Объект.ТипФайлаИмпорт);
    ПараметрыВызова.Вставить("КодировкаФайла",         Объект.КодировкаФайлаИмпорт);

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

    
    //Попытка
    //    тзВыписка = ВнешняяОбработкаОбъект.ИмпортВыписки(ПараметрыФормата);
    //Исключение
    //    Сообщить("Ошибка импорта: ");
    //    Возврат Неопределено;
    //КонецПопытки;
    //
    // Если произошла ошибка
    //Если тзВыписка = Неопределено ИЛИ ТипЗнч(тзВыписка) <> Тип("ТаблицаЗначений") Тогда
    //    Если ТипЗнч(тзВыписка) = Тип("Строка") И ЗначениеЗаполнено(тзВыписка) Тогда
    //        Сообщить(тзВыписка);
    //    Иначе
    //        Сообщить("Не загружено");
    //    КонецЕсли;    
    //    Возврат Неопределено;
    //КонецЕсли;    
    //
    
    // 4. Обрабатываем таблицу платежей
    // (перекодировка, только входящие, ищем юрфизлиц, контрагентов, сделки, заказы, договора)
    
    тзПлатежи = Объект.тчИмпорт.Выгрузить();
    тзПлатежи.Очистить();
    
    ПерекодировкаИмпорта = ВнешняяОбработкаОбъект.ПерекодировкаИмпорта();
    
    Для Каждого Строка Из тзВыписка Цикл
        
        // проверяем на только входящие платежи
        Если Объект.НастройкаИмпортТолькоВходящихПлатежей Тогда
            Если Число(Строка.Расход) > 0 Тогда
                Продолжить;    
            КонецЕсли;
        КонецЕсли;
        
        НоваяСтрока = тзПлатежи.Добавить();
        
        // перекодировка
        Если ПерекодировкаИмпорта Тогда
            Строка.Контрагент = ЗаменитьСимволы(Строка.Контрагент);    
            Строка.Содержание = ЗаменитьСимволы(Строка.Содержание);        
        КонецЕсли;    
        
        НоваяСтрока.Приход          = Строка.Приход;
        НоваяСтрока.Расход          = Строка.Расход;
        
        НоваяСтрока.НомерПП            = Строка.НомерПП;
        НоваяСтрока.ДатаПП            = Строка.ДатаПП;
        
        
        //Если  Объект.ДатаВыписки < Строка.ДатаПП Тогда
        //    
        //    Продолжить;
        //    
        //Иначе    
        //    
        //Сообщить("не ок")
        //
        //КонецЕсли;
        
          
        // 4.1. Определение контрагента
        // Ищем по коду ЕДРПОУ (в дальнейшем ОКПО):
        ВыборкаПоОКПО = НайтиПоОКПО(Строка.ОКПО, Строка.Контрагент);
        НайденКонтрагент = Ложь;
        Если ВыборкаПоОКПО.Следующий() Тогда //есть хоть один
            
            Контрагент     = ВыборкаПоОКПО.Ссылка;
            НайденКонтрагент = Истина;
            
        Иначе
            
            // в зависимости от флага
            // "АвтоСозданиеКонтрагента" создаем новые элементы справочника Контрагенты
            
            Если Объект.НастройкаАвтоСозданиеКонтрагента Тогда
                
                ПР = ?(Строка.Приход = 0, "Р", "П");
                
                Реквизиты = Новый Структура;
                Реквизиты.Вставить("Наименование", Строка.Контрагент);
                Реквизиты.Вставить("ПР", ПР); //Приход ("П") или расход ("Р")
                Реквизиты.Вставить("ОКПО",     Строка.ОКПО);
                Реквизиты.Вставить("РСчет", Строка.РСчет);
                Реквизиты.Вставить("МФО",     Строка.МФО);
                            
                //Создаём нового контрагента в справочнике
                Контрагент = СоздатьСпрКонтрагент(Реквизиты);
            Иначе
                // ПустаяСсылка
                Контрагент = Справочники.Контрагенты.ПустаяСсылка();
            КонецЕсли;    
            
        КонецЕсли;    
        
        НоваяСтрока.Контрагент         = Контрагент;
        
        // 4.2. Определение сделки, заказа, договора.        
        ПриходРасход = "";
        Если НоваяСтрока.Приход > 0 Тогда
            ПриходРасход = "Приход";
            Если Объект.Конфигурация = "УТ" Тогда
                ВидДокумента = "ПоступлениеБезналичныхДенежныхСредств";    
            ИначеЕсли  Объект.Конфигурация = "БУ" Тогда
                ВидДокумента = "ПоступлениеНаРасчетныйСчет";    
            КонецЕсли;
            
        ИначеЕсли НоваяСтрока.Расход > 0 Тогда    
            ПриходРасход = "Расход";
            Если Объект.Конфигурация = "УТ" Тогда
                ВидДокумента = "СписаниеБезналичныхДенежныхСредств";
            ИначеЕсли  Объект.Конфигурация = "БУ" Тогда
                ВидДокумента = "СписаниеСРасчетногоСчета";    
            КонецЕсли;
            
        КонецЕсли;    
        
        НоваяСтрока.ВидДокумента     = ВидДокумента;
        
        //НоваяСтрока.ВидОперации = ОпределитьВидОперации(ВидДокумента);
        НоваяСтрока.ВидОперации                 = ПолучитьНастройкуЗаполнения("ВидОперации", ВидДокумента);
        НоваяСтрока.СтатьяДДС                     = ПолучитьНастройкуЗаполнения("СтатьяДДС", ВидДокумента);
        НоваяСтрока.Подразделение                 = ПолучитьНастройкуЗаполнения("Подразделение", ВидДокумента);
        НоваяСтрока.СтатьяДоходовИлиРасходов     = ПолучитьНастройкуЗаполнения("СтатьяДоходовИлиРасходов", ВидДокумента);
        Если Объект.Конфигурация = "БУ" Тогда
            НоваяСтрока.СтавкаНДС                     = ПолучитьНастройкуЗаполнения("СтавкаНДС", ВидДокумента);    
        КонецЕсли;
        
        Если Объект.Конфигурация = "УТ" Тогда
            НоваяСтрока.ТипДокумента                 = ПолучитьНастройкуЗаполнения("ТипДокумента", ВидДокумента);
        КонецЕсли;
        
        СписокВидовДоговоров = клОпределитьВидДоговораСКонтрагентом(ПолучитьНастройкуЗаполнения("ВидОперации", ВидДокумента));
        Договор        = НайтиДоговорКонтрагента(Контрагент,Объект.Организация,СписокВидовДоговоров);

        НоваяСтрока.Договор         = Договор;
        
        НоваяСтрока.Содержание         = СокрЛП(Строка.Содержание);
                
        // по счету ищем банковский счет для контрагента. Если нет - создать.
        НоваяСтрока.СчетКонтрагента = НайтиСчетКонтрагента(Строка.РСчет, Контрагент);
        Если НЕ ЗначениеЗаполнено(НоваяСтрока.СчетКонтрагента) Тогда
            НоваяСтрока.СчетКонтрагента = ДобавитьСчетКонтрагента(Контрагент, Строка.РСчет, Строка.МФО);
        КонецЕсли;    
            
        // определяем статус
        Если НЕ ЗначениеЗаполнено(НоваяСтрока.Контрагент) Тогда
            НоваяСтрока.Статус = СтатусыСтрокИмпорта.НеобходимоЗаполнитьРеквизиты;
        Иначе
            НоваяСтрока.Статус = СтатусыСтрокИмпорта.ГотовКЗаписи;
        КонецЕсли;
        
    КонецЦикла;    
    
    // Ищем среди неоплаченных ППИсх с совпадением суммы и номера ПП (то есть те, которые вернулись из банка и их необходимо обновить).
    // Для таких проставим статус СуществующийПлатежНеобходимоОплатить
    МассивУдаляемыхСтрок = Новый Массив;
    
    Для Каждого СтрокаИмпорт Из Объект.тчИмпорт Цикл
        
        Если СтрокаИмпорт.Оплачен Или СтрокаИмпорт.ВидДокумента <> "СписаниеБезналичныхДенежныхСредств" Тогда
            Продолжить;
        КонецЕсли;
        
        Для Каждого Строка Из тзПлатежи Цикл
            Если Строка.Контрагент = СтрокаИмпорт.Контрагент Тогда
                
                Если (Строка.Расход > 0) И (СтрокаИмпорт.Расход  > 0) И (Строка.Расход  = СтрокаИмпорт.Расход ) Тогда
                    // номер ПП есть в файле и совпадает с текущим
                    Если ЗначениеЗаполнено(Строка.НомерПП) И Строка.НомерПП <> СтрокаИмпорт.НомерПП Тогда
                        Продолжить;
                    КонецЕсли;    
                    
                    Если МассивУдаляемыхСтрок.Найти(Строка) = Неопределено Тогда
                        МассивУдаляемыхСтрок.Добавить(Строка);
                    КонецЕсли;    
                    
                    СтрокаИмпорт.Статус = СтатусыСтрокИмпорта.СуществующийПлатежНеобходимоОплатить;
                    Прервать;
                КонецЕсли;    
                
            КонецЕсли;    
            
        КонецЦикла;    
        
    КонецЦикла;    
    
    Для Каждого ЭлементМассива Из МассивУдаляемыхСтрок Цикл
        тзПлатежи.Удалить(ЭлементМассива);
    КонецЦикла;
    
    // 4.5 Удаляем с тзПлатежи, те которые уже есть в тчИмпорт
    // (совпадение по Контрагенту и приходу-расходу)
    
    МассивУдаляемыхСтрок = Новый Массив;
    
    Для Каждого Строка Из тзПлатежи Цикл
        ПервоеСовпадениеПриход = Истина;
        ПервоеСовпадениеРасход = Истина;
        Для Каждого СтрокаИмпорт Из Объект.тчИмпорт Цикл
            
            СтрокаСравнения = "Контрагент";
            Если (Строка[СтрокаСравнения] = СтрокаИмпорт[СтрокаСравнения]) Тогда
                // приход-расход
                Если (Строка.Приход > 0) И (СтрокаИмпорт.Приход > 0) И (Строка.Приход = СтрокаИмпорт.Приход) Тогда
                    // номер ПП есть в файле и совпадает с текущим
                    Если ЗначениеЗаполнено(Строка.НомерПП) И Строка.НомерПП <> СтрокаИмпорт.НомерПП Тогда
                        Продолжить;
                    КонецЕсли;    
                    // совпало
                    Если ПервоеСовпадениеПриход Тогда
                        // эту строку из тзПлатежи удаляем
                        МассивУдаляемыхСтрок.Добавить(Строка);
                        ПервоеСовпадениеПриход = Ложь;
                    КонецЕсли;
                КонецЕсли;
                Если (Строка.Расход > 0) И (СтрокаИмпорт.Расход  > 0) И (Строка.Расход  = СтрокаИмпорт.Расход ) Тогда
                    // номер ПП есть в файле и совпадает с текущим
                    Если ЗначениеЗаполнено(Строка.НомерПП) И Строка.НомерПП <> СтрокаИмпорт.НомерПП Тогда
                        Продолжить;
                    КонецЕсли;    
                    // совпало
                    Если ПервоеСовпадениеРасход  Тогда
                        // эту строку из тзПлатежи удаляем
                        МассивУдаляемыхСтрок.Добавить(Строка);
                        ПервоеСовпадениеРасход  = Ложь;
                    КонецЕсли;
                КонецЕсли;
            КонецЕсли;
        КонецЦикла;
    КонецЦикла;
    
    Для Каждого ЭлементМассива Из МассивУдаляемыхСтрок Цикл
        тзПлатежи.Удалить(ЭлементМассива);
    КонецЦикла;
    
    
    // 5. Объединяем с тчИмпорт, в которой сейчас существующие платежи. Устанавливаем статусы
    Для Каждого Строка Из тзПлатежи Цикл  
        НоваяСтрока = Объект.тчИмпорт.Добавить();
        
        ЗаполнитьЗначенияСвойств(НоваяСтрока, Строка);

        НоваяСтрока.Оплачен = Истина;
        НоваяСтрока.Флаг = Истина;
        
    КонецЦикла;        
    
    // 6. Сортируем тчИмпорт
    СортировкаТчИмпорт();
    
    
    //7. Удаление пустых строк
    ЕстьПустые = Истина;
   Пока ЕстьПустые цикл
    ЕстьПустые = Ложь;
    Для Каждого Сч из Объект.ТчИмпорт Цикл
    Если Сч.ВидДокумента = "" Тогда
        Объект.ТчИмпорт.Удалить(Сч);
        ЕстьПустые = Истина;
    КонецЕсли;
    КонецЦикла;
   КонецЦикла;

КонецФункции


на локальной версии все ок. на сервере ошибка Итератор не определен. вот сюда кидает( Для Каждого Строка Из тзВыписка Цикл) поправьте где ошибка.

Сообщение отредактировал Vofka - 30.10.19, 9:29

Petre Подменю пользователя
сообщение 30.10.19, 9:25
Сообщение #2

Живет на форуме
Иконка группы
Группа: Местный
Сообщений: 2905
Из: Київ, Україна
Спасибо сказали: 1147 раз
Рейтинг: 1228.9

Ошибка означает, что тзВыписка - не коллекция, не объект с элементами.
Предполагаю, ошибка где-то в попытке, и в тзВыписка функция возвращает Неопределено.
Если вы говорите, что на сервере, где работает Сервер 1с:Предприятия, установлен Excel, то, возможно, какой-то из используемых вами Excel-методов выдает ошибку.


Signature
Допрацьовую:
- "Бухгалтерія для України 2.1";
- "Альфа-Авто: Автосалон+Автосервіс+Автозапчастини, українська версія".

burza Подменю пользователя
сообщение 30.10.19, 9:33
Сообщение #3

Оратор
*****
Группа: Пользователи
Сообщений: 312
Спасибо сказали: 1 раз
Рейтинг: 1

Petre @ Сегодня, 10:25 * ,
я его сносил, не решает это проблему
тажа обработка тажа выписка. на локалке работает на сервере нет

Petre Подменю пользователя
сообщение 30.10.19, 10:53
Сообщение #4

Живет на форуме
Иконка группы
Группа: Местный
Сообщений: 2905
Из: Київ, Україна
Спасибо сказали: 1147 раз
Рейтинг: 1228.9

QUOTE (burza @ 30.10.19, 9:33) *
я его сносил

Я не понимаю, о чем вы.

Добавьте в исключение попытки Сообщить(ОписаниеОшибки()); и посмотрите, что там творится.


Signature
Допрацьовую:
- "Бухгалтерія для України 2.1";
- "Альфа-Авто: Автосалон+Автосервіс+Автозапчастини, українська версія".

onsamuy Подменю пользователя
сообщение 30.10.19, 11:32
Сообщение #5

Оратор
Иконка группы
Группа: Местный
Сообщений: 264
Спасибо сказали: 69 раз
Рейтинг: 0

платформа 1с 8.3 уже давно умеет читать таблицы ексель. Пора отказываться от COMОбъект("Excel.Application") ...

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


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

 

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