предисловие.
в поиске был. может плохо был, тогда, плиз, прямую ссылка на топик в студию (сижу через gprs перерывать весь форум нет возможности)
есть топик http://infostart.ru/forum/read.php?23,9722,9762,quote=1,ref=18940 , но этот вариант не подходит: там просто ошибка была в самом коде. а предложение заключить часть кода в транзакцию, конечно, хорошо, но как это может помочь в данном случае представляю себе плохо (на всякий случай проверил, как и ожидалось - не помогло).
возникла необходимость в таком коде (док задается на форме)
Процедура Сформировать()
//// вариант 1
//стр = "Документ."+Док.Вид();
//текДок = создатьобъект(стр);
//текДок = Док;
//текДок.ВыбратьСтроки();
//Пока текДок.ПолучитьСтроку()=1 Цикл
// текДок.Коэффициент = текДок.Номенклатура.БазоваяЕдиница.Коэффициент;
//КонецЦикла;
//текДок.Записать();
// вариант 2
док.ВыбратьСтроки();
Пока док.ПолучитьСтроку()=1 Цикл
док.Коэффициент = док.Номенклатура.БазоваяЕдиница.Коэффициент;
КонецЦикла;
док.Записать();
КонецПроцедуры
выдается:
док.Записать();
{путь\имя.ERT(18)}: Не выбран документ!
при любом варианте (ну номера строк меняются).
подскажите, пожалуйста, что я забыл или неправильно делаю?
---------------------------
извини, не нашел как удалить тему
вопрос решил. просто полетела база ТиС на одном из подразделений, напрягся, перенервничал. сходил, покурил, вспомнил как надо программировать на 1с
правильный вариант, конечно:
стр = "Документ."+Док.Вид();
текДок = создатьобъект(стр);
Если текДок.НайтиДокумент(Док)=1 Тогда
текДок.ВыбратьСтроки();
Пока текДок.ПолучитьСтроку()=1 Цикл
текДок.Коэффициент = текДок.Номенклатура.БазоваяЕдиница.Коэффициент;
КонецЦикла;
текДок.Записать();
Иначе
Сообщить("док не нашли");
КонецЕсли;
Пиши проще.
а то от таких писателей код превращается не в елочку а в сибирскую тайгу.
я бы написал так
Код
Если текДок.НайтиДокумент(Док)=0 Тогда
Сообщить("док не нашли");
Возврат; //или продолжить или еще что-нить
КонецЕсли;
текДок.ВыбратьСтроки();
Пока текДок.ПолучитьСтроку()=1 Цикл
текДок.Коэффициент = текДок.Номенклатура.БазоваяЕдиница.Коэффициент;
КонецЦикла;
текДок.Записать();
Так и поиска документа тоже нет, а изменять документ можно только если: Док=СоздатьОбъект("Документ");
//Док.Новый();ну или
Док.найтидокумент(Текдок);
А вообще есть Синтаксис-Помощник.
2Сhe Burashka бесспорно Ваш вариант оформления элегантнее, но смысл кода все равно не меняется. расширяться код тоже не будет, так что мой вариант без "возврат" также имеет право на жизнь ;)
а про елочку, если Вы имеете ввиду, что нет ведущих табов, то увы и ах :( при копи-пасте они потерялись, а какие коды (BB-Code и прочие) используются на данном форуме не прочитал
2Serjant извините, но будьте проще ;) все в коде и предистории есть.
1. Док - задается на форме
2. текДок - создается в коде:
стр = "Документ."+Док.Вид();
текДок = создатьобъект(стр);
3. поиска документа в первом варианте действительно не было. ну забыл я, что прямое присваивание (текДок = Док) в данном случае неприемлимо. но в третьем варианте (в добавленной области) поиск уже есть:
Если текДок.НайтиДокумент(Док)=1 Тогда
4. Синтаксис-Помощник действительно есть ;) но вот к примеру в статье о "Записать()" ни слова не сказано, что метод применим только к объектам, созданным "создатьобъект". и о том, что нельзя напрямую работать с документом, выбранном на форме, там тоже ни слова нет. а это, вообще говоря, не очевидно.
То что табы потерялись при копи-пасте - это понятно.
Имхо: если вложенность если/Цикл больше 3-х - однозначно надо применять варианты улучшения читабельности кода, типа моего...