Почему табличная часть динамического списка расширения не отображается в конфигураторе 1С:Предприятия 8.5, но работает в режиме предприятия?

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

Разберем одну из весьма «любопытных» ситуаций, с которой сталкиваются разработчики при работе с расширениями в 1С:Предприятии, особенно на разных версиях платформы. Мы рассмотрим случай, когда табличная часть динамического списка, добавленного в расширение, корректно отображается и функционирует в режиме предприятия, но при этом становится невидимой в конфигураторе. Эта проблема может быть весьма загадочной, поскольку отсутствие визуального элемента в режиме разработки может ввести в заблуждение относительно его работоспособности. Выясним причину такого поведения и предложим надежные методы решения.

Исходная проблема возникла при работе с расширением в «Бухгалтерии предприятия, редакция 3.0» на платформе 1С:Предприятие 8.5.1.1150. При попытке вывести суммы реализации по счету с использованием запроса к регистру накопления «НДСЗаписиКнигиПродаж.Обороты», в конфигураторе табличная часть формы списка не отображалась, в отличие от платформы 8.3.27.1989, где все работало как положено. Несмотря на это, в режиме предприятия расширение функционировало корректно на обеих платформах.

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

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

Особенности работы расширений и динамических списков на разных версиях платформы

  1. "Любопытное" поведение запросов: Наблюдения показывают, что чем выше версия платформы 8.3.хх, тем более «любопытно» могут работать запросы, особенно в контексте расширений. Разработчики "1С" постоянно вносят изменения в API и внутренние механизмы платформы, что может приводить к изменению поведения одного и того же кода на разных версиях.
  2. Специфические ошибки платформ: Версия 8.5.1.1150, как и другие релизы платформы, могла содержать ошибки, которые влияют на отображение форм и работу расширений в конфигураторе. Например, в обсуждениях упоминалась похожая проблема, которая не работала на версии 8.3.27.1606, но была исправлена на 8.3.27.1859. Это говорит о том, что "плавающие" ошибки, влияющие на динамические списки, являются достаточно типичным явлением.
  3. Неполное автоматическое заимствование объектов: Иногда платформа автоматически не добавляет в расширение все необходимые объекты метаданных, используемые в запросе динамического списка (например, регистры накопления, документы, справочники). Это может приводить к некорректному отображению в конфигураторе, поскольку он не может полностью построить структуру данных.

Почему конфигуратор "не видит", а предприятие "видит"?

  1. Различия в обработке запросов: Конструктор запросов в конфигураторе не всегда способен полностью и корректно обработать произвольные запросы динамических списков, особенно если они содержат сложные соединения или специфические конструкции, характерные для расширений. В таких случаях конфигуратор может "не видеть" структуру данных, хотя сама платформа в режиме предприятия способна выполнить этот запрос и отобразить данные. Режим предприятия использует полноценный движок запросов, который более гибок и устойчив к различным конструкциям.
  2. Проблемы с отображением форм в конфигураторе: Ранее была признана ошибка платформы, когда при нажатии кнопки "Обновить расширение формы" слетали пути к данным элементов формы (например, на версии 8.3.15.1700). Несмотря на то что эта конкретная ошибка могла быть исправлена, подобные проблемы с визуализацией и сохранением структуры форм расширений в конфигураторе продолжают возникать.
  3. Новый интерфейс: В версиях платформы, начиная с 8.5, были внесены значительные изменения в отрисовку интерфейса и его элементов. Эти изменения также могли повлиять на отображение форм в конфигураторе, вызывая неожиданное поведение или несовместимости с определенными элементами, такими как динамические списки в расширениях.

Способы решения проблемы

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

1. Программное переопределение запроса динамического списка (наиболее надежный способ)

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

Почему это надежно?

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

Где это реализовать?

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

Как это сделать?

Мы получаем доступ к элементу формы типа ДинамическийСписок и устанавливаем его свойство ОсновнойЗапрос.Текст.

Давайте посмотрим на пример кода:


&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)

    // Получаем элемент формы, который является динамическим списком.
    // Предположим, что имя элемента на форме — "СписокДокументов".
    // Важно: убедитесь, что имя элемента соответствует вашему расширению.
    ДинамическийСписокРасширения = Элементы.СписокДокументов; 
    
    // Проверяем, что элемент действительно является динамическим списком и доступен.
    Если ДинамическийСписокРасширения <> Неопределено И ТипЗнч(ДинамическийСписокРасширения) = Тип("ДинамическийСписок") Тогда
        
        // Переопределяем текст запроса динамического списка.
        // Здесь мы формируем полный текст запроса, который должен использоваться.
        // Используем пример запроса из исходной проблемы.
        ДинамическийСписокРасширения.ОсновнойЗапрос.Текст = 
        "ВЫБРАТЬ
        |    РеализацияТоваровУслуг.Ссылка КАК ДокументРеализации,
        |    РеализацияТоваровУслуг.Дата КАК ДатаДокумента,
        |    РеализацияТоваровУслуг.Номер КАК НомерДокумента,
        |    РеализацияТоваровУслуг.Проведен,
        |    НДСЗаписиКнигиПродажОбороты.СуммаБезНДС КАК СуммаБезНДС,
        |    НДСЗаписиКнигиПродажОбороты.СуммаНДС КАК СуммаНДС,
        |    НДСЗаписиКнигиПродажОбороты.СуммаВключаяНДС КАК СуммаВключаяНДС
        |ИЗ
        |    Документ.РеализацияТоваровУслуг КАК РеализацияТоваровУслуг
        |        ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.НДСЗаписиКнигиПродаж.Обороты(, , Авто, ) КАК НДСЗаписиКнигиПродажОбороты
        |        ПО РеализацияТоваровУслуг.Ссылка = НДСЗаписиКнигиПродажОбороты.Регистратор
        |ГДЕ
        |    РеализацияТоваровУслуг.ПометкаУдаления = ЛОЖЬ
        |
        |СГРУППИРОВАТЬ ПО
        |    РеализацияТоваровУслуг.Ссылка,
        |    РеализацияТоваровУслуг.Дата,
        |    РеализацияТоваровУслуг.Номер,
        |    РеализацияТоваровУслуг.Проведен,
        |    НДСЗаписиКнигиПродажОбороты.СуммаБезНДС,
        |    НДСЗаписиКнигиПродажОбороты.СуммаНДС,
        |    НДСЗаписиКнигиПродажОбороты.СуммаВключаяНДС
        |
        |УПОРЯДОЧИТЬ ПО
        |    ДатаДокумента УБЫВ
        |
        |АВТОУПОРЯДОЧИВАНИЕ";
        
        // Важно: Если вы добавляете новые поля в запрос, которые не были
        // предусмотрены в исходном динамическом списке, убедитесь, что на форме
        // списка существуют колонки для этих полей, и их свойство "ПутьКДанным"
        // установлено корректно (например, "СуммаБезНДС", "СуммаНДС").
        // Если колонок нет, их потребуется добавить программно или вручную.
        
    КонецЕсли;

КонецПроцедуры

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

2. Явное заимствование всех необходимых объектов

Иногда платформа не всегда автоматически переносит в расширение все объекты метаданных, используемые в запросе. Это может быть причиной того, что конфигуратор "не видит" полную структуру данных. Мы должны убедиться, что все объекты метаданных, к которым обращается запрос, явно заимствованы в расширение.

  1. Проверьте все используемые метаданные: Внимательно просмотрите текст запроса и выпишите все регистры, документы, справочники и другие объекты метаданных, которые упоминаются в запросе (например, РегистрНакопления.НДСЗаписиКнигиПродаж, Документ.РеализацияТоваровУслуг).
  2. Заимствуйте их в расширение: Откройте расширение в конфигураторе, перейдите в раздел "Общие" -> "Объекты метаданных расширения" и убедитесь, что все эти объекты там присутствуют. Если какого-то объекта нет, добавьте его через команду "Добавить из конфигурации/расширения".

К сожалению, как показывает опыт (сообщение 7), этот метод не всегда решает проблему, особенно если речь идет о более глубоких платформенных ошибках в интерпретации запроса динамического списка.

3. Обновление формы и повторное заимствование

Иногда, при "глюках" с формами, помогает "перезагрузка" формы в расширении.

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

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

4. Очистка кэша 1С

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

  1. Закройте 1С:Предприятие и конфигуратор.
  2. Найдите каталоги кэша: Обычно они располагаются в папках вида:
    • %LOCALAPPDATA%\1C\1cv8
    • %USERPROFILE%\AppData\Roaming\1C\1cv8
    В этих папках найдите подкаталоги с длинными буквенно-цифровыми именами (например, 0a91e0a2-3f1c-4b5c-8d1e-2e6f4a7c8b9d), которые соответствуют вашим информационным базам.
  3. Удалите содержимое этих каталогов: Удалите все файлы и папки внутри этих длинных буквенно-цифровых каталогов. Не удаляйте сами каталоги 1cv8.
  4. Перезапустите 1С:Предприятие.

5. Проверка режима совместимости

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

  1. Проверьте режим совместимости конфигурации: Откройте конфигурацию, перейдите в "Конфигурация" -> "Свойства конфигурации" и посмотрите свойство "Режим совместимости".
  2. Проверьте режим совместимости расширения: Откройте расширение, перейдите в "Расширение" -> "Свойства расширения" и убедитесь, что свойство "Режим совместимости" расширения либо совпадает с режимом совместимости основной конфигурации, либо установлено в "Не использовать".
  3. Синхронизируйте режимы: При необходимости измените режим совместимости расширения, чтобы он соответствовал конфигурации.

6. Тестирование на разных платформах

Поскольку проблема явно проявляется как платформенно-зависимая, важно продолжать тестирование на разных версиях платформы 1С:Предприятие. Как показал опыт других пользователей (сообщение 9), на одной версии (например, 8.3.27.1606) проблема есть, а на другой (8.3.27.1859) — нет.

  1. Используйте стабильные релизы: Старайтесь работать на официально рекомендованных и стабильных релизах платформы.
  2. Проверяйте актуальность: Если вы столкнулись с проблемой на конкретной версии, попробуйте обновиться до самого последнего стабильного релиза платформы 8.3.хх, поскольку многие ошибки могут быть исправлены в обновлениях.
  3. Сравнивайте поведение: Зафиксируйте, на каких версиях платформы проблема проявляется, а на каких — нет. Эта информация будет полезна для отладки и принятия решений.

7. Декомпозиция расширения

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

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

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

← На главную