Разработка и Конфигурация · 11 мин
Как в 1С выразить субконто как справочник в запросах и отчётах
Как в 1С выразить субконто как справочник: функция ВЫРАЗИТЬ в запросах, настройка типов субконто в СКД, типичные ошибки и проверка результата.
Субконто в плане счетов 1С имеет составной тип: одно и то же субконто может хранить контрагента, договор, номенклатуру или склад. Из-за этого прямое обращение к реквизиту субконто в запросе — например Субконто1.ИНН — либо не работает, либо возвращает пустые значения для части строк. Чтобы получить доступ к реквизитам, субконто нужно выразить как конкретный тип справочника.
Задача решается двумя способами: функцией ВЫРАЗИТЬ() в тексте запроса и настройкой типа значения в СКД или в конструкторе отчёта. Оба подхода дают одинаковый результат — платформа приводит составное поле к нужному типу, после чего становятся доступны все реквизиты справочника, работают соединения и отборы по реквизитам.
Материал ориентирован на разработчиков и продвинутых пользователей типовых конфигураций (Бухгалтерия предприятия, ERP, Комплексная автоматизация), где используется план счетов с субконто. Примеры приведены для регистра бухгалтерии «Хозрасчётный», но подход универсален для любого регистра с субконто.
Почему субконто нельзя использовать напрямую
Вид субконто задаётся в плане счетов для каждого счёта отдельно. Например, на счёте 60.01 первое субконто — «Контрагенты», второе — «Договоры», а на счёте 41 первое субконто — «Номенклатура». В таблице регистра бухгалтерии поле «Субконто1» физически хранит ссылки разных типов, поэтому его тип описывается как составной.
Когда запрос обращается к реквизиту составного поля, платформа не знает заранее, какой именно справочник окажется в конкретной строке. В результате:
- конструктор запроса не показывает реквизиты субконто в дереве полей;
- обращение через точку вручную может вернуть NULL для строк, где хранится другой тип;
- соединение с таблицей справочника по субконто без приведения типа работает медленнее и иногда некорректно в отборах виртуальных таблиц;
- в СКД поле субконто отображается как «составное», и пользователь не может отфильтровать отчёт по реквизиту, например по ИНН контрагента.
Выражение субконто как справочника в запросе
Основной инструмент — функция ВЫРАЗИТЬ(). Типовой фрагмент запроса к остаткам по счёту 60.01 выглядит так:
ВЫБРАТЬ
ВЫРАЗИТЬ(Остатки.Субконто1 КАК Справочник.Контрагенты) КАК Контрагент,
ВЫРАЗИТЬ(Остатки.Субконто2 КАК Справочник.ДоговорыКонтрагентов) КАК Договор,
Остатки.СуммаОстаток КАК Сумма
ИЗ
РегистрБухгалтерии.Хозрасчетный.Остатки(&Период, Счет = &Счет, , ) КАК Остатки
После приведения типа к реквизитам обращаются через псевдоним, но для этого выражение нужно обернуть во вложенный запрос или использовать обращение через точку прямо в списке полей. Платформа допускает конструкцию вида:
ВЫРАЗИТЬ(Остатки.Субконто1 КАК Справочник.Контрагенты).ИНН КАК ИННКонтрагента
Если запрос строится в консоли запросов или конструкторе, учтите: конструктор не всегда корректно отображает такие поля в дереве, но сам запрос выполняется правильно. Проверяйте результат выполнением, а не только визуальной настройкой.
Выражение субконто в параметрах виртуальной таблицы
Отдельный случай — отбор по субконто в параметрах виртуальной таблицы остатков или оборотов. Третий параметр виртуальной таблицы принимает условие вида субконто, и там приведение типа тоже допустимо:
РегистрБухгалтерии.Хозрасчетный.Остатки(
&Период,
Счет = &Счет,
,
ВЫРАЗИТЬ(Субконто1 КАК Справочник.Контрагенты) = &Контрагент) КАК Остатки
Такой отбор выполняется на уровне виртуальной таблицы, то есть до основного запроса, что сокращает объём выбираемых данных. Это предпочтительнее, чем фильтрация в секции ГДЕ по уже полученной выборке.
Выражение субконто в СКД
В системе компоновки данных субконто выражается двумя путями: в тексте запроса набора данных той же функцией ВЫРАЗИТЬ() или через настройку типа поля на закладке «Наборы данных».
Второй способ удобен, когда запрос пишет не разработчик, а настройщик отчёта. Порядок действий:
- Откройте схему компоновки данных, перейдите на закладку «Наборы данных».
- В списке полей найдите поле субконто (например, «Субконто1»).
- В колонке «Тип значения» снимите лишние типы и оставьте только нужный справочник, например «СправочникСсылка.Контрагенты».
- После этого в настройках отчёта станут доступны реквизиты поля: ИНН, КПП, группа и другие — их можно выносить в отборы, группировки и выбранные поля.
Если оставить составной тип, пользователь отчёта увидит только само субконто без реквизитов. Если ограничить тип неверно (указать справочник, который не используется на счёте), отборы по реквизитам будут давать пустые строки.
- 1Определите по плану счетов, какой вид субконто стоит на нужной позиции счёта
- 2Напишите ВЫРАЗИТЬ(СубконтоN КАК Справочник.Имя) с псевдонимом поля
- 3Обращайтесь к реквизитам через приведённое выражение или вложенный запрос
- 4Выполните запрос на реальных данных и проверьте, что нет неожиданных NULL
- 5Перенесите отбор по субконто в параметры виртуальной таблицы, если фильтруете по значению
Соединение с таблицей справочника как альтернатива
Вместо ВЫРАЗИТЬ иногда используют левое соединение с таблицей справочника по ссылке:
ЛЕВОЕ СОЕДИНЕНИЕ Справочник.Контрагенты КАК Контрагенты
ПО Остатки.Субконто1 = Контрагенты.Ссылка
Этот подход оправдан, когда из справочника нужно вытащить много реквизитов или результаты функциональных опций, либо когда к соединению добавляются дополнительные условия. Для одного-двух реквизитов ВЫРАЗИТЬ проще и читаемее.
По производительности оба варианта в большинстве случаев сопоставимы: платформа при обращении к реквизиту через точку всё равно строит неявное соединение. Разница проявляется на больших выборках и сложных отборах — там явное соединение с отбором по индексированному полю может работать стабильнее.
Сравнение вариантов
Подходит для доступа к реквизитам и отборов. Ограничение: при несовпадении типа возвращает NULL без предупреждения.
Подходит для настройки отчётов без изменения запроса. Ограничение: работает только внутри СКД, не влияет на сам запрос.
Подходит, когда нужно много реквизитов или сложные условия соединения. Ограничение: удлиняет текст запроса.
Типичные ошибки и как их избежать
Первая ошибка — приведение к неверному справочнику. Например, на счёте 62 второе субконто — «Договоры контрагентов», а разработчик выражает его как «Справочник.Контрагенты». Ошибки выполнения не будет, просто все значения поля станут NULL, и отчёт молча потеряет данные. Всегда сверяйтесь с планом счетов: откройте счёт в конфигураторе или в режиме предприятия и посмотрите список видов субконто.
Вторая ошибка — использование приведённого поля в отборе виртуальной таблицы через секцию ГДЕ вместо параметров. Отбор в ГДЕ применяется после выборки всех остатков, что на больших базах заметно увеличивает время выполнения. Переносите условия по субконто в третий параметр виртуальной таблицы.
Третья ошибка — попытка выразить субконто в поле компоновки без приведения типа в запросе, а затем удивление пустым реквизитам в пользовательском режиме. Если запрос набора данных возвращает составное поле, а тип в СКД не ограничен, пользователь не увидит реквизитов справочника в настройках.
Проверка результата
После написания запроса выполните его на реальных данных и проверьте три вещи. Во-первых, количество строк результата должно совпадать с количеством строк без приведения типа — ВЫРАЗИТЬ не фильтрует записи, а только меняет представление поля. Если строк стало меньше, вы случайно добавили соединение или отбор.
Во-вторых, проверьте долю NULL в приведённом поле. Небольшое количество NULL допустимо, если на счёте есть проводки с другими видами субконто или пустыми значениями. Если NULL-составляющая большая, хотя вы ожидали сплошные значения, — скорее всего, выбран неверный справочник или неверная позиция субконто.
В-третьих, сверьте итоги по суммам с типовым отчётом (ОСВ по счёту). Итоги по сумме должны совпадать до копейки независимо от того, как выражено субконто: приведение типа не влияет на ресурсы регистра.
Как проверить результат
Совпадает с выборкой без ВЫРАЗИТЬ
Строк стало меньше — появился лишний отбор или соединение
NULL только там, где субконто другого вида или пустое
Массовые NULL при ожидаемых значениях — неверный справочник
Совпадают с ОСВ по счёту
Расхождение — ошибка в структуре запроса, а не в приведении типа
Ограничения и границы подхода
ВЫРАЗИТЬ работает только с типами, реально входящими в состав типа поля. Нельзя выразить субконто как справочник, который не входит в типы ни одного вида субконто плана счетов, — конструктор запроса просто не даст выбрать такой тип, а при ручном вводе запрос вернёт ошибку.
В типовых конфигурациях состав типов субконто фиксирован характеристиками плана счетов. Расширить его без изменения конфигурации нельзя. Если доработка ведётся через расширение, добавление нового вида субконто имеет ограничения — проверяйте возможности режима совместимости расширений для вашей версии платформы.
Для отчётов, которые строятся на регистре бухгалтерии напрямую (не через типовые механизмы), помните про поле «ВидСубконто» в таблице значений субконто: анализ по номеру субконто (Субконто1, Субконто2) надёжнее заменять анализом по виду субконто, если запрос охватывает несколько счетов с разной структурой аналитики.
FAQ
Можно ли выразить субконто как несколько справочников одновременно?
Нет, ВЫРАЗИТЬ приводит поле к одному типу. Если нужны реквизиты разных справочников в одной строке, сделайте несколько выражений с разными псевдонимами: одно к «Контрагенты», другое к «Номенклатура». Для строк, где тип не совпадает, соответствующее поле будет NULL.
Почему после ВЫРАЗИТЬ поле стало пустым во всех строках?
Почти всегда причина в неверном типе: вы привели субконто к справочнику, который не используется на этой позиции счёта. Откройте план счетов, найдите счёт и проверьте, какой вид субконто стоит на нужном номере, затем исправьте тип в выражении.
Работает ли ВЫРАЗИТЬ в параметрах отбора виртуальной таблицы остатков?
Да, в третьем параметре виртуальных таблиц остатков и оборотов допустимо условие с ВЫРАЗИТЬ, например ВЫРАЗИТЬ(Субконто1 КАК Справочник.Контрагенты) = &Контрагент. Это предпочтительный способ фильтрации по субконто.
Как в СКД дать пользователю отбор по ИНН контрагента из субконто?
В наборе данных найдите поле субконто и в колонке «Тип значения» оставьте только «СправочникСсылка.Контрагенты». После этого в настройках отчёта у поля появятся реквизиты, включая ИНН, и их можно добавить в отбор. Либо приведите тип функцией ВЫРАЗИТЬ прямо в запросе набора данных.
Влияет ли ВЫРАЗИТЬ на производительность запроса?
Сама функция практически не добавляет накладных расходов — платформа и так хранит тип значения. Замедление обычно связано не с ВЫРАЗИТЬ, а с обращением к реквизитам (неявными соединениями) и с отборами в секции ГДЕ вместо параметров виртуальной таблицы.
Что делать, если на разных счетах одна позиция субконто имеет разные виды?
Не опирайтесь на номер субконто. Либо стройте отдельные запросы по счетам с корректным приведением типа для каждого, либо анализируйте вид субконто через план видов характеристик и применяйте ВЫРАЗИТЬ условно через ВЫБОР, приводя поле к нужному справочнику в зависимости от вида.
Что важно запомнить
Субконто выражается как справочник функцией ВЫРАЗИТЬ в запросе или ограничением типа поля в СКД. Всегда сверяйте тип с видами субконто на счёте, отборы переносите в параметры виртуальной таблицы, а результат проверяйте по количеству строк, доле NULL и сверкой итогов с ОСВ.