При разработке отчетов или механизмов выгрузки данных в среде 1С:Предприятие 8.3 программисты часто сталкиваются с ситуацией, когда стандартный запрос к регистру бухгалтерии не возвращает данных по определенным счетам, хотя в стандартной «Оборотно-сальдовой ведомости» (ОСВ) цифры отображаются корректно. Особенно часто это проявляется в локализованных конфигурациях, таких как «Бухгалтерия для Казахстана» (БК). В этой статье мы подробно разберем, как правильно составить запрос для получения сальдо, почему групповые счета требуют особого подхода и какие технические нюансы следует учесть для получения достоверных данных.
Рассмотрим ситуацию: нам необходимо получить данные по счетам раздела 1000 («Денежные средства»), 1100, 1200 и так далее. Автор темы столкнулся с тем, что при попытке обращения к регистру бухгалтерии через запрос данные по этим счетам отсутствуют. Проанализируем причину. В плане счетов Казахстана счета с кодами, заканчивающимися на нули (например, 1000, 1200), являются групповыми. Они служат для логического объединения субсчетов и не являются счетами, по которым разрешена проводка.
Физические записи в Регистре бухгалтерии всегда привязаны к конкретным счетам, у которых установлен признак «Счет является субсчетом» (например, 1010 — «Наличные денежные средства», 1030 — «Денежные средства на текущих банковских счетах»). Если мы в условии запроса напишем ГДЕ Счет = &Счет, где параметр — это группа 1000, система будет искать записи именно по этому родителю и ничего не найдет. Для решения этой задачи нам необходимо использовать механизм иерархии.
В типовых конфигурациях для России основной регистр бухгалтерии называется Хозрасчетный. Однако в «Бухгалтерии для Казахстана» архитектура иная. Разберем состав регистров:
Следовательно, в тексте нашего запроса мы будем использовать таблицу РегистрБухгалтерии.Типовой.
Если нам необходимо получить и начальное, и конечное сальдо, а также обороты за период, воспользуемся виртуальной таблицей ОстаткиИОбороты. Рассмотрим пример кода, который решает поставленную задачу:
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| ТиповойОстаткиИОбороты.Счет КАК Счет,
| ТиповойОстаткиИОбороты.СуммаНачальныйОстатокДт КАК НачОстатокДт,
| ТиповойОстаткиИОбороты.СуммаНачальныйОстатокКт КАК НачОстатокКт,
| ТиповойОстаткиИОбороты.СуммаКонечныйОстатокДт КАК КонОстатокДт,
| ТиповойОстаткиИОбороты.СуммаКонечныйОстатокКт КАК КонОстатокКт
|ИЗ
| РегистрБухгалтерии.Типовой.ОстаткиИОбороты(&ДатаНачало, &ДатаКонец, , , Счет В ИЕРАРХИИ (&СписокСчетов), , ) КАК ТиповойОстаткиИОбороты";
Запрос.УстановитьПараметр("ДатаНачало", НачалоДня(Объект.ДатаНачало));
Запрос.УстановитьПараметр("ДатаКонец", КонецДня(Объект.ДатаКонец));
Запрос.УстановитьПараметр("СписокСчетов", СписокВыбранныхСчетов); // Сюда передаем массив или список счетов, включая 1000, 1100 и т.д.
РезультатЗапроса = Запрос.Выполнить();
Важный момент: Обратите внимание на условие Счет В ИЕРАРХИИ (&СписокСчетов). Именно использование оператора В ИЕРАРХИИ заставляет платформу 1С просуммировать данные всех дочерних субсчетов и выдать результат по родительскому счету (группе).
Зачастую программисты используют ОстаткиИОбороты там, где нужны только текущие остатки. Это замедляет работу системы. Проанализируем ситуацию: если нам нужно только сальдо на конец периода, эффективнее использовать таблицу Остатки. Посмотрим на пример реализации:
Запрос = Новый Запрос;
// Используем объект Граница, чтобы включить движения последней секунды дня
ГраницаПериода = Новый Граница(КонецДня(ДатаОтчета), ВидГраницы.Включая);
Запрос.Текст =
"ВЫБРАТЬ
| ТиповойОстатки.Счет,
| ТиповойОстатки.СуммаОстатокДт,
| ТиповойОстатки.СуммаОстатокКт
|ИЗ
| РегистрБухгалтерии.Типовой.Остатки(&Период, Счет В ИЕРАРХИИ (&Счета), , ) КАК ТиповойОстатки";
Запрос.УстановитьПараметр("Период", ГраницаПериода);
Запрос.УстановитьПараметр("Счета", МассивСчетов);
Результат = Запрос.Выполнить().Выгрузить();
В конфигурации «Бухгалтерия для Казахстана» счета денежных средств (группа 1000) почти всегда являются валютными. Если ваш отчет должен выводить суммы не только в тенге, но и в валюте операции, необходимо обращаться к ресурсу ВалютнаяСуммаОстаток. Также важно помнить о подразделениях.
Рассмотрим дополнительные параметры виртуальных таблиц:
Валюта и ВалютнаяСумма....Подразделение в выборку и в параметры таблицы.Выясним причину, по которой новички часто теряют данные за последний день. В 1С дата 31.12.2023 — это на самом деле 31.12.2023 00:00:00. Если вы передадите такую дату в параметр Период, остатки будут рассчитаны ДО начала этого дня, и все документы, проведенные 31 декабря, не попадут в результат. Чтобы избежать этой ошибки, мы рекомендуем всегда использовать объект Граница с параметром ВидГраницы.Включая.
Хотя автор просил решение без СКД, иногда это самый быстрый способ получить «правильные» итоги. В сообщении №3 приведен пример того, как программно инициализировать отчет на базе СКД и программно выгрузить его результат в ТаблицуЗначений. Рассмотрим этот метод кратко:
ОтчетОбъект = Отчеты.НазваниеОтчета.Создать();.КомпоновщикМакета и ПроцессорКомпоновки, чтобы выполнить схему.ПроцессорВывода.УстановитьОбъект(РезультатТаблица);.Этот метод гарантирует, что вы получите ровно те же цифры, что видит пользователь в стандартном отчете, так как вся сложная логика (развертывание сальдо, расчет валют, иерархия) уже заложена в схему компоновки (СКД).
Подведем итог. Чтобы программно получить данные, идентичные ОСВ в Казахстане, нужно:
РегистрБухгалтерии.Типовой.В ИЕРАРХИИ для групповых счетов.КонецДня() и объект Граница.ВалютнаяСумма и измерение Подразделение, если они используются в учете организации.Соблюдение этих правил позволит вам создавать надежные механизмы получения бухгалтерских данных, которые будут точно соответствовать официальной отчетности предприятия.