При разработке и сопровождении отчетов по дебиторской задолженности в платформе 1С:Предприятие 7.7 разработчики нередко сталкиваются с ситуацией, когда отчет успешно работает на исторических данных, но при переносе периода на более поздние даты аварийно завершает работу. Разберем по шагам, почему возникают ошибки вида «Поле агрегатного объекта не обнаружено (СрокПлатежа)», «Неверно задана периодичность запроса!» и «Неправильно задан период!», а также рассмотрим надежные способы их устранения.
Проанализируем типовую ситуацию: в учетной системе взаиморасчеты с покупателями на счете 62 могут формироваться не только документами реализации (у которых есть реквизит шапки СрокПлатежа или договорная отсрочка), но и ручными бухгалтерскими операциями, актами взаимозачета или корректировками долга. Если в коде отчета происходит прямое обращение к реквизиту через ссылку на документ без предварительной проверки, появление документа другого вида сразу вызывает исключительную ситуацию.
Для безопасного получения срока оплаты или даты погашения применим проверку структуры документа через объект метаданных:
Если Метаданные.Документ(Док.Вид()).РеквизитШапки("СрокПлатежа").Выбран() = 1 Тогда
ДатаПогашения = Док.СрокПлатежа;
Иначе
// Если реквизита нет, рассчитываем дату по умолчанию (например, дата документа + отсрочка)
ДатаПогашения = Док.ДатаДок + СрокОплаты;
КонецЕсли;
Если в коде выполняется перебор проводок, где регистратором может выступать документ вида «Операция», следует обязательно проверять тип объекта с помощью конструкции Попытка ... Исключение или через анализ вида документа перед чтением реквизитов.
Ошибки «Неверно задана периодичность запроса!» и «Неправильно задан период!» возникают из-за нарушения порядка следования аргументов в методе ВыполнитьЗапрос. В платформе 1С 7.7 данный метод принимает строго 8 параметров:
Дата или строковое представление периода).Дата).Счет).1 (по субконто), 2 (по счету), 3 (развернуто)."Проводка", "Операция", "Документ", "День", "Месяц", "Период") или число (от 1 до 5)."С" для субконто, "В" для валют).Посмотрим на ошибочный вызов:
// Ошибка: пропущена запятая, флаг "С" попал на место 7-го параметра (Периодичность)
Если Ит.ВыполнитьЗапрос(Д1, Д2, "62.0",, 1,, "С") = 0 Тогда
Исправим вызов, четко соблюдая количество запятых между параметрами:
// Корректный вызов с получением итогов по субконто за период:
// 6-й параметр: 1 (по субконто), 7-й: "Проводка" (периодичность), 8-й: "С" (разворот по субконто)
Если Ит.ВыполнитьЗапрос(Д1, Д2, "62.0",,, 1, "Проводка", "С") = 0 Тогда
Сообщить("Ошибка выполнения запроса по счету 62.0!");
Возврат 0;
КонецЕсли;
Если расчетный период выходит за границы актуальности, убедимся, что бухгалтерские итоги в базе рассчитаны на нужный квартал (меню «Операции» — «Управление бухгалтерскими итогами»). Также проверим, чтобы начальная дата Д1 была строго меньше или равна конечной дате Д2.
В объекте ТаблицаЗначений платформы 1С 7.7 не рекомендуется называть колонки зарезервированными словами встроенного языка, такими как Дата, Документ, Позиция, Число, Счет. Прямое обращение через точку к таким колонкам (например, Таб.Дата) в определенных контекстах конфликтует с глобальными функциями платформы.
Разберем правильное создание колонок таблицы значений с безопасными именами:
Таб = СоздатьОбъект("ТаблицаЗначений");
Таб.НоваяКолонка("СуммаПриход", "Число", 15, 2);
Таб.НоваяКолонка("СуммаРасход", "Число", 15, 2);
Таб.НоваяКолонка("ДатаДок", "Дата");
Таб.НоваяКолонка("ПозицияДок");
Таб.НоваяКолонка("ТекущийДокумент", "Документ");
Таб.НоваяКолонка("СрокОплатыДок", "Дата");
Рекурсивный вызов функции расчета с шагом назад по 31 дню несет критический риск переполнения стека вызовов при наличии старых долгов (глубина стека в 1С 7.7 ограничена). Вместо рекурсии используем итеративный цикл или единовременную выборку документов за весь интервал с последующим локальным распределением сумм долга по методу ФИФО.