Почему некорректно отображаются параметры виртуальных таблиц регистра бухгалтерии в конструкторе запроса?

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

В процессе разработки на платформе 1С:Предприятие 8.3 программисты иногда сталкиваются с аномальным поведением стандартных инструментов, таких как Конструктор запроса. Особенно часто это проявляется при работе с регистрами бухгалтерии в условиях специфических сочетаний версии платформы и режима совместимости конфигурации. Рассмотрим ситуацию, когда форма параметров виртуальной таблицы (например, Обороты или ОборотыДтКт) строится неверно: поля смещаются, отсутствуют или не позволяют выбрать нужные значения, при этом проблема проявляется только у конкретного пользователя.

Проанализируем причины возникновения проблемы

Для начала разберем, почему подобный «глюк» может носить индивидуальный характер и проявляться на разных компьютерах под одной учетной записью. Основная причина кроется в хранилище системных настроек. Платформа 1С сохраняет состояние окон, размеры колонок и настройки форм конструкторов в базе данных. Если в этих данных произошел сбой, конструктор будет пытаться отрисовать форму по некорректным координатам или с ошибочными параметрами именно для этого пользователя.

Второй критический фактор — сочетание платформы (например, 8.3.16.1224) и старого режима совместимости (8.3.5). В режиме совместимости 8.3.5 платформа эмулирует поведение старых версий, но при этом использует современные программные модули отрисовки. Это может приводить к конфликтам в «нативном» конструкторе запросов, особенно в толстом клиенте.

Разберем ограничения функций работы со строками

При попытке использовать внешние инструменты (например, консоли запросов с диска ИТС) в режиме совместимости 8.3.5 часто возникают ошибки инициализации модуля. Выясним причину: современные обработки написаны с использованием функций, которые появились в платформе значительно позже версии 8.3.5.

Рассмотрим конкретные функции, вызывающие ошибку:

Если ваша внешняя консоль запросов использует эти методы, в режиме совместимости 8.3.5 она просто не откроется. Проанализируем пример кода, который вызывает падение системы:


// Ошибка в режиме совместимости 8.3.5
NewItem["Presentation"] = StrTemplate("%1 (%2)", Type.Value, Account); 
PointPosition = StrFind(Type.Value, ".");

Чтобы решить эту проблему, необходимо заменить эти функции на их старые аналоги (например, использовать СтрЗаменить() для реализации шаблонов или Найти() вместо СтрНайти()).

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

Одной из проблем, обсуждаемых программистами, является доступность объекта КонструкторЗапроса. Вопреки расхожему мнению, он доступен и в тонком клиенте, но его вызов должен учитывать требования к немодальности интерфейса.

Проанализируем универсальный программный код, который позволяет корректно открывать конструктор запроса в зависимости от версии платформы и режима клиента. Этот подход минимизирует риски «глюков» отрисовки формы:


ТекстЗапросаВФорме = ТекстЗапроса.ПолучитьТекст();

// Проверяем версию платформы для выбора метода открытия
Если ВерсияКонфигурации835ИБольше Тогда
    #Если ТолстыйКлиентУправляемоеПриложение ИЛИ ТолстыйКлиентОбычноеПриложение ИЛИ ТонкийКлиент Тогда
        КонструкторЗапроса = Неопределено;
        Если ПустаяСтрока(ТекстЗапросаВФорме) Тогда
            КонструкторЗапроса = Новый КонструкторЗапроса;
        Иначе
            КонструкторЗапроса = Новый КонструкторЗапроса(ТекстЗапросаВФорме);
        КонецЕсли;
        
        // Используем описание оповещения для немодального вызова
        Оповещение = Новый ОписаниеОповещения("ПослеЗакрытияКонструктораЗапроса", ЭтотОбъект, ИндексТекущегоЗапроса);
        КонструкторЗапроса.Показать(Оповещение);
    #КонецЕсли
Иначе
    // Старый метод для версий ниже 8.3.5 (только толстый клиент)
    #Если ТолстыйКлиентУправляемоеПриложение ИЛИ ТолстыйКлиентОбычноеПриложение Тогда
        КонструкторЗапроса = Новый КонструкторЗапроса(ТекстЗапросаВФорме);
        Если КонструкторЗапроса.ОткрытьМодально() Тогда
            ТекстЗапроса.УстановитьТекст(КонструкторЗапроса.Текст);
        КонецЕсли;
    #КонецЕсли
КонецЕсли;

Принудительное исправление отображения полей ввода

Если форма параметров виртуальной таблицы регистра бухгалтерии все же строится некорректно (например, не отображается список выбора субконто), можно применить «хитрость» с программной установкой свойств элементов формы. Для параметров, предполагающих множественный выбор, критически важно свойство РасширенноеРедактированиеМножественныхЗначений.

Посмотрим на пример логики исправления:

  1. Найдем элемент формы, отвечающий за ввод параметра виртуальной таблицы.
  2. Установим программно: Элемент.РасширенноеРедактированиеМножественныхЗначений = Истина;.

Это заставляет платформу использовать стандартный диалог выбора типа и значений, даже если основной конструктор отрисовал поле некорректно.

Выясним разницу между таблицами Обороты и ОборотыДтКт

Важно помнить, что состав параметров в конструкторе зависит от метаданных самого регистра. Рассмотрим ситуацию: если у регистра бухгалтерии отключена поддержка корреспонденции, то виртуальная таблица ОборотыДтКт будет отсутствовать или работать некорректно. В режиме совместимости 8.3.5 конструктор запросов может «зависать» или отображать пустые поля, если программист пытается выбрать таблицу, не соответствующую настройкам регистра. Всегда проверяйте флаг «Корреспонденция» в свойствах регистра бухгалтерии перед использованием конструктора.

Итоговые рекомендации по исправлению

Если вы столкнулись с подобной проблемой, выполните следующие действия:

← На главную