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

Тема в разделе "1C и всё что с ней связано", создана пользователем vbs, 30 май 2010.

  1. vbs

    vbs Well-Known Member

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

    vitfil IT-интегратор

    Регистрация:
    2 апр 2004
    Сообщения:
    2.070
    Симпатии:
    0
    Ничего интересного. В журнале неверно задана размерность.
     
  3. vbs

    vbs Well-Known Member

    Регистрация:
    18 фев 2007
    Сообщения:
    1.708
    Симпатии:
    3
    Эту фразу не понял.

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

    vitfil IT-интегратор

    Регистрация:
    2 апр 2004
    Сообщения:
    2.070
    Симпатии:
    0
    Форматирование этой "текстовой колонки" задано? В формате неправильно задана размерность. Вполне стандартная фишка для журналов, ТЧ документов и отчетов: когда не хватает разрядов, 1С выводит все 9.
     
  5. vbs

    vbs Well-Known Member

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

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

    vitfil IT-интегратор

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

    vbs Well-Known Member

    Регистрация:
    18 фев 2007
    Сообщения:
    1.708
    Симпатии:
    3
    Спасибо, теперь понятно хоть, откуда ноги растут.

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

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

    vitfil IT-интегратор

    Регистрация:
    2 апр 2004
    Сообщения:
    2.070
    Симпатии:
    0
    Спасибом пьян не будешь! :please:
    Точную дату на белые ночи скажу несколько позже.
    Теперь про Итог("Переменная"). Сей метод виртуальный и переопределен для разных объектов. Когда "находимся в открытом документе" - он работает для любой численной колонки. Почему? Потому как просто суммирует значения, находящиеся в колонке.
    Не задумывался, почему этот метод в журнале работает только для колонок, в которых стоит "Итог по колонке"? Как я и говорил, при записи документа, для таких колонок проводится суммирование и запись итога в реквизит шапки (имеющий такую же размерность, как и реквизит табличной части). Так вот когда мы в журнале, метод просто считывает значения из реквизитов шапки.
    Сделано это вот по какой причине... Все документы хранятся в нескольких таблицах:
    1sjourn - это журнал документов. Единый и неделимый. Все журналы, создаваемые в конфигураторе - это всего лишь фильтры к этой таблице.
    DHххх - это шапка документа.
    DTххх - это табличная часть документа.
    ххх - это номер объекта метаданных в конфигураторе.
    Находясь в журнале, гораздо проще сделать левое соединение с таблицей шапки документа и взять оттуда сумму, чем делать левое соединение с таблицей табличной части и производить суммирование.
    Ну вот как-то так я все это себе вижу.
     
  9. Дайнеко

    Дайнеко Well-Known Member
    1C Team

    Регистрация:
    19 ноя 2009
    Сообщения:
    951
    Симпатии:
    0
    vitfil правильно разъяснил, что когда документ открыт на экране (печатаем его), "Итог" работает по-другому, чем в журнале. Это я к тому, что если ты так жаден до места в базе, как и я, то можно убрать в Конф признак "Итог по колонке" в документах, где итог используется только для печати или вычислений внутри формы. К сожалению, при обращении к "Объект.Документ" он тоже нужен.
     
  10. vbs

    vbs Well-Known Member

    Регистрация:
    18 фев 2007
    Сообщения:
    1.708
    Симпатии:
    3
    Уже не жаден, только отвыкаю плохо :ya_lamo:
     
Загрузка...

Поделиться этой страницей