Имя: Пароль:
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) Че за чушь? В запросе сразу слабо ссылку получить чтобы не делать потом еще поиск по наименованию? Или ты из ссылки объекты получать не умеешь?
Проблемы невозможно решaть нa том же уровне компетентности, нa котором они возникaют. Альберт Эйнштейн