• Познакомьтесь с пентестом веб-приложений на практике в нашем новом бесплатном курсе

    «Анализ защищенности веб-приложений»

    🔥 Записаться бесплатно!

  • CTF с учебными материалами Codeby Games

    Обучение кибербезопасности в игровой форме. Более 200 заданий по Active Directory, OSINT, PWN, Веб, Стеганографии, Реверс-инжинирингу, Форензике и Криптографии. Школа CTF с бесплатными курсами по всем категориям.

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

  • Автор темы vbs
  • Дата начала
V

vbs

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

vitfil

Ничего интересного. В журнале неверно задана размерность.
 
V

vbs

В журнале неверно задана размерность.
Эту фразу не понял.

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

vitfil

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

vbs

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

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

vitfil

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

vbs

Спасибо, теперь понятно хоть, откуда ноги растут.

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

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

vitfil

Спасибо, теперь понятно хоть, откуда ноги растут.

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

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

Дайнеко

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

Обучение наступательной кибербезопасности в игровой форме. Начать игру!