Имя: Пароль:
1C
1C 7.7
v7: Сдвигать подчиненные при изменении времени основания...
0 ptrtss
 
24.05.12
10:34
Что предпринять? В ПриИзмененииВремениДокумента() доступно только старое время. Обработку ожидания на секунду запилить? Или что?
1 andrewks
 
24.05.12
10:38
а что конкретно надо-то?
2 ptrtss
 
24.05.12
10:40
На основании поступления ТМЦ вводятся перемещения. Надо чтобы были секундой после поступления
3 ptrtss
 
24.05.12
10:41
Поступление ТМЦ могут гонять по времени туда-сюда
4 ptrtss
 
24.05.12
10:42
Думаю сделать свои кнопки "Записать", "ОК" и "Провести", чтобы по ним, после проведения себя любимого, подчиненные распроводить, ставить время и проводить
5 ЧеловекДуши
 
24.05.12
10:42
Пиши поступления ТМЦ, в начало дня, всегда....
Где бы не был создан документ :)
6 ЧеловекДуши
 
24.05.12
10:43
(4)Это лишнее, время можно двигать только не у проведенного документа ;)
Т.е. хватит и типовой "ПриЗаписи()"
7 andrewks
 
24.05.12
10:44
может, надёжней регламентной обработкой по расписанию?
8 ptrtss
 
24.05.12
10:44
(6) ПриЗаписи не отрабатывает при проведении
9 ЧеловекДуши
 
24.05.12
10:45
+ По сути эта привязка к времени, очередной бред от 1С.
Они все ровно в отчетах не могут привязаться ко времени, т.е. всегда учет ведется в пределе целого дня.
10 ЧеловекДуши
 
24.05.12
10:46
(8)Отрабатывает и еще как, если вы не умеете готовить, то не значит, что это нельзя ;)
11 ptrtss
 
24.05.12
10:46
(5) Так и делаю, приходы в начало, расходы в конец а перемещения текущим. Но все равно иногда приходится перетаскивать приходы в начало дня еще раз, как-то не знаю даже почему

В планах каждому виду документов выделить интервал и вместо АвтоВремяНачалоДня пользоваться чем-нибудь своим
12 ЧеловекДуши
 
24.05.12
10:47
Расход пиши текущим временем, иначе нарвёшся на время 23.59.59 ;)
13 ptrtss
 
24.05.12
10:48
(12)
Поступление в начало дня: 12:00:00
Расход текущим: 08:00:00
Профит))
14 ЧеловекДуши
 
24.05.12
10:48
(11)АвтоВремяНачалоДня - начало дня там, при том что в этом дне нет документов, то всегда может быть от 12.00.00 :)
Не очень удобно... Лучше руками пиши в начало.
15 ЧеловекДуши
 
24.05.12
10:49
(13)12.00.00 - один еС это делает, если в этот день небыло других документов :)
16 ЧеловекДуши
 
24.05.12
10:50
Я обычно вообще рассчитываю количество приходников в этот день и +1 секунду
17 ptrtss
 
24.05.12
10:52
(16) Вот так и надо бы сделать, по хорошему, но сейчас горячка, мне бы что-нить более лаконичное и безопасное, чтобы потом не отвлекало
(10) Хм... и фправду
18 ptrtss
 
24.05.12
10:53
(10) Хорошо что в 7.7 нельзя из журнала проводить))
19 ЧеловекДуши
 
24.05.12
10:54
Вот пример, как у меня...

//******************************************************************************
//Предопределенная процедура
//
Процедура ПриЗаписи()
УстановитьВремяЗаписиДокумента(Контекст); // находится в глобальном модуле!!!
КонецПроцедуры // ПриЗаписи()

//Глобальный модуль...
Процедура УстановитьВремяЗаписиДокумента(Конт) Экспорт
   Перем ДатаДК,ТекДок;
   Перем ТекДата,ТекВремя,ЧЧ,ММ,СС,СтрокаАвторства,КтоМенял;
   Перем Модификация,НовыйЗаписан;
   Перем ДокПред,РежимСек;
   Перем ТекДокПолучен;
   
   ДатаДК = Дата(Конт.ДатаДок);
   Если ПустоеЗначение(ДатаДК)=1 Тогда
       ДатаДК         = РабочаяДата();
       Конт.ДатаДок = ДатаДК;
   КонецЕсли;
   
   Модификация  = 0; // по дефолту нет модификации
   Попытка
       Модификация = Конт.Модифицированность();
   Исключение
       Модификация = -1;// это СоздатьОбъект - его тут нет :(  (модификатора)
   КонецПопытки;
   
   НовыйЗаписан  = 0;
   ТекДокПолучен = 0;
   Попытка
       ТекДок = Конт.ТекущийДокумент();
       Если ПустоеЗначение(ТекДок) = 1 Тогда // не имеет позиции, 100% новый!
           НовыйЗаписан  = 1;   //т.е. новый документ!
           Модификация      = 0;   // Он не новый :)
           //
           //Конт.Автор     = КтоМенял; //Автор проставляется раньше, не тут!!!
           Конт.АвторДВ     = "";
           Конт.Авторство     = "";
           Конт.АвторствоДВ = "";
       Иначе
           ТекДокПолучен = 1;
           Если Модификация < 0 Тогда //Получен функцией СоздатьОбъект
               Если ТекДок.Проведен() = 0 Тогда
                   Если ТекДок.ПометкаУдаления() = 0 Тогда
                       ТекДокПолучен = 0;
                   КонецЕсли;
               КонецЕсли;
           КонецЕсли;
       КонецЕсли;
   Исключение
   КонецПопытки;
   
   Если ДатаДК <> РабочаяДата() Тогда //Предположительно другой датой работают
       Если ПроверитьПрисутстДокНаДату(ДатаДК,ТекДокПолучен) = 0 Тогда //В периоде нет документов
           Конт.АвтоВремяОтключить();
           Конт.УстановитьВремя(0,0,1);
       ИначеЕсли ДатаДК < РабочаяДата() Тогда
           Если (Найти(",РеализацияПоДатеОтгрузки,Реализация,",","+Конт.Вид()+",") > 0) и (ТекДокПолучен = 0) Тогда //Сей документ желательно записать после док. предв. накл. (хотябы на секунду)
               //ДокПред  = СоздатьОбъект("Документ.ПредварительнаяНакладная");
               ДокПред  = 0;
               РежимСек = 0;
               ДокПред  = ПолучитьПредвНакл(Конт,РежимСек);
               Если (РежимСек > 0) и (ПустоеЗначение(ДокПред)=0) Тогда
                   ЧЧ=0; ММ=0; СС=0;
                   ДокПред.ПолучитьВремя(ЧЧ,ММ,СС);
                   УвеличитьВремяНаСекунд(ЧЧ,ММ,СС,РежимСек);
                   Если (ЧЧ>=23) и (ММ>=59) и (СС>=59) Тогда
                       Конт.АвтоВремяКонецДня(); //Селяви :( это ошибка так то :(, но рескнем ;)
                   Иначе
                       Конт.АвтоВремяОтключить();
                       Конт.УстановитьВремя(ЧЧ,ММ,СС);
                   КонецЕсли;
               Иначе
                   Конт.АвтоВремяТекущее();
               КонецЕсли;
           Иначе
               Конт.АвтоВремяТекущее();
           КонецЕсли;
       Иначе
           Конт.АвтоВремяКонецДня();
       КонецЕсли;
   Иначе
       Конт.АвтоВремяТекущее();
   КонецЕсли;
   
   Если (Модификация <> 0) или (НовыйЗаписан <> 0) Тогда // сохраним Авторство!
       ЧЧ=0; ММ=0; СС=0;
       ТекДата            = ТекущаяДата();
       ТекВремя        = ТекущееВремя(ЧЧ,ММ,СС);
       КтоМенял        = глПользователь;
       СтрокаАвторства = ""+ДатаГод(ТекДата)+Формат(ДатаМесяц(ТекДата),"Ч(0)2.0")+Формат(ДатаЧисло(ТекДата),"Ч(0)2.0")+
       Формат(Число(ЧЧ),"Ч(0)2.0")+Формат(Число(ММ),"Ч(0)2.0")+Формат(Число(СС),"Ч(0)2.0");
   КонецЕсли;
   
   Если НовыйЗаписан <> 0 Тогда
       Если ПустоеЗначение(Конт.Автор) = 1 Тогда
           Конт.Автор   = КтоМенял;
           Конт.АвторДВ = СтрокаАвторства;
       ИначеЕсли ПустоеЗначение(Конт.АвторДВ)=1 Тогда
           Конт.АвторДВ = СтрокаАвторства;
       КонецЕсли;
   КонецЕсли;

   Если Модификация <> 0 Тогда
       //Если Модификация = -1 Тогда
       Если Конт.АвторДВ = СтрокаАвторства Тогда // 100% новый!
           Модификация = 0; //Теоретически он тот же самый
           //  Подотрем
           Конт.Авторство     = "";
           Конт.АвторствоДВ = "";
       КонецЕсли;
       //КонецЕсли;
   КонецЕсли;
   
   Если Модификация <> 0 Тогда
       Конт.Авторство     = КтоМенял;
       Конт.АвторствоДВ = СтрокаАвторства;
   КонецЕсли;
   
КонецПроцедуры    // УстановитьВремяЗаписиДокумента

Функция ПроверитьПрисутстДокНаДату(ДатаДК,ТекДокПолучен=0)
   Перем ЗапросSQL, ТекстЗапроса;
   Перем Док;
   Перем Рез,РезЗапроса;
   Перем БылаОшибка;
   
   Если ПустоеЗначение(ТекДокПолучен) = 0 Тогда
       Возврат ТекДокПолучен;
   КонецЕсли;
   
   Рез       = 0; //По дефолту, как бы их нет $)
   БылаОшибка = 0;
   
   Попытка
       ЗапросSQL = СоздатьОбъект("ODBCRecordSet");
       ЗапросSQL.УстБД1С();  
       
       Если глОтладкаSQL = 1 Тогда
           ЗапросSQL.Отладка();
       КонецЕсли;
       
       ЗапросSQL.УстановитьТекстовыйПараметр("ДатаДК",ДатаДК);
       
       ТекстЗапроса = "Select Count(ДД.ДокИД) [ЕстьДок $Число]
       |From (Select TOP 1 ЖЖ.DATE_TIME_IDDOC as ДокИД
       |From _1SJOURN as ЖЖ(NOLOCK)
       |Where (ЖЖ.DATE_TIME_IDDOC >= :ДатаДК)
       |    AND (ЖЖ.DATE_TIME_IDDOC < :ДатаДК~)) as ДД";
       РезЗапроса = ЗапросSQL.ВыполнитьСкалярный(ТекстЗапроса);
       
       Если ТипЗначения(РезЗапроса)=0 Тогда
           БылаОшибка = 1;
       ИначеЕсли ТипЗначения(РезЗапроса)=1 Тогда //Число то что надо!
           Если РезЗапроса > 0 Тогда //Есть документ!
               Рез = Число(РезЗапроса);
           КонецЕсли;
       КонецЕсли;
       ЗапросSQL.Close();  
   Исключение
       БылаОшибка = 1;
   КонецПопытки;
   ЗапросSQL = 0;
   
   Если БылаОшибка = 1 Тогда
       Если ТипЗначения(ДатаДК) = 3 Тогда //Получим список документов по старинке!
           Док = СоздатьОбъект("Документ");
           Док.ВыбратьДокументы(ДатаДК,ДатаДК);
           Если Док.ПолучитьДокумент() = 1 Тогда
               Рез = 1; //Есть документы ;)
           КонецЕсли;
           Док = 0;
       КонецЕсли;
   КонецЕсли;
   
   Возврат Рез;
КонецФункции    // ПроверитьПрисутстДокНаДату(ДатаДК)

Процедура УвеличитьВремяНаСекунд(ЧЧ,ММ,СС,РежимСек) //НЕ увеличивать больше чем 59!!! Алгоритм на более не расчитан!
   
   СС = СС + РежимСек;
   Если СС > 59 Тогда
       СС = СС - 60;
       ММ = ММ + 1;
       Если ММ > 59 Тогда
           ММ = 0;
           ЧЧ = ЧЧ + 1;
           Если ЧЧ > 23 Тогда
               ЧЧ = 23; //Это предел и его нельзя преодолевать!!!
               ММ = 59;
               СС = 59;
           КонецЕсли;
       КонецЕсли;
   КонецЕсли;
   
КонецПроцедуры

//Тут ты выстави заглушку... просто у нас так оно :)
Функция ПолучитьПредвНакл(Док,ЭтоЧто)
   Перем ДокОсн;
   
   Если Док.Вид()="ПредварительнаяНакладная" Тогда
       Если ЭтоЧто = 0 Тогда
           ЭтоЧто = 1; //ПредварительнаяНакладная
       Иначе
           ЭтоЧто = ЭтоЧто + 1;
       КонецЕсли;
       Возврат Док.ТекущийДокумент();
       
   ИначеЕсли Док.Вид()="ИтоговаяНакладная" Тогда
       Если ЭтоЧто = 0 Тогда
           ЭтоЧто = 1; //ИтоговаяНакладная
       Иначе
           ЭтоЧто = ЭтоЧто + 1;
       КонецЕсли;
       
   ИначеЕсли Док.Вид()="АктОтклонений" Тогда
       Если ЭтоЧто = 0 Тогда
           ЭтоЧто = 1; //АктОтклонений
       Иначе
           ЭтоЧто = ЭтоЧто + 1;
       КонецЕсли;
       
   ИначеЕсли Док.Вид()="Реализация" Тогда
       Если ЭтоЧто = 0 Тогда
           ЭтоЧто = 1; //Реализация
       Иначе
           ЭтоЧто = ЭтоЧто + 1;
       КонецЕсли;
       
   КонецЕсли;    
   
   Если Метаданные.Документ(Док.Вид()).РеквизитШапки("ДокОснование").Выбран() = 0 тогда
       Возврат "";
   КонецЕсли;
   
   ДокОсн = Док.ДокОснование;
   
   Если ПустоеЗначение(ДокОсн) = 1 тогда
       Возврат "";
   КонецЕсли;
   
   Если ДокОсн.Вид() = "ПредварительнаяНакладная" Тогда
       Если ЭтоЧто = 0 Тогда
           ЭтоЧто = 1; //ПредварительнаяНакладная
       Иначе
           ЭтоЧто = ЭтоЧто + 1;
       КонецЕсли;
       Возврат ДокОсн;
   Иначе      
       //РЕКУРСИЯ
       Возврат ПолучитьПредвНакл(ДокОсн,ЭтоЧто);
   КонецЕсли;
   
КонецФункции // ПолучитьПредвНакл()
20 ptrtss
 
24.05.12
10:58
(19) О_х

Да, спасибо, это я при коммунизме наверное вникать будут))
21 ptrtss
 
24.05.12
11:19
Сделал как:
1. При создании перемещения ставим время через секунду после основания
2. При отмене проведения основания отменяем подчиненные
3. При изменении времени основания ничего не делаем
4. При записи непроведенного основания меняем время подчиненных, среди прочего это будет выполняться при проведении после изменения времени

Спасибо
Глупец, лишенный способности посмеяться над собой вместе с другими, не сможет долго выносить программирование. Фредерик Брукс-младший