Как сформировать динамический список для отображения сальдо и даты последней операции по контрагентам в 1С?

Программист 1С v8.3 (Управляемые формы) Управленческий учет Торговля и дистрибуция
← На главную

При работе с 1С часто возникает необходимость вывести в удобном формате специфические данные, например, из регистров накопления. Давайте разберем распространенную задачу: как сформировать динамический список для отображения уникальных пар «Контрагент – ДоговорКонтрагента», вывести по ним текущее сальдо и дату последней операции из регистра накопления РасчетыСКлиентами. Эта задача требует использования возможностей произвольных запросов в динамических списках и правильного применения виртуальных таблиц и агрегатных функций.

Мы рассмотрим процесс пошагово, начиная с формирования корректного запроса и заканчивая настройкой самого динамического списка в пользовательском интерфейсе 1С. Этот подход позволит вам гибко работать с данными, настраивая отображение именно так, как это требуется для конкретной задачи.

Решение 1: Использование виртуальной таблицы "ОстаткиИОбороты" и агрегатных функций для получения сальдо и последней даты

Для того чтобы получить сальдо (конечный остаток) по каждой уникальной связке Контрагент - ДоговорКонтрагента, а также дату последней операции, нам потребуется использовать виртуальную таблицу ОстаткиИОбороты регистра накопления РасчетыСКлиентами. Эта виртуальная таблица специально предназначена для получения агрегированных данных по остаткам и оборотам за определенный период.

Основная идея заключается в том, чтобы сгруппировать данные по Контрагенту и ДоговоруКонтрагента и применить агрегатные функции. Для получения сальдо мы используем поле СуммаКонечныйОстаток, которое уже рассчитывается виртуальной таблицей. А для определения даты последней операции мы применим функцию МАКСИМУМ к полю Период. Таким образом, по каждой группе мы найдем максимальное значение периода, что будет соответствовать дате последней операции.

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


ВЫБРАТЬ
    РасчетыСКлиентамиОстаткиИОбороты.Контрагент,
    РасчетыСКлиентамиОстаткиИОбороты.ДоговорКонтрагента,
    РасчетыСКлиентамиОстаткиИОбороты.СуммаКонечныйОстаток КАК Сальдо,
    МАКСИМУМ(РасчетыСКлиентамиОстаткиИОбороты.Период) КАК ДатаПоследнейОперации
ИЗ
    РегистрНакопления.РасчетыСКлиентами.ОстаткиИОбороты(&НачалоПериода, &КонецПериода, Авто, , ) КАК РасчетыСКлиентамиОстаткиИОбороты
СГРУППИРОВАТЬ ПО
    РасчетыСКлиентамиОстаткиИОбороты.Контрагент,
    РасчетыСКлиентамиОстаткиИОбороты.ДоговорКонтрагента

Давайте проанализируем каждую часть этого запроса:

  1. ВЫБРАТЬ: Здесь мы указываем поля, которые хотим получить в результате:
    • РасчетыСКлиентамиОстаткиИОбороты.Контрагент: ссылка на элемент справочника Контрагенты.
    • РасчетыСКлиентамиОстаткиИОбороты.ДоговорКонтрагента: ссылка на элемент справочника ДоговорыКонтрагентов.
    • РасчетыСКлиентамиОстаткиИОбороты.СуммаКонечныйОстаток КАК Сальдо: это поле возвращает конечный остаток по ресурсу Сумма. Мы переименовываем его в Сальдо для удобства. Важно: если в регистре несколько ресурсов, нужно выбрать нужный (например, СуммаВзаиморасчетовКонечныйОстаток и т.д.).
    • МАКСИМУМ(РасчетыСКлиентамиОстаткиИОбороты.Период) КАК ДатаПоследнейОперации: это агрегатная функция, которая находит максимальное значение поля Период для каждой группы. Таким образом, мы получаем дату последней записи в регистре, относящейся к данной паре Контрагент-Договор, в рамках указанного периода запроса.
  2. ИЗ РегистрНакопления.РасчетыСКлиентами.ОстаткиИОбороты(&НачалоПериода, &КонецПериода, Авто, , ) КАК РасчетыСКлиентамиОстаткиИОбороты:
    • Мы обращаемся к виртуальной таблице ОстаткиИОбороты регистра накопления РасчетыСКлиентами.
    • Параметры &НачалоПериода и &КонецПериода позволяют нам указать временной интервал, за который должны быть рассчитаны остатки и обороты. Для получения сальдо на текущую дату, &НачалоПериода можно установить как начало времени, а &КонецПериода как конец текущего дня.
    • Параметр Авто указывает, что периодичность получения остатков будет определена автоматически. Остальные параметры (виды субконто, условия отбора) в данном случае не используются, так как мы хотим получить все данные для последующей группировки.
  3. СГРУППИРОВАТЬ ПО РасчетыСКлиентамиОстаткиИОбороты.Контрагент, РасчетыСКлиентамиОстаткиИОбороты.ДоговорКонтрагента:
    • Эта часть запроса группирует все строки регистра по уникальным сочетаниям Контрагента и ДоговораКонтрагента. Агрегатные функции (СуммаКонечныйОстаток и МАКСИМУМ(Период)) будут применяться к каждой такой группе.

Важное замечание по параметрам периода: Если вам требуется сальдо строго на конец текущей даты, то &НачалоПериода можно установить в НачалоГода(Дата(1,1,1)) или даже Дата(1,1,1), а &КонецПериода в КонецДня(ТекущаяДата()). Если требуется сальдо на произвольный момент времени, эти параметры должны быть доступны для настройки пользователем.

Решение 2: Пошаговая настройка динамического списка в 1С

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

Давайте разберем процесс настройки по шагам, чтобы вы могли легко применить его в своей конфигурации.

  1. Откройте свойства динамического списка:

    На управляемой форме, где вы хотите разместить список, найдите элемент формы, который является динамическим списком (обычно это элемент типа Таблица, у которого в свойствах указан ДинамическийСписок как источник данных). Откройте его свойства через палитру свойств или двойным кликом.

  2. Установите тип основной таблицы как "Произвольный запрос":

    В свойствах динамического списка найдите раздел "Настройка списка". В поле "Основная таблица" (или "Основной источник данных", в зависимости от версии платформы и режима настройки) выберите опцию "Произвольный запрос". Это даст вам возможность вставить свой собственный SQL-запрос.

  3. Вставьте подготовленный запрос:

    После выбора "Произвольный запрос" появится поле для ввода текста запроса. Вставьте туда ваш SQL-запрос, который мы сформировали в предыдущем шаге:

    
    ВЫБРАТЬ
        РасчетыСКлиентамиОстаткиИОбороты.Контрагент,
        РасчетыСКлиентамиОстаткиИОбороты.ДоговорКонтрагента,
        РасчетыСКлиентамиОстаткиИОбороты.СуммаКонечныйОстаток КАК Сальдо,
        МАКСИМУМ(РасчетыСКлиентамиОстаткиИОбороты.Период) КАК ДатаПоследнейОперации
    ИЗ
        РегистрНакопления.РасчетыСКлиентами.ОстаткиИОбороты(&НачалоПериода, &КонецПериода, Авто, , ) КАК РасчетыСКлиентамиОстаткиИОбороты
    СГРУППИРОВАТЬ ПО
        РасчетыСКлиентамиОстаткиИОбороты.Контрагент,
        РасчетыСКлиентамиОстаткиИОбороты.ДоговорКонтрагента
    

    Важно: убедитесь, что запрос синтаксически корректен. Платформа 1С выполнит его проверку.

  4. Настройте параметры запроса:

    Перейдите на вкладку "Параметры" в настройках динамического списка. Здесь необходимо добавить параметры, которые используются в вашем запросе – в нашем случае это &НачалоПериода и &КонецПериода.

    1. Нажмите кнопку "Добавить" и введите имя параметра НачалоПериода.
    2. Укажите тип значения параметра (обычно Дата).
    3. Установите "Значение по умолчанию". Для сальдо на текущую дату это может быть НачалоДня(ТекущаяДата()). Вы можете использовать для этого специальные функции платформы 1С.
    4. Повторите те же действия для параметра КонецПериода, установив ему значение по умолчанию КонецДня(ТекущаяДата()).
    5. Если вы хотите дать пользователю возможность менять период, установите свойство "Использование" в "Всегда".

    Эти параметры будут автоматически подставляться в ваш запрос при каждом обновлении динамического списка.

  5. Выберите поля для отображения:

    Перейдите на вкладку "Поля". Платформа 1С автоматически проанализирует ваш запрос и предложит доступные поля. Выберите те поля, которые вы хотите отображать в списке:

    • Контрагент
    • ДоговорКонтрагента
    • Сальдо (это наше переименованное поле СуммаКонечныйОстаток)
    • ДатаПоследнейОперации (это наше агрегатное поле МАКСИМУМ(Период))

    Для каждого поля вы можете настроить заголовок, ширину и другие свойства отображения.

  6. Настройте сортировку и отбор (по желанию):

    На вкладках "Сортировка" и "Отбор" вы можете задать правила для упорядочивания и фильтрации данных по умолчанию. Например, вы можете установить сортировку по Контрагенту, а затем по ДоговоруКонтрагента. Или настроить отбор, чтобы видеть только контрагентов с отрицательным сальдо.

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

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

← На главную