Глюк в конфе или у меня в котелке?

Новая тема
"В модуле формы:

Процедура Заполнить()

УдалитьСтроки();

О = СоздатьОбъект("Операция");

О.ВыбратьОперацииСПроводками(НачМесяца(ДатаДок),КонМесяца(ДатаДок),СчетПоКоду("25"),СчетПоКоду("01.1"));

Пока О.ПолучитьОперацию() = 1 Цикл

НоваяСтрока();

Док = О.Документ;



ругается, грит примените метод .ТекущийДокумент()



Понимаю, что лажа, но пробую. Прокатило.



В модуле проведения:

Операция.НоваяПроводка() - Модуль Документа(5)}: Недопустимая операция



Подобные вещи делал сотни раз. Такое впервые.

На днях поставил 20-й движок и 434 релиз.







"
"Да вообще-то не глюк, а особенность работы объектов типа "Справочник", "Документ" и других, которые допускают перебор значений (типа .ПолучитьЭлемент()). Вероятно, в целях оптимизации при выполнении:

О=СоздатьОбъект("Операция");

О.ВыбратьЭлементы();

О.ПолучитьЭлемент();

П=О.Документ;

В последней строке в переменную П передается ссылка на О и относительная ссылка (внутри О) на Документ.

Поэтому если надо сохранить в какой-то переменной конкретное значение, лучше всегда использовать .ТекущийЭлемент() и .ТекущийДокумент().

Так надежнее. Кстати, допустимо многократное

.ТекущийДокумент().ТекущийДокумент().ТекущийДокумент();

:) Это нормально проходит!

Поэтому, когда функция (или процедура на входе использует конкретное значение (документ, справочник или еще чего) не вредно внутри функции, для того, чтобы это точно не был объект, выполнить .ТекущийЭлемент().

Примерно так:

Процедура Моя(НужныйЭлемСправочника);

 Перем НастоящийЭлемент;

 НастоящийЭлемент=НужныйЭлемСправочника.ТекущийЭлемент();

// и дальше работать с НастоящийЭлемент

Всего хорошего."
"О=СоздатьОбъект("Операция");

О.ВыбратьЭлементы();

А ты ничего не напутал? Объект "Операция", а не "Справочник".

О.ВыбратьОперации().

Конструкцию описанную мной, я применял неоднократно и без проблем.

Только что пришла мысль попробовать:

Спр = СоздатьОбъект("Справочник.ХХХ");

Спр.ВыбратьДокументы()



Если это сработает, то 1с это лажа полнейшая.

"
"Тут меня поправили (ну ошибся!). Конечно надо:

О=СоздатьОбъект("Операция");

О.ВыбратьОперации();

О.ПолучитьОперацию();

Но сам принцип, я думаю понятен. Вообще следует отличать объект, через который можно получить доступ к конкретному документу, эл. справочника (и т.д.) и значение с с таким типом. Значение не допускает использовать методы (может не все - не помню), а объект лучше использовать в правой части присваивания с "освобождением от объекта": .ТекущийЭлемент() или .ТекущийДокумент().

Я так делаю всегда, но это стиль программирования, например далеко не все объявляют переменные и пишут коментарии. Мне кажется, что лучше написать 1-2 десятка лишних команд, чем потом искать глюки."
Читают тему
(гостей: 2)

Быстрый переход