Как исправить ошибки при обращении к табличным частям и правильно составить запрос к регистру бухгалтерии для отчета?

Программист 1С v8.3 (Управляемые формы) 1C:Бухгалтерия Бухгалтерский учет IT и автоматизация бизнеса
← На главную

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

Разбор ошибки обращения к табличной части

Рассмотрим типичную ситуацию: в коде документа выполняется проверка суммы. Разработчик пишет условие вида Если СписокКонтрагентов.СуммаОплаты > 0 Тогда. Программа при этом выдает ошибку, так как свойство СуммаОплаты не обнаружено. Выясним причину этой проблемы.

В объектной модели 1С ТабличнаяЧасть — это коллекция строк. У самой коллекции нет и не может быть свойств, соответствующих именам колонок. Колонки (реквизиты табличной части) принадлежат конкретной строке этой таблицы. Следовательно, обратиться напрямую к «сумме всей таблицы» через точку нельзя.

Вариант 1: Получение итога по всей колонке

Если нам нужно проверить общую сумму по всей табличной части, следует использовать встроенный метод Итог(). Рассмотрим пример:


// Правильное получение общей суммы по колонке
ОбщаяСумма = Объект.СписокКонтрагентов.Итог("СуммаОплаты");
Если ОбщаяСумма > 0 Тогда
    // Ваша логика здесь
КонецЕсли;

Вариант 2: Перебор строк в цикле

Если логика требует анализа каждой отдельной строки (например, при проведении документа или проверке заполнения), мы должны использовать цикл Для Каждого. Разберем по шагам:


Для Каждого СтрокаТЧ Из Объект.СписокКонтрагентов Цикл
    // Здесь мы обращаемся к конкретной строке, у которой есть нужный реквизит
    Если СтрокаТЧ.СуммаОплаты <= 0 Тогда
        Сообщение = Новый СообщениеПользователю;
        Сообщение.Текст = "В строке № " + СтрокаТЧ.НомерСтроки + " не указана сумма!";
        Сообщение.Сообщить();
    КонецЕсли;
КонецЦикла;

Логические условия и типы данных

Проанализируем еще одну ошибку, упомянутую в обсуждении: использование неявных логических условий. В языке 1С запись Если Условие Тогда эквивалентна сравнению Если Условие = Истина Тогда. Это означает, что переменная Условие обязана иметь тип Булево.

Если вы пытаетесь написать Если СписокКонтрагентов.СуммаОплаты Тогда, система не сможет преобразовать число в истину или ложь автоматически. Всегда приводите условия к логическому типу, используя операторы сравнения (>, <, =, <>).

Построение запроса к виртуальной таблице остатков

Перейдем ко второй части задачи — формированию отчета по задолженности покупателей на конкретную дату. Пользователи часто совершают ошибки в структуре запроса к регистру бухгалтерии. Рассмотрим представленный в теме запрос:


ВЫБРАТЬ
    УчебнаяОстатки.Субконто1 КАК Контрагент,
    УчебнаяОстатки.Субконто2 КАК Договор,
    УчебнаяОстатки.СуммаОстаток КАК Сумма
ИЗ
    РегистрБухгалтерии.Учебная.Остатки(&Период, Счет = ЗНАЧЕНИЕ(ПланСчетов.Бухгалтерский.Покупатели), , ) КАК УчебнаяОстатки

Хотя этот запрос выглядит рабочим, в нем есть несколько критических моментов, которые стоит улучшить для профессионального решения задачи БУ.

1. Правильная работа с периодом (Граница)

В 1С тип данных Дата включает время. Если мы передаем в параметр &Период дату "01.02.2010", система воспримет это как "01.02.2010 00:00:00". В итоге документы, проведенные в течение этого дня, не попадут в остатки. Чтобы включить документы последней секунды указанной даты, необходимо использовать объект Граница:


КонецПериодаОтчета = КонецДня(ДатаОтчета);
ГраницаПериода = Новый Граница(КонецПериодаОтчета, ВидГраницы.Включая);
Запрос.УстановитьПараметр("Период", ГраницаПериода);

2. Типизация Субконто

Поля Субконто1, Субконто2 имеют составной тип. В отчетах (особенно в СКД) это может привести к тому, что вы не сможете обратиться к реквизитам контрагента (например, к его ИНН или адресу). Рекомендуется использовать оператор ВЫРАЗИТЬ. Проанализируем пример:


ВЫБРАТЬ
    ВЫРАЗИТЬ(УчебнаяОстатки.Субконто1 КАК Справочник.Контрагенты) КАК Контрагент,
    ВЫРАЗИТЬ(УчебнаяОстатки.Субконто2 КАК Справочник.ДоговорыКонтрагентов) КАК Договор,
    УчебнаяОстатки.СуммаОстатокДт КАК Задолженность
ИЗ
    РегистрБухгалтерии.Учебная.Остатки(&Период, Счет = &СчетПокупатели, , ) КАК УчебнаяОстатки

3. Использование параметров виртуальной таблицы

Обратите внимание, что условие по счету (Счет = &СчетПокупатели) передается во второй параметр виртуальной таблицы Остатки. Это критически важно для производительности. Если вы напишете условие в секции ГДЕ, система сначала выберет остатки по всем счетам плана счетов, а потом будет их фильтровать, что крайне неэффективно.

Рекомендации по созданию отчета через СКД

Для формирования качественного отчета по задолженности лучше всего использовать Систему компоновки данных (СКД). Разберем алгоритм настройки:

  1. Создание схемы: Вставьте приведенный выше запрос в набор данных СКД.
  2. Настройка ролей: В поле "СуммаОстаток" на закладке "Наборы данных" проверьте роль поля. Она должна быть помечена как "Остатки" с указанием соответствующего бухгалтерского счета. Это позволит СКД правильно рассчитывать итоги по группировкам.
  3. Выбор ресурсов: Добавьте поле СуммаОстаток в ресурсы, используя функцию Сумма().
  4. Параметры: Убедитесь, что параметр Период доступен пользователю для ввода, и используйте выражение в СКД для автоматического формирования Границы.

Таким образом, решение задачи по бухгалтерскому учету требует не только знания основ синтаксиса (как правильно обращаться к ТЧ через цикл или итог), но и понимания механизмов работы платформы с данными (виртуальные таблицы, границы периодов и типизация данных в запросах).

← На главную