1С 7.7 Для тех, кто программирует.
21.07.2009
09:42
#12
Видимо он имеет ввиду, что таблицу в отчетах и обработках можно использовыать как элемент диалога. В таком случае в таблице будут храниться данные из справочников или документов. Пример - форма "Т-2" в справочнике сотрудники.
21.07.2009
14:52
#13
Я еще раз Вас побеспокою... Сделали все как Вы посоветовали, только опять же столкнулись с очередной проблемой: обработка, которая должна менять Наименование в справочнике по периодическому реквизиту не хочет работать, потому как опять выдает такую же ошибку:
"Изменено Наименование! Может быть нарушена последовательность выборки! " Что делать?
"Изменено Наименование! Может быть нарушена последовательность выборки! " Что делать?
21.07.2009
15:36
#14
"Если вы делаете изменение примерно таким способом:
Справочник.ВыбратьЭлементы ();
Пока Справочник.ПолучитьЭлемент() > 0 Цикл
...Тут меняете и записываете
КонецЦикла;
То попробуйте сделать так:
Список = СоздатьОбъект ("СписокЗначений");
Справочник.ВыбратьЭлементы ();
Пока Справочник.ПолучитьЭлемент() > 0 Цикл
НадоМенять = 0;
...Тут определеляете, что надо изменить наименование, ставите НадоМенять = 1;
Если НадоМенять = 1 Тогда
Список.Добавить (Справочник.ТекущийЭлемент());
КонецЕсли;
КонецЦикла;
Для Сч = 1 По Список.РазмерСписка () Цикл
...Тут меняете наименование.
КонецЦикла;"
Справочник.ВыбратьЭлементы ();
Пока Справочник.ПолучитьЭлемент() > 0 Цикл
...Тут меняете и записываете
КонецЦикла;
То попробуйте сделать так:
Список = СоздатьОбъект ("СписокЗначений");
Справочник.ВыбратьЭлементы ();
Пока Справочник.ПолучитьЭлемент() > 0 Цикл
НадоМенять = 0;
...Тут определеляете, что надо изменить наименование, ставите НадоМенять = 1;
Если НадоМенять = 1 Тогда
Список.Добавить (Справочник.ТекущийЭлемент());
КонецЕсли;
КонецЦикла;
Для Сч = 1 По Список.РазмерСписка () Цикл
...Тут меняете наименование.
КонецЦикла;"
21.07.2009
15:50
#15
"> Если вы делаете изменение примерно таким способом:
> Справочник.ВыбратьЭлементы ();
> Пока Справочник.ПолучитьЭлемент() > 0 Цикл
> ...Тут меняете и записываете
> КонецЦикла;
>
> То попробуйте сделать так:
> Список = СоздатьОбъект ("СписокЗначений");
> Справочник.ВыбратьЭлементы ();
> Пока Справочник.ПолучитьЭлемент() > 0 Цикл
> НадоМенять = 0;
> ...Тут определеляете, что надо изменить наименование, ставите НадоМенять = 1;
> Если НадоМенять = 1 Тогда
> Список.Добавить (Справочник.ТекущийЭлемент());
> КонецЕсли;
> КонецЦикла;
>
> Для Сч = 1 По Список.РазмерСписка () Цикл
> ...Тут меняете наименование.
> КонецЦикла;
а зачем так???
еси наименование меняем, то выборку ставим по коду
Справочник.ПорядокКодов();
Справочник.ВыбратьЭлементы ();
Пока Справочник.ПолучитьЭлемент() > 0 Цикл
...Тут меняете и записываете
КонецЦикла;
"
> Справочник.ВыбратьЭлементы ();
> Пока Справочник.ПолучитьЭлемент() > 0 Цикл
> ...Тут меняете и записываете
> КонецЦикла;
>
> То попробуйте сделать так:
> Список = СоздатьОбъект ("СписокЗначений");
> Справочник.ВыбратьЭлементы ();
> Пока Справочник.ПолучитьЭлемент() > 0 Цикл
> НадоМенять = 0;
> ...Тут определеляете, что надо изменить наименование, ставите НадоМенять = 1;
> Если НадоМенять = 1 Тогда
> Список.Добавить (Справочник.ТекущийЭлемент());
> КонецЕсли;
> КонецЦикла;
>
> Для Сч = 1 По Список.РазмерСписка () Цикл
> ...Тут меняете наименование.
> КонецЦикла;
а зачем так???
еси наименование меняем, то выборку ставим по коду
Справочник.ПорядокКодов();
Справочник.ВыбратьЭлементы ();
Пока Справочник.ПолучитьЭлемент() > 0 Цикл
...Тут меняете и записываете
КонецЦикла;
"
21.07.2009
15:57
#16
Привычка обрабатывать потом, когда уверен на все 100, что выборка не будет меняться
21.07.2009
16:38
#17
"А еще можно так:
СправочникИзменение = СоздатьОбъект("Справочник.НужныйСправочник");
Справочник.ВыбратьЭлементы ();
Пока Справочник.ПолучитьЭлемент() > 0 Цикл
СправочникИзменение.НайтиЭлемент(Справочник.ТекущийЭлемент());
СправочникИзменение.Наименование = "Нужное наименование";
СправочникИзменение.Записать();
...Тут меняете и записываете
КонецЦикла;
"
СправочникИзменение = СоздатьОбъект("Справочник.НужныйСправочник");
Справочник.ВыбратьЭлементы ();
Пока Справочник.ПолучитьЭлемент() > 0 Цикл
СправочникИзменение.НайтиЭлемент(Справочник.ТекущийЭлемент());
СправочникИзменение.Наименование = "Нужное наименование";
СправочникИзменение.Записать();
...Тут меняете и записываете
КонецЦикла;
"
21.07.2009
16:46
#18
Вопрос, как работает ВыбратьЭлементы и ПолучитьЭлемент. Справочник один и тотже. В этом и заключается вопрос.
22.07.2009
11:47
#19
"> "Таблица значений" - это не сохраняемый объект
Вообще-то можно сохранять в файл ЗначениеВФайл() и загружать потом из него ЗначениеИзФайла().
Если база не распределенная - то без проблем.
Придумать имя файла содержащее информацию о дате изменений.
Тогда на каждую дату будет свой файл с сохраненной таблицей значений.
Только в таблице я бы еще хранил кроме нового названия и старое... Так проще было-бы отслеживать изменения.
Точнее в таблице я бы хранил ссылку на элемент справочника, старое значение реквизита, новое значение реквизита
Например (для реквизита Наименование):
//-------------------------------------
тз = СоздатьОбъект("ТаблицаЗначений");
тз.НоваяКолонка("Элмнт");
тз.НоваяКолонка("Было");
тз.НоваяКолонка("Стало");
тз.НоваяКолонка("Дата");
//-------------------------------------
// и, например, заполнять ее примерно так:
//-------------------------------------
спр.ВыбратьЭлементы()
Пока спр.ПолучитьЭлемент()<>0 Цикл
Если НекоеУсловиеОтбораЭлемента(спр.ТекущийЭлемент())<>1 Тогда // Наверняка нужно не все элементы менять.
Продолжить;
КонецЕсли;
тз.НоваяСтрока();
тз.Элмнт = спр.ТекущийЭлемент();
тз.Было = спр.Наименование;
тз.Стало = ВашеНовоеЗначениеРеквизита;
тз.Дата = ТекущаяДата();
КонецЦикла;
// потом пробежаться по таблице и изменить наименования
Для к=1 по тз.КоличествоСтрок();
Если спр.НайтиЭлемент(тз.Элмнт) = 1 Тогда
спр.Наименование = тз.Стало;
спр.Записать();
Иначе
Сообщить("куда-то элемент потерялся... :)");
КонецЕсли;
КонецЦикла;
// Затем сохранить нашу табличку в файл
ИмяФайла = КаталогИБ()+"РеквизитыНа_"+Формат(ТекущаяДата(),"ДГГГГММДД")+".tzn";
ЗначениеВФайл(ИмяФайла,тз);
// всё, наши изменения сохранены....
- - - - - - - -
Потом, где необходимо "вспомнить" изменения пишем
тз = СоздатьОбъект("ТаблицаЗначений");
ЗначениеИзФайла(ИмяФайла,тз);
и манипулируем с тз как нам хочется."
Вообще-то можно сохранять в файл ЗначениеВФайл() и загружать потом из него ЗначениеИзФайла().
Если база не распределенная - то без проблем.
Придумать имя файла содержащее информацию о дате изменений.
Тогда на каждую дату будет свой файл с сохраненной таблицей значений.
Только в таблице я бы еще хранил кроме нового названия и старое... Так проще было-бы отслеживать изменения.
Точнее в таблице я бы хранил ссылку на элемент справочника, старое значение реквизита, новое значение реквизита
Например (для реквизита Наименование):
//-------------------------------------
тз = СоздатьОбъект("ТаблицаЗначений");
тз.НоваяКолонка("Элмнт");
тз.НоваяКолонка("Было");
тз.НоваяКолонка("Стало");
тз.НоваяКолонка("Дата");
//-------------------------------------
// и, например, заполнять ее примерно так:
//-------------------------------------
спр.ВыбратьЭлементы()
Пока спр.ПолучитьЭлемент()<>0 Цикл
Если НекоеУсловиеОтбораЭлемента(спр.ТекущийЭлемент())<>1 Тогда // Наверняка нужно не все элементы менять.
Продолжить;
КонецЕсли;
тз.НоваяСтрока();
тз.Элмнт = спр.ТекущийЭлемент();
тз.Было = спр.Наименование;
тз.Стало = ВашеНовоеЗначениеРеквизита;
тз.Дата = ТекущаяДата();
КонецЦикла;
// потом пробежаться по таблице и изменить наименования
Для к=1 по тз.КоличествоСтрок();
Если спр.НайтиЭлемент(тз.Элмнт) = 1 Тогда
спр.Наименование = тз.Стало;
спр.Записать();
Иначе
Сообщить("куда-то элемент потерялся... :)");
КонецЕсли;
КонецЦикла;
// Затем сохранить нашу табличку в файл
ИмяФайла = КаталогИБ()+"РеквизитыНа_"+Формат(ТекущаяДата(),"ДГГГГММДД")+".tzn";
ЗначениеВФайл(ИмяФайла,тз);
// всё, наши изменения сохранены....
- - - - - - - -
Потом, где необходимо "вспомнить" изменения пишем
тз = СоздатьОбъект("ТаблицаЗначений");
ЗначениеИзФайла(ИмяФайла,тз);
и манипулируем с тз как нам хочется."
24.07.2009
16:09
#20
Еще вопросик на эту тему... С новыми документами все понятно, а как быть с теми, которые проведены в прошлом и бухгалтеру захотелось распечатать этот документ со старым контрагентом? При открытии проведенного документа в справочнике "Контрагенты" Наименование поменяется, а в документе- снова перевыбирать контрагента?
Читают тему
(гостей: 1)