Обнуление (свертка) остатков по бухгалтерскому регистру одним запросом

19.04.16

Разработка - Запросы

Интересный вариант свертки остатков. Думал, как это сделать как можно чище, и вот что получилось. Создает 4 ручные операции: для счетов без субконто, с 1 субконто, 2мя субконто и 3мя субконто.
Алгоритм можно использовать для переноса остатков по простым счетам между базами БП с помощью типовой обработки ВыгрузкаЗагрузкаXML

Хотелось сделать решение с простой загрузкой результата запроса в одно действие, но оказалось, что надо подчищать колонки с лишними субконто. Поэтому пришлось сделать 4 таблицы с разным количеством субконто. Вот что из этого вышло.

Запрос:

ВЫБРАТЬ
	ХозрасчетныйОстатки.Счет КАК СчетКт,
	тВидыСубконто1.ВидСубконто КАК ВидСубконтоКт1,
	тВидыСубконто2.ВидСубконто КАК ВидСубконтоКт2,
	тВидыСубконто3.ВидСубконто КАК ВидСубконтоКт3,
	&Счет000 КАК СчетДт,
	ХозрасчетныйОстатки.Субконто1 КАК СубконтоКт1,
	ХозрасчетныйОстатки.Субконто2 КАК СубконтоКт2,
	ХозрасчетныйОстатки.Субконто3 КАК СубконтоКт3,
	ХозрасчетныйОстатки.Организация,
	ХозрасчетныйОстатки.СуммаОстаток КАК Сумма,
	ХозрасчетныйОстатки.КоличествоОстаток,
	1 ПолеДляВсех
ИЗ
	РегистрБухгалтерии.Хозрасчетный.Остатки(&Дата2016, Счет В ИЕРАРХИИ (&СписокСчетов), , ) КАК ХозрасчетныйОстатки
		ЛЕВОЕ СОЕДИНЕНИЕ ПланСчетов.Хозрасчетный.ВидыСубконто КАК тВидыСубконто1
		ПО ХозрасчетныйОстатки.Счет = тВидыСубконто1.Ссылка
			И (1 = тВидыСубконто1.НомерСтроки)
		ЛЕВОЕ СОЕДИНЕНИЕ ПланСчетов.Хозрасчетный.ВидыСубконто КАК тВидыСубконто2
		ПО ХозрасчетныйОстатки.Счет = тВидыСубконто2.Ссылка
			И (2 = тВидыСубконто2.НомерСтроки)
		ЛЕВОЕ СОЕДИНЕНИЕ ПланСчетов.Хозрасчетный.ВидыСубконто КАК тВидыСубконто3
		ПО ХозрасчетныйОстатки.Счет = тВидыСубконто3.Ссылка
			И (3 = тВидыСубконто3.НомерСтроки)

А вот обработка его  результата:

тзПров = РезЗапроса.Выгрузить(); // выгружается в исходную ТЗ

/// *** Наборы строк с 0,1,2,3 видами субконто
масс0Сбк = тзПров.НайтиСтроки(Новый Структура("ВидСубконтоКт1", Null));
масс1Сбк = тзПров.НайтиСтроки(Новый Структура("ВидСубконтоКт2", Null));
масс2Сбк = тзПров.НайтиСтроки(Новый Структура("ВидСубконтоКт3", Null));
масс3Сбк = тзПров.НайтиСтроки(Новый Структура("ПолеДляВсех", 1));  // Все строки в массив

/// ** Чистка строк с несоответствующим количеством субконто.
Для каждого стр из масс0Сбк цикл
	масс1Сбк.Удалить(масс1Сбк.Найти(стр));
	масс2Сбк.Удалить(масс2Сбк.Найти(стр));
	масс3Сбк.Удалить(масс3Сбк.Найти(стр))
КонецЦикла;
Для каждого стр из масс1Сбк цикл
	масс2Сбк.Удалить(масс2Сбк.Найти(стр));
	масс3Сбк.Удалить(масс3Сбк.Найти(стр))
КонецЦикла;
Для каждого стр из масс2Сбк цикл
	масс3Сбк.Удалить(масс3Сбк.Найти(стр))
КонецЦикла;

/// *** Формирование таблиц значений, которые загружаются в проводки документов и удаление лишних колонок
тз0Сбк = тзПров.Скопировать(масс0Сбк);
тз0Сбк.Колонки.Удалить("СубконтоКт1");
тз0Сбк.Колонки.Удалить("СубконтоКт2");
тз0Сбк.Колонки.Удалить("СубконтоКт3");
тз0Сбк.Колонки.Удалить("ВидСубконтоКт1");
тз0Сбк.Колонки.Удалить("ВидСубконтоКт2");
тз0Сбк.Колонки.Удалить("ВидСубконтоКт3");
//
тз1Сбк = тзПров.Скопировать(масс1Сбк);
тз1Сбк.Колонки.Удалить("СубконтоКт2");
тз1Сбк.Колонки.Удалить("СубконтоКт3");
тз1Сбк.Колонки.Удалить("ВидСубконтоКт2");
тз1Сбк.Колонки.Удалить("ВидСубконтоКт3");
//
тз2Сбк = тзПров.Скопировать(масс2Сбк);
тз2Сбк.Колонки.Удалить("СубконтоКт3");
тз2Сбк.Колонки.Удалить("ВидСубконтоКт3");
//
тз3Сбк = тзПров.Скопировать(масс3Сбк);

// Для отладки
//тз0Сбк.ВыбратьСтроку();
//тз1Сбк.ВыбратьСтроку();
//тз2Сбк.ВыбратьСтроку();
//тз3Сбк.ВыбратьСтроку();

/// *** Формирование документов
ОбДок = Документы.ОперацияБух.СоздатьДокумент();
ОбДок.Дата = Запрос.Параметры.Дата2016-1;
ОбДок.Движения.Хозрасчетный.Загрузить(тз0Сбк);
ОбДок.ПолучитьФорму().Открыть();	
//
ОбДок = Документы.ОперацияБух.СоздатьДокумент();
ОбДок.Дата = Запрос.Параметры.Дата2016-1;
ОбДок.Движения.Хозрасчетный.Загрузить(тз1Сбк);
ОбДок.ПолучитьФорму().Открыть();	
//
ОбДок = Документы.ОперацияБух.СоздатьДокумент();
ОбДок.Дата = Запрос.Параметры.Дата2016-1;
ОбДок.Движения.Хозрасчетный.Загрузить(тз2Сбк);
ОбДок.ПолучитьФорму().Открыть();	
//
ОбДок = Документы.ОперацияБух.СоздатьДокумент();
ОбДок.Дата = Запрос.Параметры.Дата2016-1;
ОбДок.Движения.Хозрасчетный.Загрузить(тз3Сбк);
ОбДок.ПолучитьФорму().Открыть();

Более компактного варианта свертки остатков по бух.регистрам придумать не получилось. Кто-нибудь может предложить?

См. также

Инструментарий разработчика Роли и права Запросы СКД Программист Руководитель проекта Платформа 1С v8.3 Управляемые формы Запросы Система компоновки данных Платные (руб)

Инструменты для разработчиков 1С 8.3: Infostart Toolkit. Автоматизация и ускорение разработки на управляемых формах. Легкость работы с 1С.

12000 руб.

02.09.2020    169271    937    403    

905

Запросы Программист Бесплатно (free)

Увидел cheatsheet по SQL и захотелось нарисовать подобное, но про запросы.

18.10.2024    11392    sergey279    18    

65

Запросы Программист Платформа 1С v8.3 Запросы Конфигурации 1cv8 Бесплатно (free)

Столкнулся с интересной ситуацией, которую хотел бы разобрать, ввиду её неочевидности. Речь пойдёт про использование функции запроса АВТОНОМЕРЗАПИСИ() и проблемы, которые могут возникнуть.

11.10.2024    6338    XilDen    36    

83

Запросы Программист Запросы Бесплатно (free)

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

16.08.2024    9067    user1840182    5    

28

Математика и алгоритмы Запросы Программист Платформа 1С v8.3 Запросы Бесплатно (free)

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

08.07.2024    2727    ivanov660    9    

22

Запросы СКД Программист Стажер Система компоновки данных Россия Бесплатно (free)

Часто при разработке отчетов в СКД возникает ситуация, когда не совсем понятно, почему отчет выводит не те данные, которые нужны, либо не выводит вовсе. Возникает потребность увидеть конечный запрос, который формирует СКД. Как это сделать, рассмотрим в этой статье.

15.05.2024    10219    implecs_team    6    

48

Запросы Программист Стажер Платформа 1С v8.3 Конфигурации 1cv8 Бесплатно (free)

Часто поступают задачи по произвольному распределению общих сумм. После распределения иногда пропадают копейки. Суть решения добавить АвтоНомерЗаписи() в ВТ распределения, и далее используя функции МАКСИМУМ или МИНИМУМ можем положить разницу копеек в первую или последнюю строку знаменателя распределения.

11.04.2024    3623    andrey_sag    10    

38
Комментарии
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
1. Amel2010 43 03.05.16 16:45 Сейчас в теме
Мне кажется, что оптимальнее будет использовать пакетный запрос вроде этого:
ВЫБРАТЬ
	               |	ХозрасчетныйОстатки.Счет КАК СчетКт,
	               |	тВидыСубконто1.ВидСубконто КАК ВидСубконтоКт1,
	               |	тВидыСубконто2.ВидСубконто КАК ВидСубконтоКт2,
	               |	тВидыСубконто3.ВидСубконто КАК ВидСубконтоКт3,
	               |	&Счет000 КАК СчетДт,
	               |	ХозрасчетныйОстатки.Субконто1 КАК СубконтоКт1,
	               |	ХозрасчетныйОстатки.Субконто2 КАК СубконтоКт2,
	               |	ХозрасчетныйОстатки.Субконто3 КАК СубконтоКт3,
	               |	ХозрасчетныйОстатки.Организация,
	               |	ХозрасчетныйОстатки.СуммаОстаток КАК Сумма,
	               |	ХозрасчетныйОстатки.КоличествоОстаток
	               |ПОМЕСТИТЬ Остатки
	               |ИЗ
	               |	РегистрБухгалтерии.Хозрасчетный.Остатки(&Дата2016, Счет В ИЕРАРХИИ (&СписокСчетов), , ) КАК ХозрасчетныйОстатки
	               |		ЛЕВОЕ СОЕДИНЕНИЕ ПланСчетов.Хозрасчетный.ВидыСубконто КАК тВидыСубконто1
	               |		ПО ХозрасчетныйОстатки.Счет = тВидыСубконто1.Ссылка
	               |			И (1 = тВидыСубконто1.НомерСтроки)
	               |		ЛЕВОЕ СОЕДИНЕНИЕ ПланСчетов.Хозрасчетный.ВидыСубконто КАК тВидыСубконто2
	               |		ПО ХозрасчетныйОстатки.Счет = тВидыСубконто2.Ссылка
	               |			И (2 = тВидыСубконто2.НомерСтроки)
	               |		ЛЕВОЕ СОЕДИНЕНИЕ ПланСчетов.Хозрасчетный.ВидыСубконто КАК тВидыСубконто3
	               |		ПО ХозрасчетныйОстатки.Счет = тВидыСубконто3.Ссылка
	               |			И (3 = тВидыСубконто3.НомерСтроки)
	               |;
	               |
	               |////////////////////////////////////////////////////////////­////////////////////
	               |ВЫБРАТЬ
	               |	Остатки.СчетКт,
	               |	Остатки.СчетДт,
	               |	Остатки.Сумма,
	               |	Остатки.КоличествоОстаток,
	               |	Остатки.Организация
	               |ИЗ
	               |	Остатки КАК Остатки
	               |ГДЕ
	               |	Остатки.ВидСубконтоКт1 ЕСТЬ NULL 
	               |;
	               |
	               |////////////////////////////////////////////////////////////­////////////////////
	               |ВЫБРАТЬ
	               |	Остатки.СчетКт,
	               |	Остатки.СчетДт,
	               |	Остатки.Сумма,
	               |	Остатки.КоличествоОстаток,
	               |	Остатки.Организация,
	               |	Остатки.ВидСубконтоКт1,
	               |	Остатки.СубконтоКт1
	               |ИЗ
	               |	Остатки КАК Остатки
	               |ГДЕ
	               |	НЕ Остатки.ВидСубконтоКт1 ЕСТЬ NULL 
	               |			И Остатки.ВидСубконтоКт2 ЕСТЬ NULL 
	               |;
	               |
	               |////////////////////////////////////////////////////////////­////////////////////
	               |ВЫБРАТЬ
	               |	Остатки.СчетКт,
	               |	Остатки.СчетДт,
	               |	Остатки.Сумма,
	               |	Остатки.КоличествоОстаток,
	               |	Остатки.Организация,
	               |	Остатки.ВидСубконтоКт1,
	               |	Остатки.СубконтоКт1,
	               |	Остатки.ВидСубконтоКт2,
	               |	Остатки.СубконтоКт2
	               |ИЗ
	               |	Остатки КАК Остатки
	               |ГДЕ
	               |	НЕ Остатки.ВидСубконтоКт1 ЕСТЬ NULL 
	               |			И НЕ Остатки.ВидСубконтоКт2 ЕСТЬ NULL 
	               |			И Остатки.ВидСубконтоКт3 ЕСТЬ NULL 
	               |;
	               |
	               |////////////////////////////////////////////////////////////­////////////////////
	               |ВЫБРАТЬ
	               |	Остатки.СчетКт,
	               |	Остатки.СчетДт,
	               |	Остатки.Сумма,
	               |	Остатки.КоличествоОстаток,
	               |	Остатки.Организация,
	               |	Остатки.ВидСубконтоКт1,
	               |	Остатки.СубконтоКт1,
	               |	Остатки.ВидСубконтоКт2,
	               |	Остатки.СубконтоКт2,
	               |	Остатки.ВидСубконтоКт3,
	               |	Остатки.СубконтоКт3
	               |ИЗ
	               |	Остатки КАК Остатки
	               |ГДЕ
	               |	НЕ Остатки.ВидСубконтоКт1 ЕСТЬ NULL 
	               |	И НЕ Остатки.ВидСубконтоКт2 ЕСТЬ NULL 
	               |	И НЕ Остатки.ВидСубконтоКт3 ЕСТЬ NULL 
Показать

И потом уже выбирать отдельно каждую часть.
Нежели выполнять столько поисков строк и их удаление.
ИНТЕГРА; +1 Ответить
2. ИНТЕГРА 25 06.05.16 13:06 Сейчас в теме
(1) Amel2010, Хороший вариант. Мое решение было заточено под "консоль запросов и обработчик", в используемой мной обработке пакетные запросы не поддерживаются, потому я такой вариант не предусмотрел, но он несомненно оптимальней с точки зрения вычислений.
Оставьте свое сообщение