Имя: Пароль:
1C
1С v8
Установить время документа
0 treor
 
23.09.17
22:23
Добрый вечер!
Стоит следующая задача:
установить время первого создаваемого документа на некоторую дату в начало дня, а каждому последующему документу присваивать время на секунду больше

Пробую сделать это следующим образом:

Процедура ПередЗаписью(Отказ, РежимЗаписи, РежимПроведения)

    ДатаНачалоДня = НачалоДня(Дата);
    
    Запрос = Новый Запрос;
    Запрос.УстановитьПараметр("ДатаНачалоДня", ДатаНачалоДня);  
    Запрос.Текст = "ВЫБРАТЬ
                   |    ЗП_НачислениеОтпуска.Ссылка КАК Ссылка,
                   |    ЗП_НачислениеОтпуска.Дата
                   |ИЗ
                   |    Документ.ЗП_НачислениеОтпуска КАК ЗП_НачислениеОтпуска
                   |ГДЕ
                   |    НАЧАЛОПЕРИОДА(ЗП_НачислениеОтпуска.Дата, ДЕНЬ) = &ДатаНачалоДня
                   |
                   |УПОРЯДОЧИТЬ ПО
                   |    ЗП_НачислениеОтпуска.МоментВремени УБЫВ";

    РезультатЗапроса = Запрос.Выполнить();
    Выборка = РезультатЗапроса.Выбрать();
    
    Если Выборка.Следующий() Тогда
        Дата = Выборка.Дата + 1;
    Иначе
        Дата = ДатаНачалоДня;
    КонецЕсли;
    
КонецПроцедуры

Но в запросе некорректно отрабатывает секция ГДЕ: запрос при наличии документов на указанную дату ничего не возвращает(((
1 treor
 
23.09.17
22:24
Будет ли в этом случае как-нибудь влиять настройка формы АвтоВремя?
2 treor
 
23.09.17
22:33
(1) Методом проб и ошибок пришла к тому, что код нужно переместить в процедуру ПриЗаписи()
3 youalex
 
23.09.17
23:45
(2) не вникал, но ПередЗаписью() - было бы логичнее.
4 treor
 
24.09.17
00:04
(3)если ПередЗаписью(),то программа после выполнения процедуры автоматически выставляет время документа
5 youalex
 
24.09.17
00:51
(4) А в ПриЗаписи - запись объекта в БД уже состоялась.
Но еще есть ДокументОбъект.УстановитьВремя() .  Сам не пользовал, но, сдается, где-то рядом по смыслу.
6 youalex
 
24.09.17
00:54
(5) + ну и тут еще опер. проведение может вклиниваться, можно поэкспериментировать с вышеупомянутым методом в разных режимах проведения.
7 treor
 
24.09.17
09:36
(6)Обязательно попробую. Но мне нужна подсказка почему область ГДЕ в запросе не работает
8 VS-1976
 
24.09.17
09:52
Попробуй так:
ЗП_НачислениеОтпуска.Дата МЕЖДУ &ДатаНачалоДня И КОНЕЦПЕРИОДА( &ДатаНачалоДня, День )

И проверь передаётся ли у тебя дата
9 rudnitskij
 
24.09.17
10:09
(7) может потому, что условие ГДЕ выполняется при чтении данных из таблицы, без вычисления всяких функций? Для условия "ГДЕ ЗП_НачислениеОтпуска.Дата..." - любые условия выполняться будут, а для "ГДЕ НАЧАЛОПЕРИОДА(ЗП_НачислениеОтпуска.Дата..." - не выполняются, что вы уже установили опытным путем
10 treor
 
24.09.17
12:59
Уважаемые, форумчане, спасибо ОГРОМНОЕ за помощь!!!
Изначально приведенный код рабочий!!! Просто некоторым, не постесняюсь этого слова, ЛОШАРАМ тестировать надо на тех документах, к которым делаешь запрос!)))

Приведу измененный код:

Процедура ПередЗаписью(Отказ, РежимЗаписи, РежимПроведения)

    Если ЭтоНовый() Тогда
        
        ДатаНачалоДня = НачалоДня(Дата);
        
        Запрос = Новый Запрос;
        Запрос.УстановитьПараметр("ДатаНачалоДня", ДатаНачалоДня);
        
        Запрос.Текст = "ВЫБРАТЬ ПЕРВЫЕ 1
        |    ЗП_ОтпускаОрганизаций.Ссылка КАК Ссылка,
        |    ЗП_ОтпускаОрганизаций.Дата
        |ИЗ
        |    Документ.ЗП_ОтпускаОрганизаций КАК ЗП_ОтпускаОрганизаций
        |ГДЕ
        |    НАЧАЛОПЕРИОДА(ЗП_ОтпускаОрганизаций.Дата, ДЕНЬ) = &ДатаНачалоДня
        |
        |УПОРЯДОЧИТЬ ПО
        |    ЗП_ОтпускаОрганизаций.МоментВремени УБЫВ";
        
        РезультатЗапроса = Запрос.Выполнить();
        Выборка = РезультатЗапроса.Выбрать();
        
        Если Выборка.Следующий() Тогда
            Дата = Выборка.Дата + 1;
        Иначе
            Дата = ДатаНачалоДня;
        КонецЕсли;
        
    КонецЕсли;

КонецПроцедуры
11 breezee
 
24.09.17
13:28
Странная задача. Я не стал бы так делать. Добавил бы еще один реквизит. Как потом понять, когда создан документ? Как потом объяснить пользователю, почему у него время не так работает, как обычно? Есть шанс потерять доверие юзера к системе
12 treor
 
24.09.17
13:43
(11)Это как раз для пользователей и делается).
Если в двух словах:в документах Пользователя1  обрабатываются данные из документов, доступа к которым у него нет. Для корректной работы нужно, чтобы эти документы были проведенны до начала рабочего дня. Пользователь2 (бухгалтер)проводит их в рабочее время не парясь о времени документа (т.е. программа выставляет автоматически). На просьбу проводить документы со временем до начала рабочего дня отвечает: "Кому надо, тот пусть и меняет"

Здесь документ "Отуска" взят просто для проработки алгоритма.
Алгоритм будет внедрен, только с ведома и согласия всех сторон)
13 rudnitskij
 
24.09.17
13:57
(12) и все же советую условие переписать как в (9), запрос по вашей модели выполняется дольше. За счет вычисления начала периода
Чтобы обнаруживать ошибки, программист должен иметь ум, которому доставляет удовольствие находить изъяны там, где, казалось, царят красота и совершенство. Фредерик Брукс-младший