Меню

Ошибка при установке значения атрибута контекста formulalocal

   Andru

08.02.11 — 17:44

Excel = Новый COMОбъект(«Excel.Application»);

       Excel.Application.Workbooks.Add(1);

       Если МетодРасчета Тогда

           Excel.Sheets(1).Cells(1,»A»).FormulaLocal = «=ДНЕЙ360(B1;C1;ИСТИНА)»;

       Иначе

           Excel.Sheets(1).Cells(1,»A»).FormulaLocal = «=ДНЕЙ360(B1;C1;ЛОЖЬ)»;

       КонецЕсли;

       Excel.Sheets(1).Cells(1,»B»).Value = ДатаНачало;

       Excel.Sheets(1).Cells(1,»C»).Value = ДатаОкончания;

       КоличествоДней = Excel.Sheets(1).Cells(1,»A»).Value;

       Попытка

           Excel.ActiveWorkBook.SaveAs(КаталогВременныхФайлов() + «FailRascheta.xls»);    

       Исключение

           Сообщение = ОписаниеОшибки();

       КонецПопытки;

       Excel.Application.Quit();

Пишу вот такой код. Пользователи работают в терминале под одним пользователем отрабатывает отлично, у другого пользователя пишет ошибку «Ошибка при установке значения атрибута контекста (FormulaLocal): Произошла исключительная ситуация (0x800a03ec)» обошел все форумы, забивал формулу на английском. Все равно не работает.

   izekia

1 — 08.02.11 — 17:54

а без буковок попробуй

   Andru

2 — 08.02.11 — 17:57

Не совсем понял.

   Tatitutu

3 — 08.02.11 — 17:58

Excel.Sheets(1).Cells(1,»A»)
=
Excel.Sheets(1).Cells(1,1)

   Andru

4 — 08.02.11 — 17:58

без «А» в Cells(1,»A»)

   Andru

5 — 08.02.11 — 17:59

понял, проблемка только завтра попробую.

   dk

6 — 08.02.11 — 18:00

может там адреса в формате R1C1 забиты, хотя сумнительно
либо на англицком формулу забей в
….Formula = …

   Andru

7 — 08.02.11 — 18:00

других вариантов нету?

   Andru

8 — 08.02.11 — 18:01

«Formula =» пробовал не помогает, вообще неработало

   Andru

9 — 08.02.11 — 18:02

«FormulaR1C1 =» тоже пробовал

   Andru

10 — 08.02.11 — 18:03

могут быть какие-то настройки в самом EXL

   Andru

11 — 08.02.11 — 18:03

???

   Andru

12 — 08.02.11 — 18:05

везде на локальных машинах работает. Проблема только в терминале, хотя права у пользователей одинаковый.

   dk

13 — 08.02.11 — 18:08

отладчик не предлагать?

   Andru

14 — 08.02.11 — 18:12

проходил отладчиком, только я в таком состоянии, приму любое предложение которое не пробовал.

   dk

15 — 08.02.11 — 18:19

тест 1
поменять формула на «=1»

   Andru

16 — 08.02.11 — 18:21

проверить схавает хоть что-то?

   dk

17 — 08.02.11 — 18:28

ну да, отсекаешь 1 причину за другой

   Andru

18 — 08.02.11 — 18:29

отлично, попробую.

   Капюшон

19 — 08.02.11 — 18:29

(0)может быть разные версии Оффис у юзеров? у меня изза этого раньше в VBA проблемы возникали.

   Andru

20 — 08.02.11 — 18:36

на моей машине 2010, у клиента на локальных машинах и сервере 2003, и везде работает кроме терминала.

   Andru

21 — 08.02.11 — 18:37

может при установки админ не на всех пользователей VBA установил.

   Andru

22 — 08.02.11 — 18:39

????

   dk

23 — 08.02.11 — 18:39

(21) excel без vba не ставится )

   Andru

24 — 08.02.11 — 18:39

может это быть причиной?

   Andru

25 — 08.02.11 — 18:41

я уже готов поверить в любое не вероятное.

   supremum

26 — 08.02.11 — 18:43

(21) Только что проверил код в (0) под терминалом — все работает. Проблема может быть с правами пользователей.

   Andru

27 — 08.02.11 — 18:45

я под своим пользователем в терминал заходил, у меня не работало, под сисадмином заходил работает, назначил права сисадмина себе все равно не работает.

   Andru

28 — 08.02.11 — 18:50

может мой пользователь не входит какую-то группу типа «Пользователи DCOM»

   kambala

29 — 08.02.11 — 18:54

Права на папку КаталогВременныхФайлов() посмотри на запись

   Andru

30 — 08.02.11 — 18:56

я убирал строки
       Если МетодРасчета Тогда
           Excel.Sheets(1).Cells(1,»A»).FormulaLocal = «=ДНЕЙ360(B1;C1;ИСТИНА)»;
       Иначе
           Excel.Sheets(1).Cells(1,»A»).FormulaLocal = «=ДНЕЙ360(B1;C1;ЛОЖЬ)»;
       КонецЕсли;
без них отрабатывало под всеми пользователями нормально.

   Andru

31 — 08.02.11 — 18:58

так что права у всех на временный каталог есть.

   dk

32 — 08.02.11 — 19:01

может там англицкий Excel у юзера, хотя сумнительно

   Andru

33 — 08.02.11 — 19:04

Админ ставил под своим профелем и разрешил использовать всем пользователям, так что у всех один и тот же, но я проверю.

   ХелпДеск

34 — 08.02.11 — 21:51

(0)
Подозрительное присвоение: Value = ДатаНачало
Соответствует ли тип значения и формат ячейки xls и тип переменной ДатаНачало
Потом надо подумать над присвоением: КоличествоДней = что-то
Возможно это что-то (Value) надо привести к строковому типу.
Для отладки можно присвоить строковые константы.

   ХелпДеск

35 — 08.02.11 — 21:56

Лучше через setValue устанавливать значения, чем через прямое присвоение.

   Andru

36 — 09.02.11 — 06:42

Суть в том что на присвоение даты не ругается, ругается на формулу

   Andru

37 — 09.02.11 — 06:59

Это не сработало
Excel.Sheets(1).Cells(1,»A»)
=
Excel.Sheets(1).Cells(1,1)

   dk

38 — 09.02.11 — 07:46

Excel.Sheets(1).Cells(1,1).Formula = «=DAYS360(B1;C1;0)»;

   Andru

39 — 09.02.11 — 08:43

Этот тест сработал
тест 1
поменять формула на «=1»

   Andru

40 — 09.02.11 — 08:46

Не сработало.
Excel.Sheets(1).Cells(1,1).Formula = «=DAYS360(B1;C1;0)»;

   Andru

41 — 09.02.11 — 08:50

мне кажется это права, но не могу понять какие и на что

   Rie

42 — 09.02.11 — 08:51

(40) Попробуй FormulaR1C1 — что скажет?

   Andru

43 — 09.02.11 — 08:54

есть сдвиг
Excel.Sheets(1).Cells(1,1).FormulaLocal = «DAYS360(B1;C1;1)»
это сработало, но не посчитал.

   Andru

44 — 09.02.11 — 08:54

Как правильно передать DAYS360(B1;C1;1) третий параметр в EXL истина или ложь

   Rie

45 — 09.02.11 — 08:55

(43) А что должно было посчитать? И как именно «не посчитал»?

   Andru

46 — 09.02.11 — 08:57

вернул неопределено

   Andru

47 — 09.02.11 — 08:58

прошу прошения

   Andru

48 — 09.02.11 — 08:58

я незаметил один знак

   Andru

49 — 09.02.11 — 09:00

я написал вот так DAYS360(B1;C1;1), а надо было =DAYS360(B1;C1;1). И это не сработало. Извеняюсь.

   dk

50 — 09.02.11 — 09:16

что есть «не сработало»?
Вылетела с ошибкой?
в файле что-нить сохранилось?

   Aprobator

51 — 09.02.11 — 09:33

а под юзером у которого проблема в терминале эксель запустить слабо?

   Andru

52 — 09.02.11 — 11:53

ошибка даже самая какая и была в начале

   Andru

53 — 09.02.11 — 11:54

под пользователем у которого не работает, запускаю эксель и все работает если руками на прямую в эксель забиваешь.

   Andru

54 — 09.02.11 — 11:55

поэтому и говорю не понятный глюк.

   Aprobator

55 — 09.02.11 — 12:19

Сервис — Параметры — Общие — Стиль ссылок R1C1 под проблемным пользователем стоит?

   Andru

56 — 09.02.11 — 12:20

нет не стоит

   dk

57 — 09.02.11 — 12:21

Excel.Sheets(1).Cells(1,1).Formula = «=B1»;

   dk

58 — 09.02.11 — 12:21

может тупо в формуле C или B в кириллице заведены

   Andru

59 — 09.02.11 — 12:30

еще раз все перепроверил B это английская B, С тоже.

   Aprobator

60 — 09.02.11 — 12:33

хм — а точно вылетает на установке формулы, а не раньше на
Excel.Sheets(1)? Не помню, честно говоря там индексы с 0 или с 1?

  

   Andru

61 — 09.02.11 — 12:40

спецально отладчиком проходил, еще строку с присвоением формулы комментировал, затыкается только на формуле.

   dk

62 — 09.02.11 — 12:52

Яч = Excel.Sheets(1).Cells(1,1);
Яч.Formula = «=B1»;

   Andru

63 — 09.02.11 — 12:59

почему Formula? у меня это не сработало.
я пишу FormulaLocal.
Так же я пробовал Formula = «=B1» и FormulaLocal = «=B1», все отработало.

   dk

64 — 09.02.11 — 13:11

а не пробовал сначала данные в B1 и С1 заполнить, а уже потом формулу? )

   Andru

65 — 09.02.11 — 13:20

Попробовал В1 и С1 заполнил, и все равно заткнулся на формуле.

   Andru

66 — 09.02.11 — 13:20

Ради интереса изменил формулу

   Andru

67 — 09.02.11 — 13:21

Excel.Sheets(1).Cells(1,2).Value = 10;
       Excel.Sheets(1).Cells(1,3).Value = 20;
       Excel.Sheets(1).Cells(1,1).FormulaLocal = «=Сумм(B1;C1)»;
И все равно ругается на присвоение формулы.

   Aprobator

68 — 09.02.11 — 13:22

(67) лист не защищенный или ячейка?

   Andru

69 — 09.02.11 — 13:23

я никаких защит не ставил. А как проверить?

   Andru

70 — 09.02.11 — 13:24

новый лист создаю же.

   dk

71 — 09.02.11 — 13:33

Excel.Sheets(1).Cells(1,1).FormulaLocal = «=B1 + C1»;

   Aprobator

72 — 09.02.11 — 13:35

Excel.Sheets(1).Cells(1,1).AllowEdit проверка на разрешение редактирования. Хотя можно проверить и просто попытвашись записать значение.
Еще можно формулу попытаться вписать так:

Excel.Sheets(1).Cells(1,1).RANGE.FormulaLocal = ...
   Andru

73 — 09.02.11 — 13:44

Хоть что-то новенькое.
Ошибка.
Ошибка при получении значения атрибута контекста (Range): Неверное число параметров

   Andru

74 — 09.02.11 — 13:45

А вот это посчитал
Excel.Sheets(1).Cells(1,1).FormulaLocal = «=B1 + C1»;

   Andru

75 — 09.02.11 — 13:48

я так понимаю проблема с использованием внутренних формул экселя, если простое сложение посчитал.

   dk

76 — 09.02.11 — 13:50

Excel.Application.Workbooks.Add(1);
почему 1 в аргументе?
а если просто
Excel.Application.Workbooks.Add();

   Andru

77 — 09.02.11 — 13:52

я где то взял пример создание нового документа и листа, и все работало пока в терминал не запустили.

   dk

78 — 09.02.11 — 13:53

корявый пример )

   Andru

79 — 09.02.11 — 13:54

(76) Не помогло.Ошибка при установке значения атрибута контекста (FormulaLocal): Произошла исключительная ситуация (0x800a03ec)

   Aprobator

80 — 09.02.11 — 14:06

покопался по хелпу, там формула присваивается только на актином листе (в примерах).
Может стоит попробовать так:

Excel.Sheets(1).Activate;
ActiveSheet.FormulaLocal = ....
   Aprobator

81 — 09.02.11 — 14:09

вот еще пример из хелпы:

Worksheets(1).Range("C5:C10").Cells(1, 1).Formula = "=Rand()"
   dk

82 — 09.02.11 — 14:27

Excel = Новый COMОбъект(«Excel.Application»);
Excel.Application.Workbooks.Add();
Excel.Visible = Истина;

   Aprobator

83 — 09.02.11 — 15:14

(79) кстати — попробуй по деревянному — зайди в эксель, создай формулу, а потом с 1Сы ее считай и посмотри как она выглядит )

   Andru

84 — 09.02.11 — 16:03

спасибо большое, попробую но только завтра.

   Andru

85 — 12.02.11 — 03:39

ничего не сработало. буду искать другой выход.

   Andru

86 — 12.02.11 — 03:43

Я тут встречал расчеты.
Европейский метод —
?(День(Дата2)=31,30,День(Дата2))-?(День(Дата1)=31,30,День(Дата1))+30*(Год(Дата2)*12+Месяц(Дата2)-Год(Дата1)*12-Месяц(Дата1))

  Американский метод —
?(День(Дата2)=31 И День(Дата1)<30,31,30)-?(День(Дата1)=31,30,День(Дата1))+30*(Год(Дата2)*12+Месяц(Дата2)-Год(Дата1)*12-Месяц(Дата1))

Европейский метод расчет еще боле менее, а вот американский не правильно считает, может кто нибудь уже пытался решить это в 1С.

   Andru

87 — 12.02.11 — 03:52

к примеру задаеш период 26.08.2010-12.02.2011
Европейски метод дает 166
Американский метод дает 184

   Andru

88 — 12.02.11 — 03:59

В экселе оба метода дают 166

   azernot

89 — 12.02.11 — 05:30

В порядке бреда, попробуй поменять местами строки кода
       Excel.Sheets(1).Cells(1,»B»).Value = ДатаНачало;
       Excel.Sheets(1).Cells(1,»C»).Value = ДатаОкончания;

       Если МетодРасчета Тогда
           Excel.Sheets(1).Cells(1,»A»).FormulaLocal = «=ДНЕЙ360(B1;C1;ИСТИНА)»;
       Иначе
           Excel.Sheets(1).Cells(1,»A»).FormulaLocal = «=ДНЕЙ360(B1;C1;ЛОЖЬ)»;
       КонецЕсли;

Т.е. сначала присвоить даты, а уже потом формулу ссылающуюся на даты..

   Andru

90 — 12.02.11 — 06:38

пробовал не помогает.

  

Andru

91 — 12.02.11 — 07:22

кажись нашел
если кому интересно проверьте тоже, может я что-то не замечаю
Американский метод расчета
?(День(ДатаКон)=31,30,День(НачалоДня(ДатаКон)) — День(НачалоМесяца(ДатаКон)))+?(День(ДатаНач)=31,30,День(КонецМесяца(ДатаНач)) — День(НачалоДня(ДатаНач)))+30*(Год(ДатаКон)*12+(Месяц(ДатаКон)-1)-Год(ДатаНач)*12-Месяц(ДатаНач))

Пишу вот такой код. Пользователи работают в терминале под одним пользователем отрабатывает отлично, у другого пользователя пишет ошибку «Ошибка при установке значения атрибута контекста (FormulaLocal): Произошла исключительная ситуация (0x800a03ec)» обошел все форумы, забивал формулу на английском. Все равно не работает.

= Excel.Sheets.Cells(1,1)

понял, проблемка только завтра попробую.

может там адреса в формате R1C1 забиты, хотя сумнительно либо на англицком формулу забей в ….Formula = …

«Formula =» пробовал не помогает, вообще неработало

«FormulaR1C1 =» тоже пробовал

могут быть какие-то настройки в самом EXL

везде на локальных машинах работает. Проблема только в терминале, хотя права у пользователей одинаковый.

проходил отладчиком, только я в таком состоянии, приму любое предложение которое не пробовал.

тест 1 поменять формула на «=1»

проверить схавает хоть что-то?

ну да, отсекаешь 1 причину за другой

может быть разные версии Оффис у юзеров? у меня изза этого раньше в VBA проблемы возникали.

на моей машине 2010, у клиента на локальных машинах и сервере 2003, и везде работает кроме терминала.

может при установки админ не на всех пользователей VBA установил.

excel без vba не ставится )

я уже готов поверить в любое не вероятное.

Только что проверил код в под терминалом — все работает. Проблема может быть с правами пользователей.

я под своим пользователем в терминал заходил, у меня не работало, под сисадмином заходил работает, назначил права сисадмина себе все равно не работает.

может мой пользователь не входит какую-то группу типа «Пользователи DCOM»

Права на папку КаталогВременныхФайлов посмотри на запись

я убирал строки        КонецЕсли; без них отрабатывало под всеми пользователями нормально.

так что права у всех на временный каталог есть.

может там англицкий Excel у юзера, хотя сумнительно

Админ ставил под своим профелем и разрешил использовать всем пользователям, так что у всех один и тот же, но я проверю.

Подозрительное присвоение: Value = ДатаНачало Соответствует ли тип значения и формат ячейки xls и тип переменной ДатаНачало Потом надо подумать над присвоением: КоличествоДней = что-то Возможно это что-то (Value) надо привести к строковому типу. Для отладки можно присвоить строковые константы.

Лучше через setValue устанавливать значения, чем через прямое присвоение.

Суть в том что на присвоение даты не ругается, ругается на формулу

Это не сработало Excel.Sheets.Cells(1,»A») = Excel.Sheets.Cells(1,1)

Excel.Sheets.Cells(1,1).Formula = «=DAYS360(B1;C1;0)»;

Этот тест сработал тест 1 поменять формула на «=1»

мне кажется это права, но не могу понять какие и на что

Попробуй FormulaR1C1 — что скажет?

Excel.Sheets.Cells(1,1).FormulaLocal = «DAYS360(B1;C1;1)» это сработало, но не посчитал.

Как правильно передать DAYS360(B1;C1;1) третий параметр в EXL истина или ложь

А что должно было посчитать? И как именно «не посчитал»?

я написал вот так DAYS360(B1;C1;1), а надо было =DAYS360(B1;C1;1). И это не сработало. Извеняюсь.

что есть «не сработало»? Вылетела с ошибкой? в файле что-нить сохранилось?

а под юзером у которого проблема в терминале эксель запустить слабо?

ошибка даже самая какая и была в начале

под пользователем у которого не работает, запускаю эксель и все работает если руками на прямую в эксель забиваешь.

поэтому и говорю не понятный глюк.

Сервис — Параметры — Общие — Стиль ссылок R1C1 под проблемным пользователем стоит?

Excel.Sheets.Cells(1,1).Formula = «=B1»;

может тупо в формуле C или B в кириллице заведены

еще раз все перепроверил B это английская B, С тоже.

хм — а точно вылетает на установке формулы, а не раньше на Excel.Sheets? Не помню, честно говоря там индексы с 0 или с 1?

спецально отладчиком проходил, еще строку с присвоением формулы комментировал, затыкается только на формуле.

почему Formula? у меня это не сработало. я пишу FormulaLocal. Так же я пробовал Formula = «=B1» и FormulaLocal = «=B1», все отработало.

а не пробовал сначала данные в B1 и С1 заполнить, а уже потом формулу? )

Попробовал В1 и С1 заполнил, и все равно заткнулся на формуле.

Ради интереса изменил формулу

И все равно ругается на присвоение формулы.

лист не защищенный или ячейка?

я никаких защит не ставил. А как проверить?

Excel.Sheets.Cells(1,1).FormulaLocal = «=B1 + C1»;

Excel.Sheets.Cells(1,1).AllowEdit проверка на разрешение редактирования. Хотя можно проверить и просто попытвашись записать значение. Еще можно формулу попытаться вписать так:

Хоть что-то новенькое. Ошибка. Ошибка при получении значения атрибута контекста (Range): Неверное число параметров

А вот это посчитал Excel.Sheets.Cells(1,1).FormulaLocal = «=B1 + C1»;

я так понимаю проблема с использованием внутренних формул экселя, если простое сложение посчитал.

Excel.Application.Workbooks.Add; почему 1 в аргументе? а если просто Excel.Application.Workbooks.Add;

я где то взял пример создание нового документа и листа, и все работало пока в терминал не запустили.

Не помогло.Ошибка при установке значения атрибута контекста (FormulaLocal): Произошла исключительная ситуация (0x800a03ec)

покопался по хелпу, там формула присваивается только на актином листе (в примерах). Может стоит попробовать так:

кстати — попробуй по деревянному — зайди в эксель, создай формулу, а потом с 1Сы ее считай и посмотри как она выглядит )

спасибо большое, попробую но только завтра.

ничего не сработало. буду искать другой выход.

Я тут встречал расчеты. Европейский метод — ?(День(Дата2)=31,30,День(Дата2))-?(День(Дата1)=31,30,День(Дата1))+30*(Год(Дата2)*12+Месяц(Дата2)-Год(Дата1)*12-Месяц(Дата1))   Европейский метод расчет еще боле менее, а вот американский не правильно считает, может кто нибудь уже пытался решить это в 1С.

к примеру задаеш период 26.08.2010-12.02.2011 Европейски метод дает 166 Американский метод дает 184

В экселе оба метода дают 166

В порядке бреда, попробуй поменять местами строки кода Т.е. сначала присвоить даты, а уже потом формулу ссылающуюся на даты..

кажись нашел если кому интересно проверьте тоже, может я что-то не замечаю Американский метод расчета ?(День(ДатаКон)=31,30,День(НачалоДня(ДатаКон)) — День(НачалоМесяца(ДатаКон)))+?(День(ДатаНач)=31,30,День(КонецМесяца(ДатаНач)) — День(НачалоДня(ДатаНач)))+30*(Год(ДатаКон)*12+(Месяц(ДатаКон)-1)-Год(ДатаНач)*12-Месяц(ДатаНач))

Тэги:

Комментарии доступны только авторизированным пользователям

Содержание:

1.       Ошибка при установке значения атрибута контекста

2.       Ошибка при получении значения атрибута контекста

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

1.    Ошибка при установке значения атрибута контекста

Ошибка при установке значения атрибута контекста говорит нам о невозможности присвоить выбранное значение определенному атрибуту информационного объекта. Вызвано это либо несовпадением типа атрибута и присваиваемого ей значения, отсутствием возможности присвоить значение выбранному атрибуту, так как его можно только читать, но не записывать в него, отсутствием прав у текущего пользователя на запись значений в данный атрибут. Например, в реквизит «ДатаДокумента» с типом «Дата» пытаемся записать строку, в реквизит с типом данных ссылки на документ пытаемся записать не ссылку, а объект, полученный по ссылке, что невозможно из-за несоответствия типов, что приводит к ошибке установки значения атрибута. 

Другой пример – проходя циклом выборку запроса, пытаемся в колонку выборки записать значение, что невозможно, так как значения выборки запроса можно только считывать, а для того, чтобы можно было полученные из запроса данные изменять в коде, нужно пользоваться не выборкой, а выгружать результат запроса в таблицу значений, в таком случае в цикле по ней можно будет менять значения в колонках, но только на значения, соответствующие типу колонки. Либо у пользователя, под которым выполняется код, нет прав на изменение даты документа, при попытке записать в данный реквизит новую дату, будет выведено сообщение об ошибке установке значения, но в причине будет указано отсутствие прав у пользователя.  

2.    Ошибка при получении значения атрибута контекста

Ошибка при получении значения атрибута контекста указывает на невозможность прочитать значение атрибута объекта в силу его отсутствия, либо отсутствия прав на его чтение. Например, обращение к несуществующему реквизиту объекта, несуществующему полю выборки из запроса, несуществующему свойству элемента формы и т.п. Так же как пример можно рассмотреть получение текущего пользователя из параметров сеанса — если данный параметр сеанса не установлен, то тоже будет выведена ошибка получения значения атрибута контекста, но в причине будет указана попытка получения неинициализированного значения параметра сеанса.

При возникновении данных ошибок значения атрибута в 1Св первую очередь следует проверить существование атрибута, к которому обращаются, затем проверить совпадение типов значений атрибута и присваиваемого ему значения, затем уже проверить права на установку либо чтение значения. Проверить, является ли дело в правах либо дать права на действия с атрибутом, можно, установив привилегированный режим для совершения действия с данным атрибутом, прописав перед строчкой с ошибкой УстановитьПривилегированныйРежим(Истина), после строчки — УстановитьПривилегированныйРежим(Ложь).  

Специалист компании «Кодерлайн»

Александр Суворов

_Azazel_

0 / 0 / 2

Регистрация: 06.11.2009

Сообщений: 85

1

27.04.2012, 12:12. Показов 3554. Ответов 19

Метки нет (Все метки)


Есть вот такой код. По идее, он должен выгружать данные из табличной части и рассчитывать среднее значение по каждому столбцу, но он этого не делает.
Первый и второй считаются нормально, а вот последующие нет. В массив значений попадают такие значения : C1E9, E1H9 и так далее. Я так понимаю, ошибка в цикле, но найти ее не могу(

1C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
Попытка
Эксель = Новый COMОбъект("Excel.Application")
Исключение
Сообщить(ОписаниеОшибки() + " Программа Exсel не установлена на данном компьютере!");
Возврат;
КонецПопытки;
Книга = Эксель.WorkBooks.Add();
Лист = Книга.WorkSheets(1);
НомерСтроки=0;
Лист.Cells(1,9).Value=Объект.ЖелаемаяДоходность;
Для каждого Строка Из   Объект.МодельМарковицаДанные Цикл 
НомерСтроки=НомерСтроки+1;    
Лист.Cells(1,НомерСтроки).Value = Строка(Строка.ЦеннаяБумага);
Лист.Cells(2,НомерСтроки).Value = Строка(Строка.Доходность1);
Лист.Cells(3,НомерСтроки).Value = Строка(Строка.Доходность2);
Лист.Cells(4,НомерСтроки).Value = Строка(Строка.Доходность3);
Лист.Cells(5,НомерСтроки).Value = Строка(Строка.Доходность4);
Лист.Cells(6,НомерСтроки).Value = Строка(Строка.Доходность5);
Лист.Cells(7,НомерСтроки).Value = Строка(Строка.Доходность6);
Лист.Cells(8,НомерСтроки).Value = Строка(Строка.Доходность7);   
КонецЦикла; 
i=1;
j=1;
Пока i<=НомерСтроки Цикл
    Если  i=1   Тогда
Лист.Cells(12,i).FormulaLocal = "=Срзнач(" + Лист.Cells(2, i).Resize(8, i).Address(0, 0) + ")";
Иначе
Лист.Cells(12,i).FormulaLocal = "=Срзнач(" + Лист.Cells(2, i).Resize(8, i-1).Address(0, 0) + ")";
КонецЕсли;
i=i+1;
КонецЦикла;
Попытка
Книга.SaveAs("C:markovitz");
Исключение
Сообщить(ОписаниеОшибки()+" Файл не сохранен!");
Возврат;
КонецПопытки;
Эксель.Application.Quit();

__________________
Помощь в написании контрольных, курсовых и дипломных работ, диссертаций здесь



0



900 / 877 / 8

Регистрация: 15.03.2012

Сообщений: 2,680

27.04.2012, 12:52

2

Цитата
Сообщение от _Azazel_
Посмотреть сообщение

Первый и второй считаются нормально, а вот последующие нет.

Первый и второй — это кто? Не совсем ясно в чем проблема.

На взгляд, все вроде работоспособно, нужно только чуть подчистить мелкие косяки, не влияющие на результат. Смущает использование Resize, мне думается, что в Вашем случае нужно использовать Range.

Добавлено через 5 минут
А использование формул поставлено в задаче? Может проще в 1С среднее посчитать?



1



Модератор

Эксперт 1С

3697 / 2897 / 569

Регистрация: 10.03.2011

Сообщений: 11,398

Записей в блоге: 1

27.04.2012, 12:56

3

Открываете справку по VBA и смотрите
Параметры для FormulaLocal
и что такое .Resize(8, i-1).Address(0, 0)



1



0 / 0 / 2

Регистрация: 06.11.2009

Сообщений: 85

27.04.2012, 17:27

 [ТС]

4

Цитата
Сообщение от Fenomen
Посмотреть сообщение

Первый и второй — это кто? Не совсем ясно в чем проблема.

На взгляд, все вроде работоспособно, нужно только чуть подчистить мелкие косяки, не влияющие на результат. Смущает использование Resize, мне думается, что в Вашем случае нужно использовать Range.

Добавлено через 5 минут
А использование формул поставлено в задаче? Может проще в 1С среднее посчитать?

Да мне надо модель марковица сделать, методы не принципиальны

Добавлено через 1 час 0 минут
Сменила на Range, помогло, большое спасибо



0



_Azazel_

0 / 0 / 2

Регистрация: 06.11.2009

Сообщений: 85

01.05.2012, 12:39

 [ТС]

5

И снова затык. Ошибка : {Справочник.МодельМарковица.Форма.ФормаЭлемента.Фо рма(65)}: Ошибка при установке значения атрибута контекста (FormulaLocal)
Что не так?

1C
1
2
Лист.Range(Лист.Cells(12+флаг+1,1),Лист.Cells(j+флаг,НомерСтроки+2)).Activate();
Лист.Range(Лист.Cells(12+флаг+1,1),Лист.Cells(j+флаг,НомерСтроки+2)).FormulaLocal="={МОБР("+Лист.Cells(12,1).Address+":"+Лист.Cells(j-1,НомерСтроки+2).Address(0,1)+")}";



0



Модератор

Эксперт 1С

3697 / 2897 / 569

Регистрация: 10.03.2011

Сообщений: 11,398

Записей в блоге: 1

01.05.2012, 13:46

6

Цитата
Сообщение от _Azazel_
Посмотреть сообщение

«={МОБР(«+Лист.Cells(12,1).Address+»:»+Лист.Cells( j-1,НомерСтроки+2).Address(0,1)+»)}»

Не корректную формулу устанавливаешь, проверяй строку формулы



1



0 / 0 / 2

Регистрация: 06.11.2009

Сообщений: 85

01.05.2012, 13:58

 [ТС]

7

Спасибо, уже разобралась, там FormulaArray был) Задам еще один глупый вопрос — как в текушем элементе справочника добавить строку в табличную часть программным методом?



0



Dethmontt

Модератор

Эксперт 1С

3697 / 2897 / 569

Регистрация: 10.03.2011

Сообщений: 11,398

Записей в блоге: 1

01.05.2012, 14:12

8

1C
1
СтрокаТабЧасти = ТекущийОбъект.ИмяТабличнойЧасти.Добавить();



0



0 / 0 / 2

Регистрация: 06.11.2009

Сообщений: 85

01.05.2012, 16:03

 [ТС]

9

пробовала. но у меня данные, которые нужны при этом не записываются в колонки. почему?



0



Dethmontt

Модератор

Эксперт 1С

3697 / 2897 / 569

Регистрация: 10.03.2011

Сообщений: 11,398

Записей в блоге: 1

01.05.2012, 16:39

10

1C
1
ТекущийОбъект.Записать();



0



0 / 0 / 2

Регистрация: 06.11.2009

Сообщений: 85

01.05.2012, 17:48

 [ТС]

11

а что за оператор такой «текущий объект»?



0



Модератор

Эксперт 1С

3697 / 2897 / 569

Регистрация: 10.03.2011

Сообщений: 11,398

Записей в блоге: 1

01.05.2012, 18:01

12

Это не оператор, а переменная.
Вы же просили для текущего объекта показать вам как добавить строку в табличную часть, значит вы уже знаете как получить текущий объект.

Добавлено через 3 минуты
Просто, понимаете, мне сложно оценивать что вы знаете, а чего нет.
Наверное у вас должны быть какие то «базовые» знания 1С, в противном случае можно прибежать к помощи учебников.
З.Ы. Если по искать, то на этом форуме полно ссылок на полезную литературу по 1С.



0



0 / 0 / 2

Регистрация: 06.11.2009

Сообщений: 85

01.05.2012, 18:04

 [ТС]

13

извините. я неточно выразилась. я не знаю как получить значение текущего объекта. просто при открытой форме мне надо в колонки табличной части добавить значения программно. как это сделать -понятия не имею, потому что ни в одной книге нет обозначения колонок табличных частей и текущего объекта. извините еще раз, я просто стараюсь разобраться((((

Добавлено через 1 минуту
По крайней мере, теми которыми я располагаю…



0



Dethmontt

Модератор

Эксперт 1С

3697 / 2897 / 569

Регистрация: 10.03.2011

Сообщений: 11,398

Записей в блоге: 1

01.05.2012, 18:08

14

1C
1
2
3
4
5
Процедура КнопкаДобавлялка(Элемент)
СтрокаТЧ = ИмяТабличнойЧасти.Добавить();
СтрокаТЧ.ИмяРеквизита = Значение;
СтрокаТЧ.ИмяРеквизита2 = Значение2;
Конецпроцедуры



1



0 / 0 / 2

Регистрация: 06.11.2009

Сообщений: 85

01.05.2012, 18:10

 [ТС]

15

Книги которые я читала — Технологии Интеграции, Практическое руководство разработчика, Простые примеры разработки…все издательства 1с, там этого нет, в интернете тоже искала, поймите, мне не лень набить в поисковике, но я не нашла — если вы знаете где находится, помогите буду благодарна

Добавлено через 32 секунды
Спасибо, буду пробовать)



0



Dethmontt

Модератор

Эксперт 1С

3697 / 2897 / 569

Регистрация: 10.03.2011

Сообщений: 11,398

Записей в блоге: 1

01.05.2012, 18:14

16

Это если писать в модуле формы элемента справочника

Если из внешней обработки то объект сначала нужно получать

Добавлено через 3 минуты
В контексте модуля формы доступны все элементы формы объекта и так же доступны все элементы объекта. (реквизиты, табличные части, макеты)

1C
1
2
Сообщить(ИмяРеквизита);
Сообщить(ИмяТабличнойЧасти);



0



_Azazel_

0 / 0 / 2

Регистрация: 06.11.2009

Сообщений: 85

01.05.2012, 18:15

 [ТС]

17

Модуль формы. Пишу вот такую строчку

1C
1
Строка=Объект.МодельМарковицаРезультат.Добавить();

Это нормально, если потом реквизиты не всплывают при написании Строка. <реквизит>?



0



Модератор

Эксперт 1С

3697 / 2897 / 569

Регистрация: 10.03.2011

Сообщений: 11,398

Записей в блоге: 1

01.05.2012, 18:18

18

Простите, у вас управляемые формы?



0



0 / 0 / 2

Регистрация: 06.11.2009

Сообщений: 85

01.05.2012, 18:21

 [ТС]

19

ага, они самые
кстати, а если стоит значение «справочник. ссылка» в колонке, можно как-то загружать данные туда из массива?



0



Dethmontt

Модератор

Эксперт 1С

3697 / 2897 / 569

Регистрация: 10.03.2011

Сообщений: 11,398

Записей в блоге: 1

01.05.2012, 18:26

20

Цитата
Сообщение от _Azazel_
Посмотреть сообщение

Это нормально, если потом реквизиты не всплывают при написании Строка. <реквизит>?

Да это нормально

Добавлено через 2 минуты

Цитата
Сообщение от _Azazel_
Посмотреть сообщение

кстати, а если стоит значение «справочник. ссылка» в колонке, можно как-то загружать данные туда из массива?

Можно.

1C
1
2
3
4
Для сч=0 По Массив.Вграница() Цикл
 Строка = Объект.ИмяТабличнойЧасти.Добавить();
 Строка.ИмяРеквизита = Массив[Сч];
КонецЦикла;



0



<?php // Полная загрузка сервисных книжек, создан 2023-01-05 12:44:55

global $wpdb2;
global $failure;
global $file_hist;

/////  echo '<H2><b>Старт загрузки</b></H2><br>';

$failure=FALSE;
//подключаемся к базе
$wpdb2 = include_once 'connection.php'; ; // подключаемся к MySQL
// если не удалось подключиться, и нужно оборвать PHP с сообщением об этой ошибке
if (!empty($wpdb2->error))
{
/////   echo '<H2><b>Ошибка подключения к БД, завершение.</b></H2><br>';
$failure=TRUE;
wp_die( $wpdb2->error );
}

$m_size_file=0;
$m_mtime_file=0;
$m_comment='';
/////проверка существования файлов выгрузки из 1С
////файл выгрузки сервисных книжек
$file_hist = ABSPATH.'/_1c_alfa_exchange/AA_hist.csv';
if (!file_exists($file_hist))
{
/////   echo '<H2><b>Файл обмена с сервисными книжками не существует.</b></H2><br>';
$m_comment='Файл обмена с сервисными книжками не существует';
$failure=TRUE;
}

/////инициируем таблицу лога
/////если не существует файла то возврат и ничего не делаем
if ($failure){
///включает защиту от SQL инъекций и данные можно передавать как есть, например: $_GET['foo']
/////   echo '<H2><b>Попытка вставить запись в лог таблицу</b></H2><br>';
$insert_fail_zapros=$wpdb2->insert('vin_logs', array('time_stamp'=>time(),'last_mtime_upload'=>$m_mtime_file,'last_size_upload'=>$m_size_file,'comment'=>$m_comment));
wp_die();
/////    echo '<H2><b>Возврат в начало.</b></H2><br>';
return $failure;
}
/////проверка лога загрузки, что бы не загружать тоже самое
$masiv_data_file=stat($file_hist);   ////передаем в массив свойство файла
$m_size_file=$masiv_data_file[7];    ////получаем размер файла
$m_mtime_file=$masiv_data_file[9];   ////получаем дату модификации файла
////создаем запрос на получение последней удачной загрузки
////выбираем по штампу времени создания (редактирования) файла загрузки AA_hist.csv, $m_mtime_file

/////   echo '<H2><b>Размер файла: '.$m_size_file.'</b></H2><br>';
/////   echo '<H2><b>Штамп времени файла: '.$m_mtime_file.'</b></H2><br>';
/////   echo '<H2><b>Формирование запроса на выборку из лога</b></H2><br>';
////препарируем запрос
$text_zaprosa=$wpdb2->prepare("SELECT * FROM `vin_logs` WHERE `last_mtime_upload` = %s", $m_mtime_file);
$results=$wpdb2->get_results($text_zaprosa);

if ($results)
{   foreach ( $results as $r)
{
////если штамп времени и размер файла совпадают, возврат
if (($r->last_mtime_upload==$m_mtime_file) && ($r->last_size_upload==$m_size_file))
{////echo '<H2><b>Возврат в начало, т.к. найдена запись в логе.</b></H2><br>';
$insert_fail_zapros=$wpdb2->insert('vin_logs', array('time_stamp'=>time(),'last_mtime_upload'=>$m_mtime_file,'last_size_upload'=>$m_size_file,'comment'=>'Загрузка отменена, новых данных нет, т.к. найдена запись в логе.'));
wp_die();
return $failure;
}
}
}
////если данные новые, пишем в лог запись о начале загрузки
/////echo '<H2><b>Попытка вставить запись о начале загрузки в лог таблицу</b></H2><br>';
$insert_fail_zapros=$wpdb2->insert('vin_logs', array('time_stamp'=>time(),'last_mtime_upload'=>0, 'last_size_upload'=>$m_size_file, 'comment'=>'Начало загрузки'));

////очищаем таблицу
$clear_tbl_zap=$wpdb2->prepare("TRUNCATE TABLE %s", 'vin_history');
$clear_tbl_zap_repl=str_replace("'","`",$clear_tbl_zap);
$results=$wpdb2->query($clear_tbl_zap_repl);
/////   echo '<H2><b>Очистка таблицы сервисных книжек</b></H2><br>';
if (empty($results))
{
/////   echo '<H2><b>Ошибка очистки таблицы книжек, завершение.</b></H2><br>';
//// если очистка не удалась, возврат
$failure=TRUE;
wp_die();
return $failure;
}

////загружаем данные
$table='vin_history';         // Имя таблицы для импорта
//$file_hist Имя CSV файла, откуда берется информация     // (путь от корня web-сервера)
$delim=';';          // Разделитель полей в CSV файле
$enclosed='"';      // Кавычки для содержимого полей
$escaped='

Related Posts

  • Получение логина и пароля техподдержки 1С из базы
  • Класс для вывода отчета в ExcelКласс для вывода отчета в Excel
  • Счет-фактура для УПП
  • Библиотека классов для создания внешней компоненты 1С на C#
  • Акт об оказании услуг (со скидками) — внешняя печатная форма для Управление торговлей 11.1.10.86Акт об оказании услуг (со скидками) — внешняя печатная форма для Управление торговлей 11.1.10.86
  • Прайс-лист с артикулом в отдельной колонке

19 Comments

  1. Обработка предлагает очень разумную технологию назначения цен оптовому покупателю, упрощает ему работу с каталогом продавца, помогает стимулировать продажи и дает возможность получить от покупателя заказ в электронном виде, что способно упростить и работу с заказами покупателей. Благодарю автора за прекрасные идеи, щедрость и профессиональное исполнение.

    Reply

  2. (2) metodist, благодарю за отзыв.

    Поддержите голосом (плюсом)

    Reply

  3. Испытал в УПП на трехстах двух номенклатурах с картинками, анализом наличия на 2 складах и пятью типами цен. В конце:

    {ВнешняяОбработка.ПрайсЛистВЕксель.МодульОбъекта(150)}: Ошибка при установке значения атрибута контекста (FormulaLocal)

    ТекЛист.Range(Обл).FormulaLocal = «=»+СтрФормула.Формула;

    по причине:

    Произошла исключительная ситуация (0x800a03ec)

    Получил в точности такое сообщение 2 раза при выгрузке из файловой базы.

    При этом сумма заказа не считается и формулы расчета в ней нет, документ сам не записывается, увидеть и записать его приходится постараться.

    Если уменьшить кол-во номенклатур, например — до 281, то все работает. Или можно оставить кол-во номенклатур, но уменьшить кол-во складов до одного. Тоже все тогда нормально.

    Если при тех же параметрах база SQL, то 300 номенклатур выгружаются нормально, а 301 уже проблемно (зачем-то открываются в Экселе «Книга2» и «Книга 3»). При количестве еще немного большем база 1 раз зависла и Эксел не удавалось закрыть из-за требования открыть какую-то папку. Требование это не убиралось.

    Reply

  4. (4) metodist, интересный момент

    проверю

    Reply

  5. У меня в упп ругалась на незаполненное поле (дополнительноеописаниетовара) решается комментированием 252 строки кому надо

    Reply

  6. Всё работает.

    Только при открытии сохранённого файла эксель, открывается ещё одна книга эксель, с теми же данными, что и в первой и при закрытии требует сохранения. Это так задумано?

    Reply

  7. (7) NatalyaVP,

    Нет. не должно быть так.

    Просьба отписаться об этой проблеме всех у кого происходит то же самое.

    Reply

  8. (8), возможно проблема в самом экселе. После перезагрузки компьютера никаких дополнительных окон не открывается.

    Reply

  9. Доброго времени суток, не приходит обработка на почту((( Пишет что отправлено и все.

    Reply

  10. (1)не хватает например нормальных отборов, в том яисле по свойствам и категориям, вообще конечно лучше было бы чтоб запрос был в построителе, или лучше даже на СКД.. а так конечно идея хорошая, делал подобное по 7-ку еще, на 8 было лень.Спасибо.

    Reply

  11. (8)

    У меня похожая проблема. Писал об этом (см.№4).

    Reply

  12. Если цены в 1С установлены на характеристику, что актуально в детской одежде и женских колготках где от размера меняется цена в одном артикуле.

    Reply

  13. (14) Ничего страшного.

    В обработке предусмотрен вывод характеристик, ну и соответственно цен в разрезе характеристик.

    Reply

  14. мне нужна такая обработка с ценами по характеристикам.

    Reply

  15. У меня ут 10.3 а вы пример показали ут11. Есть возможность ценообразования по характеристикам и наличие тоже. Спасибо

    Reply

  16. в этой версии нет к сожалению

    Reply

Leave a Comment

Ваш адрес email не будет опубликован. Обязательные поля помечены *

0 0 голоса
Рейтинг статьи
Подписаться
Уведомить о
guest

0 комментариев
Старые
Новые Популярные
Межтекстовые Отзывы
Посмотреть все комментарии

А вот еще интересные материалы:

  • Яшка сломя голову остановился исправьте ошибки
  • Ясность цели позволяет целеустремленно добиваться намеченного исправьте ошибки
  • Ясность цели позволяет целеустремленно добиваться намеченного где ошибка
  • Ошибка при установке касперского 2146762485
  • Ошибка при установке значения атрибута контекста activeconnection