Имя: Пароль:
1C
1C 7.7
v7: Программное создание справочников.
,
0 ErrorEd88
 
24.02.12
11:19
Код пишу по аналогии с 8.х. В цикле программно создаю элементы номенклатуры. Торговля и Склад. Вот кусок кода:

Спр = СоздатьОбъект("Справочник.Номенклатура");
СпрВидНом = СоздатьОбъект("Справочник.ВидыНоменклатуры");
СпрНДС = СоздатьОбъект("Справочник.СтавкиНДС");
СпрНП = СоздатьОбъект("Справочник.СтавкиНП");
СпрЕд = СоздатьОбъект("Справочник.ЕдиницыИзмерений");
Спр.Новый();
Спр.ИспользоватьДату('01.11.2011');
Спр.Родитель = Спр.НайтиПоКоду("Сй111");
Спр.Наименование = Строка(СокрЛП(ExcelТипы.Cells(СтрТипы,1).Value));
Спр.ТипТовара = Перечисление.ТипыТоваров.Собственный;
Спр.ВидНоменклатуры = СпрВидНом.НайтиПоКоду("0000001");
Спр.ПолнНаименование = Спр.Наименование;
Если ВидыЦен = 1 Тогда
Спр.Себестоимость = Строка(СокрЛП(ExcelТипы.Cells(СтрТипы,4).Value));
ИначеЕсли ВидыЦен = 2 Тогда
Спр.Цена = Строка(СокрЛП(ExcelТипы.Cells(СтрТипы,4).Value));
КонецЕсли;
Спр.СтранаПроисхожд = 1;
Спр.СтавкаНДС = СпрНДС.НайтиПоКоду("3");
Спр.СтавкаНП = СпрНП.НайтиПоКоду("1");
Спр.ЕдиницаИзмерения = СпрЕд.НайтиПоКоду("796");
Спр.Записать();

В итоге создается только один элемент (который последним создавался в цикле) - и то это пустая группа номенклатуры. Если комментирую Родитель=..., тогда все элементы создаются в "корне" справочника. Но реквизиты СтавкаНДС, СтавкаНП, ЕдиницаИзмерения, ВидНоменклатуры - не заполнены.
В отладчике все значения Родитель, СтавкаНДС и пр. - пустые. Т.е. все значения пустые, где использовалось НайтиПоКоду().
Пробовал НайтиПоНаименованию() - тот же результат.
Создавал новую переменную вне цикла:
Спр2 = СоздатьОбъект("Справочник.Номенклатура");
(НачалоЦикла)
...
Спр.Родитель = Спр2.НайтиПоКоду("Сй111");
...
(КонецЦикла)
Не помогло.
1 ErrorEd88
 
24.02.12
11:19
(0) Не ТиС, а Бух.
2 Kondarat
 
24.02.12
11:21
А почитать, что возвращает НайтиПоКоду() и НайтиПоНаименованию() не пробовал?
3 Андрей_Андреич
 
naïve
24.02.12
11:24
+(2)
Если СпрНДС.НайтиПоКоду("3")=1 Тогда
спр.ставкандс=спрндс.текущийэлемент();
КонецЕсли;
4 ErrorEd88
 
24.02.12
11:32
(2) Почитал СП, спасибо за совет)
(3) Теперь все заполняется как нужно. Спасибо.
5 povar
 
24.02.12
11:32
(0) ЖКК внематочно читай
6 Escander
 
24.02.12
11:37
попробуй записать а потом присвоить родителя и снова записать... есесьно для поиска родителя использовать другой экземпляр справочника, если он у всех один и тот-же - ненадо его искать в цикле. Это-же касается и некоторых других реквиззитов.
7 Чайник Рассела
 
24.02.12
11:38
вот это г0внокод!
8 ErrorEd88
 
24.02.12
12:57
(7) А ты проголосуешь, если я на сайт г@внокода залью?
9 Tatitutu
 
24.02.12
13:02
(0) а можно весь кусок с ЦИКЛОМ посмотреть (чисто поржать)
я уже тоже готов проголосовать
но если покажешь код с циклом - нас будет тысячи!
10 ErrorEd88
 
24.02.12
13:17
(9)Пока столько кода, но скоро в обработку будет добавлена процедура по программному созданию документов.

//!!
Процедура ОбработкаНоменклатуры()
   
НомерЛистаТипы = 1;
Попытка ExcelТипы = СоздатьОбъект("Excel.Application");
ФайлДанныхТипы = ExcelТипы.Workbooks.Open(НазваниеФайла);        
Исключение
КонецПопытки;
//Лист = ФайлДанныхТипы.WorkSheets(НазваниеФайла);
ЗагрузкаТипы = ФайлДанныхТипы.Worksheets(НомерЛистаТипы).UsedRange;    
//КоличествоСтрокЭкселеТипы = Лист.Rows.Count;    
КоличествоСтрокЭкселеТипы = ФайлДанныхТипы.Worksheets(НомерЛистаТипы).UsedRange.Rows.Count;
ExcelТипы.Sheets(НомерЛистаТипы).Select();    

Спр2 = СоздатьОбъект("Справочник.Номенклатура");
СпрВидНом = СоздатьОбъект("Справочник.ВидыНоменклатуры");
СпрНДС = СоздатьОбъект("Справочник.СтавкиНДС");
СпрНП = СоздатьОбъект("Справочник.СтавкиНП");
СпрЕд = СоздатьОбъект("Справочник.ЕдиницыИзмерений");

Для СтрТипы = НачСтр+1 По КонСтр Цикл      
   
Спр = СоздатьОбъект("Справочник.Номенклатура");
Если Спр.НайтиПоНаименованию(Строка(СокрЛП(ExcelТипы.Cells(СтрТипы,1).Value))) =  1 Тогда
   Сообщить("Номенклатура найдена");
Если ВидыЦен = 1 Тогда
   Спр.Себестоимость = Строка(СокрЛП(ExcelТипы.Cells(СтрТипы,4).Value));
ИначеЕсли ВидыЦен = 2 Тогда
   Спр.Цена = Строка(СокрЛП(ExcelТипы.Cells(СтрТипы,4).Value));
КонецЕсли;
Спр.Записать();
Иначе
Спр.Новый();
Спр.ИспользоватьДату('01.11.2011');
Если Спр2.НайтиПоКоду("Сй111")=1 Тогда
Спр.Родитель =Спр2.ТекущийЭлемент();
Конецесли;
Спр.Наименование = Строка(СокрЛП(ExcelТипы.Cells(СтрТипы,1).Value));  
Сообщить("Создается номенклатура" + Спр.Наименование);
Спр.ТипТовара = Перечисление.ТипыТоваров.Собственный;
Если СпрВидНом.НайтиПоНаименованию("Товар")=1 Тогда
Спр.ВидНоменклатуры = СпрВидНом.ТекущийЭлемент();
КонецЕсли;
Спр.ПолнНаименование = Спр.Наименование;
Если ВидыЦен = 1 Тогда
   Спр.Себестоимость = Строка(СокрЛП(ExcelТипы.Cells(СтрТипы,4).Value));
ИначеЕсли ВидыЦен = 2 Тогда
   Спр.Цена = Строка(СокрЛП(ExcelТипы.Cells(СтрТипы,4).Value));
КонецЕсли;
Спр.СтранаПроисхожд = 1;  
Если СпрНДС.НайтиПоКоду("3")=1 Тогда
Спр.СтавкаНДС = СпрНДС.ТекущийЭлемент();
КонецЕсли;
Если СпрНП.НайтиПоКоду("1")=1 тогда
Спр.СтавкаНП = СпрНП.ТекущийЭлемент();
КонецЕсли;        
Если СпрЕд.НайтиПоНаименованию("шт")=1 Тогда
Спр.ЕдиницаИзмерения = СпрЕд.ТекущийЭлемент();
КонецЕсли;
Спр.Записать();
КонецЕсли;    

КонецЦикла;

КонецПроцедуры
11 Escander
 
24.02.12
13:33
какие из реквизитов Спр периодические?
12 ErrorEd88
 
24.02.12
14:45
(9) http://govnokod.ru/9532 голосуем!
(11) Уже точно не помню, но прога ругалась, поэтому написал:
Спр.ИспользоватьДату('01.11.2011'). База после свертки, поэтому не принципиально.
13 ErrorEd88
 
24.02.12
15:27
Голосуем активней.
14 Tatitutu
 
24.02.12
15:45
(0) Классный комментарий

"Я не делаю отступы. Чтобы другой программист пришел к моему клиенту - и за пять минут во всем разобрался?"

бойся гуру и следи за его пальцами
если он успеет
нажать случайно
Ctrl+A
и потом
Ctrl+Shift+F
знай - ты встретил Учителя ))))