|
Помощь по Циклам | ☑ | ||
---|---|---|---|---|
0
Tanis
26.08.13
✎
15:20
|
Добрый день!
Подскажите, пожалуйста, как правильно поставить циклы, или как лучше сделать. Есть таблица: Дата дока Кол-во дней Продажа Х продажа У продажа Z оплата Нужно получить X, Y и Z. По схеме (дата продажи) - (дата оплаты) Как возможно написать, чтоб сначала находилась дата оплаты, а потом с начала таблицы вычислялось кол-во дней. |
|||
1
Ненавижу 1С
гуру
26.08.13
✎
15:22
|
||||
2
Tanis
26.08.13
✎
15:26
|
Спасибо! Попробую.
|
|||
3
Tanis
26.08.13
✎
15:58
|
Оказалось не совсем то.
Там по сумме. А мне по датам нужно. И если правильно понял, то там с последнего начинает вычитать, а в моем случае с первого надо. |
|||
4
Hans
26.08.13
✎
16:02
|
||||
5
z01
26.08.13
✎
16:03
|
(0)странная таблица
|
|||
6
Ненавижу 1С
гуру
26.08.13
✎
16:03
|
(3) а голову включить?
|
|||
7
z01
26.08.13
✎
16:04
|
(0)а вопрос в чём? как строки перебрать и проверить на значение "оплата "?
|
|||
8
Tanis
26.08.13
✎
16:10
|
Была продажа, потом еще...
Потом контрагент произвел оплату, надо посчитать через сколько дней он произвел эту оплату после отгрузки. Значение дока с оплатой есть. Все значения нахожу, вот только, как заставить после того когда будет найдена строка с датой оплаты, вернуться назад и вычесть эту дату из даты отгрузки. (точнее наоборот из большей меньшую) |
|||
9
Tanis
26.08.13
✎
16:14
|
Там же в таблице написано. Что нужно именно дату перебрать.
(6) Уровень не тот. |
|||
10
Ненавижу 1С
гуру
26.08.13
✎
16:15
|
то есть на суммы плевать?
если он отгрузился: 01.08 на 1000 руб. 03.08 на 2000 руб. 09.08 на 5000 руб. а потом 14.08 заплатил 2000 руб.? |
|||
11
Tanis
26.08.13
✎
16:22
|
Возможно будет и не плевать.
Вообще задача, посчитать неустойку. |
|||
12
Ненавижу 1С
гуру
26.08.13
✎
17:10
|
(11) пока не будет понимания задачи - не будет и решения
|
|||
13
Tanis
27.08.13
✎
08:27
|
Доброе утро!
Возвращаюсь за помощью в решении. (12) Задача такая, посчитать неустойку по договору. Был отгружен товар, к дате документа прибавляется количество дней возможных для оплаты. Если оплата не поступает, то надо рассчитать неустойку. Берется дата возможная для оплаты (дата дока + срок), из нее вычитается дата оплаты, получается кол-во дней просрочки. Затем от непогашенной суммы высчитываем дневную неустойку по % и умножаем на кол-во дней просрочки. Сейчас заполняется таблица, всеми доками по договору, даты, суммы. Но не получается из документов (продажа), которые стоят выше чем оплата отнять дату и сумму. |
|||
14
Ненавижу 1С
гуру
27.08.13
✎
08:37
|
(13) если продаж было несколько, то оплата закрывает сначала самую ведь раннюю?
Если да, то это FIFO, см (1) |
|||
15
Бертыш
27.08.13
✎
08:43
|
(13) Не получается в запросе или в цикле обхода выборки из результата запроса?
|
|||
16
Tanis
27.08.13
✎
08:54
|
(14) Какие параметры нужно заполнить? (в базе несколько организаций)
(15) Честно говоря не знаю. Запроса там как-такого нет. Доки берутся из РБ.Хозрасчетный. Далее все циклами и условиями. Хотел написать циклами, что если находит строчку с оплатой, то чтоб возвращался и вычитал, потом дальше шел. Но либо не то считает, либо зацикливается. Подумал, может сделать вторую таблицу, отдельно для оплаты. |
|||
17
Ненавижу 1С
гуру
27.08.13
✎
08:56
|
(16) сделать всё за тебя? а бабло даешь?
неустойку они берут, коммерсанты хреновы, а денег на внедрение зажали имхо, конечно |
|||
18
Tanis
27.08.13
✎
09:01
|
(17) я же не беру неустойку. Вообще по сути обработка не поможет автоматизировать. Т.к у них разные условия для каждого контрагента и разный подход, по одному условию, вообще придется руками данный вносить, т.к. телепатии 1с еще не научилась.
По тому запросу ФИФО, я уже писал, что уровень у меня не тот. Все хочу на курсы записаться... Про оплату, не знаю... Пока сам хочу дойти до нужного. Правда, время уже поджимает, завал увеличивается. |
|||
19
Ненавижу 1С
гуру
27.08.13
✎
09:09
|
(18) а вот все это нельзя у заказчика узнать и формализовать?
|
|||
20
Tanis
27.08.13
✎
09:17
|
Можно. Но там есть условие, дата получения документов покупателем. Это без ручного ввода никак не сделать.
|
|||
21
Лодырь
27.08.13
✎
09:22
|
(20) Заведи регистр получения документов, ну или там свойство забабахай. И нехай манагеры расставляют его. Заодно и отчетность улучшится.
|
|||
22
Tanis
27.08.13
✎
09:29
|
Можно. Так же можно и в доке пометку ставить, но это все руками. Вот о том и говорил, что полностью не автоматизируешь.
|
|||
23
Tanis
28.08.13
✎
11:34
|
(19) письмо на почту (которая в контактной инфе указана) отправил.
|
|||
24
Tanis
29.08.13
✎
08:06
|
Доброе утро!
Подскажите, пожалуйста, как правильно использовать метод ФИФО по расчетам с контрагентами, чтоб оплатой закрывались предшествующие реализации. Остаток долга по реализации и разница дат. Что является параметром Оплата в данном запросе. |
|||
25
Гефест
29.08.13
✎
08:15
|
какой параметр? в каком запросе?
|
|||
26
Tanis
29.08.13
✎
08:39
|
в сообщении (1) сбросили пример использования метода ФИФО, для получения нужного мне результата. Но в сферу своей неграмотности я не знаю как его нужно применить, и что поставить параметром &Оплата
|
|||
27
Tanis
30.08.13
✎
08:30
|
Доброе утро!
Помогите, пожалуйста, с запросом ФИФО. |
|||
28
Rie
30.08.13
✎
08:56
|
(27) Для начала - что именно непонятно в запросе из (1)?
|
|||
29
Rie
30.08.13
✎
09:05
|
+(28) И ещё один интересный вопрос - а какая конфигурация?
Дело в том, что типовые конфигурации обычно сопоставляют оплаты - реализациям, в них также есть отчёты, которые показывают, какие реализации оплачены, а какие - нет. И всё, что надо - это вытащить неоплаченные реализации и вычислить разницу между текущей датой и датой документа. |
|||
30
Tanis
30.08.13
✎
09:11
|
(29) Конфигурация БП 8.2 2.0
На сайтах нашел, более подробное описание этого запроса. Но практически все они для УПП, используются через РН "Взаиморасчеты с контрагентами", в БП такого нет. И не понятно, что указывать параметром &Оплата. Изначально хотел изменить существующую обработку, добавив условие и цикл. Но судя по всему придется писать другую. |
|||
31
Rie
30.08.13
✎
09:17
|
(30) Зато в БП 2.0 есть счет 62. В котором третьим субконто идёт "Документ расчёта с контрагентом". Прекрасная замена регистру "Взаиморасчеты с контрагентами"!
|
|||
32
Rie
30.08.13
✎
09:19
|
+(31) И работать с регистром бухгалтерии Хозрасчетный и извлекать данные об оплатах из него - будет правильнее, чем непосредственно с документами. (Кстати, в запросе из (1) ничего не говорится о том, проведен ли документ, и даже не проверяется, не помечен ли документ на удаление. А ведь это - важно).
|
|||
33
Tanis
30.08.13
✎
09:29
|
Сейчас используется запрос из РБ по 3 субконто.
Могу привести примеры кода. Или скинуть данную обработку для анализа. |
|||
34
hhhh
30.08.13
✎
09:31
|
(33) ну выкладывай, проанализируем
|
|||
35
Rie
30.08.13
✎
09:31
|
(33) Это прекрасно, что сейчас используется.
Этот запрос выдаёт неоплаченные (не полностью оплаченные) документы? Ну и прекрасно! Осталось только найти разницу между текущей датой и датой документа и отсортировать по возрастанию/убыванию (смотря что нужно) этой разницы. (Если я правильно понял задачу из (0)). |
|||
36
Tanis
30.08.13
✎
09:37
|
Запрос на заполнение ТЧ:
Процедура ЗаполнитьПоДаннымБухгалтерскогоУчета() Экспорт Запрос = Новый Запрос; Запрос.Текст = "ВЫБРАТЬ | ХозрасчетныйОбороты.Период КАК Дата, | ХозрасчетныйОбороты.Субконто1 КАК ДоговорКонтрагента, | ХозрасчетныйОбороты.Регистратор КАК Документ, | ВЫБОР | КОГДА ХозрасчетныйОбороты.СуммаОборот > 0 | ТОГДА ХозрасчетныйОбороты.СуммаОборот | ИНАЧЕ 0 | КОНЕЦ КАК Кредит, | ВЫБОР | КОГДА ХозрасчетныйОбороты.СуммаОборот < 0 | ТОГДА ХозрасчетныйОбороты.СуммаОборот | ИНАЧЕ 0 | КОНЕЦ КАК Дебет, | ХозрасчетныйОбороты.СуммаОборот КАК Долг, | ЕСТЬNULL(ДанныеПервичныхДокументов.Номер, НЕОПРЕДЕЛЕНО) КАК НомерВходящегоДокумента, | ЕСТЬNULL(ДанныеПервичныхДокументов.Дата, НЕОПРЕДЕЛЕНО) КАК ДатаВходящегоДокумента |ИЗ | РегистрБухгалтерии.Хозрасчетный.Обороты(&ДатаНачала, &ДатаОкончания, Регистратор, Счет = &Счет62_01, &ВидСубконтоДоговор, Субконто1 = &Договор, , ) КАК ХозрасчетныйОбороты | ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ДанныеПервичныхДокументов КАК ДанныеПервичныхДокументов | ПО ХозрасчетныйОбороты.Регистратор = ДанныеПервичныхДокументов.Документ | И (ДанныеПервичныхДокументов.Организация = &Организация) | |ОБЪЕДИНИТЬ ВСЕ | |ВЫБРАТЬ | &ДатаНачала, | NULL, | NULL, | ВЫБОР | КОГДА ХозрасчетныйОстатки.СуммаОстаток > 0 | ТОГДА ХозрасчетныйОстатки.СуммаОстаток | ИНАЧЕ 0 | КОНЕЦ, | ВЫБОР | КОГДА ХозрасчетныйОстатки.СуммаОстаток < 0 | ТОГДА ХозрасчетныйОстатки.СуммаОстаток | ИНАЧЕ 0 | КОНЕЦ, | ХозрасчетныйОстатки.СуммаОстаток, | NULL, | NULL |ИЗ | РегистрБухгалтерии.Хозрасчетный.Остатки(&ДатаНачала, Счет = &Счет62_01, &ВидСубконтоДоговор, Субконто1 = &Договор) КАК ХозрасчетныйОстатки |ГДЕ | ХозрасчетныйОстатки.СуммаОстаток <> 0 | |УПОРЯДОЧИТЬ ПО | Дата"; Запрос.УстановитьПараметр("ДатаНачала", ДатаНачала); Запрос.УстановитьПараметр("ДатаОкончания", КонецДня(ДатаОкончания)); Запрос.УстановитьПараметр("Счет62_01", ПланыСчетов.Хозрасчетный.РасчетыСПокупателями); Запрос.УстановитьПараметр("ВидСубконтоДоговор", ПланыВидовХарактеристик.ВидыСубконтоХозрасчетные.Договоры); Запрос.УстановитьПараметр("Договор", ДоговорКонтрагента); Запрос.УстановитьПараметр("Организация", Организация); Результат = Запрос.Выполнить(); Если Результат.Пустой() Тогда Возврат КонецЕсли; Выборка = Результат.Выбрать(); НаборДвижений = ПоДаннымОрганизации.Выгрузить(); Пока Выборка.Следующий() Цикл НоваяСтрока = НаборДвижений.Добавить(); НоваяСтрока.Дата = Выборка.Дата; НоваяСтрока.Договор = Выборка.ДоговорКонтрагента; НоваяСтрока.Документ = Выборка.Документ; НоваяСтрока.Кредит = Выборка.Кредит; НоваяСтрока.Дебет = Выборка.Дебет; // Сформируем строку представления Представление = ""; Если ТипЗнч(Выборка.Документ) = Тип("ДокументСсылка.РеализацияТоваровУслуг") Или ТипЗнч(Выборка.Документ) = Тип("ДокументСсылка.ОперацияБух") И Выборка.Кредит <> 0 Тогда Представление = "Продажа"; ИначеЕсли ТипЗнч(Выборка.Документ) = Тип("ДокументСсылка.ПоступлениеНаРасчетныйСчет") Или ТипЗнч(Выборка.Документ) = Тип("ДокументСсылка.ОперацияБух") И (Выборка.Дебет <> 0) Тогда Представление = "Оплата"; ИначеЕсли Не ЗначениеЗаполнено(Выборка.Документ) Тогда Представление = "Сальдо на " + Формат(ДатаНачала, "ДФ=dd.MM.yyyy"); КонецЕсли; Если Выборка.НомерВходящегоДокумента = Неопределено тогда Если Представление = "Продажа" И ТипЗнч(Выборка.Документ) <> Тип("ДокументСсылка.ОперацияБух") Тогда Представление = Представление + " (" + ОбщегоНазначения.ПолучитьНомерНаПечать(Выборка.Документ) + " от " + Формат(Выборка.Дата, "ДФ=dd.MM.yyyy") + ")"; Иначе Представление = Представление + " ("+Формат(Выборка.Дата, "ДФ=dd.MM.yyyy") + ")"; КонецЕсли; ИначеЕсли (Выборка.НомерВходящегоДокумента = "" И Представление = "Оплата") Тогда Представление = Представление + " (" + Формат(Выборка.Дата, "ДФ=dd.MM.yyyy")+")"; ИначеЕсли Найти(Представление, "Сальдо") > 0 Тогда Иначе Представление = Представление +" ("+ ?(НЕ ЗначениеЗаполнено(Выборка.НомерВходящегоДокумента),"_______", Выборка.НомерВходящегоДокумента) +" от "+ ?(НЕ ЗначениеЗаполнено(Выборка.ДатаВходящегоДокумента), "' . . '", Формат(Выборка.ДатаВходящегоДокумента, "ДФ=dd.MM.yyyy"))+")"; КонецЕсли; НоваяСтрока.Представление = Представление; КонецЦикла; ПоДаннымОрганизации.Загрузить(НаборДвижений); КонецПроцедуры Далее основной расчет идет в: Функция ПечатьПени() НаборДвижений = ПоДаннымОрганизации.Выгрузить(); МассивОкончаниеПериодаПросрочки = НаборДвижений.ВыгрузитьКолонку("Дата"); Если МассивОкончаниеПериодаПросрочки.Количество()> 0 Тогда МассивОкончаниеПериодаПросрочки.Удалить(0); МассивОкончаниеПериодаПросрочки.Добавить(ДатаОкончания); КонецЕсли; НаборДвижений.Колонки.Добавить("ОкончаниеПериодаПросрочки", Новый ОписаниеТипов("Дата", Новый КвалификаторыДаты(ЧастиДаты.Дата))); НаборДвижений.ЗагрузитьКолонку(МассивОкончаниеПериодаПросрочки, "ОкончаниеПериодаПросрочки"); ТабДок = Новый ТабличныйДокумент; ТабДок.ИмяПараметровПечати = "ПАРАМЕТРЫ_ПЕЧАТИ_РасчетПени_РасчетНеустойки"; Макет = ПолучитьМакет("РасчетНеустойки"); ОбластьШапка = Макет.ПолучитьОбласть("Шапка"); ОбластьШапкаТаблицы = Макет.ПолучитьОбласть("ЗаголовокТаблицы"); ОбластьСтрока = Макет.ПолучитьОбласть("Строка"); ОбластьИтого = Макет.ПолучитьОбласть("Итого"); ОбластьПодвал = Макет.ПолучитьОбласть("Подвал"); //СведенияОбОрганизации = УправлениеКонтактнойИнформацией.СведенияОЮрФизЛице(Организация, Дата); //Для документа СведенияОбОрганизации = УправлениеКонтактнойИнформацией.СведенияОЮрФизЛице(Организация, ДатаНачала); ПредставлениеОрганизации = ФормированиеПечатныхФорм.ОписаниеОрганизации(СведенияОбОрганизации, "НаименованиеДляПечатныхФорм,"); //СведенияОКонтрагенте = УправлениеКонтактнойИнформацией.СведенияОЮрФизЛице(Контрагент, Дата); //Для документа СведенияОКонтрагенте = УправлениеКонтактнойИнформацией.СведенияОЮрФизЛице(Контрагент, ДатаНачала); ПредставлениеКонтрагента = ФормированиеПечатныхФорм.ОписаниеОрганизации(СведенияОКонтрагенте, "НаименованиеДляПечатныхФорм,"); ОбластьШапка.Параметры.НазваниеОрганизации = ПредставлениеОрганизации; ОбластьШапка.Параметры.ДоговорКонтрагента = ДоговорКонтрагента; ОбластьШапка.Параметры.Контрагент = ПредставлениеКонтрагента; ОбластьШапка.Параметры.ПроцентПени = "" + ПроцентПени + "%"; ОбластьШапка.Параметры.ПериодОтчета = "с " + Формат(ДатаНачала, "ДФ=dd.MM.yyyy") + " по " + Формат(ДатаОкончания, "ДФ=dd.MM.yyyy"); ТабДок.Очистить(); ТабДок.Вывести(ОбластьШапка); ТабДок.Вывести(ОбластьШапкаТаблицы); Долг = 0; СуммаПениИтог = 0; ИтоговаяСумма = 0; Для Каждого Строка Из НаборДвижений Цикл Долг = Долг + Строка.Кредит + Строка.Дебет; РазностьДат = Строка.ОкончаниеПериодаПросрочки - Строка.Дата; ДнейЗадолжености = РазностьДат/86400; Если Долг > 0 Тогда СуммаЗадолжености = Окр(Долг * ПроцентПени / 100 * ДнейЗадолжености, 2); Иначе СуммаЗадолжености = 0; КонецЕсли; СуммаПениИтог = СуммаПениИтог + СуммаЗадолжености; ОбластьСтрока.Параметры.Дата = Строка.Дата; ОбластьСтрока.Параметры.Кредит = Строка.Кредит; ОбластьСтрока.Параметры.Дебет = - Строка.Дебет; ОбластьСтрока.Параметры.Долг = Долг; ОбластьСтрока.Параметры.НачалоПериодаПросрочки = Строка.Дата; ОбластьСтрока.Параметры.ОкончаниеПериодаПросрочки = Строка.ОкончаниеПериодаПросрочки; ОбластьСтрока.Параметры.ПроцентПени = "" + ПроцентПени + " в день"; ОбластьСтрока.Параметры.КолвоДнейПросрочки = ДнейЗадолжености; ОбластьСтрока.Параметры.СуммаПени = СуммаЗадолжености; ОбластьСтрока.Параметры.ПредставлениеДокумента = Строка.Представление; ТабДок.Вывести(ОбластьСтрока); КонецЦикла; ОбластьИтого.Параметры.КредитИтог = НаборДвижений.Итог("Кредит"); ОбластьИтого.Параметры.ДебетИтог = - НаборДвижений.Итог("Дебет"); ОбластьИтого.Параметры.ДолгИтог = Долг; ОбластьИтого.Параметры.СуммаПениИтог = СуммаПениИтог; ТабДок.Вывести(ОбластьИтого); ОбластьПодвал.Параметры.ДолгИтог = Долг; ОбластьПодвал.Параметры.СуммаПениИтог = СуммаПениИтог; ОбластьПодвал.Параметры.ИтогДолгПроценты = Долг + СуммаПениИтог; ТабДок.Вывести(ОбластьПодвал); Возврат ТабДок; КонецФункции // ПечатьПени() Также есть еще: Функция РассчитатьДолг() НаборДвижений = ПоДаннымОрганизации.Выгрузить(); МассивОкончаниеПериодаПросрочки = НаборДвижений.ВыгрузитьКолонку("Дата"); Если МассивОкончаниеПериодаПросрочки.Количество()> 0 Тогда МассивОкончаниеПериодаПросрочки.Удалить(0); МассивОкончаниеПериодаПросрочки.Добавить(ДатаОкончания); КонецЕсли; НаборДвижений.Колонки.Добавить("ОкончаниеПериодаПросрочки", Новый ОписаниеТипов("Дата", Новый КвалификаторыДаты(ЧастиДаты.Дата))); НаборДвижений.ЗагрузитьКолонку(МассивОкончаниеПериодаПросрочки, "ОкончаниеПериодаПросрочки"); Долг = 0; СуммаПениИтог = 0; ИтоговаяСумма = 0; Для Каждого Строка Из НаборДвижений Цикл Долг = Долг + Строка.Кредит + Строка.Дебет; РазностьДат = Строка.ОкончаниеПериодаПросрочки - Строка.Дата; ДнейЗадолжености = РазностьДат/86400; Если Долг > 0 Тогда СуммаЗадолжености = Окр(Долг * ПроцентПени / 100 * ДнейЗадолжености, 2); Иначе СуммаЗадолжености = 0; КонецЕсли; СуммаПениИтог = СуммаПениИтог + СуммаЗадолжености; КонецЦикла; СтруктураДолга = Новый Структура; СтруктураДолга.Вставить("Долг", Долг); СтруктураДолга.Вставить("СуммаПениИтог", СуммаПениИтог); Возврат СтруктураДолга; КонецФункции |
|||
37
Tanis
30.08.13
✎
09:42
|
Это оригинальная версия, в свое дописал допустимое количество дней для оплаты, и % пеней исходя из ставки рефинансирования.
Сейчас дни просрочки рассчитываются как разница дат между следующими друг за другом документов. А надо чтоб считалось разница между допустимой даты 1 доком реализации и датой оплаты, затем сумма реализации * на это количество дней * %пени, далее если полностью не погашена, то разница дней между 1-ой реализацией и 2-ой оплаты, но сумма уже за вычетом 1-ой оплаты. |
|||
38
Rie
30.08.13
✎
09:43
|
(36) Не знаю, как там у вас просточка считается. Но в справочнике ДоговорыКонтрагентов есть СрокОплаты.
И если соединить первый запрос со справочником ДоговорыКонтрагентов - то можно просрочку вычислить прямо в запросе. |
|||
39
Tanis
30.08.13
✎
09:48
|
(38) тогда дни правильно посчитаются, будут считать до полного погашения? а как с суммами поступит?
|
|||
40
Rie
30.08.13
✎
09:58
|
(39) Запрос из (1) показывает, как рассчитать неоплаченную часть суммы на каждый документ.
Не парься с параметром &Оплата - посмотри внимательно там на ВложенныйЗапрос. |
|||
41
Tanis
30.08.13
✎
09:59
|
как не париться, если он ругается, просит указать параметр.
|
|||
42
Rie
30.08.13
✎
10:02
|
(41) Тебе же не надо тупо _копировать_ тот запрос. Надо _переписать_ свой запрос, вернее, добавить в свой запрос расчёт просрочки.
ВложенныйЗапрос в (1) как раз и рассчитывает "влияние предыдущих документов на сумму", если так можно выразиться. |
|||
43
Rie
30.08.13
✎
10:03
|
+(42) Возьми ВложенныйЗапрос из (1), сунь его в консоль запросов - и посмотри, что он выдаёт (только отсортируй выдачу по датам).
|
|||
44
Tanis
30.08.13
✎
10:07
|
Пробовал его в консоли, спрашивает параметр суммы.
Попробую еще переделать, добавить параметров. |
|||
45
Wobland
30.08.13
✎
10:09
|
предлагаю понять, как работает (1). потом - всё остальное
|
|||
46
Tanis
30.08.13
✎
10:11
|
Хорошо. Спасибо. Через час - 1,5 отпишусь, что вышло.
Т.е можно исправить эту обработку? И не надо добавлять вторую ТЧ? |
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |