Имя: Пароль:
1C
 
Получить количество значений из регистра сведений помесячно
0 HELEN0302
 
01.11.25
13:13
Есть регистр сведений "СтатусыТендера"
В нем измерения:
1) Тендер - тип ссылка на справочник "Тендеры"
2) Период - тип дата (дата изменения статуса тендера из справочника "Тендеры")
И ресурс:
Статус тендера - тип перечисления

Запись в регистре создается, когда меняется статус тендера в элементе справочника "Тендера"

Задача: Создать отчет, где за выбранный период, по месяцам будет выведено количество активных тендеров. Активные задачи - все, кроме задач со статусом "Готов" и "Отменен"

Что вызывает сложность:
1) Если, к примеру в марте был тендер "
1 HELEN0302
 
01.11.25
13:21
Что вызывает сложность:
1) Если, к примеру в марте был тендер "Тендер1"  в статусе "Подготовка" и до сентября статус не менялся, значит тендер активен и должен считаться в марте 1шт,
апрель 1 шт и т.д. до сентября
2) Если "Тендер1" в марте был в статусе "Подготовка", в апреле "Сбор информации", затем в апреле перешел в статус "Отменен",
то он должен считаться в марте 1шт, в апреле в количество не попадает
2 Ненавижу 1С
 
гуру
01.11.25
13:21
(0) активных на конец месяца? или которые были активны в месяце хотя бы какой-то период?
3 Ненавижу 1С
 
гуру
01.11.25
13:21
(1) значит на конец месяца
4 lEvGl
 
гуру
01.11.25
13:23
(0) срез последних на каждый день
5 HELEN0302
 
01.11.25
13:24
(2) Мне нужно выбрать период, например "01.01.25 - "31.03.25"
Тогда тогда в отчете должен быть тендер и колонки по месяцам где будет выводиться количество активных задач, то есть за январь - март в каком то количестве, по остальным месяцам, соответственно количество выводиться не должно, потому что они не попадают в выбранный период
6 Garykom
 
гуру
01.11.25
13:24
(0) Наймите уже программиста
7 Garykom
 
гуру
01.11.25
13:25
(6)+ И заодно аналитика, умеющего формализовывать и ставить задачи программистам
8 Garykom
 
гуру
01.11.25
13:27
Самый простой вариант это тупо кодом в цикле перебор всех тендеров
И для каждого смотреть записи в РС
В зависимости от условий засовывать в ТЗ по месяцам
9 Ненавижу 1С
 
гуру
01.11.25
13:27
1. соединив регистр с собой можно получить таблицу периодов состояния объектов
2. из производственного календаря можно получить даты окончаний всех месяцев периода
3. соединив их по включению в период можно получить статусы объектов на каждый месяц
10 Garykom
 
гуру
01.11.25
13:29
Вариант когда период "01.01.25 - "31.03.25"
Тендер последний раз менялся 01.12.24 в "Подготовка"

Он должен попадать в месяца "01.01.25 - "31.03.25"?
11 HELEN0302
 
01.11.25
13:30
(10) Да, все верно
12 Garykom
 
гуру
01.11.25
13:39
Не надо любую задачу пытаться решить через одни запросы
Часто в этом нет смысла ибо долго делать и решение не гибкое
И хрена с два легко модифицируемое
И сложно ошибки отлавливать

Тупо сделать кодом в циклах
Имхается тут не требуется излишние быстродействие
13 Garykom
 
гуру
01.11.25
13:40
1. Запросами к РС выбрать все тендеры для перебора/проверки в цикле
Тут будет несколько запросов или составной через ОБЪЕДИНИТЬ
Например выбрать все Тендеры с нужными статусами до начало периода
Так же все Тендеры изменяющиеся за период

2. Перебираем ТЗ Тендеров (свернуть ТЗ или в запросе выше)
Каждый Тендер проверяем надо ли выводить и в какие периоды
Добавляем в выходную ТЗ

3. Просто сортируем и выводим выходную ТЗ в макет
14 Eiffil123
 
01.11.25
13:40
(12) тут должна случиться истерика у хомячков, исповедующих непременно получение данных для отчета запросом, а не кодом. А от запроса в цикле они будут пить корвалол в течение всего дня )
15 Garykom
 
гуру
01.11.25
13:41
(14) Лучше запрос в цикле чем удвоение, утроение и т.д. строк в результате кривых запросов
16 Eiffil123
 
01.11.25
13:45
(15) согласен. плюс читаемость кода повышается
17 RomanYS
 
01.11.25
13:46
(15) Странная альтернатива) Не делай кривые запросы.
Задачка решает не кривым запросом
18 Garykom
 
гуру
01.11.25
13:57
(17) В некоторых случаях это невозможно, ибо зависит от данных
Например надо подобрать элементы справочника по некоему коду
И упс один код повторяется у нескольких элементов справочника
Упс было 10 строк а стало 25 - и хз в каких ошибка
19 Ненавижу 1С
 
гуру
01.11.25
14:00
(18) почему невозможно? это разные формы одного и того же, выраженные разными алгоритмами

И да, язык запросов более ограничен чем алгоритм, не спорю

но тут главное перед тем как писать любой алгоритм ответить на вопрос - а какой элемент выбирать, если код неуникален?
20 lEvGl
 
гуру
01.11.25
14:06
(18) как код поможет решить эту проблему?
зы. с запросами интересней, а в кодах по сборке такой тз как нужна для (0) у большинства сразу появляются стр, пыр, мыр, стр1, хыр1 и остальное, от чего кровавые слезы
21 Eiffil123
 
01.11.25
14:07
(20) не стр, а ТекСтр !!!
22 lEvGl
 
гуру
01.11.25
14:08
(21) шаришь! ))
23 Garykom
 
гуру
01.11.25
14:12
(20) Если в цикле по кодам делать запросы то если вернулось не 0 или 1, а >1 элемента справочника - понятно что ошибка
Ее можно обработать

А вот предварительными запросами делать проверку на дублирующиеся коды долго и сложно
24 Garykom
 
гуру
01.11.25
14:12
(19)
а какой элемент выбирать, если код неуникален?

А как ты это в запросе общем по куче кодов опишешь?
25 Garykom
 
гуру
01.11.25
14:16
Короче если есть знания (и офигенный опыт) как делать только через запросы
Да еще без ошибок (все предусмотреть с их обработкой) - вперед (на мины)!

Если таких знаний и опыта нет - хреначишь кодом и простыми запросами в цикле
И ниипет, задача решена, допилить если что легко

Не нужно излишне переусложнять код и запросы
Лучше проще - проще потом переписать
26 Ненавижу 1С
 
гуру
01.11.25
14:23
(24)
ВЫБРАТЬ
  ТаблицаКоды.Код,
  МАКСИМУМ(Номенклатура.Ссылка),
  ВЫБОР
    КОГДА Количество(*)>1 ТОГДА "Неоднозначное соответствие"
    КОГДА Количество(*)=0 ТОГДА "Нет соответствия"
  КОНЕЦ КАК Ошибка
ИЗ
  ТаблицаКоды КАК ТаблицаКоды
  ЛЕВОЕ СОЕДИНЕНИЕ Справочник.Номенклатура КАК Номенклатура
  ПО ТаблицаКоды.Код=Номенклатура.Код
СГРУППИРОВАТЬ ПО
  ТаблицаКоды.Код
27 Garykom
 
гуру
01.11.25
14:28
(26) Чем непонятно
"А вот предварительными запросами делать проверку на дублирующиеся коды долго и сложно" в (23) ?
28 Garykom
 
гуру
01.11.25
14:30
(26) Я не спорю что так тоже можно
Еще усложнить запросы, добавив разные проверки
Но это еще более усложнит доработку-переписывание в последующем
29 Ненавижу 1С
 
гуру
01.11.25
14:33
(28) такие вещи обычно обычно приходят из вне базы. Например чтение из файла. Поэтому они проверяются в самом начале
30 Ненавижу 1С
 
гуру
01.11.25
14:34
я бы вообще перешел бы по возможности в функциональный стиль (например LINQ), дабы не писать все эти циклы
31 Garykom
 
гуру
01.11.25
14:35
(30) Надо понимать что под капотом там один хрен те же циклы
И в LINQ и в SQL
32 Ненавижу 1С
 
гуру
01.11.25
14:39
(31) да. А внутри циклов goto (jmp) богомерзкий, просто другой уровень абстракции. Таков путь
Компьютеры — это как велосипед. Только для нашего сознания. Стив Джобс