Как создать простейший отчет по покупателям в 1С 8.3 с группировкой по документам движения

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

Переход с платформы 1С 7.7 на 1С 8.3 часто вызывает вопросы у разработчиков, привыкших к определенным механизмам работы с данными. Одной из типичных задач является создание отчета по взаиморасчетам с покупателями, где требуется вывести иерархию: Контрагент — Документ движения. В этой статье мы подробно разберем, как реализовать такой отчет программно, без использования системы компоновки данных (СКД), что бывает необходимо для специфических задач, например, при сверке данных с базой 7.7 через OLE/COM-соединение.

Понятие регистратора: аналог «Текущего документа»

В системе 1С 7.7 для получения документа, сделавшего проводку, мы использовали понятие ТекущийДокумент. В платформе 8.3 в запросах к регистрам (включая регистр бухгалтерии Хозрасчетный) существует прямое соответствие — поле Регистратор. Это поле является ссылкой на документ, который сформировал запись в регистре.

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

Выбор правильной таблицы для запроса

Для отчета по покупателям в «Бухгалтерии предприятия 3.0» (БП 3.0) оптимально использовать виртуальную таблицу Хозрасчетный.ОстаткиИОбороты или Хозрасчетный.Обороты. Рассмотрим, как правильно настроить параметры этой таблицы:

  1. Счет: Для покупателей обычно используются счета 62.01, 62.02. В запросе лучше использовать условие В ИЕРАРХИИ для группы счетов 62.
  2. Периодичность: Это ключевой момент. Чтобы поле Регистратор стало доступным для выбора, в параметрах виртуальной таблицы необходимо установить значение периодичности Запись (или Регистратор). Если оставить периодичность по умолчанию (Период), поле Регистратор будет отсутствовать в списке доступных полей.

Разбор программного кода запроса

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


Запрос = Новый Запрос;
Запрос.Текст = 
    "ВЫБРАТЬ
    |	ХозрасчетныйОбороты.Субконто1 КАК Контрагент,
    |	ХозрасчетныйОбороты.Регистратор КАК ДокументДвижения,
    |	ХозрасчетныйОбороты.СуммаОборотДт КАК СуммаПродажи,
    |	ХозрасчетныйОбороты.СуммаОборотКт КАК СуммаОплаты
    |ИЗ
    |	РегистрБухгалтерии.Хозрасчетный.Обороты(&НачалоПериода, &КонецПериода, Регистратор, Счет В ИЕРАРХИИ (&Счет62), , , , ) КАК ХозрасчетныйОбороты
    |ИТОГИ
    |	СУММА(СуммаПродажи),
    |	СУММА(СуммаОплаты)
    |ПО
    |	Контрагент,
    |	ДокументДвижения";

Запрос.УстановитьПараметр("НачалоПериода", НачалоДня(Объект.ДатаНачала));
Запрос.УстановитьПараметр("КонецПериода", КонецДня(Объект.ДатаОкончания));
Запрос.УстановитьПараметр("Счет62", ПланыСчетов.Хозрасчетный.РасчетыСПокупателями);

Обратите внимание на конструкцию ИТОГИ ПО. Она позволяет нам создать иерархическую структуру выборки, которую затем удобно перебирать в циклах для вывода в макет.

Обход результатов и вывод в печатную форму

Теперь разберем по шагам, как программно вывести полученные данные в табличный документ. Мы будем использовать метод Выбрать с параметром ОбходРезультатаЗапроса.ПоГруппировкам.


РезультатЗапроса = Запрос.Выполнить();

// Выборка по верхнему уровню — Контрагентам
ВыборкаКонтрагент = РезультатЗапроса.Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам);

Пока ВыборкаКонтрагент.Следующий() Цикл
    // Здесь выводим строку с данными контрагента в макет
    // ОбластьКонтрагент.Параметры.Заполнить(ВыборкаКонтрагент);
    // ТабДок.Вывести(ОбластьКонтрагент);

    // Выборка по детальным записям — Регистраторам
    ВыборкаДетали = ВыборкаКонтрагент.Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам);
    
    Пока ВыборкаДетали.Следующий() Цикл
        // Здесь выводим строку с документом
        // В поле Регистратор содержится ссылка на документ
        // Мы можем обратиться к его реквизитам: ВыборкаДетали.ДокументДвижения.Номер
        
        // ОбластьДетали.Параметры.Заполнить(ВыборкаДетали);
        // ТабДок.Вывести(ОбластьДетали);
    КонецЦикла;
КонецЦикла;

Нюансы сравнения данных с 1С 7.7 через OLE

Если задача стоит в сравнении данных между 7.7 и 8.3, проанализируем важные технические моменты. При получении данных из семерки через V7.CreateObject("БухгалтерскиеИтоги"), объекты приходят в виде COM-объектов. Прямое сравнение ссылок невозможно.

Рекомендуем следующий алгоритм сверки:

Использование Универсального отчета для быстрой проверки

Если вам нужно быстро проверить цифры, которые выдает ваш самописный отчет, не забывайте про Универсальный отчет, встроенный в БП 3.0. Чтобы настроить его аналогично нашему примеру, выполните следующие действия:

  1. Откройте «Отчеты» — «Стандартные отчеты» — «Универсальный отчет».
  2. Выберите тип данных Регистр бухгалтерии, имя регистра Хозрасчетный, таблицу Обороты.
  3. В настройках на закладке «Группировки» добавьте поля Субконто1 (Контрагент) и Регистратор.
  4. На закладке «Отборы» установите фильтр по счету 62.

Этот инструмент поможет вам убедиться в правильности логики вашего запроса и корректности получаемых сумм. Использование поля Регистратор и правильная настройка периодичности — это фундамент для построения любых детальных отчетов в 1С 8.3.

← На главную