Переход с платформы 1С 7.7 на 1С 8.3 часто вызывает вопросы у разработчиков, привыкших к определенным механизмам работы с данными. Одной из типичных задач является создание отчета по взаиморасчетам с покупателями, где требуется вывести иерархию: Контрагент — Документ движения. В этой статье мы подробно разберем, как реализовать такой отчет программно, без использования системы компоновки данных (СКД), что бывает необходимо для специфических задач, например, при сверке данных с базой 7.7 через OLE/COM-соединение.
В системе 1С 7.7 для получения документа, сделавшего проводку, мы использовали понятие ТекущийДокумент. В платформе 8.3 в запросах к регистрам (включая регистр бухгалтерии Хозрасчетный) существует прямое соответствие — поле Регистратор. Это поле является ссылкой на документ, который сформировал запись в регистре.
Проанализируем ситуацию: при работе с конструктором запроса начинающие разработчики часто пытаются выбрать конкретные виды документов (Реализация, Платежное поручение). Этого делать не нужно. Достаточно выбрать поле Регистратор из виртуальной таблицы регистра бухгалтерии, и система сама подтянет все виды документов, сделавших движения по выбранному счету.
Для отчета по покупателям в «Бухгалтерии предприятия 3.0» (БП 3.0) оптимально использовать виртуальную таблицу Хозрасчетный.ОстаткиИОбороты или Хозрасчетный.Обороты. Рассмотрим, как правильно настроить параметры этой таблицы:
В ИЕРАРХИИ для группы счетов 62.Регистратор стало доступным для выбора, в параметрах виртуальной таблицы необходимо установить значение периодичности Запись (или Регистратор). Если оставить периодичность по умолчанию (Период), поле Регистратор будет отсутствовать в списке доступных полей.Рассмотрим пример запроса, который выбирает данные по покупателям с группировкой по регистраторам. Выясним, как должна выглядеть секция итогов для корректного обхода данных.
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| ХозрасчетныйОбороты.Субконто1 КАК Контрагент,
| ХозрасчетныйОбороты.Регистратор КАК ДокументДвижения,
| ХозрасчетныйОбороты.СуммаОборотДт КАК СуммаПродажи,
| ХозрасчетныйОбороты.СуммаОборотКт КАК СуммаОплаты
|ИЗ
| РегистрБухгалтерии.Хозрасчетный.Обороты(&НачалоПериода, &КонецПериода, Регистратор, Счет В ИЕРАРХИИ (&Счет62), , , , ) КАК ХозрасчетныйОбороты
|ИТОГИ
| СУММА(СуммаПродажи),
| СУММА(СуммаОплаты)
|ПО
| Контрагент,
| ДокументДвижения";
Запрос.УстановитьПараметр("НачалоПериода", НачалоДня(Объект.ДатаНачала));
Запрос.УстановитьПараметр("КонецПериода", КонецДня(Объект.ДатаОкончания));
Запрос.УстановитьПараметр("Счет62", ПланыСчетов.Хозрасчетный.РасчетыСПокупателями);
Обратите внимание на конструкцию ИТОГИ ПО. Она позволяет нам создать иерархическую структуру выборки, которую затем удобно перебирать в циклах для вывода в макет.
Теперь разберем по шагам, как программно вывести полученные данные в табличный документ. Мы будем использовать метод Выбрать с параметром ОбходРезультатаЗапроса.ПоГруппировкам.
РезультатЗапроса = Запрос.Выполнить();
// Выборка по верхнему уровню — Контрагентам
ВыборкаКонтрагент = РезультатЗапроса.Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам);
Пока ВыборкаКонтрагент.Следующий() Цикл
// Здесь выводим строку с данными контрагента в макет
// ОбластьКонтрагент.Параметры.Заполнить(ВыборкаКонтрагент);
// ТабДок.Вывести(ОбластьКонтрагент);
// Выборка по детальным записям — Регистраторам
ВыборкаДетали = ВыборкаКонтрагент.Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам);
Пока ВыборкаДетали.Следующий() Цикл
// Здесь выводим строку с документом
// В поле Регистратор содержится ссылка на документ
// Мы можем обратиться к его реквизитам: ВыборкаДетали.ДокументДвижения.Номер
// ОбластьДетали.Параметры.Заполнить(ВыборкаДетали);
// ТабДок.Вывести(ОбластьДетали);
КонецЦикла;
КонецЦикла;
Если задача стоит в сравнении данных между 7.7 и 8.3, проанализируем важные технические моменты. При получении данных из семерки через V7.CreateObject("БухгалтерскиеИтоги"), объекты приходят в виде COM-объектов. Прямое сравнение ссылок невозможно.
Рекомендуем следующий алгоритм сверки:
ТаблицуЗначений на стороне восьмерки, а затем проводите поиск в памяти. Это ускорит работу отчета в десятки раз.Если вам нужно быстро проверить цифры, которые выдает ваш самописный отчет, не забывайте про Универсальный отчет, встроенный в БП 3.0. Чтобы настроить его аналогично нашему примеру, выполните следующие действия:
Регистр бухгалтерии, имя регистра Хозрасчетный, таблицу Обороты.Субконто1 (Контрагент) и Регистратор.Этот инструмент поможет вам убедиться в правильности логики вашего запроса и корректности получаемых сумм. Использование поля Регистратор и правильная настройка периодичности — это фундамент для построения любых детальных отчетов в 1С 8.3.