Имя: Пароль:
1C
1С v8
ФормыСправочника
0 Nykos
 
21.08.13
11:08
Всем привет!
Возникла такая проблемка. Есть справочник с полями "Код" и "Наименование". Потребовалось изменить формат кода (пример: с "00151" на "151000", не суть важно) во всем справочнике. Добился того, что в ФормеЭлемента написал процедуру "ПриИзменении" и Код меняется только после редактирования одного конкретного Наименования и нажатия кнопки "Записать". Так как в справочнике более 3 тысяч позиций и руками перебитьвать не вариант, меня это не устраивает. Насколько я понимаю, все операции нужно производить в ФормеСписка. Нужен цикл, который бы заменил текущий формат Кода на новый во всех элементах справочника. Помогите, пожалуйста, разобраться.
1 Wobland
 
21.08.13
11:09
цикл нужен, да
2 Wobland
 
21.08.13
11:09
форма списка не нужна, нет
3 Любопытная
 
21.08.13
11:10
(0) А почему обязательно в форме-то?
4 Wobland
 
21.08.13
11:11
(3) человек, вероятно, думает, что в базе есть только то, что он способен увидеть
5 Godofsin
 
21.08.13
11:12
(0) Используй перенумерацию из обработки справочников и документов
6 mulmulya
 
21.08.13
11:17
(0) не надо писать ничего в форме справочника (ни списка, ни элемента). В (5) тебе дело сказали. Но если уж хочется самому написать, то создай внешнюю обработку и в ней перенумеруй все элементы. Делаешь выборку всех элементов и в цикле меняешь каждому код
7 mulmulya
 
21.08.13
11:19
+ (6) Запрос к справочнику, потом выборку
8 Nykos
 
21.08.13
11:27
Что-то вроде этого, да?...


Запрос = Новый Запрос("
|ВЫБРАТЬ
|    Код
|ИЗ
|    Справочник.Номенклатура
|АВТОУПОРЯДОЧИВАНИЕ");
    
Результат = Запрос.Выполнить().Выбрать();

Пока Результат.Следующий() Цикл
    //цикл для замены кода  
КонецЦикла;
9 Wobland
 
21.08.13
11:27
выбрать ссылку
10 Nykos
 
21.08.13
11:30
Запрос = Новый Запрос("
|ВЫБРАТЬ
|    Ссылка,
|    Код
|ИЗ
|    Справочник.Номенклатура
|АВТОУПОРЯДОЧИВАНИЕ");

так?
11 Wobland
 
21.08.13
11:30
(10) нет
12 Nykos
 
21.08.13
11:35
Не понимаю(

А может через выборку?

Выборка = Справочники.Номенклатура.Выбрать();
Пока выборка.Следующий() = 1 Цикл
//мой цикл по замене кода
...Сообщить(...);
КонецЦикла

Так может как-то?
13 Wobland
 
21.08.13
11:37
я не против
14 Любопытная
 
21.08.13
11:39
(12) не забудь, что по ссылке тебе надо получить объект, а потом уже в объекте менять код.
15 Nykos
 
21.08.13
11:46
(14) А объектом у меня является что?
16 Любопытная
 
21.08.13
11:52
(15)
Выборка = Справочники.Номенклатура.Выбрать();
Пока Выборка.Следующий() Цикл
НомОбъект = Выборка.ПолучитьОбъект();
НомОбъект.УстановитьНовыНомер("000");//или НомОбъект.Код = "151000";
Попытка
НомОбъект.Записать();
Исключение
КонецПопытки;

Первый день как 1С увидел?
17 Любопытная
 
21.08.13
11:53
А, КонецЦикла забыла :)
18 hhhh
 
21.08.13
11:53
(15) элементы справочника Номенклатура имхо
19 Wobland
 
21.08.13
11:53
(18) думаю, у него там больше объектов, чем только номенклатуры
20 Nykos
 
21.08.13
12:04
(16)Получилось. Но теперь, когда я хочу поменять запись в Наименовании выдает ошибку "Операция не может быть выполнена из-за несоответствия версии или отсутствия записи базы данных(возможно, запись была изменена или удалена).

Не первый, третий. Но очень хочу научиться.
21 hhhh
 
21.08.13
12:06
(20) так не надо было держать документ открытым во время выполнения обработки? Граждане, вовремя закрывайте документы, не держите их на экране.
22 Nykos
 
21.08.13
12:46
(6) Спасибо) сделал через внешнюю обработку.

Запрос = Новый Запрос("ВЫБРАТЬ
                          | Номенклатура.Ссылка
                          |ИЗ
                          | Справочник.Номенклатура КАК Номенклатура");
                          
    Результат = Запрос.Выполнить().Выбрать();
    
    Пока Результат.Следующий() Цикл
        Объект = Результат.Ссылка.ПолучитьОбъект();
        Объект.Код = "12345";
        Объект.Записать();
    КонецЦикла;

Все получилось, заполнило в поле Код во всем справочнике "12345". Принцип понятен)

А вот у меня в справочнике есть поле "Номер", которое имеет  вид:
1.1.0
1.1.1
1.1.2
...
1.1.21
и тд.

И мне надо сделать так, чтобы Код равнялся Номеру, только вместо точек в Коде должны быть нули, ну и спереди нолик дописать. (пример: "1.1.21"-0101021"). Не подскажете как это сделать?
23 Wobland
 
21.08.13
12:50
Лев("00000000000"+СтрЗаменить(стр, ".", "0"), НужнаяДлина)
24 Wobland
 
21.08.13
12:51
(23) прав, конечно
25 Nykos
 
22.08.13
10:27
Ребят, помогите написать обработчик, который бы проверял длину строки одного поля(Номер) и в цикле добивал нулями до нужной длины(10 символов) и помещал в другое поле(Код)?
26 Wobland
 
22.08.13
10:31
(25) посылаю тебе луч помощи
27 hhhh
 
22.08.13
10:35
(23) ну в (23) же написан этот обработчик
28 Nykos
 
22.08.13
10:38
Запрос = Новый Запрос("ВЫБРАТЬ
                          | Номенклатура.Ссылка
                          |ИЗ
                          | Справочник.Номенклатура КАК Номенклатура");
                          
    Результат = Запрос.Выполнить().Выбрать();
    
    Пока Результат.Следующий() Цикл
        Объект = Результат.Ссылка.ПолучитьОбъект();
        Объект.Код = "Лев("00000000000"+СтрЗаменить(Объект.<моя строка>, ".", "0"), <НужнаяДлина>)";
        Объект.Записать();
    КонецЦикла;

Я так делал, когда выполняю все просто забивается нулями...
29 Wobland
 
22.08.13
11:25
(28) врёшь ты всё. "Лев("00000" у тбя там должно быть
30 Nykos
 
22.08.13
11:47
Правда вру, сделал поменьше, заработало)
Глупец, лишенный способности посмеяться над собой вместе с другими, не сможет долго выносить программирование. Фредерик Брукс-младший