Почему задваиваются суммы в документе Бюджетная операция при корректировке ЦФО в УПП 1.3

Программист 1С v8.3 (Обычные формы) Управленческий учет Промышленность, строительство и АПК
← На главную

При работе с подсистемой бюджетирования в конфигурации «1С:Управление производственным предприятием 1.3» (УПП) пользователи часто сталкиваются с неприятной ситуацией: при попытке изменить аналитику (например, ЦФО) в уже существующем документе БюджетнаяОперация, после его проведения суммы по регистру ОборотыПоБюджетам увеличиваются ровно в два раза. Проблема сохраняется даже после отмены проведения и повторного выполнения операции, а стандартное «Тестирование и исправление» не приносит результатов.

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

Разберем механизм возникновения проблемы

Проблема задвоения данных в УПП 1.3 практически всегда связана не с ошибкой в самом документе, а с тем, как система интерпретирует настройки контроля периодов. В подсистеме бюджетирования существует специальный регистр сведений ГраницыПериодовБюджетирования. Его задача — определять, до какой даты разрешено редактирование или ввод данных по определенным сценариям, проектам и центрам финансовой ответственности (ЦФО).

Когда мы проводим документ БюджетнаяОперация, программный код системы формирует сложный запрос к базе данных. В этом запросе данные из табличной части документа соединяются с данными из регистра ГраницыПериодовБюджетирования. Это необходимо для того, чтобы система могла определить «Состояние» периода (например, «Фиксирован» или «Не фиксирован») и записать это состояние в движения регистра ОборотыПоБюджетам.

Выясним причину ошибки: задвоение происходит в тот момент, когда в регистре границ периодов обнаруживается более одной записи, подходящей под условия документа. Типичный случай: одна запись установлена для всех подразделений (пустой ЦФО), а вторая запись — для конкретного подразделения. В результате ЛЕВОЕ СОЕДИНЕНИЕ в запросе выдает две строки вместо одной, и сумма документа дублируется.

Проанализируем ситуацию с помощью отладки

Для того чтобы убедиться, что проблема именно в запросе, нам необходимо «поймать» его текст в момент проведения документа. Рассмотрим, как это сделать правильно, даже если вы только начинаете изучать программирование в 1С.

Рассмотрим по шагам процесс отладки:

  1. Откроем конфигуратор и найдем модуль документа БюджетнаяОперация или соответствующий общий модуль, где формируются движения.
  2. Нам нужно найти процедуру, отвечающую за сбор данных. Обычно это СформироватьЗапросПоДаннымДокумента.
  3. Установим точку останова (клавиша F9) на строке, где переменной ТекстЗапроса присваивается значение или где инициализируется Запрос.Выполнить().
  4. Вернемся в режим «Предприятие» и проведем проблемный документ. Система остановится на нашей точке.
  5. Теперь нам нужно извлечь сформированный текст запроса. Для этого в окне вычисления выражений (Shift+F9) введем Запрос.Текст и скопируем полученную строку.

После того как текст запроса получен, запустим любую Консоль запросов. Вставим туда текст, установим параметры (ссылку на наш документ) и выполним запрос. Если в результате выполнения вы видите, что на одну строку документа приходится две или более строки в результате запроса, значит, проблема подтверждена.

Как правило, в таких дублях строки будут отличаться только значениями, полученными из регистра границ, например, реквизитом ГраницаФиксации или Состояние.

Разберем решение через настройку регистра границ

Проанализировав ситуацию, мы понимаем, что корень проблемы — в избыточности данных регистра ГраницыПериодовБюджетирования. Рассмотрим, как привести его в порядок.

В УПП реализован принцип иерархии, но в запросах проведения он иногда отрабатывает слишком прямолинейно. Если вы установили границу для «пустого» ЦФО, система считает это правилом «для всех». Если при этом создана запись для конкретного ЦФО Отдел продаж, то при проведении документа по отделу продаж система «подцепит» оба правила.

Посмотрим на алгоритм исправления:

  1. Перейдем в интерфейс «Бюджетирование».
  2. Откроем регистр сведений Границы периодов бюджетирования (через меню «Операции» — «Регистры сведений»).
  3. Установим отбор по периоду, в который попадает дата нашего документа.
  4. Внимательно изучим записи. Ищем строки, где колонки ЦФО или Проект не заполнены.
  5. Если мы обнаружили, что для одного и того же сценария существует и «общая» граница (пустой ЦФО), и «частная» (конкретный ЦФО), нам необходимо устранить это противоречие.

Важное правило: либо вы ведете границы только в целом по компании (всегда пустые ЦФО в регистре), либо вы ведете их строго детализированно по каждому ЦФО. Смешивание этих подходов в одном периоде планирования неизбежно ведет к задвоению оборотов.

Технические нюансы кода проведения

Если конфигурация находится на поддержке и вы не планируете её менять, единственный выход — корректное заполнение данных. Однако для понимания того, почему это происходит, взглянем на пример упрощенной логики запроса, который может вызывать ошибку:


ВЫБРАТЬ
    Док.СуммаДокумента КАК Сумма,
    Границы.Состояние КАК СостояниеПериода
ИЗ
    Документ.БюджетнаяОперация КАК Док
ЛЕВОЕ СОЕДИНЕНИЕ
    РегистрСведений.ГраницыПериодовБюджетирования КАК Границы
ПО
    Док.Сценарий = Границы.Сценарий
    И (Границы.ЦФО = Док.ЦФО ИЛИ Границы.ЦФО = ЗНАЧЕНИЕ(Справочник.Подразделения.ПустаяСсылка))
ГДЕ
    Док.Ссылка = &Ссылка

В данном примере условие ИЛИ Границы.ЦФО = ПустаяСсылка является «миной замедленного действия». Если в регистре есть и заполненный ЦФО, и пустой, условие ПО выполнится для обеих записей, и ЛЕВОЕ СОЕДИНЕНИЕ размножит строки документа.

Чтобы исправить это программно (если бы конфигурация была снята с поддержки), следовало бы использовать вложенный запрос для выбора максимально точной границы (например, через ВЫБРАТЬ ПЕРВЫЕ 1 с сортировкой по заполненности аналитик) или добавить группировку с выбором максимального состояния.

Рекомендации по профилактике

Чтобы в будущем не сталкиваться с тем, что бюджетная операция ведет себя непредсказуемо, рекомендуем придерживаться следующих правил:

Таким образом, мы выяснили, что задвоение сумм в УПП 1.3 при проведении бюджетных операций — это следствие специфики работы механизма контроля периодов. Исправив данные в регистре границ, вы вернете корректность отражения оборотов по бюджетам без необходимости вносить изменения в типовой код программы.

← На главную