Как обратиться к субконто регистра бухгалтерии в динамическом списке расширения 1С

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

При разработке расширений конфигурации разработчики часто сталкиваются с ситуацией, когда запрос к регистру бухгалтерии успешно отрабатывает в консоли или программном коде, но вызывает ошибку проверки метаданных при попытке использовать его в качестве произвольного запроса ДинамическийСписок. Разберем по шагам, почему возникает эта проблема, какие объекты конфигурации необходимо заимствовать в расширение и как правильно оптимизировать запрос к виртуальной таблице остатков.

Выясним причину ошибки: почему динамический список не видит субконто

Рассмотрим механизм работы расширений в платформе 1С:Предприятие. В программном коде объект Запрос исполняется в контексте объединенных метаданных (основная конфигурация плюс расширение). Поэтому на этапе выполнения сервер видит все типы данных, даже если они не добавлены в расширение.

Однако для динамического списка действуют более жесткие правила:

  1. Строгая валидация метаданных: Динамический список выполняет статическую проверку схемы данных и типизацию полей на этапе компиляции формы в конфигураторе и при инициализации формы на сервере.
  2. Составной тип субконто: Поля Субконто1, Субконто2, Субконто3 в регистре бухгалтерии имеют составной тип, определяемый планом видов характеристик (например, ПланВидовХарактеристик.ВидыСубконтоХозрасчетные). Если в расширение заимствован только регистр бухгалтерии без связанных типов и ПВХ, механизм динамического списка не может построить дерево колонок и выдает ошибку.

Способ 1. Корректное заимствование метаданных в расширение

Проанализируем минимально необходимый состав объектов для работы динамического списка с регистром бухгалтерии:

  1. Добавим в расширение сам регистр бухгалтерии (например, РегистрБухгалтерии.Хозрасчетный).
  2. Добавим справочники, которые выступают значениями субконто в запросе (например, Справочник.Номенклатура, Справочник.Склады, Справочник.Организации).
  3. Для автоматического подтягивания служебных связей метаданных (плана счетов и плана видов характеристик) добавим в расширение Основную форму списка регистра бухгалтерии. При ее заимствовании платформа автоматически настроит необходимые связи типов.
  4. Очистим расширение от избыточных заимствованных объектов (лишних реквизитов и форм), которые платформа могла добавить каскадно, оставив только используемые в запросе типы.

Способ 2. Оптимизация запроса к остаткам регистра бухгалтерии

Посмотрим на частую ошибку при написании запроса к субконто: использование разыменования через точку Субконто1.Ссылка и наложение условий в секции ГДЕ. Такой подход заставляет СУБД соединять таблицу движений со всеми таблицами типов составного субконто, что приводит к резкому падению производительности.

Разберем неоптимальный вариант запроса:


ВЫБРАТЬ
    ХозрасчетныйОстатки.Субконто1.Ссылка КАК Номенклатура,
    ХозрасчетныйОстатки.Субконто2.Ссылка КАК Склад,
    ЕСТЬNULL(ХозрасчетныйОстатки.КоличествоОстаток, 0) КАК Количество
ИЗ
    РегистрБухгалтерии.Хозрасчетный.Остатки(&Дата, , , ) КАК ХозрасчетныйОстатки
ГДЕ
    ХозрасчетныйОстатки.Субконто1.Ссылка ССЫЛКА Справочник.Номенклатура
    И ХозрасчетныйОстатки.Субконто2.Ссылка ССЫЛКА Справочник.Склады
    И ХозрасчетныйОстатки.Субконто1.Ссылка = &Номенклатура

Теперь рассмотрим правильный и быстрый вариант запроса. Для максимальной производительности применим явное приведение типов через оператор ВЫРАЗИТЬ и перенесем все условия в параметры виртуальной таблицы:


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

Разберем ключевые правила оптимизации:

  1. Не использовать обращение к полям через точку без необходимости: Поле СубконтоN само по себе уже является ссылкой. Конструкция Субконто1.Ссылка порождает лишнее неявное левое соединение в SQL.
  2. Передавать фильтры в параметры виртуальной таблицы: Отборы по счету (второй параметр) и значениям субконто (четвертый параметр) должны накладываться на уровне виртуальной таблицы, а не в предложении ГДЕ. Это отсекает лишние данные до расчета итогов.
  3. Явно указывать счет учета: В регистре бухгалтерии состав и порядок субконто привязаны к конкретному счету (например, счет 41.01). Без указания счета порядок субконто в выборке может быть непредсказуемым.

Способ 3. Заполнение таблицы формы вместо динамического списка

Рассмотрим альтернативный архитектурный подход. Запросы к виртуальным таблицам остатков внутри динамических списков могут создавать значительную нагрузку на СУБД из-за внутренних механизмов постраничной выборки платформы.

Если требуется отображать остатки по текущей позиции номенклатуры на форме, более надежным решением является отказ от динамического списка в пользу обычной Таблицы значений на форме:

  1. Создадим на форме реквизит ТаблицаОстатков с типом ТаблицаЗначений и колонками Склад, Количество.
  2. В обработчике ПриСозданииНаСервере или при смене текущей строки выполняем обычный программный запрос или используем метод РегистрыБухгалтерии.Хозрасчетный.Остатки().
  3. Заполняем таблицу формы результатом запроса через ЗначениеВРеквизитФормы().

Такой подход полностью снимает ограничения валидации метаданных расширения, так как запрос исполняется программно и не требует добавления связанных объектов конфигуратора в состав расширения.

← На главную