Имя: Пароль:
1C
1С v8
Проблема с Регистром Сведений
0 kyriil
 
12.03.12
10:37
Занялся переводом из убогой самописной 7.7 на УНФ 8.2
Есть текстовые файлы с инфой из 7.7, начал постепенно грузить данные в УНФ 8.2, после загрузки справочников застрял на Регистрах сведений, а именно на РегистрСведений.ЦеныНоменклатуры, режим записи Независимый. В организации 5 видов розничных цен, пытаюсь загрузить хотя бы один вид.
В текстовом файле есть строки:
Начало
Г~Пироги~1~
Г~Булочки~2~
Э~Пирог вишневый 0,4 кг~10~95~105~115~125~135~шт.~
Э~Пирог абрикосовый 0,5 кг~11~115~125~135~145~155~шт.~
...и т.п. всего 200 строк-номенклатур
Конец
то есть: первое (нулевое) значение это тип: (Э)лемент/(Г)руппа, следуюещее наименование, далее: код, и затем пять значений: цена1, цена2, цена3, цена4 и цена5 и единица измерения.

На 8.2 пишу код загрузки данных (по похожему коду загружал справочники):
ДанныеТХТ = Новый ТекстовыйДокумент;
ДанныеТХТ.Прочитать("C:\Обмен77_82\товары.txt");
Можно = 0;
НомерСтроки = 0;
Для  ном = 1 по ДанныеТХТ.КоличествоСтрок() Цикл
   НомерСтроки = НомерСтроки + 1;
   Стр = ДанныеТХТ.ПолучитьСтроку(НомерСтроки);
   Если Стр="Начало" Тогда
       Можно = 1;
       НомерСтроки = НомерСтроки + 1;
       Стр = ДанныеТХТ.ПолучитьСтроку(НомерСтроки);
   КонецЕсли;
   Если Стр = "Конец" Тогда
       Прервать;
   КонецЕсли;
   Если Можно = 1  Тогда
       ДанныеСтроки = СписокИзСтроки(Стр);
   СПризнак = ДанныеСтроки[0].Значение;
   Если СПризнак = "Э" Тогда
       Если (ДанныеСтроки[3].Значение)<>"" Тогда
               Ном = Справочники.Номенклатура.НайтиПоКоду(ДанныеСтроки[2].Значение);
       ПериодУстановки = "31.12.2011 23:59:59";
       ВидЦенУстановки = Справочники.ВидыЦен.НайтиПоКоду("00-000001");
       НаборЗаписей = РегистрыСведений.ЦеныНоменклатуры.СоздатьНаборЗаписей();
       НаборЗаписей.Отбор.Период.Установить(ПериодУстановки);
       НаборЗаписей.Отбор.ВидЦен.Установить(ВидЦенУстановки);
       НоваяЗапись = НаборЗаписей.Добавить();
       НоваяЗапись.Период = ПериодУстановки;
       НоваяЗапись.ВидЦен = ВидЦенУстановки;
       НоваяЗапись.Номенклатура = Ном;            
               НоваяЗапись.Цена = ДанныеСтроки[3].Значение;
       НоваяЗапись.Актуальность = Истина;
       Если ДанныеСтроки[8].Значение = "шт." Тогда
           НоваяЗапись.ЕдиницаИзмерения = Справочники.КлассификаторЕдиницИзмерения.НайтиПоКоду("796");
       ИначеЕсли ДанныеСтроки[14].Значение = "Кор." Тогда
           НоваяЗапись.ЕдиницаИзмерения = Справочники.КлассификаторЕдиницИзмерения.НайтиПоКоду("778");
       КонецЕсли;
       НаборЗаписей.Записать();
       КонецЕсли;
   КонецЕсли;
   КонецЕсли;
КонецЦикла;

Но при попытке загрузить данные в РегистрСведений появляется ошибка:
{Форма.Форма.Форма(562)}: Преобразование значения к типу Число не может быть выполнено
КонецЦикла;

То есть программе не нравится условие Цикла "Для  ном = 1 по ДанныеТХТ.КоличествоСтрок() Цикл
...
КонецЦикла;"
При этом он делает первую запись с Пирогом вишневым, а Пирог абрикосовый и всё остальное не записывает...
Прошу помочь советом.
1 Wobland
 
12.03.12
10:38
>режим записи Независимый
УНФ не видел, но всё, что видел, имело спецдокумент для регистрации цен номенклатуры
2 Reset
 
12.03.12
10:40
>> Для  ном = 1 по
+
>> Ном = Справочники.Номенклатура.НайтиПоКоду(ДанныеСтроки[2].Значение);
3 Wobland
 
12.03.12
10:41
ПериодУстановки = "31.12.2011 23:59:59"; -> ПериодУстановки = '20111231235959'
4 Reset
 
12.03.12
10:41
Если бы не ленился с именованием переменных (например,НомерСтроки и НоменклатураСсылка), не получил бы косяк
5 Wobland
 
12.03.12
10:42
гыгы:
НомерСтроки = 0;
Для  ном = 1 по ДанныеТХТ.КоличествоСтрок() Цикл
   НомерСтроки = НомерСтроки + 1;
6 Alex S D
 
12.03.12
10:43
бу га га
ном = 1 по ДанныеТХТ.КоличествоСтрок() Цикл
...

Ном = Справочники.Номенклатура.НайтиПоКоду(ДанныеСтроки[2].Значение);
7 Reset
 
12.03.12
10:43
(5) лол, это я еще бегло посмотрел, оказывается ;)
8 kyriil
 
12.03.12
10:43
(2) в УНФ этот Регистр независимый, и документа установки цен, увы нет, только Обработка (замороченная). Читал на форумах, многие говорят, что УНФ довольно сырая, при том, что это первая Конфигурация - Управляемое приложение.
9 Alex S D
 
12.03.12
10:43
(2) а, сори не заметил)
10 vmv
 
12.03.12
10:44
конец итератора цикла ДанныеТХТ.КоличествоСтрок()

вынеси в переменную, так надежнее

а то хрен его знает, что ты там творишь с текстом, мож строки грохаешь или съедаешь. это не язык с и тут красивости и экономия ни к чему
11 Ненавижу 1С
 
гуру
12.03.12
10:45
(10) границы цикла вычисляются один раз перед началом цикла, так что не спасет
12 Maxus43
 
12.03.12
10:47
всё уже сказали, переменные названы криво, пересекаются
13 Ненавижу 1С
 
гуру
12.03.12
10:47
(8) так какого типа Ном?
тут:
ном = 1 по ДанныеТХТ.КоличествоСтрок() Цикл
и тут:
Ном = Справочники.Номенклатура.НайтиПоКоду(ДанныеСтроки[2].Значение);
14 Maxus43
 
12.03.12
10:47
(13) буква большая во втором случае! это же всё меняет)
15 vmv
 
12.03.12
10:47
(11) т.е. если удалять строки в теле цикла, то все будет ок, циклу будет наплевать, что строк в коллекции на входе уже меньше?)
16 Wobland
 
12.03.12
10:48
(15) Н=4;
Для й=0 По Н Цикл
   Н=2;
   Сообщить(й);
КонецЦикла;

говорит с 0 по 4
17 Ненавижу 1С
 
гуру
12.03.12
10:49
(15) нет, но выведение просто в отдельную переменную не спасет
18 vmv
 
12.03.12
10:50
тогда расстрелять, жаль конечно
Программист всегда исправляет последнюю ошибку.