При разработке или доработке внешних отчетов по взаиморасчетам программисты часто сталкиваются с ситуацией, когда отчет идеально работает на рублевых данных, но «теряет» контрагентов, как только появляются договоры в валюте (USD, EUR) или в условных единицах (у.е.). Рассмотрим, почему это происходит, как правильно модифицировать запрос и какие нюансы платформы 1С нужно учитывать при работе с валютной дебиторкой.
Проанализируем типовую структуру запроса к регистру бухгалтерии. В большинстве случаев проблема кроется в жестком отборе по счету. В плане счетов 1С (особенно в конфигурации «Бухгалтерия предприятия») расчеты с покупателями разделены на разные субсчета:
62.01 — Расчеты с покупателями и заказчиками (в рублях).62.21 — Расчеты с покупателями и заказчиками (в валюте).62.31 — Расчеты с покупателями и заказчиками (в у.е.).Если в параметрах запроса или в настройках СКД (Схемы компоновки данных) указан только счет 62.01, система закономерно проигнорирует все движения по валютным счетам. Посмотрим на исходный фрагмент запроса:
ИЗ
РегистрБухгалтерии.Хозрасчетный.ДвиженияССубконто(, , СчетДт = &СчетДт, , ) КАК ХозрасчетныйДвиженияССубконто
Здесь оператор = ограничивает выборку одним конкретным значением. Если параметр &СчетДт заполнен ссылкой на счет 62.01, данные по 62.21 никогда не попадут в отчет.
Самый простой способ — изменить условие в запросе, чтобы оно позволяло выбирать несколько счетов сразу. Для этого заменим оператор = на оператор В. Разберем по шагам, как это сделать в тексте запроса:
ДвиженияССубконто, Остатки и т.д.).СчетДт = &СчетДт на СчетДт В (&СписокСчетов).СчетКт В (&СписокСчетов).После изменений запрос в первой временной таблице ВТСчета будет выглядеть следующим образом:
ВЫБРАТЬ
ХозрасчетныйДвиженияССубконто.Период КАК Период,
ХозрасчетныйДвиженияССубконто.СубконтоДт1 КАК Контрагент,
ХозрасчетныйДвиженияССубконто.Сумма КАК СуммаДокРеализации,
// Остальные поля...
ИЗ
РегистрБухгалтерии.Хозрасчетный.ДвиженияССубконто(, , СчетДт В (&СписокСчетов), , ) КАК ХозрасчетныйДвиженияССубконто
ОБЪЕДИНИТЬ ВСЕ
ВЫБРАТЬ
ХозрасчетныйДвиженияССубконто.Период,
ХозрасчетныйДвиженияССубконто.СубконтоКт1,
// Остальные поля...
ИЗ
РегистрБухгалтерии.Хозрасчетный.ДвиженияССубконто(, , СчетКт В (&СписокСчетов), , ) КАК ХозрасчетныйДвиженияССубконто
Важный момент: В настройках параметров СКД для параметра СписокСчетов необходимо установить флаг «Доступен список значений». В самом отчете в этот список нужно добавить счета 62.01, 62.21 и 62.31.
Более профессиональный подход заключается в использовании оператора В ИЕРАРХИИ. Это позволит не перечислять каждый субсчет вручную. Если мы укажем родительский счет 62, система автоматически подтянет все вложенные счета, включая те, которые могут быть созданы пользователями в будущем.
Рассмотрим пример условия:
ГДЕ
ХозрасчетныйДвиженияССубконто.СчетДт В ИЕРАРХИИ (&СчетДебиторки)
В качестве значения параметра &СчетДебиторки достаточно будет передать одну ссылку — ПланСчетов.Хозрасчетный.РасчетыСПокупателями.
Проанализируем, какие ресурсы регистра мы используем. В системе 1С поле Сумма всегда содержит данные в валюте регламентированного учета (обычно это рубли). Даже если сделка совершена в долларах, в поле Сумма будет записан рублевый эквивалент по курсу на дату операции.
Если ваша задача — просто видеть общую задолженность, пересчитанную в рубли, то текущий запрос с полем Сумма корректен. Однако, если нужно видеть сумму именно в той валюте, в которой выписан счет, необходимо добавить в запрос поле СуммаВалютная.
Посмотрим на пример модификации выборки:
ВЫБРАТЬ
ХозрасчетныйДвиженияССубконто.Сумма КАК СуммаРуб,
ХозрасчетныйДвиженияССубконто.СуммаВалютная КАК СуммаВал,
ХозрасчетныйДвиженияССубконто.ВалютаДт КАК Валюта
Помните: Ресурс СуммаВалютная заполняется только в том случае, если у счета в плане счетов установлен признак «Валютный». Для счета 62.01 это поле будет пустым (NULL или 0), а для 62.21 — заполненным.
В исходном коде используется таблица ДвиженияССубконто. Это «тяжелая» таблица, которая читает физические записи регистра. Если объем данных большой, отчет будет работать медленно. Выясним, как оптимизировать этот процесс.
Для отчетов по взаиморасчетам лучше использовать виртуальную таблицу ОстаткиИОбороты. Она позволяет получить готовые итоги по документам (регистраторам) без необходимости самостоятельно суммировать приходы и расходы. Рассмотрим пример структуры такого запроса:
ВЫБРАТЬ
ХозрасчетныйОстаткиИОбороты.Субконто1 КАК Контрагент,
ХозрасчетныйОстаткиИОбороты.Субконто2 КАК Договор,
ХозрасчетныйОстаткиИОбороты.Субконто3 КАК ДокументРеализации,
ХозрасчетныйОстаткиИОбороты.СуммаКонечныйОстатокДт КАК ДолгРуб,
ХозрасчетныйОстаткиИОбороты.СуммаВалютнаяКонечныйОстатокДт КАК ДолгВал
ИЗ
РегистрБухгалтерии.Хозрасчетный.ОстаткиИОбороты(&НачалоПериода, &КонецПериода, Регистратор, , Счет В ИЕРАРХИИ (&Счет), , ) КАК ХозрасчетныйОстаткиИОбороты
При работе с валютными счетами важно учитывать курсовые разницы. В 1С рублевый остаток долга может изменяться при переоценке валюты (счет 91). Если ваш отчет строится только на «документах реализации», он может не увидеть эти корректировки.
Чтобы отчет всегда сходился с Оборотно-сальдовой ведомостью (ОСВ), при расчете СальдоДокумента необходимо учитывать все движения по конкретному Субконто3 (Документ расчетов), а не только те, что сделаны самой «Реализацией» или «Поступлением на расчетный счет». Именно поэтому использование виртуальных таблиц остатков предпочтительнее ручного разбора движений.
62.01, но и 62.21 (валюта), 62.31 (у.е.).В (&СписокСчетов) или В ИЕРАРХИИ (&Счет) вместо =.СуммаВалютная.62.21 субконто идут в том же порядке: Контрагент, Договор, Документ. Если в вашей базе порядок другой, индексы СубконтоДт1, СубконтоДт2 и т.д. в запросе нужно будет скорректировать.Проанализировав и внедрив эти изменения, вы обеспечите корректную работу отчета вне зависимости от того, в какой валюте ведутся расчеты с вашими бизнес-партнерами.