При работе с подсистемой бюджетирования в конфигурации 1С:Управление производственным предприятием (УПП) редакции 1.3 специалисты часто сталкиваются с жесткими требованиями со стороны управляющих компаний или холдингов. Одно из таких требований — предоставление бюджета строго по определенной форме, где порядок следования статей не позволяет логично объединить их в папки справочника Статьи оборотов по бюджетам для автоматического расчета итогов.
В такой ситуации разработчики и аналитики часто идут по пути наименьшего сопротивления: создают итоговую статью и прописывают в ней сложный произвольный запрос, объединяющий (через ОБЪЕДИНИТЬ ВСЕ) запросы всех составляющих статей. Это приводит к колоссальным затратам на поддержку системы: при изменении логики получения данных хотя бы в одной базовой статье приходится вручную переписывать запросы во всех зависимых итоговых статьях. Давайте разберем, как можно оптимизировать этот процесс с помощью типовых механизмов и минимальных доработок.
Попытка использовать типовой документ Установка зависимостей оборотов по статьям для решения этой проблемы при расчете фактических данных не принесет результата. Выясним причину такого поведения системы.
Этот механизм в УПП 1.3 предназначен исключительно для подсистемы планирования. Он позволяет при вводе плановых оборотов по одной статье (например, объема продаж) автоматически генерировать плановые обороты по другим, зависимым статьям (например, материальные затраты или расходы на логистику). Документ Учет фактических данных по бюджетам работает по совершенно иному принципу: он напрямую обращается к источникам данных для расчетов бюджетирования и не анализирует регистр сведений, хранящий правила зависимостей планирования.
Поэтому для автоматического получения итогов по фактическим данным нам придется использовать другие подходы.
Если итоговые статьи нужны вам только для вывода в отчетность, то рассчитывать их физически и записывать «факт» в регистр накопления Обороты бюджетов нет никакой необходимости. Для этих целей в 1С:УПП 1.3 предусмотрен отличный, но незаслуженно забытый инструмент — конструктор Финансовые расчеты.
Рассмотрим по шагам, как настроить такую схему:
Отчет по бюджету и перейдем к использованию отчета Финансовый расчет.Финансовые расчеты и создадим новый элемент. Этот справочник представляет собой конструктор произвольных табличных форм.Статьи оборотов по бюджетам.Строка1 + Строка2.Проанализируем преимущества этого подхода. Мы получаем полностью типовое решение, которое избавляет нас от необходимости дублировать SQL-запросы в источниках данных. Если завтра поменяется логика расчета "Составляющей_1", мы просто обновим один запрос в ее источнике данных, а итоговая строка в финансовом расчете пересчитается автоматически «на лету».
Бывают ситуации, когда итоговые данные обязательно должны физически присутствовать в регистре накопления Обороты бюджетов. Например, это необходимо для последующей выгрузки данных в консолидированную базу холдинга (1С:Консолидация или 1С:ERP) или для работы механизмов лимитирования расходов по итоговым статьям.
В этом случае мы можем настроить «хитрый» источник данных для итоговой статьи, который будет обращаться не к первичным бухгалтерским или оперативным регистрам, а к самой подсистеме бюджетирования.
Давайте посмотрим на пример такого запроса для источника данных итоговой статьи:
ВЫБРАТЬ
ОборотыБюджетовОбороты.Период КАК Период,
СУММА(ОборотыБюджетовОбороты.СуммаОборот) КАК Сумма,
ОборотыБюджетовОбороты.Валюта КАК Валюта
ИЗ
РегистрНакопления.ОборотыБюджетов.Обороты(
&НачалоПериода,
&КонецПериода,
Регистратор,
Сценарий = &ФактическийСценарий
И СтатьяОборотов В (&СписокСоставляющихСтатей)
) КАК ОборотыБюджетовОбороты
СГРУППИРОВАТЬ ПО
ОборотыБюджетовОбороты.Период,
ОборотыБюджетовОбороты.Валюта
Для реализации этой схемы нам нужно соблюдать строгий регламент расчета фактических данных:
Учет фактических данных по бюджетам для базовых (составляющих) статей. Документ делает запросы к хозрасчетному регистру или регистру затрат и записывает обороты в базу.Учет фактических данных по бюджетам (или добавляем вторую настройку расчета в рамках того же сеанса), который рассчитывает итоговые статьи. Его запрос мгновенно выбирает уже готовые и записанные на предыдущем шаге суммы по подчиненным статьям и делает по ним сводную запись.Этот способ также позволяет избежать дублирования сложного кода бизнес-логики. Изменение правил отбора первичных документов для базовых статей никак не повлияет на работоспособность итогового запроса.
Если ручной контроль последовательности расчета документов кажется вам слишком ненадежным, а отчеты типа Финансовый расчет не устраивают по соображениям эргономики, лучшим выходом будет небольшая доработка конфигурации.
Рассмотрим вариант доработки, который минимально затронет типовой функционал и не создаст проблем при последующих обновлениях системы 1С:УПП.
Добавим в справочник Статьи оборотов по бюджетам новую табличную часть СоставРасчетнойСтатьи с единственным реквизитом СтатьяСлагаемое (тип ссылки на этот же справочник). На форме элемента справочника создадим флаг ЯвляетсяРасчетной. Если флаг взведен, пользователь может вручную набрать в табличную часть список статей, из которых складывается итог.
Далее нам потребуется доработать модуль менеджера или модуль объекта документа УчетФактическихДанныхПоБюджетам (в зависимости от релиза, где расположена функция заполнения табличной части документа). Переопределим алгоритм заполнения:
Процедура ЗаполнитьРасчетныеСтатьиДокумента(ДокументОбъект) Экспорт
// Шаг 1: Сначала рассчитываем все обычные статьи по их источникам данных
// Используем для этого стандартный вызов процедур заполнения документа.
// Шаг 2: Производим расчет итоговых (расчетных) статей на основе уже заполненной ТЧ документа
ТаблицаОборотов = ДокументОбъект.ОборотыБюджетов.Выгрузить();
Для Каждого СтрокаДокумента Из ДокументОбъект.ОборотыБюджетов Цикл
Если СтрокаДокумента.СтатьяОборотов.ЯвляетсяРасчетной Тогда
// Получаем список подчиненных статей для текущей расчетной статьи
СписокСтатейСлагаемых = СтрокаДокумента.СтатьяОборотов.СоставРасчетнойСтатьи.ВыгрузитьКолонку("СтатьяСлагаемое");
// Находим строки в таблице оборотов текущего документа по составляющим статьям
ПараметрыОтбора = Новый Структура;
СуммаИтог = 0;
Для Каждого СтатьяСлагаемое Из СписокСтатейСлагаемых Цикл
ПараметрыОтбора.Вставить("СтатьяОборотов", СтатьяСлагаемое);
НайденныеСтроки = ТаблицаОборотов.НайтиСтроки(ПараметрыОтбора);
Для Каждого СтрокаСлагаемого Из НайденныеСтроки Цикл
СуммаИтог = СуммаИтог + СтрокаСлагаемого.Сумма;
КонецЦикла;
КонецЦикла;
// Записываем рассчитанную сумму в строку документа
СтрокаДокумента.Сумма = СуммаИтог;
СтрокаДокумента.СуммаУпр = СуммаИтог; // При необходимости пересчитываем валюты
КонецЕсли;
КонецЦикла;
КонецПроцедуры
Такой подход гарантирует, что расчет произойдет строго в один клик при заполнении документа Учет фактических данных по бюджетам. Пользователям больше не нужно помнить о последовательности запуска расчетов, а программисту — бесконечно переписывать SQL-запросы вслед за изменениями методологии учета холдинга.
Мы проанализировали три метода решения проблемы жесткой структуры бюджетов в 1С:УПП 1.3. При выборе оптимального пути рекомендуем придерживаться следующей логики: