1c77. Интересная особенность

vbs

Well-known member
18.02.2007
1 708
1
#1
Вот какой интересный факт я обнаружил :
Переменная имеет тип "Число,3,0"
При выводе документа на печать Док.Итог("Переменная") показывается ПРАВИЛЬНОЕ значение (скажем, 1132),
а при выводе Док.Итог("Переменная") в ЖУРНАЛЕ все, что больше 1000, режутся до 999 !
Столкнулся с этим фактом при попытке вывести в форму журнала средние значения Док.Итог("Переменная")/Док.КоличествоСтрок()
Пришлось увеличить размерность переменной :rolleyes:
 

vitfil

IT-интегратор
02.04.2004
2 062
0
#2
Ничего интересного. В журнале неверно задана размерность.
 

vbs

Well-known member
18.02.2007
1 708
1
#3
В журнале неверно задана размерность.
Эту фразу не понял.

В журнале есть текстовая колонка, в которую выводится среднее значение по колонке документа.
Так вот, при вызове соответствующей функции, Док.Итог там уже обрезана до 3 знаков.
 

vitfil

IT-интегратор
02.04.2004
2 062
0
#4
Форматирование этой "текстовой колонки" задано? В формате неправильно задана размерность. Вполне стандартная фишка для журналов, ТЧ документов и отчетов: когда не хватает разрядов, 1С выводит все 9.
 

vbs

Well-known member
18.02.2007
1 708
1
#5
Что-то я никак не въезжаю - что есть форматирование текстовой колонки ?
И при чем здесь оно, даже если бы было ?
Еще раз повторю : при ВЫЗОВЕ из колонки журнала функции расчета этой колонки
Док.Итог("Переменная") режется до формата, заданного размерностью переменной :)

Можно и не выводить в колонку, все, что больше 999, все равно 999, даже в сообщении
 

vitfil

IT-интегратор
02.04.2004
2 062
0
#6
Тэкс... Значит не в колонке нарушена размерность, а в самой переменной...
Как думаешь, что делает 1С, когда ты ставишь галочку "Итог по колонке"?
Она в шапку документа добавляет реквизит с таким же именем, как в табличной части и с такой же размерностью.
Ну, а что делает 1С, когда размерность "зашкаливает"?
САМ БЫЛ В ШОКЕ, увидев в процедурах сиквела что-то типа
Код:
Если Переменная > 999 Тогда
Переменная = 999;
КонецЕсли;
Написал в синтаксисе 1с, чтобы было понятней.
 

vbs

Well-known member
18.02.2007
1 708
1
#7
Спасибо, теперь понятно хоть, откуда ноги растут.

Но ведь ВНУТРИ документа Итог("Переменная") выдает ПРАВИЛЬНОЕ значение, независимо от недостаточной размерности
самой переменной для суммы.
Напомню и то, о чем я когда-то на Форуме писал.
Итог("Переменная") внутри документа работает, даже если у реквизита нет итога по колонке, а при внешних вызовах
выдается ошибка "реквизит не имеет итога по колонке".
Что-то мутное с этим итогом внутри компилятора 1С (или как он там называется ?).

PS. На самом деле, сам я пал жертвой въевшейся в мозги привычки экономить память аж до байта, поставил бы себе размерность 5
и не наткнулся бы на стенку. Это еще со времен, когда магнитный барабан емкостью 64 КИЛОБАЙТА (!) казался
вершиной технической мысли изобретателей внешней памяти :*цензура*you:
 

vitfil

IT-интегратор
02.04.2004
2 062
0
#8
Спасибо, теперь понятно хоть, откуда ноги растут.

Но ведь ВНУТРИ документа Итог("Переменная") выдает ПРАВИЛЬНОЕ значение, независимо от недостаточной размерности
самой переменной для суммы.
Напомню и то, о чем я когда-то на Форуме писал.
Итог("Переменная") внутри документа работает, даже если у реквизита нет итога по колонке, а при внешних вызовах
выдается ошибка "реквизит не имеет итога по колонке".
Что-то мутное с этим итогом внутри компилятора 1С (или как он там называется ?).

PS. На самом деле, сам я пал жертвой въевшейся в мозги привычки экономить память аж до байта, поставил бы себе размерность 5
и не наткнулся бы на стенку. Это еще со времен, когда магнитный барабан емкостью 64 КИЛОБАЙТА (!) казался
вершиной технической мысли изобретателей внешней памяти :*цензура*you:
Спасибом пьян не будешь! :please:
Точную дату на белые ночи скажу несколько позже.
Теперь про Итог("Переменная"). Сей метод виртуальный и переопределен для разных объектов. Когда "находимся в открытом документе" - он работает для любой численной колонки. Почему? Потому как просто суммирует значения, находящиеся в колонке.
Не задумывался, почему этот метод в журнале работает только для колонок, в которых стоит "Итог по колонке"? Как я и говорил, при записи документа, для таких колонок проводится суммирование и запись итога в реквизит шапки (имеющий такую же размерность, как и реквизит табличной части). Так вот когда мы в журнале, метод просто считывает значения из реквизитов шапки.
Сделано это вот по какой причине... Все документы хранятся в нескольких таблицах:
1sjourn - это журнал документов. Единый и неделимый. Все журналы, создаваемые в конфигураторе - это всего лишь фильтры к этой таблице.
DHххх - это шапка документа.
DTххх - это табличная часть документа.
ххх - это номер объекта метаданных в конфигураторе.
Находясь в журнале, гораздо проще сделать левое соединение с таблицей шапки документа и взять оттуда сумму, чем делать левое соединение с таблицей табличной части и производить суммирование.
Ну вот как-то так я все это себе вижу.
 

Дайнеко

Well-known member
19.11.2009
951
0
#9
Но ведь ВНУТРИ документа Итог("Переменная") выдает ПРАВИЛЬНОЕ значение, независимо от недостаточной размерности
самой переменной для суммы.
vitfil правильно разъяснил, что когда документ открыт на экране (печатаем его), "Итог" работает по-другому, чем в журнале. Это я к тому, что если ты так жаден до места в базе, как и я, то можно убрать в Конф признак "Итог по колонке" в документах, где итог используется только для печати или вычислений внутри формы. К сожалению, при обращении к "Объект.Документ" он тоже нужен.