Консультация № 33586
19.01.2006, 08:40
0.00 руб.
0 13 3
Здравствуйте!
Подскажите пожалуйста как работать с датой. Нужно сделать отчет на проверку оплаты накладных поставщиков. То есть есть дата накладной + из справочника в числовом виде кол-во дней в течение которого должны оплатить и сравниваем это дело в сегодняшней датой.
Заранее благодарен всем кто откликнится.

Обсуждение

Неизвестный
19.01.2006, 09:09
общий
Если ДатаДок + ЧислоДнейНаОплату < РабочаяДата() Тогда Сообщить("Срок истек","!");КонецЕсли;
Неизвестный
19.01.2006, 09:27
общий
Да это-то понятно, вопрос в том как обрабатывать числа типа дата. То есть как прибавить к определенной дате число дней, и как перевести обычное число в кол-во дней.
Неизвестный
19.01.2006, 10:10
общий
Здесь ЧислоДней - обычное число, например, ЧислоДней = 2;Дата0 - обычная дата (поле или константа)Дата0 =‘01.01.06‘;Поддерживаются арифметические операции:Дата1 = Дата0 + ЧислоДней;Дата1 = Дата0 - ЧислоДней;ЧислоДней = Дата1 - Дата0;То есть никаких преобразований не требуется.
Неизвестный
19.01.2006, 11:01
общий
ЧислоДней = 2; Дата0 =‘01.01.06‘; Дата1 = Дата0 + ЧислоДней; А можно ли применить в тексте запроса, если нет то как тогда быть?У меня пишет ошибку.:-)
Неизвестный
19.01.2006, 11:17
общий
А, так вопрос по синтаксису запросов...По-моему, в тексте запроса вообще нельзя никаких арифметических операций.ИМХО так:...Функция Сум2(дата1,число2)Возврат (дата1 + число2);КонецФункции...ТекстЗапроса = "...;Функция ДатаОплаты=Сум2(Дата0,ЧислоДней);Условие (ДатаОплаты<ДатаДок);...";Вариант:ТекстЗапроса = "...;Условие (Сум2(Дата0,ЧислоДней)<ДатаДок);...Извиняюсь, сам не проверял.
Неизвестный
19.01.2006, 12:49
общий
это ответ
Здравствуйте, Данилов Николай Юрьевич!
Обычно дата оплаты накладной указывается в самом документе, т.к. время отсрочки обычно разное для разных клиентов.
Соответственно для проверки оплат пишется отчет, который выбирает неоплаченные накладные за 2 последних месяца (можно больше или меньше) и выводит сроки оплаты. В вашем случае вы просто в запросе одним из полей получаете дату накладной, а в другом время отсрочки в днях. Во время вывода отчеты Вы складываете их. Не забывая, чтобы дата была первым суммируемым.

Для более серьезной системы контроля оплат пишется специальный регистр с измерениями клиент и накладная, в который прописывается сумма задолженности (которая при оплате гасится). Соответственно вы в любой момент можете получить остатки данного регистра, которые состоят из задолженностей клиента. При этом срок задолженности не имеет значения ( в предыдущем варианте, если срок задолженности превышал время выборки, то задолженности не попадали в отчет). Время задолженности вычисляется аналогично( либо дата оплаты в накладной либо дата накладной + к-во дней отсрочки клиента)
Неизвестный
19.01.2006, 12:52
общий
В запросе значение поля не может быть арифметической операцией, но если вычислять функцию Минимум , максимум или среднее - то можноСоответственно можно написать так...Функция ДадаОплаты=Среднее(ДатаОплаты+ЧислоДней);...
Неизвестный
19.01.2006, 12:55
общий
это ответ
Здравствуйте, Данилов Николай Юрьевич!

(ДатаДок+КвоДней)<ТекущаяДата()
Неизвестный
19.01.2006, 14:52
общий
это ответ
Здравствуйте, Данилов Николай Юрьевич!
Код Elric, в общем-то, абсолютно правильный, но я всегда перестраховуюсь так:
Дата(ДатаДок+КвоДней)<ТекущаяДата()
Неизвестный
19.01.2006, 15:15
общий
Таким образом у меня получилось:Процедура ПриОткрытии() Перем Запрос, ТекстЗапроса, Таб, НачДата, КонДата, СуммаИтого; НачДата = "01.12.05"; КонДата = "02.12.05"; //Создание объекта типа Запрос Запрос = СоздатьОбъект("Запрос"); ТекстЗапроса = "//{{ЗАПРОС(Пост) //|с ВыбНачПериода по ВыбКонПериода; |с НачДата по КонДата; |Обрабатывать Все; //НеПомеченныеНаУдаление; |Без итогов; |НомерДок = Документ.НакладнаяПриходная1.НомерДок; |ДатаДокум = Документ.НакладнаяПриходная1.ДатаДок; |НаимПоставщик = Документ.НакладнаяПриходная1.Клиент.Наименование; |СрокОпл = Документ.НакладнаяПриходная1.Клиент.СрокОплаты; //|КонСрок = Документ.НакладнаяПриходная1.ДатаДок; |СуммаНакл = Документ.НакладнаяПриходная1.Сумма; |Функция КонСрок = Сумма(ДатаДокум + СрокОпл); |Группировка НаимПоставщик; |Условие (Найти(НаимПоставщик,""Покупатель"")=0); |Условие (Найти(НаимПоставщик,""РОДНИК"")=0); |"//}}ЗАПРОС ; // Если ошибка в запросе, то выход из процедуры Если Запрос.Выполнить(ТекстЗапроса) = 0 Тогда Возврат; КонецЕсли; // Подготовка к заполнению выходных форм данными запроса Таб = СоздатьОбъект("Таблица"); Таб.ИсходнаяТаблица("Пост"); // Заполнение полей "Заголовок" Таб.ВывестиСекцию("Заголовок"); Состояние("Заполнение выходной таблицы..."); Таб.Опции(0, 0, Таб.ВысотаТаблицы(), 0); Пока Запрос.Группировка() = 1 Цикл // Заполнение полей Пост Таб.ВывестиСекцию("Пост"); СуммаИтого=СуммаИтого+Запрос.СуммаНакл; КонецЦикла; // Заполнение полей "Итого" Таб.ВывестиСекцию("Итого"); // Вывод заполненной формы //Таб.ТолькоПросмотр(1); Таб.Показать("Пост", "");КонецПроцедурыВыдает непонятную сумму, наверно суммирует столбец, хотя ...Как быть, подскажите
Неизвестный
19.01.2006, 15:17
общий
Вот что получилосьПроцедура ПриОткрытии() Перем Запрос, ТекстЗапроса, Таб, НачДата, КонДата, СуммаИтого; НачДата = "01.12.05"; КонДата = "02.12.05"; //Создание объекта типа Запрос Запрос = СоздатьОбъект("Запрос"); ТекстЗапроса = "//{{ЗАПРОС(Пост) //|с ВыбНачПериода по ВыбКонПериода; |с НачДата по КонДата; |Обрабатывать Все; //НеПомеченныеНаУдаление; |Без итогов; |НомерДок = Документ.НакладнаяПриходная1.НомерДок; |ДатаДокум = Документ.НакладнаяПриходная1.ДатаДок; |НаимПоставщик = Документ.НакладнаяПриходная1.Клиент.Наименование; |СрокОпл = Документ.НакладнаяПриходная1.Клиент.СрокОплаты; //|КонСрок = Документ.НакладнаяПриходная1.ДатаДок; |СуммаНакл = Документ.НакладнаяПриходная1.Сумма; |Функция КонСрок = Сумма(ДатаДокум + СрокОпл); |Группировка НаимПоставщик; |Условие (Найти(НаимПоставщик,""Покупатель"")=0); |Условие (Найти(НаимПоставщик,""РОДНИК"")=0); |"//}}ЗАПРОС ; // Если ошибка в запросе, то выход из процедуры Если Запрос.Выполнить(ТекстЗапроса) = 0 Тогда Возврат; КонецЕсли; // Подготовка к заполнению выходных форм данными запроса Таб = СоздатьОбъект("Таблица"); Таб.ИсходнаяТаблица("Пост"); // Заполнение полей "Заголовок" Таб.ВывестиСекцию("Заголовок"); Состояние("Заполнение выходной таблицы..."); Таб.Опции(0, 0, Таб.ВысотаТаблицы(), 0); Пока Запрос.Группировка() = 1 Цикл // Заполнение полей Пост Таб.ВывестиСекцию("Пост"); СуммаИтого=СуммаИтого+Запрос.СуммаНакл; КонецЦикла; // Заполнение полей "Итого" Таб.ВывестиСекцию("Итого"); // Вывод заполненной формы //Таб.ТолькоПросмотр(1); Таб.Показать("Пост", "");КонецПроцедурыВыдает непонятную сумму, наверно суммирует столбец, хотя ...Кто знает, подскажите
Неизвестный
19.01.2006, 15:34
общий
Я же говорил, чтобы использовать Минимум , максимум или среднее, а не Сумма - возможно из-за этого. Впрочем не понимаю, почему нужно обязательно получить Искомую дату в запросе. Получи их раздельно (дата документа и срок), а складывай во время обработки.
Неизвестный
19.01.2006, 16:48
общий
ИМХО мешаетФункция КонСрок = Сумма(ДатаДокум + СрокОпл); А вот на Ваш первоначальный вопрос (о проверке в условии) у меня прошло следующее:|Условие (Сум2(Док.ДатаДок,Док.ДнейОплаты) <Док.ДатаОплаты);и вставить в начало Функция Сум2(...Ну и, конечно, можно повставлять в документы НакладнаяПриходная1 и Выписка дополнительные атрибуты и взаимный поиск между этими документами ПриВводеНового, чтобы определить фактическую дату оплаты. Дальше, думаю, Вы справитель.Если возникают другие вопросы - можно задать новый вопрос в рассылку.
Форма ответа