Имя: Пароль:
1C
1С v8
Из Excel в 1С
0 Яна93
 
12.07.13
16:12
Всем Привет!:) Сегодня столкнулась с такой проблемой..в таблице эксель изменилось расположение данных, в обработке которую всегда использовала удалось понять немного код, и внесла небольшие изменения по части расположения обрабатываемых данных, но одну колонку "Держатель" применить уже не получится т.к. она уже пустая (в коде она записана как - КонтрагентID), но появилась колонка "Номер карты" которая ранее была записана не в виде колонки..так вот не могу придумать для нее условие, потому что не имела ранее дело с таким сложным кодом.. Подскажите пожалуйста


Процедура КнопкаВыполнитьНажатие(Кнопка)

  Попытка
     Excel = Новый COMОбъект("Excel.Application");
  Исключение
     Сообщить("Не удалось инициализировать Excel");
     Возврат;
  КонецПопытки;  
  Попытка
     ЗапросПоКонтрагентам = Новый Запрос;
     ЗапросПоКонтрагентам.Текст="ВЫБРАТЬ
     |   ИнформацияПоРаботеКонтрагентовПоСмартКартамСрезПоследних.Период,
     |   ИнформацияПоРаботеКонтрагентовПоСмартКартамСрезПоследних.Контрагент,
     |   ИнформацияПоРаботеКонтрагентовПоСмартКартамСрезПоследних.ДоговорПоСмартКартам,
     |   ИнформацияПоРаботеКонтрагентовПоСмартКартамСрезПоследних.Филиал.Код КАК КодФилиала,
     |   ИнформацияПоРаботеКонтрагентовПоСмартКартамСрезПоследних.КодПЦ
     |ИЗ
     |   РегистрСведений.Ю_ИнформацияПоРаботеКонтрагентовПоСмартКартам.СрезПоследних(&ДатаТранзакции, ) КАК ИнформацияПоРаботеКонтрагентовПоСмартКартамСрезПоследних";
     ЗапросПоТО = Новый Запрос;
     ЗапросПоТО.Текст= "ВЫБРАТЬ
                       |   Ю_ТочкиОбслуживания.Ссылка КАК ТО,
                       |   Ю_ТочкиОбслуживания.Эмитент,
                       |   Ю_ТочкиОбслуживания.КодТО_ОЦ как НомерТО
                       |ИЗ
                       |   Справочник.Ю_ТочкиОбслуживания КАК Ю_ТочкиОбслуживания" ;
     
     Excel.Workbooks.Open(ПутьКФайлу);
     НомерКниги=Excel.Workbooks.count;
     Книга=Excel.Workbooks.Item(НомерКниги);
     Лист=Excel.Sheets(1);
     метка = ложь; номерСтроки=8; индекс=0;
     
     ВыборкаТранзакцийЗаОдинДень=Новый ТаблицаЗначений;
     ВыборкаТранзакцийЗаОдинДень.Очистить();
     ВыборкаТранзакцийЗаОдинДень.Колонки.Добавить("ID_OPERATION");
     ВыборкаТранзакцийЗаОдинДень.Колонки.Добавить("ID_CLIENT");
     ВыборкаТранзакцийЗаОдинДень.Колонки.Добавить("DATE_OF");
     ВыборкаТранзакцийЗаОдинДень.Колонки.Добавить("POS_EMITENT");
     ВыборкаТранзакцийЗаОдинДень.Колонки.Добавить("POS_NUMBER");
     ВыборкаТранзакцийЗаОдинДень.Колонки.Добавить("CARD_GRAF_NUM");
     ВыборкаТранзакцийЗаОдинДень.Колонки.Добавить("ID_SERVICE_FOR");
     ВыборкаТранзакцийЗаОдинДень.Колонки.Добавить("POS_PRICE");
     ВыборкаТранзакцийЗаОдинДень.Колонки.Добавить("SUM_AMOUNT");
     ВыборкаТранзакцийЗаОдинДень.Колонки.Добавить("BASE_SUM_DELTA");      
     ВыборкаТранзакцийЗаОдинДень.Колонки.Добавить("SERVICE_AMOUNT");
     
     Пока метка <> истина цикл
        значениеД =  Лист.Cells(номерСтроки,4).Value;
        значениеФ =  Лист.Cells(номерСтроки,6).Value;
        Если Не значениеД = Неопределено тогда
           индекс = 0;
           НомерКарты_ = "";
           длинаСтроки = СтрДлина(значениеД);
           Для к=1 по длинаСтроки Цикл
              СимволСтр = Сред(значениеД,к,1);
              Если СимволСтр = "0" или СимволСтр = "1" или СимволСтр = "2" или СимволСтр = "3" или СимволСтр = "4" или СимволСтр = "5" или СимволСтр = "6" или СимволСтр = "7" или СимволСтр = "8" или СимволСтр = "9" тогда
                 НомерКарты_ = НомерКарты_ + СимволСтр;
              КонецЕсли;
           КонецЦикла;
           НомерКарты  = НомерКарты_;
        ИначеЕсли Не значениеФ = Неопределено тогда
           ЗначениеДаты_  = СокрЛП(Лист.Cells(номерСтроки,5).Value);
           Попытка
              ДатаиВремя_ = Формат(ЗначениеДаты_,"ДЛФ=DT");
              ЗначениеДаты = Дата(ДатаиВремя_);
              индекс = 0;
              стр=ВыборкаТранзакцийЗаОдинДень.Добавить();
              стр.CARD_GRAF_NUM = НомерКарты;                         //номер карты
              стр.DATE_OF = СокрЛП(Лист.Cells(номерСтроки,5).Value); //дата
              ДатаНачалаЗагрузкиТранзакцийИзБДПетрол = Дата(стр.DATE_OF);
              значение = Лист.Cells(номерСтроки,6).Value;
              Эмитент = Сред(значение,2,4);
              номерСим_1 = Найти(значение,"]");
              к = 1;
              НомерТО_ = "";СимволСтр="";
              Пока СимволСтр<>"," Цикл
                 СимволСтр = Сред(значение,номерСим_1-к,1);
                 Если СимволСтр = "0" или СимволСтр = "1" или СимволСтр = "2" или СимволСтр = "3" или СимволСтр = "4" или СимволСтр = "5" или СимволСтр = "6" или СимволСтр = "7" или СимволСтр = "8" или СимволСтр = "9" тогда
                    НомерТО_ = СимволСтр + НомерТО_;
                 КонецЕсли;
                 к = к+1;
              КонецЦикла;
              стр.POS_EMITENT = Эмитент;                      //эмитент ТО
              стр.POS_NUMBER = Число(НомерТО_);               // Номер ТО
              попытка
                 КонтрагентID = Число(Лист.Cells(номерСтроки,9).Value);
                 стр.ID_CLIENT = КонтрагентID;                      //id
              Исключение
                 Сообщить("Не числовое значение держателя соответствующее ID клиента " + Лист.Cells(номерСтроки,9).Value);
              КонецПопытки;
              Операция_ = Лист.Cells(номерСтроки,10).Value;
              Если Операция_ = "Обсл." тогда Операция = 29
              ИначеЕсли Операция_ = "Возв. С." тогда Операция = 31
              Иначе
                 Операция = 100;
                 Сообщить("Не опознанная операция " + Операция_ +" по карте " + НомерКарты + " от " + стр.DATE_OF);
              КонецЕсли;
              стр.ID_OPERATION = Операция;                  // Операции
              Услуга_ = Лист.Cells(номерСтроки,11).Value;
              Если Услуга_ = "Бензин А-92" тогда Услуга = 15
              ИначеЕсли Услуга_ = "Аи-95" тогда Услуга = 17
              ИначеЕсли Услуга_ = "Аи-98" тогда Услуга = 18
              ИначеЕсли Услуга_ = "А-76" или Услуга_ = "А-76/80" тогда Услуга = 13
              ИначеЕсли Услуга_ = "ДТ летнее" тогда Услуга = 11
              ИначеЕсли Услуга_ = "ДТ зимнее" или Услуга_ = "ДТ" тогда Услуга = 12
              ИначеЕсли Услуга_ = "Газ пропан-бутан" тогда Услуга = 22
              Иначе
                 Услуга = 100;
                 Сообщить("Не опознанная услуга " + Услуга_ +" по карте " + НомерКарты + " от " + стр.DATE_OF);
              КонецЕсли;
              стр.ID_SERVICE_FOR = Услуга;                     // Номенклатура
              стр.SERVICE_AMOUNT = -Лист.Cells(номерСтроки,12).Value; // Количество
              стр.POS_PRICE = Лист.Cells(номерСтроки,13).Value;       // Цена ТО
              стр.SUM_AMOUNT = -Лист.Cells(номерСтроки,17).Value;    // Стоимость на ТО со скидкой
              стр.BASE_SUM_DELTA = -Лист.Cells(номерСтроки,16).Value; // скидка
             
           Исключение
              //Сообщить("бла бла Не удалось инициализировать Excel");
              //Возврат;
           КонецПопытки;
        Иначе индекс = индекс+1;  
        КонецЕсли;        
        номерСтроки=номерСтроки+1;
        Если индекс > 30 тогда метка = Истина; конецЕсли;
     КонецЦикла;
  Исключение
     Сообщить(ОписаниеОшибки());
     Excel.Quit();
  КонецПопытки;
 
  НачатьТранзакцию();
  ДокТранзакцииЗаСутки      = Документы.Ю_ТранзакцииЗаСуткиЭмитента1070.СоздатьДокумент();
  ДокТранзакцииЗаСутки.Дата   = КонецМесяца(ДатаНачалаЗагрузкиТранзакцийИзБДПетрол);
  ЗапросПоКонтрагентам.УстановитьПараметр("ДатаТранзакции",КонецДня(ДатаНачалаЗагрузкиТранзакцийИзБДПетрол));
  РезультатЗапросаПоКонтрагентам = ЗапросПоКонтрагентам.Выполнить();
  РезультатЗапросаПоТО = ЗапросПоТО.Выполнить();
  НомерСвоегоЭмитента = Константы.Ю_СвойЭмитент.Получить().Код;
  НомерСтроки=0;
  для каждого выборка из  ВыборкаТранзакцийЗаОдинДень цикл
        НастройкиФилиала = ПолучитьНастройкиФилиалаПетрол(Справочники.Ю_Филиалы.НайтиПоКоду("1"));
        Если НЕ НастройкиФилиала.СостояниеФилиала.Пустая() Тогда
           Если НомерЭмитента(Выборка.POS_EMITENT)<>НомерСвоегоЭмитента Тогда
              ЗаполнитьСтрокуТабЧастиДокТранзакции(ДокТранзакцииЗаСутки.ТранзакцииНаЧужихТО,ДокТранзакцииЗаСутки,НастройкиФилиала,Выборка,РезультатЗапросаПоКонтрагентам,РезультатЗапросаПоТО)
           Иначе
              ЗаполнитьСтрокуТабЧастиДокТранзакции(ДокТранзакцииЗаСутки.Транзакции,ДокТранзакцииЗаСутки,НастройкиФилиала,Выборка,РезультатЗапросаПоКонтрагентам,РезультатЗапросаПоТО)
           КонецЕсли;                                                              
        КонецЕсли;
  КонецЦикла;  
  //ЗапросПоДокументам   = Новый Запрос;
  //ЗапросПоДокументам.Текст   = "ВЫБРАТЬ
  //                       |   ТранзакцииЗаСутки.Ссылка,
  //                       |   ТранзакцииЗаСутки.Номер
  //                       |ИЗ
  //                       |   Документ.Ю_ТранзакцииЗаСуткиЭмитента412 КАК ТранзакцииЗаСутки
  //                       |ГДЕ
  //                       |   ТранзакцииЗаСутки.Дата = &НачПериодаУдаления";
  //ЗапросПоДокументам.УстановитьПараметр("НачПериодаУдаления",КонецМесяца(ДатаНачалаЗагрузкиТранзакцийИзБДПетрол));
  //РезультатЗапросаПоДокументам   = ЗапросПоДокументам.Выполнить();
  //ВыборкаЗапросаПоДокументам      = РезультатЗапросаПоДокументам.Выбрать();
  //НачатьТранзакцию();
  //Пока ВыборкаЗапросаПоДокументам.Следующий() Цикл
  //   ДокОбъект   = ВыборкаЗапросаПоДокументам.Ссылка.ПолучитьОбъект();
  //   ДокОбъект.Удалить();
  //КонецЦикла;  
  //ЗафиксироватьТранзакцию();
  //ОбновитьНумерациюОбъектов(Метаданные.Документы.Ю_ТранзакцииЗаСутки);

  //ДокТранзакцииЗаСутки.Записать(РежимЗаписиДокумента.Проведение);
  ДокТранзакцииЗаСутки.Записать(РежимЗаписиДокумента.Запись);
  ЗафиксироватьТранзакцию();
КонецПроцедуры
1 Ненавижу 1С
 
гуру
12.07.13
16:13
позови программиста
2 Никола_
Питерский
 
12.07.13
16:17
(1) + И лучше Маню ))
3 Maxus43
 
12.07.13
16:19
на форуме такой код разбирать неблагодарное дело, и врятли кто-то будет читать 5-ти страничный код...
4 yurec_k
 
12.07.13
16:22
и как бэ, и фото нет,
тема не наберет и 10 постов
5 МихаилМ
 
12.07.13
16:22
что-то Вы врете

как минимум с проблемой столкнулись вчера.
http://www.1c-pro.ru/topic51829.html
6 sunson
 
12.07.13
16:22
Вряд ли мы вам дадим тут решение, посидите повнимательней и сама поймите, что вам надо сделать. Вы взяли обработку, что-то в ней поменяли и выложили сюда... мы не телепаты и структуру вашего файла эксель не знаем, что вы заменили тоже не знаем. Код вовсе не сложный.
7 Яна93
 
12.07.13
16:22
Да мне просто бы удалить безболезненно ту часть кода которая отвечает за обработку колонки "Держатель"
КонтрагентID = Число(Лист.Cells(номерСтроки,9).Value);
стр.ID_CLIENT = КонтрагентID;                      //id
Пробывала закомментить..но обработка зависает..похоже он застревает на какомто из циклов..
8 Яна93
 
12.07.13
16:23
Я перепостила свое же сообщение из другого форума..т.к. там не смогли помчь..
9 Iv-less
 
12.07.13
16:29
Особо не вникал, но кажись
попытка
                 КонтрагентID = Число(Лист.Cells(номерСтроки,9).Value);
                 стр.ID_CLIENT = КонтрагентID;                      //id

              Исключение
                 Сообщить("Не числовое значение держателя соответствующее ID клиента " + Лист.Cells(номерСтроки,9).Value);
              КонецПопытки;
Закомменти это и проверь
10 Яна93
 
12.07.13
16:31
Iv-less, спасибо за отзыв. Но я пробывала комментить..от самой Попытки и до КонецПопытки..Обработка зависает и молчит..
11 Яна93
 
12.07.13
16:33
Просто я как бухгалтер самостоятельно начала изучать 1С, чтобы упростить себе задачу в работе..но такой код для меня еще в новинку..не научилась еще..
12 sunson
 
12.07.13
16:35
Посмотрев на ваши файлы эксель стало понятно что раньше номер карты был в 4 колонке файла и осуществлялся перебор строк до тех пор пока не находим новый номер карты. Теперь номер карты переехал в колонку 8, сами данные сместились. (11)
13 sunson
 
12.07.13
16:41
Обработка зависает не потому что вы комментируете строку контрагентов. А потому что структура файла поменялась критично для этой обработки.
14 Яна93
 
12.07.13
16:43
sunson, да, это я немного пыталась корректировать обработку..но проблема из-за которой я не могу сдвинутся с мертвой точки - это отсутствие данных в колонке Держатель..
15 Яна93
 
12.07.13
16:44
А как же тогда быть? ведь структура смненилась не так сильно..
16 Iv-less
 
12.07.13
16:45
+ колонка держатель видимо критична, ибо идет загрузка в документ. Держатель может содержать обязательный реквизит для заполнения документа.
17 mikecool
 
12.07.13
16:45
20 летний бух, какая прелесть
я бы помог наверное, глядя на фото....
18 jsmith
 
12.07.13
16:46
с такой простынёй только маня может разобраться
19 pessok
 
12.07.13
16:47
раз уж начала сама изучать 1С, будучи бухом, то будь уж мужиком, блджад, до конца - изучи отладчик!
20 Яна93
 
12.07.13
16:47
Фото обработки? Здесь невозможно прикреплять файлы..я не нашла кнопку прикрепить..
21 Iv-less
 
12.07.13
16:47
xD
22 jsmith
 
12.07.13
16:48
(20) бухахахаааа
он твои сиськи имел в виду
23 jsmith
 
12.07.13
16:48
тут традиция такая на мисте
если новенькая чёто просит, то должна свою прелесть показать
после этого обязательно найдутся доброжелатели
24 mikecool
 
12.07.13
16:49
(22) фу пошляк )
25 Яна93
 
12.07.13
16:49
Я за помощью обратилась..а вы смеетесь..
26 jsmith
 
12.07.13
16:49
ну или хотя бы фотку где-нибудь стырь, только чтобы не гуглилась
можно с сайтов знакомств зарубежных
27 Яна93
 
12.07.13
16:50
А если к вам новенький парень обратится за помощью?)
28 Remark
 
12.07.13
16:52
(27) Тебе легче, поверь ))

А вообще, ты  в Екселе колонки можешь копировать в тот порядок, который был.
29 sunson
 
12.07.13
16:53
(27) парням не помогают) у них сисек нет
30 Remark
 
12.07.13
16:53
+28 Сорри, пропустил момент про пропавшую колонку "Держатель"
31 jsmith
 
12.07.13
16:53
(27) затюкают, заклюют, обольют сарказмом и навсегда отобьют охоту что-то спрашивать
в редких случаях удаётся отбить охоту кодить на 1с вообще
32 Яна93
 
12.07.13
16:53
Пробывала..Но все равно колонка Держатель останется пустой..
33 sunson
 
12.07.13
16:53
(15) Самый простой способ обратиться к программисту. Есть у вас программист? Кто-то ведь эту обработку писал?
34 jsmith
 
12.07.13
16:54
самый простой способ - овладеть отладчиком
иначе придётся всю жизнь сиськи показывать
35 Яна93
 
12.07.13
16:55
Был..месяца 4 назад..уехал в Москву добиваться новых высот..вакансия свободня до сих пор..
36 sunson
 
12.07.13
16:55
[0647, 1, 1392] "ЗАРЯ" ООО - что значат эти цифры?
37 Remark
 
12.07.13
16:56
(0) Решается административным методом: "Верните колонку Деражатель!".
38 pessok
 
12.07.13
16:56
Яна, внемлите моему совету, используйте точки останова и отладчик, сразу все поймете.

Тяяяяяпница, пора домой :)
39 jsmith
 
12.07.13
16:57
(36) где ты это колдунство надыбал
40 Remark
 
12.07.13
16:57
(38) Ждем темы "Как пользоваться отладчиком?"
41 Яна93
 
12.07.13
16:57
Использовала..он застревает на одном цикле..и так до бесконечности..после того как закомментила попытка
                 КонтрагентID = Число(Лист.Cells(номерСтроки,9).Value);
                 стр.ID_CLIENT = КонтрагентID;                      //id


              Исключение
                 Сообщить("Не числовое значение держателя соответствующее ID клиента " + Лист.Cells(номерСтроки,9).Value);
              КонецПопытки;
42 pessok
 
12.07.13
16:57
(40) действительно... об отладчике:

http://www.v8.1c.ru/overview/DeveloperDebugger.htm
43 pessok
 
12.07.13
16:58
(41) значит закомментила увеличение итератора, делов то. НомерСтроки = НомерСтроки + 1;
44 pessok
 
12.07.13
16:59
Попытка
//Старый код
Исключение
НомерСтроки = НомерСтроки + 1;
КонецПопытки
45 sunson
 
12.07.13
16:59
46 Cyberhawk
 
12.07.13
17:04
(35) город?
47 sunson
 
12.07.13
17:04
(41) Яна, вы что хотите сказать, что до того как вы закомментировали попытку по контрагенту обработка работала?))))
48 sunson
 
12.07.13
17:09
Рекомендую обратиться к ближайшей фирме занимающейся 1С, скажите руководству, что вам необходимо переделать эту обработку. Однако если они вам скажут более 2-х часов за работу, то они пытаются вас обмануть) (41)
49 mikecool
 
12.07.13
17:11
(35) так ты сейчас без парня??
50 Iv-less
 
12.07.13
17:15
Та нельзя убирать "держатель". Там идет заполнение документа по таблице. Держатель 90% необходимый реквизит, так что даже если получится найти, где завис, документ не будет проводится и придется в ручную доделывать.
51 Iv-less
 
12.07.13
17:17
ВыборкаТранзакцийЗаОдинДень.Колонки.Добавить("ID_CLIENT");
Попробуй это еще закоментить,помимо попытки. может идет проверка на пустые поля...
52 Яна93
 
12.07.13
17:28
Iv-less, тоже комментила..итог тот же..зависает..
53 sunson
 
12.07.13
17:29
В самом начале цикла идет вычисление номера карты... при измененном файле эксель, номер вычислять не надо, его надо брать из колонки
54 sunson
 
12.07.13
17:31
так и чешутся руки разбить вашу процедурку на несколько маленьких, логично названных понятных процедур
55 Iv-less
 
12.07.13
17:32
(53) Ты про это?
       Если Не значениеД = Неопределено тогда
           индекс = 0;
           НомерКарты_ = "";
           длинаСтроки = СтрДлина(значениеД);
           Для к=1 по длинаСтроки Цикл
              СимволСтр = Сред(значениеД,к,1);
              Если СимволСтр = "0" или СимволСтр = "1" или СимволСтр = "2" или СимволСтр = "3" или СимволСтр = "4" или СимволСтр = "5" или СимволСтр = "6" или СимволСтр = "7" или СимволСтр = "8" или СимволСтр = "9" тогда
                 НомерКарты_ = НомерКарты_ + СимволСтр;
              КонецЕсли;
56 Яна93
 
12.07.13
17:35
тогда стоит всего лишь вместо КонтрагентаID написать следующее:
Попытка НомерКарты = Число(Лист.Cells(номерСтроки,8).Value);
стр.CARD_GRAF_NUM = НомерКарты;                            
Исключение
   Сообщить("Не числовое значение" + Лист.Cells(номерСтроки,8).Value);
КонецПопытки;
57 Яна93
 
12.07.13
17:35
если это глупое предположение, то извиняюсь)
58 sunson
 
12.07.13
17:36
(55) ага
59 Iv-less
 
12.07.13
17:39
Вощем тут работы на пару часов, не используя скил "телепатия", боюсь все же стоит позвать спеца или хотя б немного изучить отладчик. Имхо
60 sunson
 
12.07.13
17:41
(57) не надо сомневаться, надо пробовать
я вот попробовал, у меня получилось)))
61 sunson
 
12.07.13
17:42
(59) да на самом деле меньше
62 Яна93
 
12.07.13
17:42
(60) Как может получится если у Вас нет конфигурации?)
63 sunson
 
12.07.13
17:47
Все очень просто я закомментировал те строки которые обращаются к конфигурации и попробовал вашу обработку на вашем же файле "КАК СТАЛО". Обработка отрабатывает и заполняет таблицу "ВыборкаТранзакцийЗаОдинДень" единственно, что колонка номер карты там пустая, но об этом я сказал ранее, потому что надо подправить, и вы уже даже знаете как
64 Яна93
 
12.07.13
17:51
Спасибо, sunson!!;) сейчас попробую поэкспериментировать)
65 sunson
 
12.07.13
17:53
Так что Яна, ваше утверждение, что обработка бесконечно крутит цикл все же не верно.

рекомендую вам вместо строки

ДокТранзакцииЗаСутки.Записать(РежимЗаписиДокумента.Запись);

Написать открытие файла, что бы вы видели чем же документ все таки заполнился
66 sunson
 
12.07.13
17:54
(64) Хороших вам выходных, мой рабочий день закончен)))
67 Яна93
 
12.07.13
17:57
(66) Спасибо, и Вам)
Ошибка? Это не ошибка, это системная функция.