Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Как перезаписать значения реквизитов, поменять местами два значения
Украинский 1С форум: всё про 1С 8.3, 1С 8.2, 1С 8.1, 1С 8.0, 1С 7.7 > Программисту > Программирование в 1С Предприятие 7.7
wmatik
1С Предприятие 7.7(сетевая версия) - 7.70.027,Конф: ПУБ(7.70.010)
Помогите в документе заполненном поменять значение реквизитов местами: МестоХранения и МестоХраненияВЭксплуатации. Начала писать обработку:
Процедура Выполнить()
    Док=СоздатьОбъект("Документ");
    Док.ВыбратьДокументы(НачДата,КонДата);
    Пока Док.ПолучитьДокумент()=1 Цикл
        Если (Док.Вид() = "ВводВЭксплуатацию") Тогда
            Док.ВыбратьСтроки();
            Пока Док.ПолучитьСтроку() = 1 Цикл  
                 Если ПустоеЗначение(Док.МестоХранения) = 0 Тогда
                    Док.МестоХранения=Док.МестоХраненияВЭксплуатации;
          Док.МестоХраненияВЭксплуатации=Док.МестоХранения;                                                        
                 КонецЕсли;
                ГлПользователь=Док.Автор;
            КонецЦикла;
            Док.Записать();
            Док.ВыбратьСтроки();
            Пока Док.ПолучитьСтроку()=1 Цикл
            КонецЦикла;
        КонецЕсли;
    КонецЦикла;
    Предупреждение("Обработка завершена!");  
КонецПроцедуры

В результате в МестоХранения записывается значение реквизита МестоХраненияВЭксплуатации, а значение МестоХраненияВЭксплуатации не меняется.
Flexy
Так вы же записываете одно и тоже значение в две переменных.
Введите доп переменную и в нее вносите МестоХраненияВЭксплуатации.
А потом уже из нее присваивайте значение нужному реквизиту
alex040269
Цитата(wmatik @ 06.10.11, 14:00) необходимо зарегистрироваться для просмотра ссылки
Процедура Выполнить()
                    Док.МестоХранения=Док.МестоХраненияВЭксплуатации;
          Док.МестоХраненияВЭксплуатации=Док.МестоХранения;                                                        
КонецПроцедуры

В результате в МестоХранения записывается значение реквизита МестоХраненияВЭксплуатации, а значение МестоХраненияВЭксплуатации не меняется.


МестоХранения=Док.МестоХраненияВЭксплуатации; 
Док.МестоХраненияВЭксплуатации = Док.МестоХранения;
Док.МестоХранения  =МестоХранения;
wmatik
Создала дополнительную переменную МестоХр, но почему то не все переносится, не соображу почему некоторые не меняются:
Процедура Выполнить()
    Док=СоздатьОбъект("Документ");
    Док.ВыбратьДокументы(НачДата,КонДата);
    Пока Док.ПолучитьДокумент()=1 Цикл
        Если (Док.Вид() = "ВводВЭксплуатацию") Тогда
            Сообщить("Обрабатываю документ "+Док.ТекущийДокумент());
            Док.ВыбратьСтроки();
            Пока Док.ПолучитьСтроку() = 1 Цикл              
                Если ПустоеЗначение(Док.МестоХранения) = 0 Тогда    
                    Док.МестоХр=Док.МестоХранения;
                    Док.Записать();
                    Док.МестоХранения=Док.МестоХраненияВЭксплуатации;
                    Док.МестоХраненияВЭксплуатации=Док.МестоХр;
                КонецЕсли;
                ГлПользователь=Док.Автор;
            КонецЦикла;
            Док.Записать();
            Док.ВыбратьСтроки();
            Пока Док.ПолучитьСтроку()=1 Цикл
            КонецЦикла;
        КонецЕсли;
    КонецЦикла;
    Предупреждение("Обработка завершена!");  
КонецПроцедуры
Flexy
Цитата(wmatik @ 06.10.11, 14:49) необходимо зарегистрироваться для просмотра ссылки
Создала дополнительную переменную МестоХр, но почему то не все переносится, не соображу почему некоторые не меняются:

Потому что не описан алгоритм в случае блока Иначе:
Процедура Выполнить()
              
            Если ПустоеЗначение(Док.МестоХранения) = 0 Тогда    
                    
КонецПроцедуры
wmatik
так оно не пустое, да и вообще нет пустых вообще, все заполнено.
Flexy
Вы меняете 1 реквизит дока, потом сам док записываете.А потом пытаетесь изменить 2-ой реквизит в уже записанном доке.
Если ПустоеЗначение(Док.МестоХранения) = 0 Тогда    
                    Док.МестоХр=Док.МестоХранения;
                   // Док.Записать();
                    Док.МестоХранения=Док.МестоХраненияВЭксплуатации;
                    Док.МестоХраненияВЭксплуатации=Док.МестоХр;
                КонецЕсли;
                ГлПользователь=Док.Автор;
            КонецЦикла;
wmatik
убрала Док.Записать();, но все та же песня...(
Flexy
Цитата(wmatik @ 06.10.11, 15:20) необходимо зарегистрироваться для просмотра ссылки
убрала Док.Записать();, но все та же песня...(

А что такое:
Док.МестоХр
?
Вам писал создать именно переменную.
МестоХр = Док.МестоХранения;
Читатель
Вы пишете что создали переменную МестоХр, а по коду видно что это реквизит документа. Так что Вы создали?
wmatik
я создала реквизит
Читатель
Цитата(wmatik @ 06.10.11, 16:30) необходимо зарегистрироваться для просмотра ссылки
я создала реквизит

А реквизит то зачем? Сделайте так, как Вам посоветовали - переменную.
Flexy
Цитата(wmatik @ 06.10.11, 15:30) необходимо зарегистрироваться для просмотра ссылки
я создала реквизит

faceoff.gif
Вы разницу между переменной и реквизитом ощущаете?
Virgo
05081.gif
wmatik
Создала переменную, все равно непонятно почему, некоторые документы не записывает.
Batchir
Ну что Вы все налетели и сразу под стол? Обратились за помощью, делает сама, но не получается.

Сначала нужно сохранить текущие значения в переменные
СтарМестоХранения =  Док.МестоХранения;
СтарМестоХраненияВЭксплуатации =  Док.МестоХраненияВЭксплуатации;

После чего нужно установить в документе значения из этих переменных
Док.МестоХранения=СтарМестоХраненияВЭксплуатации 
Док.МестоХраненияВЭксплуатации=СтарМестоХранения;
alex040269
Цитата(wmatik @ 07.10.11, 8:19) необходимо зарегистрироваться для просмотра ссылки
Создала переменную, все равно непонятно почему, некоторые документы не записывает.

Установите точку останова с условием на эти документов.
или в коде
Если Док.Номер = "????" Тогда
            Сообщить("что-то")
Конецесли


Установите точку останова на Сообщить в отладчике и посмотрите что происходит на самом деле....
wmatik
Batchir, спасибо за понимания, сделала как вы написали, та же телега....

некоторые документы заполняюся правильно, шагаю дальше и выдает:Док.МестоХраненияВЭксплуатации = Ошибка в выражении!
Читатель
Отладчиком смотрите. Если одни и те же документы не записываются, то как посоветовал alex040269. Если нет, то без условия Сообщить("что-то").
Кстати зачем Вы перебыраете строки документа после его записи? Вряд ли это решит проблему, но я бы убрал перебор строк.
Ну и на всякий случай. Может Вы запускаете свою обработку в то время, когда есть открытые документы кем-то? Тогда они не запишутся.
wmatik
убрала перебор строк, все то же. В общем в итоге код сейчас выглядит таким образом:
Процедура Выполнить()
    Док=СоздатьОбъект("Документ");
    Док.ВыбратьДокументы(НачДата,КонДата);
    Пока Док.ПолучитьДокумент()=1 Цикл
        Если (Док.Вид() = "ВводВЭксплуатацию") Тогда
            Сообщить("Обрабатываю документ "+Док.ТекущийДокумент());
            Док.ВыбратьСтроки();
            Пока Док.ПолучитьСтроку() = 1 Цикл              
                Если ПустоеЗначение(Док.МестоХраненияВЭксплуатации) = 0 Тогда    
                    СтарМестоХранения = Док.МестоХранения;
                    СтарМестоХраненияВЭксплуатации = Док.МестоХраненияВЭксплуатации;
                    Док.МестоХранения=СтарМестоХраненияВЭксплуатации;
                    Док.МестоХраненияВЭксплуатации=СтарМестоХранения;  

                КонецЕсли;
                ГлПользователь=Док.Автор;
            КонецЦикла;
            Док.Записать();
        КонецЕсли;
    КонецЦикла;
    Предупреждение("Обработка завершена!");  
КонецПроцедуры
Flexy
Какой тип данных у:
МестоХраненияВЭксплуатации и МестоХранения ?
wmatik
Справочник МестХранения
Читатель
Еще. Вы писали "нет пустых вообще, все заполнено". В то же время в обработке "Если ПустоеЗначение(Док.МестоХраненияВЭксплуатации) = 0".
Может есть таки пустые и документы не обрабатываются?
Если пустых нет то зачем условие? Уберите его.
Если есть условие для МестоХраненияВЭксплуатации, то почему нет для МестоХранения?
Flexy
Может как-то так еще попробовать
Док.УстановитьАтрибут("МестоХранения", СтарМестоХраненияВЭксплуатации); 
Док.УстановитьАтрибут("МестоХраненияВЭксплуатации", СтарМестоХранения);




Цитата(Читатель @ 07.10.11, 9:49) необходимо зарегистрироваться для просмотра ссылки
Еще. Вы писали "нет пустых вообще, все заполнено". В то же время в обработке "Если ПустоеЗначение(Док.МестоХраненияВЭксплуатации) = 0".
Может есть таки пустые и документы не обрабатываются?
Если пустых нет то зачем условие? Уберите его.
Если есть условие для МестоХраненияВЭксплуатации, то почему нет для МестоХранения?

Тоже склоняюсь к тому что есть пустые значение.Иначе условие это вообще не надо
GreenFox
Попробуйте так (и сообщите результат):

Процедура Выполнить()
    Док=СоздатьОбъект("Документ");
    Док.ВыбратьДокументы(НачДата,КонДата);
    Пока Док.ПолучитьДокумент()=1 Цикл
        Если (Док.Вид() = "ВводВЭксплуатацию") Тогда
            Состояние("Обрабатываю документ "+Док.ТекущийДокумент());
          Попытка
            Док.ВыбратьСтроки();
            Пока Док.ПолучитьСтроку() = 1 Цикл              
                Если ПустоеЗначение(Док.МестоХраненияВЭксплуатации) = 0 Тогда    
                    СтарМестоХранения = Док.МестоХранения;
                    СтарМестоХраненияВЭксплуатации = Док.МестоХраненияВЭксплуатации;
                    Док.МестоХранения=СтарМестоХраненияВЭксплуатации;
                    Док.МестоХраненияВЭксплуатации=СтарМестоХранения;  

                КонецЕсли;
                ГлПользователь=Док.Автор;
            КонецЦикла;
            Док.Записать();
          исключение
           Сообщить("Ошибка в документе: "+СокрЛП(Док.Вид())+" №"+Док.НомерДок+" от "+Док.ДатаДок);
           Сообщить(ОписаниеОшибки());
          КонецПопытки;
        КонецЕсли;
    КонецЦикла;
    Предупреждение("Обработка завершена!");  
КонецПроцедуры


Будет интересовать содержание окна сообщений.

Можно даже принтскин выставить.
Flexy
А для чего кстати пускать цикл по всем документам, если вы заведомо знаете, что вам нужен Документ.ВводВЭксплуатацию ?
wmatik
Процедура Выполнить()
    Док=СоздатьОбъект("Документ");
    Док.ВыбратьДокументы(НачДата,КонДата);
    Пока Док.ПолучитьДокумент()=1 Цикл
        Если (Док.Вид() = "ВводВЭксплуатацию") Тогда
            Сообщить("Обрабатываю документ "+Док.ТекущийДокумент());
            Док.ВыбратьСтроки();
            Пока Док.ПолучитьСтроку() = 1 Цикл              
                СтарМестоХранения = Док.МестоХранения;
                СтарМестоХраненияВЭксплуатации = Док.МестоХраненияВЭксплуатации;
                Док.УстановитьАтрибут("МестоХранения", СтарМестоХраненияВЭксплуатации);
                Док.УстановитьАтрибут("МестоХраненияВЭксплуатации", СтарМестоХранения);
                ГлПользователь=Док.Автор;
            КонецЦикла;
            Док.Записать();
        КонецЕсли;
    КонецЦикла;
    Предупреждение("Обработка завершена!");  
КонецПроцедуры

По прежнему некоторые не меняются
Flexy
Цитата(wmatik @ 07.10.11, 10:05) необходимо зарегистрироваться для просмотра ссылки
По прежнему некоторые не меняются

Ну вы можете приблизительно отследить тенденцию тех некоторых что меняются и тех некоторых что не меняются.Может разница в датах или в проведен/не проведен или пометка удаления, или еще что и т.д.?
wmatik
GreenFox, сделала как вы писали, никаких сообщений не выдал, но и по прежнему не все документы поменял

Да в том то и дело, что все документы проведены, нет пометок на удаление, а как дату можно проследить?
Flexy
А для чего вы передаете параметры НачДата и КонДата?

Параметры:
<Дата1> - дата, документ или позиция начала выборки документов. Если данный параметр опущен, то выборка начинается с самого первого существующего в системе документа.
<Дата2> - дата, документ или позиция конца выборки документов. Если данный параметр опущен, то выборка заканчивается самым последним существующим в системе документом.

Док = СоздатьОбъект("Документ.ВводВЭксплуатацию");
        Док.ВыбратьДокументы();
        Пока Док.ПолучитьДокумент()>0 Цикл
nysysimara
МестоХранения и МестоХраненияВЭксплуатации, насколько я понимаю, - реквизиты шапки документа, значит перебирать строки вам ник чему.
Если диапазон документов не ограничен, т.е. изменить во всех документах базы, тогда попробуйте так:
Процедура Выполнить() 
    Док = СоздатьОбъект("Документ.ВводВЭксплуатацию");
    Док.ВыбратьДокументы(,);
    Пока Док.ПолучитьДокумент()>0 Цикл
        старМестоХранения                = Док.МестоХранения;
        старМестоХраненияВЭксплуатации    = Док.МестоХраненияВЭксплуатации;
        
        Док.МестоХранения                = старМестоХраненияВЭксплуатации;
        Док.МестоХраненияВЭксплуатации    = старМестоХранения;
        
        Док.Записать();
    КонецЦикла;
КонецПроцедуры
,
если нужн оперделенный период дат, тогда
Док.ВыбратьДокументы(ДатаНач,ДатаКон);
GreenFox
Цитата(wmatik @ 07.10.11, 11:15) необходимо зарегистрироваться для просмотра ссылки
GreenFox, сделала как вы писали, никаких сообщений не выдал, но и по прежнему не все документы поменял

Да в том то и дело, что все документы проведены, нет пометок на удаление, а как дату можно проследить?


Вы уж извините, но давайте еще попробуем так:

Процедура Выполнить()
    Док=СоздатьОбъект("Документ");
    Док.ВыбратьДокументы(НачДата,КонДата);
    Пока Док.ПолучитьДокумент()=1 Цикл
        Если (Док.Вид() = "ВводВЭксплуатацию") Тогда
            Состояние("Обрабатываю документ "+Док.ТекущийДокумент());
          Попытка
            Док.ВыбратьСтроки();
            Пока Док.ПолучитьСтроку() = 1 Цикл              
                Если ПустоеЗначение(Док.МестоХраненияВЭксплуатации) = 0 Тогда    
                    СтарМестоХранения = Док.МестоХранения;
                    СтарМестоХраненияВЭксплуатации = Док.МестоХраненияВЭксплуатации;
                    Док.МестоХранения=СтарМестоХраненияВЭксплуатации;
                    Док.МестоХраненияВЭксплуатации=СтарМестоХранения;  
                иначе
                    Сообщить(Пустое значение МестоХраненияВЭксплуатации в документе: "+СокрЛП(Док.Вид())+" №"+Док.НомерДок+" от "+Док.ДатаДок);
                    Продолжить;
                КонецЕсли;
                ГлПользователь=Док.Автор;
            КонецЦикла;
            Док.Записать();
          исключение
           Сообщить("Ошибка в документе: "+СокрЛП(Док.Вид())+" №"+Док.НомерДок+" от "+Док.ДатаДок);
           Сообщить(ОписаниеОшибки());
          КонецПопытки;
        КонецЕсли;
    КонецЦикла;
    Предупреждение("Обработка завершена!");  
КонецПроцедуры


И еще:
МестоХраненияВЭксплуатации, и МестоХранения - это реквизиты шапки или табличной части?
wmatik
МестоХраненияВЭксплуатации, и МестоХранения - это реквизиты шапки
nysysimara
если
Цитата(wmatik @ 07.10.11, 11:40) необходимо зарегистрироваться для просмотра ссылки
МестоХраненияВЭксплуатации, и МестоХранения - это реквизиты шапки

попробуйте как я вам советую
GreenFox
Цитата(wmatik @ 07.10.11, 11:40) необходимо зарегистрироваться для просмотра ссылки
МестоХраненияВЭксплуатации, и МестоХранения - это реквизиты шапки


тогда действительно цикл по строкам не нужен

Процедура Выполнить()
    Док=СоздатьОбъект("Документ");
    Док.ВыбратьДокументы(НачДата,КонДата);
    Пока Док.ПолучитьДокумент()=1 Цикл
        Если (Док.Вид() = "ВводВЭксплуатацию") Тогда
           Состояние("Обрабатываю документ "+Док.ТекущийДокумент());
           Попытка
                Если ПустоеЗначение(Док.МестоХраненияВЭксплуатации) = 0 Тогда    
                    СтарМестоХранения = Док.МестоХранения;
                    СтарМестоХраненияВЭксплуатации = Док.МестоХраненияВЭксплуатации;
                    Док.МестоХранения=СтарМестоХраненияВЭксплуатации;
                    Док.МестоХраненияВЭксплуатации=СтарМестоХранения;  
                иначе
                    Сообщить(Пустое значение МестоХраненияВЭксплуатации в документе: "+СокрЛП(Док.Вид())+" №"+Док.НомерДок+" от "+Док.ДатаДок);
                    Продолжить;
                КонецЕсли;
                ГлПользователь=Док.Автор;
                Док.Записать();
           исключение
               Сообщить("Ошибка в документе: "+СокрЛП(Док.Вид())+" №"+Док.НомерДок+" от "+Док.ДатаДок);
               Сообщить(ОписаниеОшибки());
          КонецПопытки;
        КонецЕсли;
    КонецЦикла;
    Предупреждение("Обработка завершена!");  
КонецПроцедуры


Напишите что есть в окне сообщений

Цитата(nysysimara @ 07.10.11, 11:45) необходимо зарегистрироваться для просмотра ссылки
если

попробуйте как я вам советую


Отбор по виду документа нужен
wmatik
nysysimara, все получилось!)
nysysimara
Цитата
Отбор по виду документа нужен

не нужен

Цитата(wmatik @ 07.10.11, 11:51) необходимо зарегистрироваться для просмотра ссылки
nysysimara, все получилось!)

biggrin.gif
GreenFox
Цитата(nysysimara @ 07.10.11, 11:52) необходимо зарегистрироваться для просмотра ссылки
не нужен


biggrin.gif

Мои поздравления - Вы победили, Надо "подтянуть свои знания семерки" biggrin.gif 47046430.gif
wmatik
да, всем спасибо за участие!!!
а мне учить учить и еще раз учить 32000000.gif
Flexy
Цитата(wmatik @ 07.10.11, 10:59) необходимо зарегистрироваться для просмотра ссылки
да, всем спасибо за участие!!!
а мне учить учить и еще раз учить 32000000.gif

Лучше 8 -ку 32000000.gif
wmatik
кстати её мне надо тоже начинать познавать, т.к. уже почти купили help.gif
Flexy
Цитата(wmatik @ 07.10.11, 11:10) необходимо зарегистрироваться для просмотра ссылки
кстати её мне надо тоже начинать познавать, т.к. уже почти купили help.gif

Вот как раз и начнете ее познавать с зачетных книженций из коробки wink.gif
wmatik
да да да!!!)
sercher
Цитата(wmatik @ 06.10.11, 14:00) необходимо зарегистрироваться для просмотра ссылки
Если ПустоеЗначение(Док.МестоХранения) = 0 Тогда
Док.МестоХранения=Док.МестоХраненияВЭксплуатации;
Док.МестоХраненияВЭксплуатации=Док.МестоХранения;
КонецЕсли;


Если не смотреть на все остальное, меня сильно напрягла эта конструкция, дело в том что в результате получится абсолютно одинаковые колонки для значений МестоХранения и МестоХраненияВЭксплуатации
vadim007
Цитата(sercher @ 08.05.12, 13:07) необходимо зарегистрироваться для просмотра ссылки
Если не смотреть на все остальное, меня сильно напрягла эта конструкция, дело в том что в результате получится абсолютно одинаковые колонки для значений МестоХранения и МестоХраненияВЭксплуатации

Вот и я о том же. Были бы числа, обмен делается примитивно просто: x:=x-y; y:=x+y; x:=y-x. А тут какие-то места...
sercher
для "мест " обмен делается точно так же примитивно просто 32000000.gif

точнее не так, это долго wink.gif и математические способы тут не применимы:
временнаяПеременная = Место1;
Место1 = Место2;
Место2 = ВременнаяПеременная;
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.