|
v7: Запрос по регистру остатков: проблема с НачОст и КонОст | ☑ | ||
---|---|---|---|---|
0
ALCAPONA
23.05.24
✎
08:07
|
Доброго всем дня.
Имеется простой запрос по регистру остатков, в функциях которого есть обращение вида: Функция КолНач = НачОст(Количество);
Функция СумНач = НачОст(Сумма); Функция КолКон = КонОст(Количество); Функция СумКон = КонОст(Сумма); где Количество и Сумма - ресурсы регистра. Далее делается запрос по регистру, обращение ко всем его группировкам и наконец к функциям вида Запрос.КолНач и т.д. Формирую запрос по конкретному набору измерений. И проблема в том, что функции отрабатывают неверно. Если делаешь запрос за период 01.04.2024-30.04.2024, то все остатки корректны. Если делаешь запрос за период 10.04.2024-20.04.2024, то все остатки корректны. Если делаешь запрос за период 02.04.2024-30.04.2024, то зануляется КОНЕЧНЫЙ остаток. Если делаешь запрос за период 01.04.2024-29.04.2024, то зануляется НАЧАЛЬНЫЙ остаток. И такая ерунда на всех граничных значениях любого месяца. Проверял движения через стандартный отчёт RegPrint на все запрошенные даты - по этому набору измерений никаких движений нет. Пробовал сделать полный пересчёт регистров - безрезультатно. От безысходности пробовал даже устанавливать флаг "Быстрая обработка движений" для регистра и флаги "Отбор движений" и "Отбор итогов" для измерений - ничего не дало. Посоветуйте, что ещё можно попробовать в такой ситуации ? |
|||
1
victuan1
23.05.24
✎
08:24
|
Нужно:
1) сделать пересчет регистров в конфигураторе 2) выложить сюда для анализа полный текст запросв. |
|||
2
skafandr
23.05.24
✎
08:25
|
Вместо пересказа может текст запроса просто покажете?
|
|||
3
ALCAPONA
23.05.24
✎
08:31
|
(1)
Пробовал сделать полный пересчёт регистров - безрезультатно. |
|||
4
ALCAPONA
23.05.24
✎
08:38
|
(2)
Запрос = СоздатьОбъект("Запрос"); ТекстЗапроса = " |Период с ДатаНачала по ДатаКонца; |Продукт = Регистр.Сыр.Продукт; |Варка = Регистр.Сыр.Варка; |ДатаВарки = Регистр.Сыр.Документ.ДатаДок; |Головы = Регистр.Сыр.Головы; |Вес = Регистр.Сыр.Вес; |ВесЗрелого = Регистр.Сыр.ВесЗрелого; |ЗПодразделение = Регистр.Сыр.Подразделение; |Док = Регистр.Сыр.ТекущийДокумент; |ДатаСозревания = Регистр.Сыр.ДатаСозревания; |Группировка ЗПодразделение; |Группировка Продукт; |Группировка ДатаВарки; |Группировка Варка; |Функция Приход_Г = Приход(Головы); |Функция Приход_В = Приход(Вес); |Функция Приход_З = Приход(ВесЗрелого); |Функция Расход_Г = Расход(Головы); |Функция Расход_З = Расход(ВесЗрелого); |Функция СНД_Г = НачОст(Головы); |Функция СНД_З = НачОст(ВесЗрелого); |Функция СКД_Г = КонОст(Головы); |Функция СКД_З = КонОст(ВесЗрелого); |"; Если Сыр.Выбран() = 1 Тогда ТекстЗапроса = ТекстЗапроса + "Условие (Продукт=Сыр); |"; КонецЕсли; Если Подразделение.Выбран() = 1 Тогда ТекстЗапроса = ТекстЗапроса+ "Условие(ЗПодразделение = Подразделение); |"; КонецЕсли; Если Запрос.Выполнить(ТекстЗапроса) = 0 Тогда Возврат; КонецЕсли; Пока Запрос.Группировка(1) = 1 Цикл Пока Запрос.Группировка(2) = 1 Цикл Пока Запрос.Группировка(3) = 1 Цикл Пока Запрос.Группировка(4) = 1 //Получение результатов вида Запрос.Приход_З Запрос.Расход_З Запрос.СКД_З Запрос.СНД_З |
|||
5
ALCAPONA
23.05.24
✎
08:39
|
И по выбранным продукту и подразделению видно, что движений ни в приход, ни в расход не было, а остатки пляшут в зависимости от выбранного периода запроса.
|
|||
6
Гена
гуру
23.05.24
✎
08:43
|
Три цикла в запросах - это нормально?
|
|||
7
ALCAPONA
23.05.24
✎
08:44
|
(6)
Между этими циклами ещё формируется печатная форма, я убрал лишний код для удобства чтения. |
|||
8
uno-group
23.05.24
✎
08:48
|
База СКЛ ДБФ? для ДБВ размер файла данного регистра и повторить эксперимент в монопольном режиме.
|
|||
9
ALCAPONA
23.05.24
✎
08:50
|
(8)
SQL 2008 R2 1С 7.7.027 |
|||
10
Гена
гуру
23.05.24
✎
08:52
|
(7) Для начала неплохо бы понять: ошибка в остатках или всё же в данном трёхцикловом коде. Для этого посмотреть те же интервалы на любом универсальном отчёте по регистрам 7.7
|
|||
11
ALCAPONA
23.05.24
✎
08:52
|
(10)
Проверял движения через стандартный отчёт RegPrint на все запрошенные даты - по этому набору измерений никаких движений нет. |
|||
12
ALCAPONA
23.05.24
✎
08:53
|
К тому же проблема на всех граничных значениях любого месяца.
Если делаешь запрос за период 01.04.2024-30.04.2024, то все остатки корректны. Если делаешь запрос за период 10.04.2024-20.04.2024, то все остатки корректны. Если делаешь запрос за период 02.04.2024-30.04.2024, то зануляется КОНЕЧНЫЙ остаток. Если делаешь запрос за период 01.04.2024-29.04.2024, то зануляется НАЧАЛЬНЫЙ остаток. На май тоже всё хорошо для периода 01.05.2024-31.05.2024 и всё плохо для периодов 01.05.2024-30.05.2024 и 02.05.2024-31.05.2024. |
|||
13
uno-group
23.05.24
✎
08:56
|
|ДатаВарки = Регистр.Сыр.Документ.ДатаДок; убрать
|Группировка ДатаВарки; заменить на |Группировка День; |
|||
14
ALCAPONA
23.05.24
✎
08:57
|
(11) + остатки и на начало, и на конец отбираются верно при любых интервалах запроса.
|
|||
15
Ёпрст
23.05.24
✎
09:01
|
(12) так и должно быть. Нет остатков по документу движения регистров, и не будет
|
|||
16
Ёпрст
23.05.24
✎
09:01
|
причина - в (13)
|
|||
17
Гена
гуру
23.05.24
✎
09:01
|
(14) Значит ошибка в Вашем коде.
|
|||
18
Гена
гуру
23.05.24
✎
09:04
|
(15) Это верно. Но тогда бы вообще нулились остатки по любым интервалам, а у автора выпадают границы...
|
|||
19
Ёпрст
23.05.24
✎
09:04
|
(0) Документ - это чего, измерение регистра, да ?
И чего пишешь туда, текущий документ, толкающий регистр ? |
|||
20
ALCAPONA
23.05.24
✎
09:42
|
(13)
Да, похоже мы на верном пути. При Вашем варианте отбирает много лишних строк, но по крайней мере не пропадают остатки. (19) Документ - измерение регистра. Что туда пишется: в приходных движениях - сам приходный документ, в расходных движениях - приходный документ (не текущий, толкающий регистр). Что любопытно, остатки пропадают именно по той партии, для которой ДатаВарки пустая. |
|||
21
ALCAPONA
23.05.24
✎
09:44
|
(20) а почему ДатаВарки пустая, могу только догадываться, что в регистр её добавляли позже и не перезаполняли все движения.
|
|||
22
Ёпрст
23.05.24
✎
09:51
|
(20) Тогда проверить все движения на предмет пустого измерения Документ
|
|||
23
Злопчинский
23.05.24
✎
10:07
|
Должно нормально всё работать.
|
|||
24
Ёпрст
23.05.24
✎
10:56
|
Ну и использовать зарезервированные слова в обозначении измерения...могут быть ошибки в самых неожиданных местах.
Переименовал бы в ПриходныйДокумент |
|||
25
ALCAPONA
23.05.24
✎
11:07
|
(13)
Остатки не пропадают, но ломается логика отчёта. 🤦 К примеру: формируем за месяц, на остатках имеем 3 партии (1 с пустой датой (старая, без заполненного документа) и 2 с заполненной). Все остатки на месте, но в табличной форме за счёт Группировки по дням уже не 3 строки с партиями, а 3 * Количество дней в месяце. |
|||
26
ALCAPONA
23.05.24
✎
11:08
|
(24)
Согласен, но база писалась задолго до меня, и с кодом тут полный швах, полно переменных "ку", "пр", "ню" и т.п. Так и с реквизитами. Но, имеем что имеем. |
|||
27
Ёпрст
23.05.24
✎
11:21
|
(25) Проапдейть табличку движений, можешь, хоть всё на один документ повесить. Потом пересчитай итоги прямым запросом.
|
|||
28
uno-group
23.05.24
✎
11:53
|
(25) с какого перепугу там 3 * Количество дней в месяце. Где-то используется "ВСЕ" и выложенный запрос не такой как в обработке? Замени на "все вошедшие в запрос". По большому счету тут наверное проще выгрузить запрос в ТЗ и дальше уже ее сортировать, сжимать и обрабатывать.
|
|||
29
uno-group
23.05.24
✎
11:55
|
А по хорошему переименовываешь Документ В ДокументПрих.
и потом в конфигураторе поиск и замена Регистр.Сыр.Документ на Регистр.Сыр.ДокументПрих на полчаса работы максимум и в будущем никаких глюков. |
|||
30
uno-group
23.05.24
✎
12:01
|
Бывали у меня когда то глюки с Пока Запрос.Группировка(3) Помогало прямое указание имени группировки
Пока Группировка("День")=1. Если в отчете не предполагается произвольное перемещение группировок вверх вниз предпочитаю явно прописывать группировки. |
|||
31
uno-group
23.05.24
✎
12:04
|
(25) скорее всего обрезали базу документ тупа напрямую грохнули, а потом очистили записи.
Для пустого документа Запись Документ.ДатаДок не верна. Тип у реквизита Документ хоть "Документ" или вообще неопределенный ? |
|||
32
ALCAPONA
23.05.24
✎
12:17
|
(27)
Нет, я оказался неправ, движения регистра имеют заполненный реквизит "Документ" с даты начала ведения базы. Буду раскапывать, почему отчёт для моих конкретных данных возвращает пустую дату. (28) Нет в запросе ни конструкции "ВСЕ", ни "Все вошедшие в запрос". В ТЗ пока не хочу идти, дабы не потерять все красивые группировки итогов. (30) Любопытно, попробую. (31) Обрезка была в 2016 году. Реквизит "Документ" имеет тип "Документ". |
|||
33
ALCAPONA
23.05.24
✎
12:21
|
(30)
Попробовал, не помогло. |
|||
34
ALCAPONA
23.05.24
✎
12:24
|
(30)
С такой группировкой всё грустно: запрос за один день - 3 строки, за 2 дня - 6 строк и т.д. |
|||
35
ALCAPONA
23.05.24
✎
12:55
|
В общем поменял в исходном запросе
|ДатаВарки = Регистр.Сыр.Документ.ДатаДок; на |ДатаВарки = Регистр.Сыр.Документ; и всё, остатки перестали исчезать, на любые даты всё корректно. А в печати просто заменю Запрос.ДатаВарки на Запрос.ДатаВарки.ДатаДок По логике всё должно быть ОК, всё равно не может быть в одной дате больше одного дока. Но конечно поведение 1с оставляет вопросы: при группировке по пустому документу всё ОК, а по пустой дате - пропажа остатков. |
|||
36
ALCAPONA
23.05.24
✎
14:23
|
Всем спасибо огромное за помощь !
|
|||
37
Злопчинский
23.05.24
✎
15:30
|
(32) посмотри на ИС поиск по NotaBene - универсальный отчёт по ТЗ, с группировками, шахматной..
|
|||
38
Злопчинский
23.05.24
✎
15:31
|
(35) в документе штатно не бывает пустой даты.
|
|||
39
Franchiser
гуру
23.05.24
✎
17:04
|
(0) посмотри провайлер, семерышные запросы глючат когда через точку выбираешь данные из объекта, когда в запросе присутствуют данные из регистра в котором есть поля с одинаковым типом.
|
|||
40
Злопчинский
23.05.24
✎
23:21
|
(39) "когда в запросе присутствуют данные из регистра в котором есть поля с одинаковым типом."
- Как-то мутновато, пример примерный такого чорного запроса и структура регистра с одинаковым типом..? . |
|||
41
АгентБезопасной Нацио
24.05.24
✎
08:46
|
(39) Поэтому про "чорные запросы" пора забыть.
|
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |