Переключение на Главную Страницу Страницы: 1 [2]  ОтправитьПечать
Очень популярная тема (более 25 ответов) Перехватить вывод окна установки времени документа при изменении его даты? (число прочтений - 9375 )
Z1
God Member
*****
Отсутствует


I Love YaBB 2!

Сообщений: 2906
Местоположение: Москва
Зарегистрирован: 26. Мая 2006
Пол: Мужской
Re: Перехватить вывод окна установки времени документа при изменении его даты?
Ответ #15 - 24. Сентября 2012 :: 13:13
Печать  
Satans Claws писал(а) 24. Сентября 2012 :: 01:39:
Я так понимаю, проблема в том, что в контексте ЗАПИСАННОГО документа нельзя сказать УстановитьВремя()?
Отчасти эта проблема решается тем, что УстановитьВремя() можно сказать у ОПЕРАЦИИ(!) документа.


можно. должно работать
Время нельзя менять у проведенного документа.
  
Наверх
 
IP записан
 
Satans Claws
God Member
*****
Отсутствует


1C++ rocks!

Сообщений: 721
Зарегистрирован: 29. Ноября 2010
Re: Перехватить вывод окна установки времени документа при изменении его даты?
Ответ #16 - 25. Сентября 2012 :: 05:27
Печать  
Z1 писал(а) 24. Сентября 2012 :: 13:13:
можно. должно работать
Время нельзя менять у проведенного документа.


Ну попробуй сделать это в контексте формы записанного документа Подмигивание
  
Наверх
 
IP записан
 
Z1
God Member
*****
Отсутствует


I Love YaBB 2!

Сообщений: 2906
Местоположение: Москва
Зарегистрирован: 26. Мая 2006
Пол: Мужской
Re: Перехватить вывод окна установки времени документа при изменении его даты?
Ответ #17 - 25. Сентября 2012 :: 05:45
Печать  
Satans Claws писал(а) 25. Сентября 2012 :: 05:27:
Z1 писал(а) 24. Сентября 2012 :: 13:13:
можно. должно работать
Время нельзя менять у проведенного документа.


Ну попробуй сделать это в контексте формы записанного документа Подмигивание

попробовал
так не работает
Все что АвтоВремя... это для нового документа.
УстановитьВремя только для объекта создатьОбъект("Документ...);
  
Наверх
 
IP записан
 
Satans Claws
God Member
*****
Отсутствует


1C++ rocks!

Сообщений: 721
Зарегистрирован: 29. Ноября 2010
Re: Перехватить вывод окна установки времени документа при изменении его даты?
Ответ #18 - 25. Сентября 2012 :: 06:27
Печать  
Z1 писал(а) 25. Сентября 2012 :: 05:45:
попробовал
так не работает
Все что АвтоВремя... это для нового документа.
УстановитьВремя только для объекта создатьОбъект("Документ...);


УстановитьВремя в контексте формы нового документа, кстати, работает.
АвтоВремя... в контексте формы записанного документа - емнип, тоже.

Короче, очередное место, где у 1С нет какой-то стройной логики поведения.
  
Наверх
 
IP записан
 
Eprst
God Member
*****
Отсутствует



Сообщений: 3397
Зарегистрирован: 08. Октября 2007
Re: Перехватить вывод окна установки времени документа при изменении его даты?
Ответ #19 - 25. Сентября 2012 :: 09:04
Печать  
Эээ..хх.. вот красивое решение для всего и для времени в том числе:
http://my1c-archive.narod.ru/knowhow/skpblock.html

А так, установитьВремя работает в форме нового не записаного документа( помимо СоздатьОбъект)
  
Наверх
 
IP записан
 
Kalen
Full Member
***
Отсутствует


1C++ rocks!

Сообщений: 185
Зарегистрирован: 29. Марта 2010
Пол: Мужской
Re: Перехватить вывод окна установки времени документа при изменении его даты?
Ответ #20 - 25. Сентября 2012 :: 10:07
Печать  
Eprst писал(а) 25. Сентября 2012 :: 09:04:
Эээ..хх.. вот красивое решение для всего

Эх какие красивые слова Улыбка
Финт прикольный, но, имхо, малореальный. У пользователя может быть открыта форма нового документа. Наверное это тоже можно обыграть, но тогда совсем уж заморочено получится.
  
Наверх
GTalkICQ  
IP записан
 
zk96
Senior Member
****
Отсутствует


1C++ rocks!

Сообщений: 320
Местоположение: Киев
Зарегистрирован: 15. Ноября 2009
Пол: Мужской
Re: Перехватить вывод окна установки времени документа при изменении его даты?
Ответ #21 - 25. Сентября 2012 :: 11:20
Печать  
Почему малореальный? Очень легко реализуеться. Я делал так. Перебрал все реквизиты
Код
Выбрать все
Для НР=1 По Метаданные.Справочник(ВидСправочника).Реквизит() Цикл
	Идентификатор = Метаданные.Справочник(ВидСправочника).Реквизит(НР).Идентификатор;
	Значение = КонтекстФормы.ПолучитьАтрибут(Идентификатор);
	КоллекцияРеквизитов.Добавить(Значение,Идентификатор);
КонецЦикла;
 


Плюс код, наименование, родитель, владелец(если они есть).
Сохранил в некую глобальную переменную все это. Запустил таймер. Потом закрыл форму без сохранения. Обработчик таймера снова открыл эту форму ,если новый элемент-документ, то открыл форму нового элемента-документа, перезаполнил.
Здесь ничего сложного.
Проблемы в другом. Если на форме много всяких атрибутов, табличные поля, АктивИксы, то закрытие-открытие занимает до 10 секунд. А это уж слишком заметно.
Я пробовал так делать и для документов и для справочников.
Через месяц использования отказался. Оставил только у пары-тройки справочников, чтобы изменять родителя.
  
Наверх
 
IP записан
 
Frog
Junior Member
**
Отсутствует


I Love YaBB 2!

Сообщений: 22
Зарегистрирован: 27. Мая 2008
Re: Перехватить вывод окна установки времени документа при изменении его даты?
Ответ #22 - 13. Ноября 2012 :: 07:02
Печать  
Написал один из наших разработчиков, алгоритм работает несколько лет никаких проблем ни с отборами ни с запросами нет. Может менять время и проведенного документа.
//*****************************************************************************
//Процедура глУстановитьВремяДокумента(Конт,ЧЧ = 0,ММ = 0,СС = 0)
// Устанавливает время документа независио от того проведен он или нет
// Устанвливает в таблицу настроек последнее время по указанному виду движений.
// Параметры:
//  конт - Контекст документа, для установки времени.
//  ЧЧ - Час документа
//  ММ - минута документ
//  СС - Секунда документа
// Если в параметрах не указано время документа, оно вычисляется автоматически исходя из вида движения в первой строке и
// даты документа.
Функция глУстановитьВремяДокумента(Конт,ЧЧ = 0,ММ = 0,СС = 0) Экспорт
     Попытка
           Если глФлагФормированияПроводокГААП=0 Тогда
                 Сообщить("ВНИМАНИЕ! Время по документу в таблицу ГААП не записаны в базу. Данный режим предназначен для тестирования","i");
                 Возврат 1;
           КонецЕсли;
           Если Конт.Выбран() = 0 Тогда
                 Конт.Записать();
           КонецЕсли;
           
           Док = Конт.ТекущийДокумент();
           Док.ПолучитьСтрокуПоНомеру(1);      
           ДатаДок = Док.ДатаДок;
           
           Если ПустоеЗначение(ЧЧ) = 1 тогда
                 сзВремени = ГлВремяДляТекущегоДВижения(Док.ВидДвижения,ДатаДок);            
                 ЧЧ = сзВремени.Получить("Час");
                 ММ = сзВремени.Получить("Минута");
                 СС = сзВремени.Получить("Секунда");      
                 Если ПустоеЗначение(ЧЧ) = 1 Тогда
                       Возврат 1;
                 КонецЕсли;            
           КонецЕсли;
           
           ТекВремяЧас = 0;
           Конт.ПолучитьВремя(ТекВремяЧас);
           Если Число(ЧЧ) = Число(ТекВремяЧас) Тогда
                 Возврат 1;
           КонецЕсли;
           
           РС = СоздатьОбъект("ODBCRecordSet");
           MDW = СоздатьОбъект("MetaDataWork");
           
           ИдДата = ,"Ч(0)2");
           Время36 = _IdToStr((ЧЧ*3600+ММ*60+СС)*10000);
           ИдДок = MDW.ЗначениеВСтрокуБД(Конт.ТекущийДокумент());
           
           ИДДокВремя = ИдДата+Время36+ИдДок;
           
           ТекстЗапроса = "
           |BEGIN TRANSACTION TIME
           |
           |UPDATE _1SJOURN
           |      SET DATE_TIME_IDDOC = '"+ИДДокВремя+"'
           |WHERE (IDDOC = :ТекДок)
           |
           |UPDATE _1SOPER
           |      SET DATE_TIME_DOCID = '"+ИДДокВремя+"'
           |WHERE (DOCID = :ТекДок)
           |
           |UPDATE _1SCRDOC
           |      SET CHILD_DATE_TIME_IDDOC = '"+ИДДокВремя+"'
           |WHERE (CHILDID = :ТекДок)
           |
           |UPDATE _1SENTRY
           |      SET DATE_TIME_DOCID = '"+ИДДокВремя+"'
           |WHERE (DOCID = :ТекДок)
           |
           |COMMIT TRANSACTION TIME
           |";      
           рс.УстановитьТекстовыйПараметр("ТекДок",Конт.ТекущийДокумент());
           //рс.Отладка(1);
           Попытка
                 рс.ВыполнитьИнструкцию(ТекстЗапроса);      
           Исключение
                 Сообщить("Ошибка установки времени документа в 1С ");
                 Возврат 0;
           КонецПопытки;
     Исключение
           Сообщить("Ошибка установки времени документа:" + ОписаниеОшибки());
           Возврат 0;
     КонецПопытки;      
КонецФункции
  
Наверх
 
IP записан
 
Salimbek
God Member
*****
Отсутствует



Сообщений: 862
Зарегистрирован: 06. Июня 2006
Пол: Мужской
Re: Перехватить вывод окна установки времени документа при изменении его даты?
Ответ #23 - 13. Ноября 2012 :: 10:20
Печать  
Насколько я помню, если включен у регистра флаг "Быстрая обработка движений", то Date_Time_Iddoc надо еще и в таких регистрах править.
  
Наверх
ICQ  
IP записан
 
Frog
Junior Member
**
Отсутствует


I Love YaBB 2!

Сообщений: 22
Зарегистрирован: 27. Мая 2008
Re: Перехватить вывод окна установки времени документа при изменении его даты?
Ответ #24 - 13. Ноября 2012 :: 21:19
Печать  
Если у вас движения по регистрам еще, и в этом регистре есть поле Date_Time_Iddoc то его так же нужно устнавливать. Но тут будте внимательны, нужно просмотреть всю цепочку таблиц регистра (остатки, обороты возможно еще что-то). Никогда не занимался изучением этих таблиц, поэтому подробно не расскажу.
  
Наверх
 
IP записан
 
Satans Claws
God Member
*****
Отсутствует


1C++ rocks!

Сообщений: 721
Зарегистрирован: 29. Ноября 2010
Re: Перехватить вывод окна установки времени документа при изменении его даты?
Ответ #25 - 14. Ноября 2012 :: 07:11
Печать  
Frog писал(а) 13. Ноября 2012 :: 21:19:
Если у вас движения по регистрам еще, и в этом регистре есть поле Date_Time_Iddoc то его так же нужно устнавливать. Но тут будте внимательны, нужно просмотреть всю цепочку таблиц регистра (остатки, обороты возможно еще что-то). Никогда не занимался изучением этих таблиц, поэтому подробно не расскажу.


Если меняется только время (без даты), то остатки пересчитывать не нужно.
Можно даже расширить, на самом деле: если при изменении даты-времени не меняется период периодичности_сохранения_итогов - то остатки можно не пересчитывать
  
Наверх
 
IP записан
 
Переключение на Главную Страницу Страницы: 1 [2] 
ОтправитьПечать