Перейти к содержимому

Как можно посмотреть текст свернутой группировки 1с

  • автор:

Вопрос 14 Как можно просмотреть текст свернутой группировки?

Вопрос 15 Какие режимы форматирования текстов модулей реализованы в «1с:Предприятия 8»?

1. Автоматическое форматирование текста при его вводе

2. Автоматическое форматирование уже введенного текста

3. Верно первое и второе

4. Понятия автоматического форматирования не существует

Вопрос.16 Выделяются ли цветом свойства и методы глобального кон-

текста при редактировании программных модулей?

2. Если на закладке «Редактирование» в параметрах редактирования текстов и модулей установить признак «Выделять цветом свойства и методы глобального контекста»

3. Нет, так как свойства и методы глобального контекста не являются конструкциями встроенного языка

Вопрос.17 Что обозначают изображенные символы в начале каждой строки?

1. Группировку синтаксической конструкции

2. Это маркер, который позволяет просмотреть содержимое свернутой группы в виде всплывающей подсказки

3. Верно первое и второе

Вопрос.18 Будут ли выделяться цветом ключевые слова «Процедура. КонецПроцедуры» при редактировании программных модулей?

2. Зависит от настроек параметров

Вопрос 19 Для чего используется автоматическое форматирование текстов модулей?

1. Для смещения вправо уже введенного текста, расположенного внутри управляющих конструкций, за счет добавления в начало строк необходимого количества знаков табуляции

2. Для сдвига блока текста вправо или влево (в зависимости от настроек форматирования)

3. Верны оба ответа

Вопрос 20 Какие синтаксические конструкции можно группировать?

1. Процедуры и функции

2. Комментарии к процедурам и функциям

3. Циклы и условия

4. Верно все вышеперечисленное

5. Только процедуры и функции, циклы и условия

Вопрос.21 Какие существуют операции для ручного форматирования выделенных блоков текста модуля?

1. Автоматическое форматирование, добавить/удалить комментарий

2. Автоматическое форматирование, увеличить/уменьшить отступ

3. Добавить/удалить комментарий, увеличить/уменьшить отступ

4. Автоматическое форматирование, добавить/удалить комментарий, увеличить/уменьшить отступ

5. Автоматическое форматирование, добавить/удалить комментарий, увеличить/уменьшить отступ, изменение шрифта

Вопрос 22 Выполнять редактирование текстов модулей можно.

1. В процессе создания формы объекта прикладного решения

2. При разработке модулей объектов или всего приложения

3. Верно первое и второе

4. В процессе создания формы объекта прикладного решения, непосредственно при разработке модулей объектов или всего приложения, и при редактировании внешнего текстового файла, содержащего текст модуля

Вопрос.23 Какие существуют способы поиска нужной функции в текущем модуле?

1. Через пункт меню «Правка — Найти»

2. Через пункт меню «Правка — Глобальный поиск»

3. Использование режима поиска процедур и функций

4. Верно первое и второе

5. Использование режима поиска процедур и функций, и через пункт меню «Правка — Найти»

Редактор встроенного языка

Редактор встроенного языка позволяет вам редактировать модули конфигурации.

Этот редактор нельзя открыть сам по себе. Он открывается в контексте редактирования конфигурации, когда вы открываете тот или иной модуль. Кроме этого редактор встроенного языка открывается и в других сценариях работы, связанных с переходом к некоторой строке исходного текста.

Области редактора

Окно редактора содержит несколько функциональных областей:

Вертикальная линейка

Вертикальная линейка прокручивается вместе с текстом модуля и показывает информацию, связанную со строками модуля, отображаемыми на экране:

  • предупреждения и ошибки — ;
  • точки останова — ;
  • закладки — ;
  • задачи — ;
  • номера строк модуля;
  • значки группировки синтаксических конструкций — ;
  • быстрые отличия;
  • информация о ревизии;
  • результаты замера производительности.

Область редактирования

Область редактирования показывает:

  • текст модуля;
  • результаты встроенной отладки.

Линейка обзора не прокручивается, она представляет собой весь модуль целиком. Положение маркеров на линейке обзора соответствует их относительному положению в модуле. Маркеры обозначают те же сущности, что и в вертикальной линейке: предупреждения, ошибки, задачи, закладки и т.д. При наведении мыши на маркер показывается текстовое описание, а при нажатии — переход к отмеченной строке. Значок в верхней части панели показывает наибольшую степень критичности ошибок и предупреждений, имеющихся в модуле.

Условные обозначения

  • Предупреждение;
  • Фрагмент текста, с которым связано предупреждение.
  • Ошибка;
  • Фрагмент текста, с которым связана ошибка.
  • Ошибка, для которой существуют варианты быстрого исправления;
  • Строка, которая будет исполняться при пошаговом исполнении;
  • Включенная точка останова;
  • Включенная точка останова с условием;
  • Выключенная точка останова;
  • Неактивные точки останова;
  • Развернутая синтаксическая конструкция.
  • Свернутая синтаксическая конструкция;
  • Задача
  • Закладка

Текущая строка и текущий идентификатор;

Быстрые отличия.

Информация о ревизии.

Результаты замера производительности.

Результаты встроенной отладки;

Клики мышью и перетаскивание

  • Вертикальная линейка
    • Наведение мыши на значок предупреждения , ошибки , точки останова , задачи или закладки показывает текстовое описание этого элемента во всплывающей подсказке;
    • Одиночный клик на значке предупреждения или ошибки может открыть окно быстрого исправления, если у 1C:EDT есть варианты автоматического исправления;
    • Двойной клик добавляет или удаляет точку останова;
    • Перетаскивание в области номеров строк выделяет диапазон строк;
  • Линейка обзора
    • Наведение мыши на маркер показывает текстовое описание маркера во всплывающий подсказке;
    • Одиночный клик на маркере показывает в редакторе отмеченную строку;
    • Одиночный клик показывает в редакторе фрагмент модуля, местоположение которого примерно соответствует указанному;

Цветовое оформление встроенного языка

Синтаксические конструкции встроенного языка выделяются разным цветом. Это облегчает чтение текста программы.

Существует стандартный набор цветов, которыми выделяются синтаксические конструкции. Чтобы изменить цвета нажмите Параметры. в контекстном меню области редактирования. Затем откройте группу параметров Подсветка синтаксиса .

Также можно открыть эти настройки из главного меню основного окна, нажав Окно > Параметры. > V8 > Встроенный язык > Подсветка синтаксиса .

Контекстное меню вертикальной линейки

  • Отключить точку останова — включает точку останова в выбранной строке. Во время отладки 1C:EDT не будет анализировать эту точку и не будет останавливать исполнение программы;
  • Включить точку останова — включает точку останова, которая находится в выбранной строке и была выключена ранее. Во время отладки 1C:EDT будет анализировать эту точку и, при необходимости, останавливать исполнение программы;
  • Точка останова — добавляет безусловную точку останова или удаляет точку останова, которая существует в этой строке;
  • Добавить закладку. — добавляет закладку, связанную с выбранной строкой модуля;
  • Удалить закладку — удаляет закладку, связанную с текущей строкой модуля;
  • Добавить задачу. — добавляет задачу; Задача будет связана с выбранной строкой модуля;
  • Удалить задачу — удаляет задачу, связанную с текущей строкой модуля;
  • Замер производительности > — подменю содержит следующие команды:
    • Показать результаты замеров — если флажок установлен, то в вертикальной линейке 1C:EDT показывает результаты замера производительности. Если сброшен — не показывает;
    • Показывать устаревшие результаты — после выполнения замера производительности можно изменить строку, которая участвовала в замере. В этом случае результат замера, показываемый в этой строке, станет неактуальным. Если флажок Показывать устаревшие результаты установлен, результат замера, ставший неактуальным, будет выделен серым цветом текста. Если флажок сброшен — неактуальный результат замера будет скрыт;
    • Скрыть информацию о ревизии — в вертикальной линейке скрывает информацию о ревизии.
    • Цвет по дате — более новые коммиты выделяются более темным фоном.
    • Цвет по автору — изменения, внесенные каждым автором, выделяются собственным цветом фона.
    • Комбинированная раскраска — изменения, внесенные каждым автором, выделяются собственным цветом фона. Более новые коммиты выделяются более темным фоном.
    • Показать автора — если флажок установлен, в вертикальной линейке показывается имя автора коммита.
    • Показать Id — если флажок установлен, в вертикальной линейке показывается имя автора коммита.
    • Включить свертывание — если флажок установлен, синтаксические конструкции группируются и сворачиваются. Если флажок снят — группировки и сворачивание не используются. Можно настроить, какие конструкции будут группироваться и какие конструкции будут сворачиваться. Это можно сделать на странице параметров Сворачивание/Отображение участка кода;
    • Развернуть все — разворачивает все группировки синтаксических конструкций;
    • Свернуть все — сворачивает все группировки синтаксических конструкций;
    • Сбросить структуру — возвращает настройки группировки синтаксических конструкций к стандартному состоянию. Аналогична нажатию Восстановить значения по умолчанию на странице параметров Сворачивание/Отображение участка кода;

    Контекстное меню области редактирования

    • Отменить: — отменяет последнее действие. Содержание действия показывается после названия команды;
    • Вернуть файл — отменяет все изменения, выполненные с момента последнего сохранения файла;
    • Сохранить — сохраняет изменения, выполненные в файле;
    • Открыть в > — подменю содержит команды, которые позволяют вам открыть модуль с помощью других редакторов, которые существуют в 1C:EDT или установлены на компьютере;
    • Показать в > — подменю содержит команды, которые позволяют вам отрыть редактируемый файл в проводнике операционной системы или посмотреть свойства объекта конфигурации, которому принадлежит этот модуль;
    • Перейти к определению — переходит к определению переменной или метода, на имени которого находится курсор. Вернуться обратно можно, нажав Назад к в командной панели основного окна;
    • Иерархия вызовов — открывает панель Иерархия вызовов и показывает в ней вызывающую или вызываемую иерархию методов, по отношению к выделенному методу;
    • Быстрая схема модуля — показывает быструю схему модуля;
    • Поиск ссылок — открывает панель Поиск и показывает в ней вызывающую иерархию методов и объектов конфигурации по отношению к методу, который выделен в панели;
    • Вырезать — копирует выделенный текст в буфер обмена и удаляет его из модуля;
    • Копировать — копирует выделенный текст в буфер обмена;
    • Вставить вставляет текст из буфера обмена в модуль;
    • Добавить обработчик события — открывает диалог «Добавить обработчик события». Шаблон обработчика события добавляется после того метода, в котором находится курсор;
    • Источник > подменю содержит следующие команды:
      • Генерировать комментарии к методу — создает шаблон комментариев для процедуры или функции, внутри которой находится курсор или определение которой следует за строкой, в которой находится курсор. В этом шаблоне фрагменты, предназначенные для ввода поясняющего текста, выделяются маркерами;
      • Добавить аннотацию для пропуска предупреждений — эта команда полезна для тех строк, для которых проверка конфигурации показала предупреждение . Команда вставляет служебный комментарий перед строкой, в которой находится курсор (если это исполняемый оператор) или перед следующей строкой, содержащий исполняемый оператор (если курсор находится в пустой строке). Этот комментарий исключает строку из результатов проверки и предупреждение исчезает;
      • Создать шаблон кода — добавляет новый шаблон кода. Выделенный текст вставляет в поле Шаблон ;
      • Включить строгую типизацию (@strict-types) в модулях — в модулях, принадлежащих выделенным веткам конфигурации, включает строгую типизацию путем добавления аннотации //@strict-types в начало модулей;
      • Переключить комментарий — устанавливает комментарии на выделенные строки или снимает их (как выделить диапазон строк);
      • Формат — форматирует все модули в соответствии с настройками форматирования;
      • Помощь по контенту — открывает контекстную подсказку;
    • Рефакторинг > — подменю содержит следующие команды:
      • Переименовать — начинает переименование переменной, процедуры или функции, на имени которой находится курсор. Видимые вхождения отмечаются маркерами. После изменения значения в любом маркере можно нажать Enter , и переименование будет выполнено во всех модулях, в которых используется эта переменная, процедура или функция;
      • Извлечь локальную переменную. — открывает диалог извлечения локальной переменной;
      • Извлечь метод. — открывает диалог извлечения метода;
    • Окружить > — подменю содержит следующие команды:
      • #Область. — окружает выделенные строки модуля инструкциями препроцессора #Область . #КонецОбласти . После вставки инструкций фрагмент, предназначенный для ввода имени области, выделяется маркером;
    • Быстрое исправление — открывает окно быстрого исправления, если текущая строка отмечена предупреждением или ошибкой , для которых у 1C:EDT имеются варианты исправления;
    • Редактор запроса. — открывает редактор запроса и вставляет результат в позицию курсора. Если курсор уже находится внутри текста запроса, то текст запроса загружается в редактор, а результат редактирования замещает имеющийся в модуле текст запроса;
    • Добавить метод в расширение

      заимствует текущий модуль, при необходимости заимствует объект конфигурации, которому принадлежит модуль, и создает расширяющий обработчик события.

      Возможная проблема: На момент выполнения этой команды должно существовать расширение, связанное с данным проектом. Если с проектом связано несколько расширений, 1C:EDT предложит вам выбрать одно из расширений.

      • Коммит. — помещает изменения проекта в локальный репозиторий.
      • Репозиторий > — подменю содержит следующие команды:
        • Отправить в Upstream — отправляет изменения в удаленную ветку, связанную с локальной веткой;
        • Получить из Upstream — получает изменения из удаленной ветки, связанной с локальной веткой;
        • Отправить ветку ‘имя ветки’. — отправляет выбранную ветку в удаленный репозиторий. При этом можно выбрать репозиторий или создать новый, выбрать отправляемую ветку, а также настроить для нее конфигурации отправки и получения изменений из удаленного репозитория;
        • Получить и слить — получает изменения из удаленного репозитория и сливает их с текущей веткой проекта;
        • Переключить На — переключает проект на другую ветку. Во вложенном меню для выбора предлагаются локальные ветки текущего репозитория, а также создание новой ветки и выбор из других элементов репозитория (ветки удаленного отслеживания, метки и др.);
        • Assume Unchanged — Using «assume unchanged» bit;
        • No Assume Unchanged — Using «assume unchanged» bit;
        • Удалить из под версионного контроля — удаляет объект из индекса, оставляя его в рабочем каталоге;
        • Синхронизировать рабочую область — синхронизирует рабочий каталог с удаленным репозиторием. Для этого используется перспектива Синхронизация совместной работы ;
        • Создать патч. — создает патч;
        • Игнорировать — добавляет файл в .gitignore, так что Git игнорирует его (подробнее);
        • Показать в панели Репозитории Git — открывает проект в панели Репозитории Git ;
        • Отключить — отключает всех Git Team провайдеров от этого проекта. Репозиторий Git продолжает существовать, но 1C:EDT с ним больше не взаимодействует;
        • Друг с другом — сравнивает файловую структуру двух выбранных проектов;
        • Локальная история. — открывает панель История для выбора одной из предыдущих локальных версий файла. После выбора сравнивает с ней текущую версию в редакторе сравнения и объединения модулей;
        • HEAD-ревизия — сравнивает рабочий каталог с последним коммитом.
        • Индекс — сравнивает рабочий каталог с индексом.
        • Предыдущая ревизия — сравнивает проект с предыдущим коммитом.
        • Ветка, метка или ссылка. — сравнивает рабочий каталог с некоторой веткой, меткой или ссылкой;
        • Коммит. — сравнивает рабочий каталог с некоторым коммитом;
        • HEAD-ревизия — заменяет рабочий каталог последним коммитом;
        • Индекс — заменяет рабочий каталог индексом;
        • Предыдущая ревизия — заменяет рабочий каталог предыдущей ревизией;
        • Ветка, метка или ссылка. — заменяет рабочий каталог веткой, меткой или ссылкой;
        • Коммит. — заменяет рабочий каталог выбранным коммитом;

        Контекстное меню линейки обзора

        • Параметры. — можно настроить следующие группы параметров: Аннотации , Выделение изменений и Специальные возможности ;

        Разбор тестирования 1С:Профессионал и PMP

        Блоки текста модулей могут быть длинными, что ухудшает читаемость кода. Для решения этой проблемы, редактор модулей предусматривает группировку — когда многие строки кода сворачиваются до одной, но при необходимости могут быть развернуты по плюсику слева:

        Сгруппированы могут быть:

        • Функции
        • Процедуры
        • Комментарии к процедурам и функциям
        • Циклы
        • Условия

        Что именно группировать, может быть настроено в Параметрах:

        При этом полный текст, спрятанный внутри группировки, можно увидеть и не раскрывая плюсик, а просто наведя курсор на пиктограмму стремя точками:

        Вопрос 02.31 экзамена 1С:Профессионал по платформе. Для чего предназначена группировка в модуле?

        1. Для объединения некоторых синтаксических конструкций языка в группы, сворачивания и разворачивания их
        2. Для лучшего восприятия различных частей текста, а также переноса и копирования группы целиком
        3. Верно первое и второе
        4. Нет правильного ответа

        Правильный ответ третий.

        Вопрос 02.20 экзамена 1С:Профессионал по платформе. Какие синтаксические конструкции можно группировать?

        1. Процедуры и функции
        2. Комментарии к процедурам и функциям
        3. Циклы и условия
        4. Верно все вышеперечисленное
        5. Только процедуры и функции, циклы и условия

        Правильный ответ четвертый, можно группировать все.

        Вопрос 02.14 экзамена 1С:Профессионал по платформе. Как можно просмотреть текст свернутой группировки?

        1. Нажав на маркер «+» в начале строки группировки
        2. Для просмотра в виде подсказки – подведя курсор к специальному маркеру
        3. Верно первое и второе
        4. Нет правильного ответа

        Правильный вариант третий, обе опции работают.

        Вопрос 02.16 экзамена 1С:Профессионал по платформе. Что обозначают изображенные символы в начале каждой строки?

        1. Группировку синтаксической конструкции
        2. Это маркер, который позволяет просмотреть содержимое свернутой группы в виде всплывающей подсказки
        3. Верно первое и второе
        9 комментариев:

        почему в 02.16 неверно 2)? Ведь подсказка всплывает Ответить Удалить

        Потому что вопрос заключается в том, что обозначают символы В НАЧАЛЕ СТРОКИ: Во-первых, в начале стоят изображения «плюсиков», наведя на которые подсказка не всплывает; во-вторых, это не маркеры, а пиктограмма. Как то так:) Удалить

        А если наведешь курсор на символы В КОНЦЕ СТРОКИ — то подсказка всплывет Удалить

        Сгруппированы могут быть:
        -Функции
        -Процедуры
        -Комментарии к процедурам и функциям
        -Циклы
        -Условия

        Еще же области можно — это и на скрине отображено Ответить Удалить

        можно, в том и заключается хитрость некоторых вопросов Удалить

        Так про области в вопросе ничего не сказано Удалить

        вопрос был изменен чуть-чуть:

        2.20 Какие синтаксические конструкции могут группировать автоматически?
        1. Процедуры и функции
        2. Комментарии к процедурам и функциям
        3. Циклы и условия
        4. Варианты 1 и 3
        5. Верны все варианты

        правильный ответ — вариант 5
        Ответить Удалить

        вопрос был чуть-чуть изменен:
        2.14 Как можно просмотреть текст свернутой группировки?
        1. Нажав на маркер «+» в начале строки группировки
        2. Для просмотра в виде подсказки – подведя курсор к специальному маркеру
        3. Только отключив сворачивание группировок
        4. Варианты 1 и 2

        В тексте модуля группировке могут подлежать:
        определенные конструкции встроенного языка (условия, циклы и т.п.)
        произвольные строки кода, группируемые области могут пересекаться
        произвольные строки кода, группируемые области могут быть вложенными
        Варианты 1 и 2
        Варианты 1 и 3
        Верны все варианты

        правильный ответ — вариант 5 Ответить Удалить

        Выборочная свертка группировок для СКД

        • Отчет 1.PNG
        • Отчет 2.PNG

        Методика разработки отчета на СКД с возможностью свёртки части группировок по заданному программно условию. — свертка по значению поля (неотрицательные — сворачиваются); — свертка подчиненных в иерархии с произвольным количеством уровней.

        Скачать файлы

        .zip 30,34Kb

        Задача: создать отчет на СКД таким образом, чтобы в нем некоторые группировки вывелись свернутыми.

        Далее рассматриваются два примера — свертка всех группировок по условию на поле (свернуть все группы с неотрицательным значением по родительской группировке) и свертка подчиненной группировки у группировок с иерархией с произвольным количеством уровней.

        Решать такую задачу без СКД просто — при выводе очередной строчки отчета требуется использовать методы НачатьГруппуСтрок/ЗакончитьГруппуСтрок. При использовании СКД возникают проблемы:

        • необходимость перехвата вывода определенных группировок
        • отключение автонастройки свертки/развертки групп.
        • анализ изменений в структуре.

        Далее в статье используется функция ПолучитьМакетГруппировкиПоПолюГруппировки из типового модуля СтандартныеОтчеты (БП 2.0) / БухгалтерскиеОтчеты (БП 3.0). Если вы делаете отчет для базы, в которой нет этих модулей, текст этих функций вам потребуется перенести в модуль объекта (либо общий модуль, доступный из объекта).

        Текст функции, (с) 1с Бухгалтерия Предприятия

        //--------- Далее //(c) Общий модуль СтандартныеОтчеты для БП 2.0, БухгалтерскиеОтчеты для БП 3.0 Функция ПолучитьМакетГруппировкиПоПолюГруппировки(МакетКомпоновки, ПолеГруппировки, ИскатьВДетальныхЗаписях = Ложь, ТипМакета = "Заголовок") Экспорт МассивМакетов = Новый Массив; ОбойтиТелоМакетаКомпоновки(МакетКомпоновки, МакетКомпоновки.Тело, МассивМакетов, ПолеГруппировки, ТипМакета, ИскатьВДетальныхЗаписях); Возврат МассивМакетов; КонецФункции Процедура ОбойтиТелоМакетаКомпоновки(МакетКомпоновки, Тело, МассивМакетов, ПолеГруппировки, ТипМакета, ИскатьВДетальныхЗаписях = Ложь) Для Каждого Элемент Из Тело Цикл Если ТипЗнч(Элемент) = Тип("ГруппировкаМакетаКомпоновкиДанных") Тогда Для Каждого ЭлементГруппировки Из Элемент.Группировка Цикл Если Найти(ЭлементГруппировки.ИмяПоля, ПолеГруппировки) = 1 Тогда МакетТело = ПолучитьМакетШапки(МакетКомпоновки, Элемент.Тело, ТипМакета); Если МакетТело <> Неопределено Тогда МассивМакетов.Добавить(МакетТело); КонецЕсли; МакетТелоИерархии = ПолучитьМакетШапки(МакетКомпоновки, Элемент.ТелоИерархии, ТипМакета); Если МакетТелоИерархии <> Неопределено Тогда МассивМакетов.Добавить(МакетТелоИерархии); КонецЕсли; КонецЕсли; ОбойтиТелоМакетаКомпоновки(МакетКомпоновки, Элемент.Тело, МассивМакетов, ПолеГруппировки, ТипМакета, ИскатьВДетальныхЗаписях); КонецЦикла; ИначеЕсли ТипЗнч(Элемент) = Тип("ТаблицаМакетаКомпоновкиДанных") Тогда ОбойтиТелоМакетаТаблицыКомпоновки(МакетКомпоновки, Элемент.Строки, МассивМакетов, ПолеГруппировки, ТипМакета, ИскатьВДетальныхЗаписях = Ложь); КонецЕсли; Если ИскатьВДетальныхЗаписях Тогда Если ТипЗнч(Элемент) = Тип("ЗаписиМакетаКомпоновкиДанных") Тогда Если Элемент.Имя = ПолеГруппировки Тогда МассивМакетов.Добавить(ПолучитьМакетШапки(МакетКомпоновки, Элемент.Тело)); КонецЕсли; КонецЕсли; КонецЕсли; КонецЦикла; КонецПроцедуры Процедура ОбойтиТелоМакетаТаблицыКомпоновки(МакетКомпоновки, Тело, МассивМакетов, ПолеГруппировки, ТипМакета, ИскатьВДетальныхЗаписях = Ложь) Для Каждого Элемент Из Тело Цикл Если ТипЗнч(Элемент) = Тип("ГруппировкаТаблицыМакетаКомпоновкиДанных") Тогда Для Каждого ЭлементГруппировки Из Элемент.Группировка Цикл Если Найти(ЭлементГруппировки.ИмяПоля, ПолеГруппировки) = 1 Тогда МакетТело = ПолучитьМакетШапки(МакетКомпоновки, Элемент.Тело, ТипМакета); Если МакетТело <> Неопределено Тогда МассивМакетов.Добавить(МакетТело); КонецЕсли; МакетТелоИерархии = ПолучитьМакетШапки(МакетКомпоновки, Элемент.ТелоИерархии, ТипМакета); Если МакетТелоИерархии <> Неопределено Тогда МассивМакетов.Добавить(МакетТелоИерархии); КонецЕсли; КонецЕсли; ОбойтиТелоМакетаТаблицыКомпоновки(МакетКомпоновки, Элемент.Тело, МассивМакетов, ПолеГруппировки, ТипМакета, ИскатьВДетальныхЗаписях); КонецЦикла; КонецЕсли; Если ИскатьВДетальныхЗаписях Тогда Если ТипЗнч(Элемент) = Тип("ЗаписиТаблицыМакетаКомпоновкиДанных") Тогда Если Элемент.Имя = ПолеГруппировки Тогда МассивМакетов.Добавить(ПолучитьМакетШапки(МакетКомпоновки, Элемент.Тело)); КонецЕсли; КонецЕсли; КонецЕсли; КонецЦикла; КонецПроцедуры Функция ПолучитьМакетШапки(МакетКомпоновки, Тело = Неопределено, ТипМакета = "Заголовок") Экспорт ЕстьПустойМакет = Ложь; Если Тело = Неопределено Тогда Тело = МакетКомпоновки.Тело; КонецЕсли; Если Тело.Количество() > 0 Тогда Если ТипМакета = "Заголовок" Тогда НачальныйИндекс = 0; КонечныйИндекс = Тело.Количество(); ИтераторПрямой = Истина; ИначеЕсли ТипМакета = "Подвал" Тогда НачальныйИндекс = Тело.Количество() - 1; КонечныйИндекс = 0; ИтераторПрямой = Ложь; КонецЕсли; Индекс = НачальныйИндекс; Пока Индекс <> КонечныйИндекс Цикл Элемент = Тело[Индекс]; Если ТипЗнч(Элемент) = Тип("МакетОбластиМакетаКомпоновкиДанных") Тогда Если ЕстьПустойМакет Тогда ЕстьПустойМакет = Ложь; Иначе Возврат МакетКомпоновки.Макеты[Элемент.Макет]; КонецЕсли; ИначеЕсли ТипЗнч(Элемент) = Тип("МакетГруппировкиТаблицыМакетаКомпоновкиДанных") Тогда Возврат МакетКомпоновки.Макеты[Элемент.Макет]; ИначеЕсли ТипЗнч(Элемент) = Тип("ДиаграммаМакетаКомпоновкиДанных") Тогда ЕстьПустойМакет = Истина; ИначеЕсли ТипЗнч(Элемент) = Тип("ТаблицаМакетаКомпоновкиДанных") Тогда Возврат МакетКомпоновки.Макеты[Элемент.МакетШапки]; КонецЕсли; Если ИтераторПрямой Тогда Индекс = Индекс + 1; Иначе Индекс = Индекс - 1; КонецЕсли; КонецЦикла; КонецЕсли; Возврат Неопределено; КонецФункции Функция ПолучитьМакетПодвала(МакетКомпоновки, Тело = Неопределено) Экспорт Если Тело = Неопределено Тогда Тело = МакетКомпоновки.Тело; КонецЕсли; Для Каждого Элемент Из Тело Цикл Если ТипЗнч(Элемент) = Тип("ГруппировкаМакетаКомпоновкиДанных") Тогда Если Не ПустаяСтрока(Элемент.МакетПодвала) Тогда Возврат МакетКомпоновки.Макеты[Элемент.МакетПодвала]; КонецЕсли; КонецЕсли; КонецЦикла; Возврат Неопределено; КонецФункции 

        Конкретный пример — показать заказы на номенклатуру на дату отгрузки, структура — Номенклатура/Заказы.

        СКД, используемая для примера

        Состоит из двух наборов:

        ВЫБРАТЬ ЗаказКлиентаТовары.Ссылка КАК Заказ, ЗаказКлиентаТовары.Количество КАК Количество, ЗаказКлиентаТовары.Количество - ЕСТЬNULL(тРеализации.Количество, 0) КАК КоличествоНедогруз, ЗаказКлиентаТовары.Сумма КАК Сумма, ЗаказКлиентаТовары.Сумма - ЕСТЬNULL(тРеализации.Сумма, 0) КАК СуммаНедогруз, ЗаказКлиентаТовары.Номенклатура КАК Номенклатура, ЗаказКлиентаТовары.Номенклатура.Наименование КАК НоменклатураНаименование, ЗаказКлиентаТовары.Ссылка.Партнер КАК Партнер, ЗаказКлиентаТовары.Ссылка.Партнер.Родитель.Наименование КАК ЗаказНаименование, ЕСТЬNULL(тРеализации.Количество, 0) КАК КоличествоПродано, ЕСТЬNULL(тРеализации.Вес, 0) КАК ВесПродано, ЕСТЬNULL(тРеализации.Сумма, 0) КАК СуммаПродано, тРеализации.Реализация КАК Реализация, ЗаказКлиентаТовары.Количество * ЗаказКлиентаТовары.Номенклатура.ВесЧислитель КАК КоличествоВес, (ЗаказКлиентаТовары.Количество - ЕСТЬNULL(тРеализации.Количество, 0)) * ЗаказКлиентаТовары.Номенклатура.ВесЧислитель КАК КоличествоВесНедогруз, ЗаказКлиентаТовары.Номенклатура.ВесЧислитель КАК Вес, ВЫБОР КОГДА ЗаказКлиентаТовары.Склад = ЗНАЧЕНИЕ(Справочник.Склады.ПустаяСсылка) ТОГДА ЗаказКлиентаТовары.Ссылка.Склад ИНАЧЕ ЗаказКлиентаТовары.Склад КОНЕЦ КАК Склад ИЗ Документ.ЗаказКлиента.Товары КАК ЗаказКлиентаТовары ЛЕВОЕ СОЕДИНЕНИЕ (ВЫБРАТЬ РеализацияТоваровУслугТовары.Ссылка.ЗаказКлиента КАК Ссылка, РеализацияТоваровУслугТовары.Номенклатура КАК НоменклатураРеализации, СУММА(РеализацияТоваровУслугТовары.Количество) КАК Количество, СУММА(РеализацияТоваровУслугТовары.Количество * РеализацияТоваровУслугТовары.Номенклатура.ВесЧислитель) КАК Вес, СУММА(РеализацияТоваровУслугТовары.Сумма) КАК Сумма, РеализацияТоваровУслугТовары.Ссылка КАК Реализация, ВЫБОР КОГДА РеализацияТоваровУслугТовары.Склад = ЗНАЧЕНИЕ(Справочник.Склады.ПустаяСсылка) ТОГДА РеализацияТоваровУслугТовары.Ссылка.Склад ИНАЧЕ РеализацияТоваровУслугТовары.Склад КОНЕЦ КАК Склад ИЗ Документ.РеализацияТоваровУслуг.Товары КАК РеализацияТоваровУслугТовары ГДЕ РеализацияТоваровУслугТовары.Ссылка.Проведен СГРУППИРОВАТЬ ПО РеализацияТоваровУслугТовары.Ссылка.Сделка, РеализацияТоваровУслугТовары.Номенклатура, РеализацияТоваровУслугТовары.Ссылка, РеализацияТоваровУслугТовары.Ссылка.ЗаказКлиента, ВЫБОР КОГДА РеализацияТоваровУслугТовары.Склад = ЗНАЧЕНИЕ(Справочник.Склады.ПустаяСсылка) ТОГДА РеализацияТоваровУслугТовары.Ссылка.Склад ИНАЧЕ РеализацияТоваровУслугТовары.Склад КОНЕЦ) КАК тРеализации ПО ЗаказКлиентаТовары.Ссылка = тРеализации.Ссылка И ЗаказКлиентаТовары.Номенклатура = тРеализации.НоменклатураРеализации И ЗаказКлиентаТовары.Склад = тРеализации.Склад ГДЕ ЗаказКлиентаТовары.Ссылка.ДатаОтгрузки = &ДатаОтч И НЕ ЗаказКлиентаТовары.Ссылка.ПометкаУдаления И ВЫБОР КОГДА тРеализации.Ссылка ЕСТЬ NULL ИЛИ тРеализации.Количество <> ЗаказКлиентаТовары.Количество ТОГДА ИСТИНА ИНАЧЕ ЛОЖЬ КОНЕЦ УПОРЯДОЧИТЬ ПО ЗаказКлиентаТовары.Номенклатура.Наименование, ЗаказКлиентаТовары.Ссылка.Партнер.Наименование

        Второй набор — Остатки

        ВЫБРАТЬ ЕСТЬNULL(ТоварыНаСкладахОстатки.ВНаличииОстаток, 0) КАК Остаток, ЕСТЬNULL(ТоварыНаСкладахОстатки.ВНаличииОстаток, 0) * ТоварыНаСкладахОстатки.Номенклатура.ВесЧислитель КАК ОстатокВес, ТоварыНаСкладахОстатки.Номенклатура КАК Номенклатура, ТоварыНаСкладахОстатки.Склад КАК Склад ИЗ РегистрНакопления.ТоварыНаСкладах.Остатки( <(КОНЕЦПЕРИОДА(&ДатаОтч, ДЕНЬ))>,) КАК ТоварыНаСкладахОстатки

        Связаны наборы по полям Склад и Номенклатура.

        Выражение дефицита — вычисляемое поле. Добавьте его в ресурсы, вместе с остатком и объемами заказов. Остаток и дефицит должны суммироваться по номенклатуре и складу и =0 по заказу и партнерам.

        0+Вычислить("СУММА(ЕстьNull(Остаток,0))")-Вычислить("СУММА(ЕстьNull(Количество,0))")+Вычислить("Сумма(ЕстьNull(КоличествоПродано,0))")

        Структура отчета — группировка Номенклатура с подчиненной группировкой Заказы.

        Отчет формируется типовым образом:

        Процедура ПриКомпоновкеРезультата(ДокументРезультат, ДанныеРасшифровки, СтандартнаяОбработка) СтандартнаяОбработка=Ложь; КомпоновщикМакета = Новый КомпоновщикМакетаКомпоновкиДанных; ПроцессорКомпоновкиДанных = Новый ПроцессорКомпоновкиДанных; МакетКомпоновкиДанных = КомпоновщикМакета.Выполнить(СхемаКомпоновкиДанных, КомпоновщикНастроек.Настройки, ДанныеРасшифровки); ПроцессорКомпоновкиДанных.Инициализировать(МакетКомпоновкиДанных, ,ДанныеРасшифровки); ДокументРезультат.Очистить(); ПроцессорВывода = Новый ПроцессорВыводаРезультатаКомпоновкиДанныхВТабличныйДокумент; ПроцессорВывода.УстановитьДокумент(ДокументРезультат); 

        Задача 0) Для начала рассмотрим более простую задачу — свернуть именованную группировку, которая может оказаться на любом (заранее неизвестном) уровне в структуре. Для сворачивания используется метод ПоказатьУровеньГруппировокСтрок объекта типа ТабличныйДокумент. Этот метод принимает параметр — уровень группировки, аналогичный уровню, показываемому в контекстном меню в разделе «уровни группировок», только нумерация начинается с нуля.

        текст для примера, считается что структура «лесенкой» и в группировке поле поиска идет первым.

         ПроцессорВывода.Вывести(ПроцессорКомпоновкиДанных); Уровень = -1; Стр = КомпоновщикНастроек.Настройки.Структура[0]; ур = 0; Пока Истина Цикл стрИмя = Строка(Стр.ПоляГруппировки.Элементы[0].Поле); Если стрИмя = "Заказ" и Стр.Использование Тогда СтрРод = стр.Родитель; Уровень = ур-1; Прервать; КонецЕсли; Если стр.Структура.Количество()=0 Тогда Прервать; КонецЕсли; стр = стр.Структура[0]; ур = ур + 1; КонецЦикла; Если Уровень <> -1 Тогда ДокументРезультат.ПоказатьУровеньГруппировокСтрок(Уровень); КонецЕсли; КонецПроцедуры 

        Задачи 1 и 2) Общая часть.

        Для выборочной группировки требуется анализ выводимого макета, для чего используются методы НачатьВывод / Следующий / ВывестиЭлемент / ЗакончитьВывод объекта типа ПроцессорВыводаРезультатаКомпоновкиДанныхВТабличныйДокумент.

        Метод Следующий последовательно возвращает объекты типа ЭлементРезультатаКомпоновкиДанных.

        Для решения задач используются следующие свойства этого объекта: полная информация о данных выводимой строчки в коллекции «ЗначенияПараметров», имя макета и тип элемента.

        Имена макетов и параметров формализованы — все макеты именуются в виде «Макет#», и все параметры — «П#», где # это номер от одного и далее.

        Для того чтобы понять, какая группировка выводится, используется функция ПолучитьМакетГруппировкиПоПолюГруппировки, которая возвращает массив объектов типа ОписаниеМакетаОбластиМакетаКомпоновкиДанных, содержащих данную группировку. Этот массив мы перезаписываем в массив строковых имен вида «Макет#», для удобства поиска.

         МакетГруппировкиНом = ПолучитьМакетГруппировкиПоПолюГруппировки(МакетКомпоновкиДанных, "Номенклатура"); МакетНом = Новый Массив; Для Каждого МакетГруппировки Из МакетГруппировкиНом Цикл МакетНом.Добавить(МакетГруппировки.Имя); КонецЦикла; МакетГруппировкиЗаказ = ПолучитьМакетГруппировкиПоПолюГруппировки(МакетКомпоновкиДанных, "Заказ"); МакетЗаказ = Новый Массив; Для Каждого МакетГруппировки Из МакетГруппировкиЗаказ Цикл МакетЗаказ.Добавить(МакетГруппировки.Имя); КонецЦикла; 

        Для того, чтобы получить данные о соблюдении условия свертки анализируется значение параметра П#, относящегося к полю, определяющему проверяемое значение и здесь у нас проблема — нет способа привязать параметр П к полю, как мы это сделали с макетами. Значение Параметра только содержит свойство Выражение, в котором прописано вычисляемое выражение. Для полей, описанных в разделе «Наборы данных», выражение имеет вид «НазваниеНабораДанных.НазваниеПоля», например НаборДанных1.Номенклатура, для вычисляемых же полей свойство «Выражение» содержит нормализованное значение в колонке «выражение» — добавлена функция «Представление()», расставлены пробелы, регистры для функций, удалены лишние нули в числах, к каждому параметру добавлен набор данных. Поэтому даже просто скопировать значение из этой колонки не всегда получится. Я предлагаю в начало выражения Вычисляемого поля добавить маркер «0 +» и искать по фрагменту «(0 +» — скобка от того что в начале у вас после преобразования будет «Представление(0 +. «.

        Вложенные группировки выводятся не просто по очереди а в следующем формате:
        ( (Р) < ( ( (п) ) [( (п) ) . ] ) >),
        где ( — элемент результата со свойством «ТипЭлемента» = ТипЭлементаРезультатаКомпоновкиДанных.Начало,
        ) — элемент результата со свойством «ТипЭлемента» = ТипЭлементаРезультатаКомпоновкиДанных.Конец,
        (Р) — элемент результата для родительской группировки, имеющий свойство «ТипЭлемента» = ТипЭлементаРезультатаКомпоновкиДанных.НачалоИКонец,
        (п) — . для подчиненной группировки (см. (Р) ),
        — я обозначил те места между элементами результатов куда следует добавить НачатьГруппуСтрок/ЗакончитьГруппуСтрок соответственно.

        То есть каждая группировка имеет тип НачалоИКонец, и обрамляется элементами Начало и Конец, после чего следуют подчиненные группировки, имеющие тип НачалоИКонец, все вместе обрамленные элементами Начало и Конец и каждая по отдельности обрамлена элементами Начало и Конец.

        Судя по всему, типовой механизм СКД вешает группы строк на какие то из этих элементов результатов, но на какие — точно узнать невозможно, так как метода определения текущего назначения группы строк на строку нет. И если не соблюдать парность типов элементов при ручном назначении групп строк, то у вас либо получится каша, либо никакой реакции. Парность гарантированно работает.

        Общая идея такая — при получении результата типа НачалоИКонец и соблюдении нашего условия мы сразу ставим НачатьГруппуСтрок, выводим все подчиненные группировки, после чего, соблюдая парность, ставим ЗакончитьГруппуСтрок.

        Задача 1) Для отчета в разрезе Номенклатура/Заказ свернуть все группировки номенклатуры без дефицита (то есть таких, для которых остаток товара больше объема заказов).

         ИмяПараметраДефицит = Неопределено; ПроцессорВывода.НачатьВывод(); ВыражениеДефицита = "(0 +"; ЗначениеДефицита = 0; Пока Истина Цикл ЭлементРезультата = ПроцессорКомпоновкиДанных.Следующий(); Если ЭлементРезультата = Неопределено Тогда Прервать; КонецЕсли; ПроцессорВывода.ВывестиЭлемент(ЭлементРезультата); Если ЭлементРезультата.ТипЭлемента = ТипЭлементаРезультатаКомпоновкиДанных.НачалоИКонец Тогда Если МакетНом.Найти(ЭлементРезультата.Макет) <> Неопределено Тогда Если ИмяПараметраДефицит = Неопределено Тогда Для каждого Параметр Из МакетКомпоновкиДанных.Макеты[ЭлементРезультата.Макет].Параметры Цикл Попытка Если ТипЗнч(Параметр.Выражение) = Тип("Строка") И Найти(Параметр.Выражение, ВыражениеДефицита)>0 Тогда ИмяПараметраДефицит = Параметр.Имя; Прервать КонецЕсли; Исключение КонецПопытки; КонецЦикла; КонецЕсли; ЗначениеДефицита = 0; Если ИмяПараметраДефицит <> Неопределено Тогда ЗначениеДефицита = ЭлементРезультата.ЗначенияПараметров[ИмяПараметраДефицит].Значение; КонецЕсли; Если ЗначениеДефицита>=0 Тогда ДокументРезультат.НачатьГруппуСтрок(ЭлементРезультата.ЗначенияПараметров.П1.Значение,Ложь); Иначе ДокументРезультат.НачатьГруппуСтрок(ЭлементРезультата.ЗначенияПараметров.П1.Значение,Истина); КонецЕсли; //( (Н)!( ( (з) ) ( (з) ) )!) УровеньНачала = 0; Пока Истина Цикл ЭлементРезультата = ПроцессорКомпоновкиДанных.Следующий(); Если ЭлементРезультата.ТипЭлемента = ТипЭлементаРезультатаКомпоновкиДанных.Начало Тогда УровеньНачала = УровеньНачала + 1; ИначеЕсли ЭлементРезультата.ТипЭлемента = ТипЭлементаРезультатаКомпоновкиДанных.Конец Тогда УровеньНачала = УровеньНачала - 1; КонецЕсли; ПроцессорВывода.ВывестиЭлемент(ЭлементРезультата); Если УровеньНачала = 0 Тогда Прервать КонецЕсли; КонецЦикла; ДокументРезультат.ЗакончитьГруппуСтрок(); КонецЕсли; КонецЕсли; КонецЦикла; ПроцессорВывода.ЗакончитьВывод(); КонецПроцедуры 

        Прим. При поиске используется Попытка потому что не каждый Параметр имеет поле Выражение. Но это тема для отдельной статьи.

        Пример результата данного отчета:

        Задача 2) Для отчета в разрезе Номенклатура/Заказ свернуть все группировки номенклатуры с подчиненными заказами.

        В приведенной выше структуре надо поставить тип группировки номенклатуры — Иерархия.

        Значения параметров имеют скалярные типы, и номенклатуру мы получаем в виде строки с наименованием. Обычно существует опасность что в базе может быть несколько элементов номенклатуры с одинаковым наименованием, поэтому искать ссылку по наименованию не предлагается. Вместо этого сначала помещаем все результаты в массив. Потом делаем вывод результатов из этого массива, проверяя, не является ли третий результат впереди группировкой «Заказ».

         ПроцессорВывода.НачатьВывод(); мРезультат = Новый Массив; Пока Истина Цикл ЭлементРезультата = ПроцессорКомпоновкиДанных.Следующий(); мРезультат.Добавить(ЭлементРезультата); Если ЭлементРезультата = Неопределено Тогда Прервать; КонецЕсли; КонецЦикла; Для х=0 по мРезультат.ВГраница()-1 Цикл ЭлементРезультата = мРезультат[х]; ПроцессорВывода.ВывестиЭлемент(ЭлементРезультата); Если ЭлементРезультата.ТипЭлемента = ТипЭлементаРезультатаКомпоновкиДанных.НачалоИКонец Тогда Если МакетНом.Найти(ЭлементРезультата.Макет) <> Неопределено Тогда // Если у вас в номенклатуре гарантированно уникальные наименования номенклатуры тогда можно // не помещать результаты в массив а использовать проверку вида //ЗначРод = ЭлементРезультата.ЗначенияПараметров["П1"].Значение; //СсылкаРод = Справочники.Номенклатура.НайтиПоНаименованию(ЗначРод,Истина); //Если НЕ СсылкаРод.ЭтоГруппа Тогда СледЭлт = мРезультат[х+3]; Если МакетЗаказ.Найти(СледЭлт.Макет) <> Неопределено Тогда ДокументРезультат.НачатьГруппуСтрок(ЭлементРезультата.ЗначенияПараметров.П1.Значение,Ложь); //( (Н)!( ( (з) ) ( (з) ) )!) УровеньНачала = 0; Пока Истина Цикл х = х+1; ЭлементРезультата = мРезультат[х]; Если ЭлементРезультата.ТипЭлемента = ТипЭлементаРезультатаКомпоновкиДанных.Начало Тогда УровеньНачала = УровеньНачала + 1; ИначеЕсли ЭлементРезультата.ТипЭлемента = ТипЭлементаРезультатаКомпоновкиДанных.Конец Тогда УровеньНачала = УровеньНачала - 1; КонецЕсли; ПроцессорВывода.ВывестиЭлемент(ЭлементРезультата); Если УровеньНачала = 0 Тогда Прервать КонецЕсли; КонецЦикла; ДокументРезультат.ЗакончитьГруппуСтрок(); КонецЕсли; КонецЕсли; КонецЕсли; КонецЦикла; ПроцессорВывода.ЗакончитьВывод(); КонецПроцедуры 

        К статье прикрепрен примерный СКД, созданный под задачи организации: заказы берутся без пометки на удаление, заказ на который уже выписана реализация считается полностью отгруженным (нет резервирования для допоставки). В группировке Заказ типовое представление заменено на наименование Партнера. Для конфиденциальности на образцах наименования обрезаны. Отчеты работают в УТ11, ERP 2, если необходим вариант для УТ10, напишите в комментариях.

        Отчеты тестировались на версии Платформы 1С:Предприятие 8.3 (8.3.21.1622), хотя старые версии отчета работали в УТ10 с платформ версии 8.3.5. Теоретически должно работать на любой платформе с поддержкой СКД.

        P.S. отправной точкой послужила статья

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *