При разработке отчетов или обработок в 1С часто возникает задача получить детальную аналитику из бухгалтерского регистра Хозрасчетный. Одной из самых распространенных проблем является извлечение статьи расходов (статьи затрат) в связке со списываемой номенклатурой. Трудность заключается в том, что на разных счетах бухгалтерского учета (например, 20, 25, 26 или 44) статьи затрат могут находиться на разных позициях: где-то это Субконто1, а где-то — Субконто2.
В этой статье мы подробно разберем, как построить универсальный запрос, который позволит вытащить нужную аналитику вне зависимости от настроек плана счетов, и как оптимизировать этот процесс для обеспечения максимальной производительности системы.
Рассмотрим ситуацию, с которой сталкиваются многие начинающие разработчики. При попытке получить данные через виртуальную таблицу ДвиженияССубконто, программист обращается к полям напрямую, например: ХозрасчетныйДвиженияССубконто.СубконтоДт1.СтатьяРасходов. Это приводит к нескольким проблемам:
Статьи затрат — это первое субконто, а на другом — второе, запрос вернет пустые значения для части проводок..СтатьяРасходов) заставляет СУБД выполнять неявные левые соединения со всеми таблицами, входящими в этот составной тип, что катастрофически снижает скорость выполнения запроса.Проанализируем более надежный подход. Вместо того чтобы гадать, в какой колонке (1, 2 или 3) лежит нужная аналитика, мы можем обратиться к физической таблице РегистрБухгалтерии.Хозрасчетный.Субконто. Эта таблица хранит каждое значение субконто в отдельной строке, связывая его с конкретной записью регистра через регистратор и номер строки.
Разберем алгоритм решения по шагам:
ПланВидовХарактеристик.ВидыСубконтоХозрасчетные.Посмотрим на пример реализации такого запроса с использованием временных таблиц:
ВЫБРАТЬ
СубконтоДт.Регистратор КАК Регистратор,
СубконтоКт.Значение КАК Номенклатура,
СубконтоДт.НомерСтроки КАК НомерСтроки,
СубконтоДт.Значение КАК СтатьяЗатрат
ПОМЕСТИТЬ ВТ_ОборотыАналитика
ИЗ
РегистрБухгалтерии.Хозрасчетный.Субконто КАК СубконтоДт
ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрБухгалтерии.Хозрасчетный.Субконто КАК СубконтоКт
ПО СубконтоДт.Регистратор = СубконтоКт.Регистратор
И СубконтоДт.НомерСтроки = СубконтоКт.НомерСтроки
ГДЕ
СубконтоДт.Регистратор = &Документ
И СубконтоДт.ВидДвижения = ЗНАЧЕНИЕ(ВидДвиженияБухгалтерии.Дебет)
И СубконтоКт.ВидДвижения = ЗНАЧЕНИЕ(ВидДвиженияБухгалтерии.Кредит)
И СубконтоДт.Вид = ЗНАЧЕНИЕ(ПланВидовХарактеристик.ВидыСубконтоХозрасчетные.СтатьиЗатрат)
И СубконтоКт.Вид = ЗНАЧЕНИЕ(ПланВидовХарактеристик.ВидыСубконтоХозрасчетные.Номенклатура)
ИНДЕКСИРОВАТЬ ПО
Регистратор,
НомерСтроки
;
В данном фрагменте мы четко определяем, что нам нужно значение субконто с видом СтатьиЗатрат по дебету и Номенклатура по кредиту. Это делает запрос независимым от порядка аналитик на счете.
Продолжим работу. Теперь, когда у нас есть связи между статьями и номенклатурой, нам нужно получить количественные и суммовые показатели, а также дополнительные реквизиты (например, единицу измерения номенклатуры). Здесь важно применить оператор ВЫРАЗИТЬ.
Выясним причину важности ВЫРАЗИТЬ: поле Значение в таблице субконто — это ЛюбаяСсылка. Если мы напишем СубконтоКт.Значение.ЕдиницаИзмерения, СУБД создаст огромный LEFT JOIN ко всем справочникам системы. Чтобы этого избежать, мы "подсказываем" системе конкретный тип.
Рассмотрим итоговый запрос:
ВЫБРАТЬ
Хозрасчетный.Регистратор КАК Регистратор,
ВТ.СтатьяЗатрат КАК СтатьяРасходов,
ВТ.Номенклатура КАК Номенклатура,
ВЫРАЗИТЬ(ВТ.Номенклатура КАК Справочник.Номенклатура).ЕдиницаИзмерения КАК ЕдиницаИзмерения,
Хозрасчетный.КоличествоКт КАК Количество,
Хозрасчетный.Сумма КАК Сумма
ИЗ
ВТ_ОборотыАналитика КАК ВТ
ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрБухгалтерии.Хозрасчетный КАК Хозрасчетный
ПО ВТ.Регистратор = Хозрасчетный.Регистратор
И ВТ.НомерСтроки = Хозрасчетный.НомерСтроки
ГДЕ
Хозрасчетный.Активность = ИСТИНА
ИТОГИ
СУММА(Количество),
СУММА(Сумма)
ПО
Регистратор
Хотя работа с физическими таблицами надежна, 1С предоставляет специализированный инструмент для анализа корреспонденций — виртуальную таблицу ОборотыДтКт. Проанализируем, как она может упростить задачу.
В параметрах этой таблицы можно передать массив видов субконто. Если мы передадим виды субконто СтатьиЗатрат и Номенклатура, система сама подготовит колонки, к которым можно будет обращаться более удобно. Однако стоит помнить, что ОборотыДтКт лучше подходит для итоговых данных за период, а для анализа движений конкретного документа (регистратора) физические таблицы часто отрабатывают быстрее и точнее, особенно если нужно видеть каждую строку проводки.
Работая с регистром Хозрасчетный, всегда учитывайте следующие моменты:
Активность = ИСТИНА, чтобы исключить сторнированные или помеченные на удаление записи, которые еще не удалены физически.ВидУчета, иначе вы получите удвоение сумм (БУ + НУ).ЛЕВОЕ СОЕДИНЕНИЕ вместо ВНУТРЕННЕЕ СОЕДИНЕНИЕ, чтобы не потерять строки в отчете.Таким образом, мы разобрали, как с помощью временных таблиц и соединения физических таблиц субконто получить точные данные по статьям расходов. Этот метод является наиболее гибким и устойчивым к изменениям метаданных конфигурации.