Как исправить ошибку «Поле агрегатного объекта не обнаружено (СрокПлатежа)» и сбои запроса бухгалтерских итогов в 1С 7.7?

Программист 1С v7.7 1C:Бухгалтерия Бухгалтерский учет IT и автоматизация бизнеса
← На главную

При разработке и сопровождении отчетов по дебиторской задолженности в платформе 1С:Предприятие 7.7 разработчики нередко сталкиваются с ситуацией, когда отчет успешно работает на исторических данных, но при переносе периода на более поздние даты аварийно завершает работу. Разберем по шагам, почему возникают ошибки вида «Поле агрегатного объекта не обнаружено (СрокПлатежа)», «Неверно задана периодичность запроса!» и «Неправильно задан период!», а также рассмотрим надежные способы их устранения.

Причина 1. Обращение к реквизиту документа, которого нет в метаданных

Проанализируем типовую ситуацию: в учетной системе взаиморасчеты с покупателями на счете 62 могут формироваться не только документами реализации (у которых есть реквизит шапки СрокПлатежа или договорная отсрочка), но и ручными бухгалтерскими операциями, актами взаимозачета или корректировками долга. Если в коде отчета происходит прямое обращение к реквизиту через ссылку на документ без предварительной проверки, появление документа другого вида сразу вызывает исключительную ситуацию.

Для безопасного получения срока оплаты или даты погашения применим проверку структуры документа через объект метаданных:


Если Метаданные.Документ(Док.Вид()).РеквизитШапки("СрокПлатежа").Выбран() = 1 Тогда
    ДатаПогашения = Док.СрокПлатежа;
Иначе
    // Если реквизита нет, рассчитываем дату по умолчанию (например, дата документа + отсрочка)
    ДатаПогашения = Док.ДатаДок + СрокОплаты;
КонецЕсли;

Если в коде выполняется перебор проводок, где регистратором может выступать документ вида «Операция», следует обязательно проверять тип объекта с помощью конструкции Попытка ... Исключение или через анализ вида документа перед чтением реквизитов.

Причина 2. Ошибки в параметрах метода ВыполнитьЗапрос объекта БухгалтерскиеИтоги

Ошибки «Неверно задана периодичность запроса!» и «Неправильно задан период!» возникают из-за нарушения порядка следования аргументов в методе ВыполнитьЗапрос. В платформе 1С 7.7 данный метод принимает строго 8 параметров:

  1. НачПериода — начальная дата (тип Дата или строковое представление периода).
  2. КонПериода — конечная дата (тип Дата).
  3. Счет — фильтр по счету (строка или объект Счет).
  4. ПланСчетов/Разделитель — фильтр по плану счетов или разделителю учета.
  5. Валюта — валюта учета.
  6. ТипИтогов — числовой флаг: 1 (по субконто), 2 (по счету), 3 (развернуто).
  7. Периодичность — строка ("Проводка", "Операция", "Документ", "День", "Месяц", "Период") или число (от 1 до 5).
  8. ФлагРазворота — строковый флаг разворота (например, "С" для субконто, "В" для валют).

Посмотрим на ошибочный вызов:


// Ошибка: пропущена запятая, флаг "С" попал на место 7-го параметра (Периодичность)
Если Ит.ВыполнитьЗапрос(Д1, Д2, "62.0",, 1,, "С") = 0 Тогда

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


// Корректный вызов с получением итогов по субконто за период:
// 6-й параметр: 1 (по субконто), 7-й: "Проводка" (периодичность), 8-й: "С" (разворот по субконто)
Если Ит.ВыполнитьЗапрос(Д1, Д2, "62.0",,, 1, "Проводка", "С") = 0 Тогда
    Сообщить("Ошибка выполнения запроса по счету 62.0!");
    Возврат 0;
КонецЕсли;

Если расчетный период выходит за границы актуальности, убедимся, что бухгалтерские итоги в базе рассчитаны на нужный квартал (меню «Операции» — «Управление бухгалтерскими итогами»). Также проверим, чтобы начальная дата Д1 была строго меньше или равна конечной дате Д2.

Причина 3. Использование зарезервированных системных слов в именах колонок

В объекте ТаблицаЗначений платформы 1С 7.7 не рекомендуется называть колонки зарезервированными словами встроенного языка, такими как Дата, Документ, Позиция, Число, Счет. Прямое обращение через точку к таким колонкам (например, Таб.Дата) в определенных контекстах конфликтует с глобальными функциями платформы.

Разберем правильное создание колонок таблицы значений с безопасными именами:


Таб = СоздатьОбъект("ТаблицаЗначений");
Таб.НоваяКолонка("СуммаПриход", "Число", 15, 2);
Таб.НоваяКолонка("СуммаРасход", "Число", 15, 2);
Таб.НоваяКолонка("ДатаДок", "Дата");
Таб.НоваяКолонка("ПозицияДок");
Таб.НоваяКолонка("ТекущийДокумент", "Документ");
Таб.НоваяКолонка("СрокОплатыДок", "Дата");

Оптимизация алгоритма расчета задолженности (FIFO)

Рекурсивный вызов функции расчета с шагом назад по 31 дню несет критический риск переполнения стека вызовов при наличии старых долгов (глубина стека в 1С 7.7 ограничена). Вместо рекурсии используем итеративный цикл или единовременную выборку документов за весь интервал с последующим локальным распределением сумм долга по методу ФИФО.

← На главную