Разберем одну из весьма «любопытных» ситуаций, с которой сталкиваются разработчики при работе с расширениями в 1С:Предприятии, особенно на разных версиях платформы. Мы рассмотрим случай, когда табличная часть динамического списка, добавленного в расширение, корректно отображается и функционирует в режиме предприятия, но при этом становится невидимой в конфигураторе. Эта проблема может быть весьма загадочной, поскольку отсутствие визуального элемента в режиме разработки может ввести в заблуждение относительно его работоспособности. Выясним причину такого поведения и предложим надежные методы решения.
Исходная проблема возникла при работе с расширением в «Бухгалтерии предприятия, редакция 3.0» на платформе 1С:Предприятие 8.5.1.1150. При попытке вывести суммы реализации по счету с использованием запроса к регистру накопления «НДСЗаписиКнигиПродаж.Обороты», в конфигураторе табличная часть формы списка не отображалась, в отличие от платформы 8.3.27.1989, где все работало как положено. Несмотря на это, в режиме предприятия расширение функционировало корректно на обеих платформах.
Давайте проанализируем, почему возникает такое расхождение в поведении между конфигуратором и режимом предприятия, а также между разными версиями платформы.
Особенности работы расширений и динамических списков на разных версиях платформы
Почему конфигуратор "не видит", а предприятие "видит"?
Мы предлагаем несколько способов решения этой проблемы, начиная с наиболее надежного и универсального.
Самым надежным и рекомендованным способом для обхода "плавающих" проблем с динамическими списками в расширениях является программное переопределение текста запроса. Этот подход позволяет нам взять полный контроль над запросом, обходя особенности работы конфигуратора и обеспечивая стабильное поведение на разных версиях платформы.
Почему это надежно?
При программном переопределении запроса мы напрямую устанавливаем текст запроса для динамического списка, минуя этапы его визуального конструирования и интерпретации конфигуратором, который может некорректно обрабатывать расширенные запросы. Это позволяет нам избежать зависимостей от поведения конфигуратора при его визуализации.
Где это реализовать?
Переопределять запрос следует в обработчике события формы ПриСозданииНаСервере. Этот обработчик выполняется один раз при создании формы на сервере, до ее отображения пользователю.
Как это сделать?
Мы получаем доступ к элементу формы типа ДинамическийСписок и устанавливаем его свойство ОсновнойЗапрос.Текст.
Давайте посмотрим на пример кода:
&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
// Получаем элемент формы, который является динамическим списком.
// Предположим, что имя элемента на форме — "СписокДокументов".
// Важно: убедитесь, что имя элемента соответствует вашему расширению.
ДинамическийСписокРасширения = Элементы.СписокДокументов;
// Проверяем, что элемент действительно является динамическим списком и доступен.
Если ДинамическийСписокРасширения <> Неопределено И ТипЗнч(ДинамическийСписокРасширения) = Тип("ДинамическийСписок") Тогда
// Переопределяем текст запроса динамического списка.
// Здесь мы формируем полный текст запроса, который должен использоваться.
// Используем пример запроса из исходной проблемы.
ДинамическийСписокРасширения.ОсновнойЗапрос.Текст =
"ВЫБРАТЬ
| РеализацияТоваровУслуг.Ссылка КАК ДокументРеализации,
| РеализацияТоваровУслуг.Дата КАК ДатаДокумента,
| РеализацияТоваровУслуг.Номер КАК НомерДокумента,
| РеализацияТоваровУслуг.Проведен,
| НДСЗаписиКнигиПродажОбороты.СуммаБезНДС КАК СуммаБезНДС,
| НДСЗаписиКнигиПродажОбороты.СуммаНДС КАК СуммаНДС,
| НДСЗаписиКнигиПродажОбороты.СуммаВключаяНДС КАК СуммаВключаяНДС
|ИЗ
| Документ.РеализацияТоваровУслуг КАК РеализацияТоваровУслуг
| ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.НДСЗаписиКнигиПродаж.Обороты(, , Авто, ) КАК НДСЗаписиКнигиПродажОбороты
| ПО РеализацияТоваровУслуг.Ссылка = НДСЗаписиКнигиПродажОбороты.Регистратор
|ГДЕ
| РеализацияТоваровУслуг.ПометкаУдаления = ЛОЖЬ
|
|СГРУППИРОВАТЬ ПО
| РеализацияТоваровУслуг.Ссылка,
| РеализацияТоваровУслуг.Дата,
| РеализацияТоваровУслуг.Номер,
| РеализацияТоваровУслуг.Проведен,
| НДСЗаписиКнигиПродажОбороты.СуммаБезНДС,
| НДСЗаписиКнигиПродажОбороты.СуммаНДС,
| НДСЗаписиКнигиПродажОбороты.СуммаВключаяНДС
|
|УПОРЯДОЧИТЬ ПО
| ДатаДокумента УБЫВ
|
|АВТОУПОРЯДОЧИВАНИЕ";
// Важно: Если вы добавляете новые поля в запрос, которые не были
// предусмотрены в исходном динамическом списке, убедитесь, что на форме
// списка существуют колонки для этих полей, и их свойство "ПутьКДанным"
// установлено корректно (например, "СуммаБезНДС", "СуммаНДС").
// Если колонок нет, их потребуется добавить программно или вручную.
КонецЕсли;
КонецПроцедуры
В этом примере мы явно указываем полный текст запроса, используя при этом тот же регистр накопления, что и в исходной проблеме. Обратите внимание, что мы также добавили группировку и упорядочивание для полноты запроса динамического списка.
Иногда платформа не всегда автоматически переносит в расширение все объекты метаданных, используемые в запросе. Это может быть причиной того, что конфигуратор "не видит" полную структуру данных. Мы должны убедиться, что все объекты метаданных, к которым обращается запрос, явно заимствованы в расширение.
РегистрНакопления.НДСЗаписиКнигиПродаж, Документ.РеализацияТоваровУслуг).К сожалению, как показывает опыт (сообщение 7), этот метод не всегда решает проблему, особенно если речь идет о более глубоких платформенных ошибках в интерпретации запроса динамического списка.
Иногда, при "глюках" с формами, помогает "перезагрузка" формы в расширении.
Этот метод может быть трудоемким, если доработок много. И, как и в случае с явным заимствованием объектов, он не всегда гарантирует решение проблемы, если причина кроется в специфике платформы.
При необъяснимых проблемах с отображением или работой расширений, особенно в конфигураторе, очистка кэша 1С часто помогает решить множество проблем, связанных с некорректно сохраненными временными данными.
%LOCALAPPDATA%\1C\1cv8%USERPROFILE%\AppData\Roaming\1C\1cv80a91e0a2-3f1c-4b5c-8d1e-2e6f4a7c8b9d), которые соответствуют вашим информационным базам.1cv8.Несоответствие режимов совместимости между основной конфигурацией и расширением может быть источником различных проблем, включая некорректное отображение элементов.
Поскольку проблема явно проявляется как платформенно-зависимая, важно продолжать тестирование на разных версиях платформы 1С:Предприятие. Как показал опыт других пользователей (сообщение 9), на одной версии (например, 8.3.27.1606) проблема есть, а на другой (8.3.27.1859) — нет.
В некоторых особо "глючных" или сложных случаях, когда ни один из вышеперечисленных методов не помогает, может потребоваться более радикальный подход.
Таким образом, исчезновение табличной части динамического списка в конфигураторе 1С при работе с расширением — это известная особенность, часто связанная с нюансами обработки динамических списков и запросов в разных версиях платформы. Мы рассмотрели различные подходы к решению этой проблемы, среди которых программное управление запросом является наиболее рекомендуемым для обеспечения стабильности и предсказуемости поведения расширения.