Имя: Пароль:
1C
1С v8
Обработка загрузки из Excel глючит на серверной базе и корректно работает на файл
0 Soul771
 
22.11.16
13:16
Доброго дня.
Столкнулась сегодня с очень странным для меня явлением, ума не приложу, куда копать даже......
Есть обработка, считывает exel-вский файл продаж, сначала в таблицу значений, после чего таблицу значений сворачивает по полям номенклатура, ед изм, ндс, цена, дата, суммирует количество и создает документ Отчет о розничных продажах в 1С. Вроде самая обычная простая обработка...... Суть свертки таблицы значений - занести все продажи за день в 1 документ, а не разбрасывать по чекам. Дата предварительно преобразуется, чтобы время во всех строках было одинаковое.
В чем косяк.... На файловой базе, на свежей, только что снятой у клиента копии .dt все отрабатывает идеально. У клиента - создается куча документов, т.е. свертка таблицы значений не срабатывает.... Даты созданных документов - вразброс. Ковыряюсь отладчиком, дабы выявить какую-то закономерность,но, честн говоря, сам факт того, что один и тот же, простой вроде совсем код по-разному повел себя в файловом и серверном варианте - для меня непонятно....
Подскажите что-нибудь, пожалуйста..... Или пристыдите и ткните куда почитать, если вопрос тривиальный(((( У клиента толком в отладчике не посидишь- работают в базе, вот пытаюсь понять хотя бы,как так, что код один, база одна, результат - разный...Код обработки выложу, если нужно.Запускала и под толстым и под тонким клиентами.... Версии платформ отличаются 8.3.6 - у клиента и 8.3.9.1818 у меня.
1 Defender aka LINN
 
22.11.16
13:19
(0) "Версии платформ отличаются"
Какой смысл в дальнейшем разговоре вообще?
2 Soul771
 
22.11.16
13:21
(1) - а как версия платформы влияет на ТЗ.Свернуть("Номенкл,СтавкаНДС,ЕдИзм, Цена,Дата","Кол");
?.....
в СП ничего про это....
3 b_ru
 
22.11.16
13:22
Самый вероятный косяк - файл загружается по адресу "C:\bla-bla", а не с сетевой шары. И на сервере на месте вашего файлика лежит что-нить с тем же именем.
4 RomaH
 
naïve
22.11.16
13:22
дату как к дате приводишь?
5 RomaH
 
naïve
22.11.16
13:23
Суть свертки таблицы значений - занести все продажи за день в 1 документ
т.е. у тебя разные даты из екселя приводятся на начало дня
вот как?
6 RomaH
 
naïve
22.11.16
13:23
Даты созданных документов - вразброс.
7 Pahomich
 
22.11.16
13:26
Первым делом надоть платформу у клиента обновить...
8 elCust
 
22.11.16
13:27
(0) Гадание на кофейной гуще на самом деле.
9 Pahomich
 
22.11.16
13:27
(7) Или дома тестировать на его релизе...
10 Soul771
 
22.11.16
13:32
(3) - спасибо! В обработке выбираю файл через ДиалогВыбораФайла, пробовала с 2 компов клиентских, в разные места файл кидала...

(4) - спасибо! Коряво привожу, наверно, но приводится)
                текдата=СокрЛП(ход.дата);
        текДата = СтрЗаменить(текДата,".","");
        текДатаДень = Лев(текДата, 2);
        текДатаМесяц = Лев(текДата, 4);
        ТекДатаМесяц=Прав(текДатаМесяц,2);
        текДатаГод = Прав(текДата,4);
        текстр.дата = Дата(текДатаГод+ТекДатаМесяц+текДатаДень+"000000");

(5) - да, разные по времени даты приводятся к началу дня. В файле идут сначала продажи за 14 ноября, с начала дня, потом за 15, с начала дня и т.д. . Привожу все, что за 14 к виду 14112016000000 и т.д...

(6) - да, у клиента даты вразброс: 14,15,16,20, потом опять 14 и дальше как попало..

(7),(9) - спасибо, поставлю сейчас у себя тот же релиз, просто не понимаю, вроде Свернуть() он как был так и остался по описанию.... Версии Exel, кст, одинаковые....

(8) - да, понимаю... но хотя бы направление узнать... вариантов для гадания своих уже не осталось..
11 Pahomich
 
22.11.16
13:35
(10) Фантазирую что, скорее всего у тебя разные версии платформы по разному считывают ексель файл, ну там типы значений, квалификаторы типров и т.д.
12 b_ru
 
22.11.16
13:41
(3) Загрузка файла происходит &НаСервере? Путь к файлу через диалог указывается на локальном диске или на сетевом?
На всякий случай напоминаю, что для кода &НаСервере диск C: будет содержать совсем не то же самое, что для кода &НаКлиенте

>>Коряво привожу, наверно, но приводится)
Воистину коряво. А эксель как читается? С помощью COM-объекта Excel? Или через ТабличныйДокумент? Или вовсе через ADO?
13 Soul771
 
22.11.16
13:58
(12)
&НаКлиенте
Процедура ИмяФайлаНачалоВыбора(Элемент, ДанныеВыбора, СтандартнаяОбработка)
    СтандартнаяОбработка = Ложь;
    
    РасширениеПодключено = ПодключитьРасширениеРаботыСФайлами();
    Если РасширениеПодключено Тогда
        
        Режим = РежимДиалогаВыбораФайла.Открытие;
        ДиалогСохраненияФайла = Новый ДиалогВыбораФайла(Режим);
        ДиалогСохраненияФайла.ПолноеИмяФайла = "";
        //Фильтр    = "Файл Excel (*.xls, *.xlsx)|*.xls, *.xlsx";  
        //ДиалогСохраненияФайла.Фильтр = Фильтр;
        ДиалогСохраненияФайла.Заголовок = НСтр("ru = 'Выберите каталог для сохранения результата'");
        Если ДиалогСохраненияФайла.Выбрать() Тогда
            
            ФайлВыгрузки = ДиалогСохраненияФайла.ПолноеИмяФайла;
            //Если Прав(ФайлВыгрузки,4) <> ".xls" И  Прав(ФайлВыгрузки,4) <> ".xlsx" И Прав(ФайлВыгрузки,1) <> "." Тогда
            //    ФайлВыгрузки = ФайлВыгрузки + ".xlsx";
            //КонецЕсли;
        КонецЕсли;
        
    КонецЕсли;
    объект.ИмяФайла = ФайлВыгрузки;
    
    
КонецПроцедуры
14 Soul771
 
22.11.16
13:59
(12) - через Com

//подключаемся к эксель
    Попытка
        Excel = Новый COMОбъект("Excel.Application");
        Excel.WorkBooks.Open(Объект.ИмяФайла);
        Состояние("Обработка файла Microsoft Excel...");
    Исключение
        Сообщить("Ошибка при открытии файла с помощью Excel! Загрузка не будет произведена!");
        Сообщить(ОписаниеОшибки());
        Возврат;
    КонецПопытки;
    
    Попытка
        //Открываем необходимый лист
        Excel.Sheets(1).Select();  // лист 1, по умолчанию  
    Исключение
        //Закрываем Excel
        Excel.ActiveWorkbook.Close();     
        Excel = 0;
        Сообщить("Файл "+Строка(Объект.ИмяФайла)+" не соответствует необходимому формату! Первый лист не найден!");
        //ОтменитьТранзакцию();
        Возврат;
    КонецПопытки;
15 Soul771
 
22.11.16
14:01
(12) - путь к файлу на локальном диске. С рабочего стола и с диска Д(той машины, с которой 1С запущена)
16 RomaH
 
naïve
22.11.16
14:05
текДата = СтрЗаменить(текДата,".","");
        текДатаДень = Лев(текДата, 2);
        текДатаМесяц = Лев(текДата, 4);
        ТекДатаМесяц=Прав(текДатаМесяц,2);
        текДатаГод = Прав(текДата,4);

а в екселе дата как дата?

а уверена что на севрере клиента дата в екселе представляется как 21.01.2016? а не
2016/1/21, наприер
17 Soul771
 
22.11.16
14:08
(16) - если открыть файл(на моем компе или на клиентском (сервере и другом)), то в виде "14.11.2016  8:17:06"
а на сервере - имеете ввиду, на sql-сервере? как это посмотреть, подскажите, пожалуйста..
18 MM
 
22.11.16
14:08
На какой строке ошибка  и какая? СОМ-объект может на сервере не создаётся?
19 RomaH
 
naïve
22.11.16
14:11
то в виде "14.11.2016  8:17:06"

тогда твой алгоритм (10) какой-то не очевидный
текДатаГод = Прав(текДата,4);
вернет "7:06"
20 Soul771
 
22.11.16
14:11
(18) - обработка отрабатывает без сообщений об ошибках... а первый созданный у клиента документ - это 50-я строка файла.
А как посмотреть, создается Com на сервере или нет? Через точку останова на строке Excel = Новый COMОбъект("Excel.Application"); ?
21 b_ru
 
22.11.16
14:13
Если у тебя вот это


        Excel.WorkBooks.Open(Объект.ИмяФайла);


исполняется на сервере, то он пытается открыть файл, лежащий на диске Д сервера, а не твоего компьютера. Впрочем, если это все происходит в терминале, и сервер 1С запущен на том же сервере терминалов (что есть рукojoпствo админов), тогда будет работать (случайно)

И попробуй делать просто вот так:

текстр.дата = bla-bla-bla.Cells(i,1).value;
22 Soul771
 
22.11.16
14:15
(19) - простите, забыла строку дописать....
при считывании файла сначала
Врем.Дата          = Лев(Строка(Excel.Cells(НС, 2).Value),10);
и уже после в др. процедуре код
для каждого ход из Врем цикл
....
текдата=СокрЛП(ход.дата);

        текДата = СтрЗаменить(текДата,".","");
        текДатаДень = Лев(текДата, 2);
        текДатаМесяц = Лев(текДата, 4);
        ТекДатаМесяц=Прав(текДатаМесяц,2);
        текДатаГод = Прав(текДата,4);
        текстр.дата = Дата(текДатаГод+ТекДатаМесяц+текДатаДень+"000000");
...
23 Soul771
 
22.11.16
14:23
(21) - спасибо!
&НаКлиенте....
24 Soul771
 
22.11.16
14:35
(11) - загрузила у себя на компе на той версии платформы, что и у клиента, все идеально...
25 Soul771
 
22.11.16
15:34
(21) - на всякий случай файл переименовала, все равно грузится кучей документов(((
26 Soul771
 
22.11.16
16:27
Разбила файл по дням, загрузилось по 1 файлу на день. А исходный файл с выгрузкой за несколько дней не группирует строки по дням((((((
27 Soul771
 
22.11.16
20:47
Выгрузила .dt, загрузила в чистую файловую базу на том же компе клиента, где и рабочая база (и где консоль управления сервером 1С), в эту файловую копию все загружается как надо - по дням группирует. А в рабочую серверную - ну ни в какую.....
28 Мимохожий Однако
 
22.11.16
21:16
(22) Сумасшедший код. ИМХО.
29 Soul771
 
22.11.16
21:17
(22) - да и мне не нравится) лучше не придумала)
подскажите?)
30 shuhard_серый
 
22.11.16
21:25
(29) продать тебе отладчик ?
за 12 часов на форум не выложен кусок ТЗ
31 Soul771
 
22.11.16
21:33
(30) - проблема в том, что толком не могу в отладчике посидеть, люди работают. Урывками подключаюсь, смотрю.
А что по ТЗ выложить? Задачу вроде описала, куски кода, какие спрашивали, прикрепила. Вот сижу 12 часов и голову ломаю, какого простейшая обработка на одних и тех же данных в файловом варианте пашет корректно, а в серверном - нет.
Ясно, что не знаю каких-то особенностей работы серверной базы. Стыдно, что не знаю. Пока в гугле не нашла то, что покроет пробел по данной теме((((
32 shuhard_серый
 
22.11.16
21:42
(31) ТЗ = таблица значений
то, что тебя ломает поднять себе локальный сервер 1С - твоя проблема
33 Soul771
 
22.11.16
21:45
(32) - а спасибо за идею! как-то не пришло в голову, повод узнать, как это вообще делается....
34 FIXXXL
 
23.11.16
09:32
(29) у тебя одинФайл=одинДокумент? тогда вообще плюнь ты на дату, ставь нужную сразу в документ
35 Soul771
 
23.11.16
09:51
(34) - в одном файле несколько документов...
36 zva
 
23.11.16
10:13
(35) Я бы формат даты на винде у клиента посмотрел, если там стоит что-то d.mm.yyyy вместо dd.mm.yyyy, то будет то что в (0) и возможно документы и создаются, только в 16 году, а не в 2016
"обработка отрабатывает без сообщений об ошибках... а первый созданный у клиента документ - это 50-я строка файла."
37 FIXXXL
 
23.11.16
10:46
(35) как ты их делишь?
38 Wit77
 
23.11.16
10:58
(36) Очень похоже что проблема в этом. Очень часто серверную ОС ставят без русского языкового пакета. Соотв. форматы дат в екселе могут быть для английского языка. Тогда приведенный разбор даты из строки будет некорректные данные возвращать. Соотв. свертка неправильно будет работать по полю "Дата".
39 Wit77
 
23.11.16
11:00
(0) По хорошему надо дописать обработку: дату не приводить к дате, а писать в ТЗ как получили из екселя. и такую ТЗ куда-нибудь сохранять. В табличный документ или на экран выводить. И сравнить полученные таблички при корректной работе и некорректной. Думаю что проблема будет видна.