Как программно завести материал в Норму расхода
27.01.2008
01:58
#1
Подскажите пожалуйста как завести программно материал(ссылку на материал) из справочника Материалы в справочник Нормы расходов. Я пишу программу на VB.NET.
'Открываю справочник материалы
o2 = o.CreateObject("Справочник.Материалы")
If o2.ВыбратьЭлементы > 0 Then
while o2.ПолучитьЭлемент > 0
If o2.ЭтоГруппа < 1 Then
exit while
End if
End While
End If
'Сейчас в о2.ТекущийЭлемент материал который нужно завести в справочник НормыРасходов
o4 = o.CreateObject("Справочник.Номенклатура")
If o4.ВыбратьЭлементы > 0 Then
while o4.ПолучитьЭлемент > 0
If o4.ЭтоГруппа < 1 Then
o5 = o.CreateObject("Справочник.НормыРасходов")
o5.ИспользоватьВладельца(o4)
If o5.ВыбратьЭлементы > 0 Then
While o5.ПолучитьЭлемент > 0
o5.Новый()
o5.Наименование = spr2
'На следующей строке прога падает
o5.Элемент = o2.ТекущийЭлемент
o5.Записать()
End While
end if
end if
End While
End If
'Открываю справочник материалы
o2 = o.CreateObject("Справочник.Материалы")
If o2.ВыбратьЭлементы > 0 Then
while o2.ПолучитьЭлемент > 0
If o2.ЭтоГруппа < 1 Then
exit while
End if
End While
End If
'Сейчас в о2.ТекущийЭлемент материал который нужно завести в справочник НормыРасходов
o4 = o.CreateObject("Справочник.Номенклатура")
If o4.ВыбратьЭлементы > 0 Then
while o4.ПолучитьЭлемент > 0
If o4.ЭтоГруппа < 1 Then
o5 = o.CreateObject("Справочник.НормыРасходов")
o5.ИспользоватьВладельца(o4)
If o5.ВыбратьЭлементы > 0 Then
While o5.ПолучитьЭлемент > 0
o5.Новый()
o5.Наименование = spr2
'На следующей строке прога падает
o5.Элемент = o2.ТекущийЭлемент
o5.Записать()
End While
end if
end if
End While
End If
28.01.2008
15:40
#2
Конфигурация то какая?
o5.Элемент - реквизит элемент в этом справочнике определенного вида?
o5.Элемент - реквизит элемент в этом справочнике определенного вида?
28.01.2008
22:42
#3
о5.Элемент-это Справочник не определенного вида. Тип значения: <<Справочник>>.
А как узнать какая Конфигурация? Думаю что какая нибудь стандартная т.к. в нашем колхозе вряд ли
есть кто-то кто сделает конфигурацию с нуля.
А как узнать какая Конфигурация? Думаю что какая нибудь стандартная т.к. в нашем колхозе вряд ли
есть кто-то кто сделает конфигурацию с нуля.
29.01.2008
06:54
#4
Варианты: 1С:Бухгалтерия, 1С:Производство+Услуги+Бухгалтерия, любая самописная конфигурация, любая стандартная переписанная конфигурация... В общем, лучше, если в вопросах вы будете указывать точную версию платформы и релиза своей конфигурации. Посмотреть их можно нажам на большой желтый знак вопроса в панели инструментов.
А с вопросом вашим, попробуйте перед установкой значения назначить вид реквизиту.
НазначитьВид(Реквизит,ВидСтрокой)
А с вопросом вашим, попробуйте перед установкой значения назначить вид реквизиту.
НазначитьВид(Реквизит,ВидСтрокой)
30.01.2008
22:25
#5
1)У нас написано вот что:
1С:Предприятие 7.7(сетевая версия)
Конфигурация: Бухгалтерский учет, редакция 4.5 (7.70.487)
Установленные компоненты: Бухгалтерский учет Оперативный учет Расчет
2)Я тоже было подумал об этой функции но на ней прога падает не пойму что делаю неправильно.
o = CreateObject("V77.Application")
o.Initialize("16440", "/DC:\1C_basa_UPP", " ")
o2 = o.CreateObject("Справочник.Материалы")
If o2.ВыбратьЭлементы > 0 Then
while o2.ПолучитьЭлемент > 0
If o2.ЭтоГруппа < 1 Then
exit while
End if
End While
End If
'Сейчас в о2.ТекущийЭлемент материал который нужно завести в справочник НормыРасходов
o4 = o.CreateObject("Справочник.Номенклатура")
If o4.ВыбратьЭлементы > 0 Then
while o4.ПолучитьЭлемент > 0
If o4.ЭтоГруппа < 1 Then
o5 = o.CreateObject("Справочник.НормыРасходов")
o5.ИспользоватьВладельца(o4)
If o5.ВыбратьЭлементы > 0 Then
While o5.ПолучитьЭлемент > 0
'На следующей строке прога падает
o.НазначитьВид(o5.Элемент, "Материалы")
o5.Новый()
'И если сюда поставить эту функцию прога падает
o.НазначитьВид(o5.Элемент, "Материалы")
o5.Наименование = spr2
'На следующей строке прога падает
o5.Элемент = o2.ТекущийЭлемент
o5.Записать()
End While
end if
end if
End While
End If
1С:Предприятие 7.7(сетевая версия)
Конфигурация: Бухгалтерский учет, редакция 4.5 (7.70.487)
Установленные компоненты: Бухгалтерский учет Оперативный учет Расчет
2)Я тоже было подумал об этой функции но на ней прога падает не пойму что делаю неправильно.
o = CreateObject("V77.Application")
o.Initialize("16440", "/DC:\1C_basa_UPP", " ")
o2 = o.CreateObject("Справочник.Материалы")
If o2.ВыбратьЭлементы > 0 Then
while o2.ПолучитьЭлемент > 0
If o2.ЭтоГруппа < 1 Then
exit while
End if
End While
End If
'Сейчас в о2.ТекущийЭлемент материал который нужно завести в справочник НормыРасходов
o4 = o.CreateObject("Справочник.Номенклатура")
If o4.ВыбратьЭлементы > 0 Then
while o4.ПолучитьЭлемент > 0
If o4.ЭтоГруппа < 1 Then
o5 = o.CreateObject("Справочник.НормыРасходов")
o5.ИспользоватьВладельца(o4)
If o5.ВыбратьЭлементы > 0 Then
While o5.ПолучитьЭлемент > 0
'На следующей строке прога падает
o.НазначитьВид(o5.Элемент, "Материалы")
o5.Новый()
'И если сюда поставить эту функцию прога падает
o.НазначитьВид(o5.Элемент, "Материалы")
o5.Наименование = spr2
'На следующей строке прога падает
o5.Элемент = o2.ТекущийЭлемент
o5.Записать()
End While
end if
end if
End While
End If
31.01.2008
14:37
#6
"В общем, я поглядел... через OLE в v77 в качестве параметров функций можно передавать только значения неагрегатных типов данных, то есть, числа, строки, даты в формате строк и т.п.
Поэтому конструкция вида
o.НазначитьВид(o5.Элемент, "Материалы")
работать не будет, тем более, что НазначитьВид - не является методом объекта V77.Application, как бы, по хорошему тут надо применять:
o.EvalExpr("НазначитьВид(??????,""""Материалы"""")")
но у нас не получится кинуть указатель на o5.Элемент через EvalExpr, поэтому предлагаю такой вариант:
в глобальном модуле конфигурации 1С-а сделать:
Функция глСоздатьЭлементРасходов(КодВладельца, ДатаУстановкиЗначений, Наименование, КодЭлемента, Норма, КолПрод, ВидЭлемента) Экспорт
СозданныйЭлемент=ПолучитьПустоеЗначение();
Номенклатура=СоздатьОбъект("Справочник.Номенклатура");
Если Номенклатура.НайтиПоКоду(КодВладельца)=1 Тогда
НормыРасходов=СоздатьОбъект("Справочник.НормыРасходов");
НормыРасходов.ИспользоватьВладельца(Номенклатура.ТекущийЭлемент());
НормыРасходов.Новый();
НормыРасходов.Наименование=Наименование;
НормыРасходов.ВидЭлемента=ВидЭлемента;
НужныйСправочник=СоздатьОбъект("Справочник."+?(ВидЭлемента=1,"Материалы","Номенклатура"));
Если НужныйСправочник.НайтиПоКоду(КодЭлемента)=1 Тогда
НазначитьВид(НормыРасходов.Элемент, НужныйСправочник.Вид());
НормыРасходов.Элемент=НужныйСправочник.ТекущийЭлемент();
НормыРасходов.Записать();
НормыРасходов.Норма.Установить(Дата(ДатаУстановкиЗначений),Норма);
НормыРасходов.КолПрод.Установить(Дата(ДатаУстановкиЗначений),КолПрод);
СозданныйЭлемент=НормыРасходов.ТекущийЭлемент();
КонецЕсли;
КонецЕсли;
Возврат(СозданныйЭлемент);
КонецФункции
и ваш модуль в .Net переделать так:
Dim o, o2, o4, o5 As Object
Dim spr2 As String = "тест"
o = CreateObject("V77.Application")
o.Initialize("16440", "/DC:\1C_basa_UPP", " ")
o2 = o.CreateObject("Справочник.Материалы")
If o2.ВыбратьЭлементы > 0 Then
While o2.ПолучитьЭлемент > 0
If o2.ЭтоГруппа < 1 Then
Exit While
End If
End While
End If
'Сейчас в о2.ТекущийЭлемент материал который нужно завести в справочник НормыРасходов
o5 = o.CreateObject("Справочник.НормыРасходов")
o4 = o.CreateObject("Справочник.Номенклатура")
If o4.ВыбратьЭлементы > 0 Then
While o4.ПолучитьЭлемент > 0
If o4.ЭтоГруппа < 1 Then
o5 = o.EvalExpr("глСоздатьЭлементРасходов(""""" & o4.Код & """"",""""01.01.1980"""",""""" & spr2 & """"",""""" & o2.Код & """"",13,1,1)")
End If
End While
End If
o5 = 0
o4 = 0
o2 = 0
o = 0
Маленькое замечание.
У вас странный алгоритм. Если выкинуть обрамление получится:
НормыРасходов = СоздатьОбъект("Справочник.НормыРасходов");
НормыРасходов.ВыбратьЭлементы();
Пока НормыРасходов.ПолучитьЭлемент()=1 Цикл
НормыРасходов.Новый();
...
КонецЦикла;
то есть, у вас внутри выборки создается новый элемент, принадлежащий выборке, при этом выборка поведет себя непонятно как. Это ненормально"
Поэтому конструкция вида
o.НазначитьВид(o5.Элемент, "Материалы")
работать не будет, тем более, что НазначитьВид - не является методом объекта V77.Application, как бы, по хорошему тут надо применять:
o.EvalExpr("НазначитьВид(??????,""""Материалы"""")")
но у нас не получится кинуть указатель на o5.Элемент через EvalExpr, поэтому предлагаю такой вариант:
в глобальном модуле конфигурации 1С-а сделать:
Функция глСоздатьЭлементРасходов(КодВладельца, ДатаУстановкиЗначений, Наименование, КодЭлемента, Норма, КолПрод, ВидЭлемента) Экспорт
СозданныйЭлемент=ПолучитьПустоеЗначение();
Номенклатура=СоздатьОбъект("Справочник.Номенклатура");
Если Номенклатура.НайтиПоКоду(КодВладельца)=1 Тогда
НормыРасходов=СоздатьОбъект("Справочник.НормыРасходов");
НормыРасходов.ИспользоватьВладельца(Номенклатура.ТекущийЭлемент());
НормыРасходов.Новый();
НормыРасходов.Наименование=Наименование;
НормыРасходов.ВидЭлемента=ВидЭлемента;
НужныйСправочник=СоздатьОбъект("Справочник."+?(ВидЭлемента=1,"Материалы","Номенклатура"));
Если НужныйСправочник.НайтиПоКоду(КодЭлемента)=1 Тогда
НазначитьВид(НормыРасходов.Элемент, НужныйСправочник.Вид());
НормыРасходов.Элемент=НужныйСправочник.ТекущийЭлемент();
НормыРасходов.Записать();
НормыРасходов.Норма.Установить(Дата(ДатаУстановкиЗначений),Норма);
НормыРасходов.КолПрод.Установить(Дата(ДатаУстановкиЗначений),КолПрод);
СозданныйЭлемент=НормыРасходов.ТекущийЭлемент();
КонецЕсли;
КонецЕсли;
Возврат(СозданныйЭлемент);
КонецФункции
и ваш модуль в .Net переделать так:
Dim o, o2, o4, o5 As Object
Dim spr2 As String = "тест"
o = CreateObject("V77.Application")
o.Initialize("16440", "/DC:\1C_basa_UPP", " ")
o2 = o.CreateObject("Справочник.Материалы")
If o2.ВыбратьЭлементы > 0 Then
While o2.ПолучитьЭлемент > 0
If o2.ЭтоГруппа < 1 Then
Exit While
End If
End While
End If
'Сейчас в о2.ТекущийЭлемент материал который нужно завести в справочник НормыРасходов
o5 = o.CreateObject("Справочник.НормыРасходов")
o4 = o.CreateObject("Справочник.Номенклатура")
If o4.ВыбратьЭлементы > 0 Then
While o4.ПолучитьЭлемент > 0
If o4.ЭтоГруппа < 1 Then
o5 = o.EvalExpr("глСоздатьЭлементРасходов(""""" & o4.Код & """"",""""01.01.1980"""",""""" & spr2 & """"",""""" & o2.Код & """"",13,1,1)")
End If
End While
End If
o5 = 0
o4 = 0
o2 = 0
o = 0
Маленькое замечание.
У вас странный алгоритм. Если выкинуть обрамление получится:
НормыРасходов = СоздатьОбъект("Справочник.НормыРасходов");
НормыРасходов.ВыбратьЭлементы();
Пока НормыРасходов.ПолучитьЭлемент()=1 Цикл
НормыРасходов.Новый();
...
КонецЦикла;
то есть, у вас внутри выборки создается новый элемент, принадлежащий выборке, при этом выборка поведет себя непонятно как. Это ненормально"
31.01.2008
22:10
#7
1)"я поглядел... через OLE в v77..." -если не секрет где поглядели?
2)Это не алгоритм это проба (здесь я пытаюсь получить от 1С то что мне нужно для написания проги)в релизе будет все нормально и имена переменных и функции.
Завтра попробую ваш вариант(думаю он единственный в данной ситуации).
2)Это не алгоритм это проба (здесь я пытаюсь получить от 1С то что мне нужно для написания проги)в релизе будет все нормально и имена переменных и функции.
Завтра попробую ваш вариант(думаю он единственный в данной ситуации).
Читают тему
(гостей: 1)