При работе в конфигурациях на базе 1С:Бухгалтерия 3.0 (например, «1С:Аренда и управление недвижимостью») пользователи могут столкнуться со специфической ошибкой при попытке выбора документа или элемента справочника. Ошибка выглядит как системное сообщение: «Ошибка создания набора данных "НаборДанныхДинамическогоСписка". Неверные параметры в операции сравнения. Нельзя сравнивать поля неограниченной длины и поля несовместимых типов». Особенно сбивает с толку строка в тексте ошибки, указывающая на условие, которого нет ни в запросе динамического списка, ни в программном коде, например: И ДокументСчетНаОплатуПокупателю.Контрагент >= &П2.
В этой статье мы подробно разберем, почему возникает эта проблема, как она связана с обновлением платформы 1С:Предприятие 8.3 и какие шаги необходимо предпринять для ее устранения.
Первым делом проанализируем ситуацию: почему платформа ругается на код, который мы не писали? Начиная с версий платформы 8.3.25 и выше, механизмы генерации SQL-запросов для динамических списков претерпели изменения. Платформа стала более строго подходить к типизации данных при наложении автоматических фильтров.
Строка И ДокументСчетНаОплатуПокупателю.Контрагент >= &П2 генерируется платформой динамически. Это происходит в тот момент, когда срабатывает механизм «Связи параметров выбора» (ChoiceParameterLinks). Если вы открываете форму выбора счета из документа поступления, система пытается автоматически отфильтровать счета по контрагенту, указанному в текущем документе. Если в расширении конфигурации метаданные формы или реквизита «рассинхронизировались» с основной базой, платформа может ошибочно интерпретировать тип передаваемого параметра (например, передать NULL или строку там, где ожидается ссылка), что и приводит к конфликту типов на уровне СУБД.
Рассмотрим самый частый сценарий: в расширение была добавлена форма документа, из которой вызывается выбор. При обновлении основной конфигурации внутренние связи метаданных могли измениться, а в расширении остались старые настройки.
ПоступлениеНаРасчетныйСчет).СчетНаОплату).Объект.Контрагент) в расширении соответствует типу и структуре основной конфигурации.Иногда визуальный редактор форм в расширении «запоминает» состояние элементов, которое конфликтует с новой логикой платформы 8.3.25. В этом случае эффективным методом будет пересоздание формы в расширении. Разберем этот процесс по шагам:
ПриСозданииНаСервере.Рассмотрим пример кода для программного вывода реквизитов, добавленных в расширение:
&НаСервере
Процедура ПриСозданииНаСервереПосле(Отказ, СтандартнаяОбработка)
// Добавляем программно элемент формы, связанный с реквизитом расширения
НовыйЭлемент = Элементы.Добавить("ДопРеквизитКонтрагента", Тип("ПолеФормы"), Элементы.ГруппаШапка);
НовыйЭлемент.Вид = ВидПоляФормы.ПолеВвода;
НовыйЭлемент.ПутьКДанным = "Объект.ДопРеквизитКонтрагента";
// При необходимости настраиваем связи параметров выбора программно
НоваяСвязь = Новый СвязьПараметраВыбора("Отбор.Владелец", "Объект.Контрагент");
МассивСвязей = Новый Массив;
МассивСвязей.Добавить(НоваяСвязь);
НовыйЭлемент.СвязиПараметровВыбора = Новый ФиксированныйМассив(МассивСвязей);
КонецПроцедуры
Такой подход минимизирует количество «жестких» правок в XML-описании формы внутри расширения, что делает его более устойчивым к обновлениям платформы.
Если вышеуказанные действия не помогли, нам следует проверить соответствие типов реквизитов. Выясним причину, почему платформа считает поле «Контрагент» полем неограниченной длины. Это может происходить, если в расширении тип реквизита указан неявно или как «составной», в то время как в основной конфигурации он строго определен.
Проанализируем следующие рекомендации:
Контрагент во всех объектах, участвующих в расширении. Если он добавлен в расширение, его тип должен строго соответствовать типу в основной конфигурации (например, СправочникСсылка.Контрагенты).1C:Enterprise и очистить содержимое папки snccntx в каталоге кластера серверов. Это заставит платформу заново сформировать планы запросов к базе данных.Мы выяснили, что ошибка «Неверные параметры в операции сравнения» чаще всего является следствием ужесточения контроля типов в новых версиях платформы 8.3 при использовании расширений. Основное внимание при решении проблемы следует уделить свойству СвязиПараметровВыбора и корректности захвата форм в расширение. Использование программного вывода элементов формы вместо визуального редактирования в расширении является «хорошим тоном» и позволяет избежать подобных ошибок в будущем.