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