В процессе разработки на платформе 1С:Предприятие 8.3 программисты иногда сталкиваются с аномальным поведением стандартных инструментов, таких как Конструктор запроса. Особенно часто это проявляется при работе с регистрами бухгалтерии в условиях специфических сочетаний версии платформы и режима совместимости конфигурации. Рассмотрим ситуацию, когда форма параметров виртуальной таблицы (например, Обороты или ОборотыДтКт) строится неверно: поля смещаются, отсутствуют или не позволяют выбрать нужные значения, при этом проблема проявляется только у конкретного пользователя.
Для начала разберем, почему подобный «глюк» может носить индивидуальный характер и проявляться на разных компьютерах под одной учетной записью. Основная причина кроется в хранилище системных настроек. Платформа 1С сохраняет состояние окон, размеры колонок и настройки форм конструкторов в базе данных. Если в этих данных произошел сбой, конструктор будет пытаться отрисовать форму по некорректным координатам или с ошибочными параметрами именно для этого пользователя.
Второй критический фактор — сочетание платформы (например, 8.3.16.1224) и старого режима совместимости (8.3.5). В режиме совместимости 8.3.5 платформа эмулирует поведение старых версий, но при этом использует современные программные модули отрисовки. Это может приводить к конфликтам в «нативном» конструкторе запросов, особенно в толстом клиенте.
При попытке использовать внешние инструменты (например, консоли запросов с диска ИТС) в режиме совместимости 8.3.5 часто возникают ошибки инициализации модуля. Выясним причину: современные обработки написаны с использованием функций, которые появились в платформе значительно позже версии 8.3.5.
Рассмотрим конкретные функции, вызывающие ошибку:
СтрШаблон() (или StrTemplate) — появилась в 8.3.6.СтрНайти() (или StrFind) — появилась в 8.3.6.Если ваша внешняя консоль запросов использует эти методы, в режиме совместимости 8.3.5 она просто не откроется. Проанализируем пример кода, который вызывает падение системы:
// Ошибка в режиме совместимости 8.3.5
NewItem["Presentation"] = StrTemplate("%1 (%2)", Type.Value, Account);
PointPosition = StrFind(Type.Value, ".");
Чтобы решить эту проблему, необходимо заменить эти функции на их старые аналоги (например, использовать СтрЗаменить() для реализации шаблонов или Найти() вместо СтрНайти()).
Одной из проблем, обсуждаемых программистами, является доступность объекта КонструкторЗапроса. Вопреки расхожему мнению, он доступен и в тонком клиенте, но его вызов должен учитывать требования к немодальности интерфейса.
Проанализируем универсальный программный код, который позволяет корректно открывать конструктор запроса в зависимости от версии платформы и режима клиента. Этот подход минимизирует риски «глюков» отрисовки формы:
ТекстЗапросаВФорме = ТекстЗапроса.ПолучитьТекст();
// Проверяем версию платформы для выбора метода открытия
Если ВерсияКонфигурации835ИБольше Тогда
#Если ТолстыйКлиентУправляемоеПриложение ИЛИ ТолстыйКлиентОбычноеПриложение ИЛИ ТонкийКлиент Тогда
КонструкторЗапроса = Неопределено;
Если ПустаяСтрока(ТекстЗапросаВФорме) Тогда
КонструкторЗапроса = Новый КонструкторЗапроса;
Иначе
КонструкторЗапроса = Новый КонструкторЗапроса(ТекстЗапросаВФорме);
КонецЕсли;
// Используем описание оповещения для немодального вызова
Оповещение = Новый ОписаниеОповещения("ПослеЗакрытияКонструктораЗапроса", ЭтотОбъект, ИндексТекущегоЗапроса);
КонструкторЗапроса.Показать(Оповещение);
#КонецЕсли
Иначе
// Старый метод для версий ниже 8.3.5 (только толстый клиент)
#Если ТолстыйКлиентУправляемоеПриложение ИЛИ ТолстыйКлиентОбычноеПриложение Тогда
КонструкторЗапроса = Новый КонструкторЗапроса(ТекстЗапросаВФорме);
Если КонструкторЗапроса.ОткрытьМодально() Тогда
ТекстЗапроса.УстановитьТекст(КонструкторЗапроса.Текст);
КонецЕсли;
#КонецЕсли
КонецЕсли;
Если форма параметров виртуальной таблицы регистра бухгалтерии все же строится некорректно (например, не отображается список выбора субконто), можно применить «хитрость» с программной установкой свойств элементов формы. Для параметров, предполагающих множественный выбор, критически важно свойство РасширенноеРедактированиеМножественныхЗначений.
Посмотрим на пример логики исправления:
Элемент.РасширенноеРедактированиеМножественныхЗначений = Истина;.Это заставляет платформу использовать стандартный диалог выбора типа и значений, даже если основной конструктор отрисовал поле некорректно.
Важно помнить, что состав параметров в конструкторе зависит от метаданных самого регистра. Рассмотрим ситуацию: если у регистра бухгалтерии отключена поддержка корреспонденции, то виртуальная таблица ОборотыДтКт будет отсутствовать или работать некорректно. В режиме совместимости 8.3.5 конструктор запросов может «зависать» или отображать пустые поля, если программист пытается выбрать таблицу, не соответствующую настройкам регистра. Всегда проверяйте флаг «Корреспонденция» в свойствах регистра бухгалтерии перед использованием конструктора.
Если вы столкнулись с подобной проблемой, выполните следующие действия:
ХранилищеСистемныхНастроек для данного сотрудника.СтрШаблон и другие функции, не поддерживаемые в 8.3.5).ОткрытьМодально() на метод Показать(), как показано в примере выше.