1. dmitrym777 04.12.18 15:19 Сейчас в теме

Расчет значения с учетом предыдущих данных. СКД

Добрый день.
Помогите, пожалуйста, извернуться в расчете значения.

СКД.
Есть 3 колонки. а| б| в

Нужно посчитать колонку "в" по следующему алгоритму:
Если это первая запись в группировке, берем значение константы, если это не первая запись - вычисляем по формуле: предыдущее значение - колонка б.

В вычисляемых полях, как и в пользовательских, ссылаться на рассчитываемое поле нельзя, т.е. ВычислитьВыражение("в", , , "Предыдущая", "Предыдущая") вызывает ошибку (поле в не найдено).

Есть такой полувыход: поле "в" добавляем как вычислимое, с выражением 0;
Через выражение в макете поля можно все прописать, но как получить значение именно выражения, а не самого поля ( т.е. всегда получает значение 0)

1. Вопрос. Можно ли как-то достучаться до предыдущего значения поля "в" при расчете этого поля?
2. Тут еще второй вопрос есть чуть посложней: значение в колонке "а" нужно вычислять с учетом рассчитанного значения из колонки "в".
3. Вообще реально ли это все сделать на СКД?

Спасибо
Найденные решения
4. spacecraft 04.12.18 17:47 Сейчас в теме
(3) тогда что-то в этом роде:
Выбор когда НомерПоПорядкуВГруппировке()=1 Тогда ЗначениеКонстанты Иначе ЗначениеКонстанты-ВычислитьВыражение("Сумма(Б)",,"Группировка","Первая(2)","Текущая") Конец
6. sergathome 05.12.18 09:23 Сейчас в теме
over partition оно не умеет ни в каком виде. обломайтесь. Единственный выход, если нужно СКД, это подсунуть СКД уже готовую таблицу.
8. spacecraft 05.12.18 09:40 Сейчас в теме
(5) Вы привязались к увеличению самого вычисляемого поля от самого этого поля.
Я привел пример как выполнить туже задачу в рамках нормального решения на СКД.
Читаем условие задачи:
"Если это первая запись в группировке, берем значение константы, если это не первая запись - вычисляем по формуле: предыдущее значение - колонка б."
Смотрим решение в (4):
"Если это первая запись в группировке, берем значение константы" выполняется?
"если это не первая запись - вычисляем по формуле: предыдущее значение - колонка б.". Другими словами: "если это не первая запись - вычисляем по формуле: значение константы минус сумма колонки б начиная со второй записи"
Проверьте.

Для наглядности вычислений см вложение.
Прикрепленные файлы:
Остальные ответы
Избранное Подписка Сортировка: Древо
2. spacecraft 04.12.18 15:35 Сейчас в теме
(1) вычисляемое поле:
Выбор когда НомерПоПорядкуВГруппировке()=1 Тогда 1 Иначе 2 Конец

Вместо 1 и 2 подставить свои данные.
3. dmitrym777 04.12.18 15:43 Сейчас в теме
(2) Выбор Когда ВычислитьВыражение("в",,, "Предыдущая", "Предыдущая") ЕСТЬ NULL Тогда... То же самое.
Вопрос в другом:
Поле "в" - вычисляемое.
При его расчете мне нужно использовать его же предыдущее значение.

Если рассмотреть, например, массив:

Поле в =
выбор когда индекс = 0
тогда ЗначениеКонстанты
иначе
в[индекс - 1] - значение поля б
конец
4. spacecraft 04.12.18 17:47 Сейчас в теме
(3) тогда что-то в этом роде:
Выбор когда НомерПоПорядкуВГруппировке()=1 Тогда ЗначениеКонстанты Иначе ЗначениеКонстанты-ВычислитьВыражение("Сумма(Б)",,"Группировка","Первая(2)","Текущая") Конец
5. dmitrym777 05.12.18 09:11 Сейчас в теме
(4) Вы не правильно поняли суть задачи.

Даже пример с массивом:

Поле в =
выбор когда индекс = 0
тогда ЗначениеКонстанты
иначе
в[индекс - 1] - значение поля б
конец
8. spacecraft 05.12.18 09:40 Сейчас в теме
(5) Вы привязались к увеличению самого вычисляемого поля от самого этого поля.
Я привел пример как выполнить туже задачу в рамках нормального решения на СКД.
Читаем условие задачи:
"Если это первая запись в группировке, берем значение константы, если это не первая запись - вычисляем по формуле: предыдущее значение - колонка б."
Смотрим решение в (4):
"Если это первая запись в группировке, берем значение константы" выполняется?
"если это не первая запись - вычисляем по формуле: предыдущее значение - колонка б.". Другими словами: "если это не первая запись - вычисляем по формуле: значение константы минус сумма колонки б начиная со второй записи"
Проверьте.

Для наглядности вычислений см вложение.
Прикрепленные файлы:
9. dmitrym777 05.12.18 10:37 Сейчас в теме
(8) Да, спасибо. Все верно. Но, правильно поставленное ТЗ..
В общем, я не все описал в задаче, но сам виноват

Константа1 = 43 950
Константа2 = 1000
Константа 3 = 21600

Поле 1 | А | Б | В
Не обрывной | 22 559 | 209,0 | 43 950
Обрывной | 6 289 | 5539,0 | 38 411
Обрывной | 19 018 | 18268,0 | 20 143
Обрывной | 40 411 | 18061,0 | 23 682
Обрывной | 12 500 | 11750,0 | 33 532
Обрывной | 32 000 | 9 650,0 | 23 882
Не обрывной | 23 882 | 1 532,0 | 43 950


В свою очередь, поле 1 так же вычисляется.
Итого имеем.
Поле 1: Если поле Б меньше константы 2, тогда "Не обрывной" иначе если А = значению В из предыдущей строки, тогда "Не обрывной" иначе "Обрывной"
Поле В: Если поле 1 = "Не обрывной" тогда Константа1 иначе если (Поле В из предыдущей строки - поле А из текущей) / Константа3 < 1 Тогда (Поле В из предыдущей строки - поле А из текущей) + Константа3 иначе (Поле В из предыдущей строки - поле А из текущей)


И тут наступает звездец, потому что это оба вычислимых поля и они оба на основании друг друга вычисляются. И именно поэтому я завязывался на поле В в описании, дабы максимально упростить задачу. Но я не учел что ее можно решить Вашим способм.

Так что спасибо за потраченное время. Решение действительно либо внешний источник, либо функция в ом
6. sergathome 05.12.18 09:23 Сейчас в теме
over partition оно не умеет ни в каком виде. обломайтесь. Единственный выход, если нужно СКД, это подсунуть СКД уже готовую таблицу.
7. dmitrym777 05.12.18 09:35 Сейчас в теме
(6) Выход - функция в общем модуле. Это решает проблему конкретно в моей ситуации, но работает долго.
Вы же знаете какая это повсеместная проблема: сделать крутой отчет, а потом его постоянно переделывать, потому что "а вот тут мы вот передумали вот так считать, надо так".
Если бы окончательный вариант был известен перед тем как отчет начинал разрабатываться, естественно внешний источник данных, но когда уже полтора десятка ресурсов расписаны и т.д..
Оставьте свое сообщение
Новые вопросы с вознаграждением
Автор темы объявил вознаграждение за найденный ответ, его получит тот, кто первый поможет автору.

Вакансии

Старший Программист 1С НОВОСИБИРСК
Новосибирск
зарплата до 130 000 руб.
Полный день

Программист 1С
Новосибирск
зарплата от 75 000 руб.
Полный день



Руководитель проектов 1С
Санкт-Петербург
По совместительству