Имя: Пароль:
1C
1С v8
Заблудился в 14 строках)) Помогите)
,
0 cube033
 
25.12.12
11:39
Простейший участок кода. Не вижу, где можно ошибиться. На примере из 6 элементов работает идеально, преобразует 1,2,3,4,5,6 в
Кв. 1
Кв. 2
Кв. 3 итд.
Проблема в том, что на самом деле элементов в справочнике 9902. И тут начинается беда. Работает всё так
Кв.1
Кв.2
------
Кв.6
Кв.Кв.1
Кв.Кв.2
--------
Кв.Кв.6
Кв.Кв.Кв.1 итд вплоть до
Кв.Кв.Кв.Кв.Кв.Кв.Кв.Кв.Кв.Кв.Кв.Кв.Кв до конца длины поля

Как я понимаю - он обходит справочник множество раз. Могу побороть это кривым методом (если число вхождений "Кв."=1 то продолжть), но хочется понять.


Выборка = Справочники.УПЖКХ_Помещения.Выбрать();
Пока Выборка.Следующий() Цикл
 Квартира = Выборка.ПолучитьОбъект();            
 Если Квартира.ЭтоГруппа Тогда
  Продолжить;
 КонецЕсли;                
 Если Квартира.Владелец.Многоквартирное=Истина Тогда
  Квартира.ВидПомещения = Справочники.УПЖКХ_ВидыПомещений.НайтиПоНаименованию("Квартира");
 Иначе
  Квартира.ВидПомещения = Справочники.УПЖКХ_ВидыПомещений.НайтиПоНаименованию("Помещение");                         КонецЕсли;    
 Квартира.Наименование=Квартира.ВидПомещения.НаименованиеКраткое+" "+Квартира.Наименование;
 Квартира.Записать();
КонецЦикла;
1 drcrasher
 
25.12.12
11:41
Квартира.Наименование=Квартира.ВидПомещения.НаименованиеКраткое+" "+Квартира.Наименование;

что ты сказать этим хотел?
2 wowik
 
25.12.12
11:41
(0) я тоже заблудился...
3 GLazNik
 
25.12.12
11:42
(0) запрос покажи. Ошибка скорее всего там. Хотя и представленный код попахивает.
4 drcrasher
 
25.12.12
11:43
(3) учимся читать:
Выборка = Справочники.УПЖКХ_Помещения.Выбрать()
5 cw014
 
25.12.12
11:43
(0) Вижу где можно ошибиться. В многократном запуске с самого начала этой обработки
6 cube033
 
25.12.12
11:43
Квартира.Наименование=1 Например
Квартира.ВидПомещения.НаименованиеКраткое = Кв.
В Итоге Квартира.Наименование Было "1" Стало "Кв. 1"
7 Feofan
 
25.12.12
11:44
У тебя Квартира.Наименование не очищается при каждой итерации
8 Ursus maritimus
 
25.12.12
11:44
(0) Классика гамнокода
9 del123
 
25.12.12
11:44
либо вначале запросом получить список элементов и перебирать, либо проверять наименование квартир, если не число, то пропускать.
10 Жан Пердежон
 
25.12.12
11:44
(0) запросы в цикле - сам знаешь признак кого
11 GLazNik
 
25.12.12
11:44
(4) дада... уже заметил после того как нажал на кнопку "Отправить" :)
12 del123
 
25.12.12
11:45
и виды помещения лучше было бы перед запросом найти и присвоить переменным
13 cube033
 
25.12.12
11:45
Квартира.Наименование не может очищатся, так как переприсвамваеися из элемента справочника на каждой итерации.
14 DEVIce
 
25.12.12
11:45
Ты когда делаешь Квартира.Записать(), то выборку сбиваешь. Лучше выбрать запросом и обойти его результат.
15 cw014
 
25.12.12
11:45
(6) После второго запуска у тебя следующее:
Квартира.Наименование="Кв. 1" (уже так) Квартира.ВидПомещения.НаименованиеКраткое = Кв.
В Итоге Квартира.Наименование Было "Кв. 1" Стало "Кв. Кв. 1"
16 drcrasher
 
25.12.12
11:46
(13) считай, что у тебя к коде наименование = наименование.
17 drcrasher
 
25.12.12
11:46
(14) чёйта?
18 DEVIce
 
25.12.12
11:47
Вообще в восьмерке не рекомендуется выборкой лишний раз ползоваться, тем более что меняешь наименование элементов справочника, а значит меняется положение его в выборке (он может несколько раз в итоге выбраться, а некоторые элементы ниодного). Это кстати основы самые работы в восьмерке.
19 cw014
 
25.12.12
11:47
И еще лучше номера помещений хранить в отдельном, числовом реквизите, а в наименование можно и "отдельное помещение" написать
20 sidalexsandr
 
25.12.12
11:47
(0)

Выбрать(<Родитель>, <Владелец>, <Отбор>, <Порядок>)  
<Порядок> необязательный  

Тип: Строка. Строка с именем реквизита справочника, определяющая упорядочивание элементов в выборке. Может быть указано "Код", "Наименование" или имя одного из реквизитов примитивного типа (число, строка, дата, булево), для которого установлен признак "Индексирование" в значение "Индексировать" или в "Индексировать с доп. упорядоч." в конфигураторе. После имени реквизита через пробел может быть указано направление сортировки.  

Направление определяется:  

    "Убыв" ("Desc") - упорядочивать по убыванию;  

    "Возр" ("Asc") - упорядочивать по возрастанию.  

По умолчанию сортировка производится по возрастанию. Если параметр не указан, то порядок определяется основным представлением справочника.  

Значение по умолчанию: пустая строка.
21 MSII
 
25.12.12
11:47
(14) Да не, он тупо дописывает к наименованию "Кв." и так много раз.
22 cube033
 
25.12.12
11:47
(15) Второго запуска нет
23 DEVIce
 
25.12.12
11:48
(17) Тойта - читайте как работает выборка и почему ее не рекомендуется использовать в таких случаях.
24 Reset
 
25.12.12
11:48
(14) Не сбивается она никуда. Чел в процессе отладки 100500 раз запустил обработку, каждый раз прилемпляя спереди "Кв"
25 DEVIce
 
25.12.12
11:48
(21) Правильно. Элемент в соответствии с заданной сортировкой займет новой положение в справочнике, а значит и в выборке.
26 sidalexsandr
 
25.12.12
11:48
(0) Поставь сортировку В методе выбрать.
27 cw014
 
25.12.12
11:49
(22) Да ладно, цитирую тебя же:
>На примере из 6 элементов работает идеально
>на самом деле элементов в справочнике 9902. И тут начинается беда

Отсюда вывод - неоднократный вызов процедуры
28 sidalexsandr
 
25.12.12
11:50
(0) Ещё вариант:
Выбрать Квартира.Наименование
ИЗ Справочники.УПЖКХ_Помещения КАК Квартира
29 DEVIce
 
25.12.12
11:51
В любом случае дучше использовать запрос - будет быстрее и без вот таких вот эффектов сортировки. Автор, отвыкай программить посемерочному.
30 ERWINS
 
25.12.12
11:51
Запускал много раз вот и накопилось
31 cube033
 
25.12.12
11:51
(14) Пока самый дельный ответ
По поводу Неоднакратного вызова - всё четко отслеживается -  запуск - очистка - заполнение - запуск. Код не находится в цикле
32 sidalexsandr
 
25.12.12
11:52
(0) А ещё зайди в справочник в режиме 1с Предприятие и поставь сортировку по наименованию и посмотри будет ли у тебя в правильном порядке отображаться. + Смотри (26)
33 cube033
 
25.12.12
11:52
(29) Я и не привыкал.) Опыта пока мало - пишу интуитивно)
34 DEVIce
 
25.12.12
11:53
(33) Забудь про выборку короче. Выбери запросом.
35 sidalexsandr
 
25.12.12
11:54
(0) Автор, только сейчас обратил внимание. Ты одновременно делаеш выборку и записываеш элемент справочника. Такое делать нельзя (сбивается выборка).Вот твой код, где этот косяк:
Квартира.Наименование=Квартира.ВидПомещения.НаименованиеКраткое+" "+Квартира.Наименование;
 Квартира.Записать();
36 Reset
 
25.12.12
11:55
(25) Вероятно, это верно, если для выборки задан порядок.
Но с (29) согласен
37 DEVIce
 
25.12.12
11:56
(36) Если порядок не выбран, то по умолчанию тот что в конфигураторе задан, обычно код или наименование, он как раз наименование меняет.
38 Reset
 
25.12.12
11:58
(37) Я проверил только что, выбирая и меняя наименование. Каждый элемент выбрался строго 1 раз
Правда в файловой, сервер в данный момент недоступен
39 cw014
 
25.12.12
11:58
Посмотри, у тебя сейчас в наименованиях этого справочника одни цифры стоят?
40 DEVIce
 
25.12.12
12:00
(38) Значит удачно наименование поменял или сортировка по коду стоит. :)
41 DEVIce
 
25.12.12
12:01
(38) Сделай сортировку по наименованию и поменяй наименование так чтобы элемент был первым, а после переименования непервым. И расскажи что получилось :)
42 sidalexsandr
 
25.12.12
12:01
Тебе надо из выборки Только читать данные + создать ещё одну переменную типа Справочники.УПЖКХ_Помещения (Временная). Далее получив из выборки следующий элемент найти например по коду через переменную Временная и далее обязательно изменять и записывать элемент справочника через перемнную Временная.
43 Reset
 
25.12.12
12:01
(41) Так и было, сортировка по наименования
44 Reset
 
25.12.12
12:02
(41) Порядок изменился после переименованию
45 Reset
 
25.12.12
12:02
переименования*
46 Reset
 
25.12.12
12:03
Собственно, алгоритм у ТС в любом случае должен включать провеку наличие свпереди сигнатуры, на случай повторного запуска
47 DEVIce
 
25.12.12
12:03
(42) Запрос, запрос и еще раз запрос. Тогда всех этих извращений не нужно будет.
48 cube033
 
25.12.12
12:04
(38) На маленьком примере у меня так же. Видимо на 9000 такая удача не срабатывает и все регулярно перемешивается.
Делаю запрос - по результату отпишусь
49 sidalexsandr
 
25.12.12
12:04
(47) Полностью согласен. Просто человек хотел выборкой.
50 sidalexsandr
 
25.12.12
12:17
Лови Запрос:
Изменим = Справочники.УПЖКХ_Помещения.Создать();
Запрос = Новый Запрос;
Запрос.Текст = "
| Выбрать Квартира.Наименование,
|("кв."+Квартира.Наименование) КАК НовоеНаименование
| ИЗ Справочники.УПЖКХ_Помещения КАК Квартира";

РезультатЗапроса = Запрос.Выполнить().Выбрать;
Пока РезультатЗапроса.Следующий Цикл
    Текущий =Изменим.НайтиПоНаименованию(РезультатЗапрос.Наименование);  Текущий.Наименование = РезультатЗапроса.НовоеНаименование;
Текущий.Записать();

КонецЦикла;
51 sidalexsandr
 
25.12.12
12:17
(50) Опечатлся
Пока РезультатЗапроса.Следующий Цикл
Замени на
Пока РезультатЗапроса.Следующий() Цикл
52 cube033
 
25.12.12
12:31
Сделал через запрос. На маленьком примере по прежнему работает. По поводу большого примера сегодня не отпишусь ибо обработка 2х экселевских документв 9900 и 28000 строк - занимает много времени. С Очисткой, загрузкой документов, переносом данных - 2 попытки в день получается))
Всем спасибо. Я только учусь, собственно сегодня был полезный урок.
53 DEVIce
 
25.12.12
12:33
(50) Че за чушь? В запросе сразу слабо ссылку получить чтобы не делать потом еще поиск по наименованию? Или ты из ссылки объекты получать не умеешь?