1С Предприятие 7.7(сетевая версия) - 7.70.027,Конф: ПУБ(7.70.010)
Помогите в документе заполненном поменять значение реквизитов местами: МестоХранения и МестоХраненияВЭксплуатации. Начала писать обработку:
Процедура Выполнить()
Док=СоздатьОбъект("Документ");
Док.ВыбратьДокументы(НачДата,КонДата);
Пока Док.ПолучитьДокумент()=1 Цикл
Если (Док.Вид() = "ВводВЭксплуатацию") Тогда
Док.ВыбратьСтроки();
Пока Док.ПолучитьСтроку() = 1 Цикл
Если ПустоеЗначение(Док.МестоХранения) = 0 Тогда
Док.МестоХранения=Док.МестоХраненияВЭксплуатации;
Док.МестоХраненияВЭксплуатации=Док.МестоХранения;
КонецЕсли;
ГлПользователь=Док.Автор;
КонецЦикла;
Док.Записать();
Док.ВыбратьСтроки();
Пока Док.ПолучитьСтроку()=1 Цикл
КонецЦикла;
КонецЕсли;
КонецЦикла;
Предупреждение("Обработка завершена!");
КонецПроцедуры
В результате в МестоХранения записывается значение реквизита МестоХраненияВЭксплуатации, а значение МестоХраненияВЭксплуатации не меняется.
Так вы же записываете одно и тоже значение в две переменных.
Введите доп переменную и в нее вносите МестоХраненияВЭксплуатации.
А потом уже из нее присваивайте значение нужному реквизиту
alex040269
06.10.11, 13:19
Цитата(wmatik @ 06.10.11, 14:00) необходимо зарегистрироваться для просмотра ссылки
Процедура Выполнить()
Док.МестоХранения=Док.МестоХраненияВЭксплуатации;
Док.МестоХраненияВЭксплуатации=Док.МестоХранения;
КонецПроцедуры
В результате в МестоХранения записывается значение реквизита МестоХраненияВЭксплуатации, а значение МестоХраненияВЭксплуатации не меняется.
МестоХранения=Док.МестоХраненияВЭксплуатации;
Док.МестоХраненияВЭксплуатации = Док.МестоХранения;
Док.МестоХранения =МестоХранения;
Создала дополнительную переменную МестоХр, но почему то не все переносится, не соображу почему некоторые не меняются:
Процедура Выполнить()
Док=СоздатьОбъект("Документ");
Док.ВыбратьДокументы(НачДата,КонДата);
Пока Док.ПолучитьДокумент()=1 Цикл
Если (Док.Вид() = "ВводВЭксплуатацию") Тогда
Сообщить("Обрабатываю документ "+Док.ТекущийДокумент());
Док.ВыбратьСтроки();
Пока Док.ПолучитьСтроку() = 1 Цикл
Если ПустоеЗначение(Док.МестоХранения) = 0 Тогда
Док.МестоХр=Док.МестоХранения;
Док.Записать();
Док.МестоХранения=Док.МестоХраненияВЭксплуатации;
Док.МестоХраненияВЭксплуатации=Док.МестоХр;
КонецЕсли;
ГлПользователь=Док.Автор;
КонецЦикла;
Док.Записать();
Док.ВыбратьСтроки();
Пока Док.ПолучитьСтроку()=1 Цикл
КонецЦикла;
КонецЕсли;
КонецЦикла;
Предупреждение("Обработка завершена!");
КонецПроцедуры
Цитата(wmatik @ 06.10.11, 14:49) необходимо зарегистрироваться для просмотра ссылки
Создала дополнительную переменную МестоХр, но почему то не все переносится, не соображу почему некоторые не меняются:
Потому что не описан алгоритм в случае блока Иначе:
Процедура Выполнить()
Если ПустоеЗначение(Док.МестоХранения) = 0 Тогда
КонецПроцедуры
так оно не пустое, да и вообще нет пустых вообще, все заполнено.
Вы меняете 1 реквизит дока, потом сам док записываете.А потом пытаетесь изменить 2-ой реквизит в уже записанном доке.
Если ПустоеЗначение(Док.МестоХранения) = 0 Тогда
Док.МестоХр=Док.МестоХранения;
// Док.Записать();
Док.МестоХранения=Док.МестоХраненияВЭксплуатации;
Док.МестоХраненияВЭксплуатации=Док.МестоХр;
КонецЕсли;
ГлПользователь=Док.Автор;
КонецЦикла;
убрала Док.Записать();, но все та же песня...(
Цитата(wmatik @ 06.10.11, 15:20) необходимо зарегистрироваться для просмотра ссылки
убрала Док.Записать();, но все та же песня...(
А что такое:
Док.МестоХр
?
Вам писал создать именно переменную.
МестоХр = Док.МестоХранения;
Вы пишете что создали переменную МестоХр, а по коду видно что это реквизит документа. Так что Вы создали?
Цитата(wmatik @ 06.10.11, 16:30) необходимо зарегистрироваться для просмотра ссылки
я создала реквизит
А реквизит то зачем? Сделайте так, как Вам посоветовали - переменную.
Цитата(wmatik @ 06.10.11, 15:30) необходимо зарегистрироваться для просмотра ссылки
я создала реквизит
Вы разницу между переменной и реквизитом ощущаете?
Создала переменную, все равно непонятно почему, некоторые документы не записывает.
Ну что Вы все налетели и сразу под стол? Обратились за помощью, делает сама, но не получается.
Сначала нужно сохранить текущие значения в переменные
СтарМестоХранения = Док.МестоХранения;
СтарМестоХраненияВЭксплуатации = Док.МестоХраненияВЭксплуатации;
После чего нужно установить в документе значения из этих переменных
Док.МестоХранения=СтарМестоХраненияВЭксплуатации
Док.МестоХраненияВЭксплуатации=СтарМестоХранения;
alex040269
07.10.11, 7:44
Цитата(wmatik @ 07.10.11, 8:19) необходимо зарегистрироваться для просмотра ссылки
Создала переменную, все равно непонятно почему, некоторые документы не записывает.
Установите точку останова с условием на эти документов.
или в коде
Если Док.Номер = "????" Тогда
Сообщить("что-то")
Конецесли
Установите точку останова на Сообщить в отладчике и посмотрите что происходит на самом деле....
Batchir, спасибо за понимания, сделала как вы написали, та же телега....
некоторые документы заполняюся правильно, шагаю дальше и выдает:Док.МестоХраненияВЭксплуатации = Ошибка в выражении!
Отладчиком смотрите. Если одни и те же документы не записываются, то как посоветовал alex040269. Если нет, то без условия Сообщить("что-то").
Кстати зачем Вы перебыраете строки документа после его записи? Вряд ли это решит проблему, но я бы убрал перебор строк.
Ну и на всякий случай. Может Вы запускаете свою обработку в то время, когда есть открытые документы кем-то? Тогда они не запишутся.
убрала перебор строк, все то же. В общем в итоге код сейчас выглядит таким образом:
Процедура Выполнить()
Док=СоздатьОбъект("Документ");
Док.ВыбратьДокументы(НачДата,КонДата);
Пока Док.ПолучитьДокумент()=1 Цикл
Если (Док.Вид() = "ВводВЭксплуатацию") Тогда
Сообщить("Обрабатываю документ "+Док.ТекущийДокумент());
Док.ВыбратьСтроки();
Пока Док.ПолучитьСтроку() = 1 Цикл
Если ПустоеЗначение(Док.МестоХраненияВЭксплуатации) = 0 Тогда
СтарМестоХранения = Док.МестоХранения;
СтарМестоХраненияВЭксплуатации = Док.МестоХраненияВЭксплуатации;
Док.МестоХранения=СтарМестоХраненияВЭксплуатации;
Док.МестоХраненияВЭксплуатации=СтарМестоХранения;
КонецЕсли;
ГлПользователь=Док.Автор;
КонецЦикла;
Док.Записать();
КонецЕсли;
КонецЦикла;
Предупреждение("Обработка завершена!");
КонецПроцедуры
Какой тип данных у:
МестоХраненияВЭксплуатации и МестоХранения ?
Еще. Вы писали "нет пустых вообще, все заполнено". В то же время в обработке "Если ПустоеЗначение(Док.МестоХраненияВЭксплуатации) = 0".
Может есть таки пустые и документы не обрабатываются?
Если пустых нет то зачем условие? Уберите его.
Если есть условие для МестоХраненияВЭксплуатации, то почему нет для МестоХранения?
Может как-то так еще попробовать
Док.УстановитьАтрибут("МестоХранения", СтарМестоХраненияВЭксплуатации);
Док.УстановитьАтрибут("МестоХраненияВЭксплуатации", СтарМестоХранения);
Цитата(Читатель @ 07.10.11, 9:49) необходимо зарегистрироваться для просмотра ссылки
Еще. Вы писали "нет пустых вообще, все заполнено". В то же время в обработке "Если ПустоеЗначение(Док.МестоХраненияВЭксплуатации) = 0".
Может есть таки пустые и документы не обрабатываются?
Если пустых нет то зачем условие? Уберите его.
Если есть условие для МестоХраненияВЭксплуатации, то почему нет для МестоХранения?
Тоже склоняюсь к тому что есть пустые значение.Иначе условие это вообще не надо
Попробуйте так (и сообщите результат):
Процедура Выполнить()
Док=СоздатьОбъект("Документ");
Док.ВыбратьДокументы(НачДата,КонДата);
Пока Док.ПолучитьДокумент()=1 Цикл
Если (Док.Вид() = "ВводВЭксплуатацию") Тогда
Состояние("Обрабатываю документ "+Док.ТекущийДокумент());
Попытка
Док.ВыбратьСтроки();
Пока Док.ПолучитьСтроку() = 1 Цикл
Если ПустоеЗначение(Док.МестоХраненияВЭксплуатации) = 0 Тогда
СтарМестоХранения = Док.МестоХранения;
СтарМестоХраненияВЭксплуатации = Док.МестоХраненияВЭксплуатации;
Док.МестоХранения=СтарМестоХраненияВЭксплуатации;
Док.МестоХраненияВЭксплуатации=СтарМестоХранения;
КонецЕсли;
ГлПользователь=Док.Автор;
КонецЦикла;
Док.Записать();
исключение
Сообщить("Ошибка в документе: "+СокрЛП(Док.Вид())+" №"+Док.НомерДок+" от "+Док.ДатаДок);
Сообщить(ОписаниеОшибки());
КонецПопытки;
КонецЕсли;
КонецЦикла;
Предупреждение("Обработка завершена!");
КонецПроцедуры
Будет интересовать содержание окна сообщений.
Можно даже принтскин выставить.
А для чего кстати пускать цикл по всем документам, если вы заведомо знаете, что вам нужен Документ.ВводВЭксплуатацию ?
Процедура Выполнить()
Док=СоздатьОбъект("Документ");
Док.ВыбратьДокументы(НачДата,КонДата);
Пока Док.ПолучитьДокумент()=1 Цикл
Если (Док.Вид() = "ВводВЭксплуатацию") Тогда
Сообщить("Обрабатываю документ "+Док.ТекущийДокумент());
Док.ВыбратьСтроки();
Пока Док.ПолучитьСтроку() = 1 Цикл
СтарМестоХранения = Док.МестоХранения;
СтарМестоХраненияВЭксплуатации = Док.МестоХраненияВЭксплуатации;
Док.УстановитьАтрибут("МестоХранения", СтарМестоХраненияВЭксплуатации);
Док.УстановитьАтрибут("МестоХраненияВЭксплуатации", СтарМестоХранения);
ГлПользователь=Док.Автор;
КонецЦикла;
Док.Записать();
КонецЕсли;
КонецЦикла;
Предупреждение("Обработка завершена!");
КонецПроцедуры
По прежнему некоторые не меняются
Цитата(wmatik @ 07.10.11, 10:05) необходимо зарегистрироваться для просмотра ссылки
По прежнему некоторые не меняются
Ну вы можете приблизительно отследить тенденцию тех некоторых что меняются и тех некоторых что не меняются.Может разница в датах или в проведен/не проведен или пометка удаления, или еще что и т.д.?
GreenFox, сделала как вы писали, никаких сообщений не выдал, но и по прежнему не все документы поменял
Да в том то и дело, что все документы проведены, нет пометок на удаление, а как дату можно проследить?
А для чего вы передаете параметры НачДата и КонДата?
Параметры:
<Дата1> - дата, документ или позиция начала выборки документов. Если данный параметр опущен, то выборка начинается с самого первого существующего в системе документа.
<Дата2> - дата, документ или позиция конца выборки документов. Если данный параметр опущен, то выборка заканчивается самым последним существующим в системе документом.
Док = СоздатьОбъект("Документ.ВводВЭксплуатацию");
Док.ВыбратьДокументы();
Пока Док.ПолучитьДокумент()>0 Цикл
nysysimara
07.10.11, 10:34
МестоХранения и МестоХраненияВЭксплуатации, насколько я понимаю, - реквизиты шапки документа, значит перебирать строки вам ник чему.
Если диапазон документов не ограничен, т.е. изменить во всех документах базы, тогда попробуйте так:
Процедура Выполнить()
Док = СоздатьОбъект("Документ.ВводВЭксплуатацию");
Док.ВыбратьДокументы(,);
Пока Док.ПолучитьДокумент()>0 Цикл
старМестоХранения = Док.МестоХранения;
старМестоХраненияВЭксплуатации = Док.МестоХраненияВЭксплуатации;
Док.МестоХранения = старМестоХраненияВЭксплуатации;
Док.МестоХраненияВЭксплуатации = старМестоХранения;
Док.Записать();
КонецЦикла;
КонецПроцедуры
,
если нужн оперделенный период дат, тогда
Док.ВыбратьДокументы(ДатаНач,ДатаКон);
Цитата(wmatik @ 07.10.11, 11:15) необходимо зарегистрироваться для просмотра ссылки
GreenFox, сделала как вы писали, никаких сообщений не выдал, но и по прежнему не все документы поменял
Да в том то и дело, что все документы проведены, нет пометок на удаление, а как дату можно проследить?
Вы уж извините, но давайте еще попробуем так:
Процедура Выполнить()
Док=СоздатьОбъект("Документ");
Док.ВыбратьДокументы(НачДата,КонДата);
Пока Док.ПолучитьДокумент()=1 Цикл
Если (Док.Вид() = "ВводВЭксплуатацию") Тогда
Состояние("Обрабатываю документ "+Док.ТекущийДокумент());
Попытка
Док.ВыбратьСтроки();
Пока Док.ПолучитьСтроку() = 1 Цикл
Если ПустоеЗначение(Док.МестоХраненияВЭксплуатации) = 0 Тогда
СтарМестоХранения = Док.МестоХранения;
СтарМестоХраненияВЭксплуатации = Док.МестоХраненияВЭксплуатации;
Док.МестоХранения=СтарМестоХраненияВЭксплуатации;
Док.МестоХраненияВЭксплуатации=СтарМестоХранения;
иначе
Сообщить(Пустое значение МестоХраненияВЭксплуатации в документе: "+СокрЛП(Док.Вид())+" №"+Док.НомерДок+" от "+Док.ДатаДок);
Продолжить;
КонецЕсли;
ГлПользователь=Док.Автор;
КонецЦикла;
Док.Записать();
исключение
Сообщить("Ошибка в документе: "+СокрЛП(Док.Вид())+" №"+Док.НомерДок+" от "+Док.ДатаДок);
Сообщить(ОписаниеОшибки());
КонецПопытки;
КонецЕсли;
КонецЦикла;
Предупреждение("Обработка завершена!");
КонецПроцедуры
И еще:
МестоХраненияВЭксплуатации, и МестоХранения - это реквизиты шапки или табличной части?
МестоХраненияВЭксплуатации, и МестоХранения - это реквизиты шапки
nysysimara
07.10.11, 10:45
если
Цитата(wmatik @ 07.10.11, 11:40) необходимо зарегистрироваться для просмотра ссылки
МестоХраненияВЭксплуатации, и МестоХранения - это реквизиты шапки
попробуйте как я вам советую
Цитата(wmatik @ 07.10.11, 11:40) необходимо зарегистрироваться для просмотра ссылки
МестоХраненияВЭксплуатации, и МестоХранения - это реквизиты шапки
тогда действительно цикл по строкам не нужен
Процедура Выполнить()
Док=СоздатьОбъект("Документ");
Док.ВыбратьДокументы(НачДата,КонДата);
Пока Док.ПолучитьДокумент()=1 Цикл
Если (Док.Вид() = "ВводВЭксплуатацию") Тогда
Состояние("Обрабатываю документ "+Док.ТекущийДокумент());
Попытка
Если ПустоеЗначение(Док.МестоХраненияВЭксплуатации) = 0 Тогда
СтарМестоХранения = Док.МестоХранения;
СтарМестоХраненияВЭксплуатации = Док.МестоХраненияВЭксплуатации;
Док.МестоХранения=СтарМестоХраненияВЭксплуатации;
Док.МестоХраненияВЭксплуатации=СтарМестоХранения;
иначе
Сообщить(Пустое значение МестоХраненияВЭксплуатации в документе: "+СокрЛП(Док.Вид())+" №"+Док.НомерДок+" от "+Док.ДатаДок);
Продолжить;
КонецЕсли;
ГлПользователь=Док.Автор;
Док.Записать();
исключение
Сообщить("Ошибка в документе: "+СокрЛП(Док.Вид())+" №"+Док.НомерДок+" от "+Док.ДатаДок);
Сообщить(ОписаниеОшибки());
КонецПопытки;
КонецЕсли;
КонецЦикла;
Предупреждение("Обработка завершена!");
КонецПроцедуры
Напишите что есть в окне сообщений
Цитата(nysysimara @ 07.10.11, 11:45) необходимо зарегистрироваться для просмотра ссылки
если
попробуйте как я вам советую
Отбор по виду документа нужен
nysysimara, все получилось!)
nysysimara
07.10.11, 10:52
Цитата
Отбор по виду документа нужен
не нужен
Цитата(wmatik @ 07.10.11, 11:51) необходимо зарегистрироваться для просмотра ссылки
nysysimara, все получилось!)
Цитата(nysysimara @ 07.10.11, 11:52) необходимо зарегистрироваться для просмотра ссылки
не нужен
Мои поздравления - Вы победили, Надо "подтянуть свои знания семерки"
да, всем спасибо за участие!!!
а мне учить учить и еще раз учить
Цитата(wmatik @ 07.10.11, 10:59) необходимо зарегистрироваться для просмотра ссылки
да, всем спасибо за участие!!!
а мне учить учить и еще раз учить
Лучше 8 -ку
кстати её мне надо тоже начинать познавать, т.к. уже почти купили
Цитата(wmatik @ 07.10.11, 11:10) необходимо зарегистрироваться для просмотра ссылки
кстати её мне надо тоже начинать познавать, т.к. уже почти купили
Вот как раз и начнете ее познавать с зачетных книженций из коробки
Цитата(wmatik @ 06.10.11, 14:00) необходимо зарегистрироваться для просмотра ссылки
Если ПустоеЗначение(Док.МестоХранения) = 0 Тогда
Док.МестоХранения=Док.МестоХраненияВЭксплуатации;
Док.МестоХраненияВЭксплуатации=Док.МестоХранения;
КонецЕсли;
Если не смотреть на все остальное, меня сильно напрягла эта конструкция, дело в том что в результате получится абсолютно одинаковые колонки для значений МестоХранения и МестоХраненияВЭксплуатации
Цитата(sercher @ 08.05.12, 13:07) необходимо зарегистрироваться для просмотра ссылки
Если не смотреть на все остальное, меня сильно напрягла эта конструкция, дело в том что в результате получится абсолютно одинаковые колонки для значений МестоХранения и МестоХраненияВЭксплуатации
Вот и я о том же. Были бы числа, обмен делается примитивно просто: x:=x-y; y:=x+y; x:=y-x. А тут какие-то места...
для "мест " обмен делается точно так же примитивно просто
точнее не так, это долго
и математические способы тут не применимы:
временнаяПеременная = Место1;
Место1 = Место2;
Место2 = ВременнаяПеременная;
Для просмотра полной версии этой страницы, пожалуйста,
пройдите по ссылке.