Почему программно добавленная колонка не отображается в динамическом списке подбора номенклатуры в 1С:Управление торговлей?

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

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

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

Анализ исходной проблемы и шаги автора

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

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


Ожидается = Элементы.Вставить("Ожидается", Тип("ПолеФормы"), Элементы.СписокСтандартныйПоискНоменклатура, Элементы.СписокСтандартныйПоискНоменклатураУпаковкаЕдиницаИзмерения);
Ожидается.ПутьКДанным = "СписокНоменклатура.Ожидается";
Ожидается.Вид = ВидПоляФормы.ПолеВвода;

Несмотря на то что поле добавлялось в коллекцию элементов формы (то есть объект ПолеФормы создавался), на самой форме его не было видно. Автор проверил ПутьКДанным, убедившись, что он верный и соответствует имени поля в источнике данных динамического списка. Более того, при попытке исправить ПутьКДанным на неверное значение, платформа выдавала ошибку, подтверждая, что текущий путь считается корректным для указанного источника данных.

Для дополнительной верификации наличия данных на серверной стороне, в обработчике события ПриСозданииНаСервере формы, был использован следующий код, позволяющий получить результат компоновки данных:


Схема = Элементы.СписокСтандартныйПоискНоменклатура.ПолучитьИсполняемуюСхемуКомпоновкиДанных();
Настройки = Элементы.СписокСтандартныйПоискНоменклатура.ПолучитьИсполняемыеНастройкиКомпоновкиДанных();
КомпоновщикМакета = Новый КомпоновщикМакетаКомпоновкиДанных();
МакетКомпоновки = КомпоновщикМакета.Выполнить(Схема, Настройки,,, Тип("ГенераторМакетаКомпоновкиДанныхДляКоллекцииЗначений"));
ПроцессорКомпоновки = Новый ПроцессорКомпоновкиДанных;
ПроцессорКомпоновки.Инициализировать(МакетКомпоновки);
ПроцессорВывода = Новый ПроцессорВыводаРезультатаКомпоновкиДанныхВКоллекциюЗначений;
Результат = ПроцессорВывода.Вывести(ПроцессорКомпоновки);

Этот тест подтвердил, что данные и колонка с ними присутствуют в объекте Результат, то есть на уровне СКД все работало правильно.

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

Выявление истинной причины: Неверный целевой динамический список

После тщательного анализа и экспериментов, автор обнаружил истинную причину проблемы, которая, как это часто бывает, оказалась довольно простой, но трудноуловимой: на форме присутствовало два динамических списка. Один из них был "простым" или стандартным, а другой – "расширенным" (возможно, программно создаваемым или модифицированным в рамках другой доработки). Программно добавление колонки происходило в первый список (Элементы.СписокСтандартныйПоискНоменклатура), тогда как на форме отображался совсем другой динамический список. Таким образом, колонка добавлялась, но в невидимый или неактивный для пользователя элемент формы.

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

Комплексный подход к устранению проблем с отображением колонок в динамических списках

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

  1. Проверьте целевой динамический список и его путь к данным:

    Как показал опыт автора, это одна из наиболее частых причин. Убедитесь, что вы добавляете колонку к правильному элементу формы, который реально отображается пользователю. Используйте отладчик для проверки имени элемента формы (например, Элементы.СписокВашНазвание). Также критически важно, чтобы свойство ПутьКДанным новой колонки точно соответствовало имени поля, которое вы добавили в запросе источника данных динамического списка.

    Например, если ваш динамический список называется СписокНоменклатура, и в его запросе есть поле Ожидается, то ПутьКДанным для вашей новой колонки должен быть СписокНоменклатура.Ожидается. Любое несоответствие приведет либо к ошибке, либо к пустой колонке.

  2. Убедитесь в наличии поля в запросе:

    Мы должны гарантировать, что добавляемое поле присутствует в конечном тексте запроса, который использует динамический список. В типовых конфигурациях запросы могут переопределяться программно в общих модулях, иногда несколько раз. Например, для формы подбора в УТ 11 это может быть модуль ПодборТоваровСервер и функция ТекстЗапросаСпискаФормыПодбора.

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

    Метод, который использовал автор для получения исполняемой схемы СКД (ПолучитьИсполняемуюСхемуКомпоновкиДанных()), является отличным способом проверить, какие поля доступны в итоговом запросе динамического списка на серверной стороне.

  3. Проверьте свойства видимости и доступности:

    Убедитесь, что у программно добавляемой колонки установлены необходимые свойства Видимость и ПользовательскаяВидимость. По умолчанию они должны быть Истина, но в некоторых случаях могли быть изменены программно или пользовательскими настройками. Также проверьте, не скрыт ли реквизит функциональными опциями конфигурации. Мы должны убедиться, что все функциональные опции, влияющие на видимость данных, активны.

  4. Особенности работы с расширениями:

    При использовании расширений возникает ряд дополнительных нюансов:

    • Некорректное заимствование: Мы должны корректно заимствовать в расширение динамический список, его форму и, при необходимости, источник данных. Недостаточно просто добавить элемент формы, если сам динамический список или его источник данных не заимствованы или заимствованы с ошибками.
    • Права доступа: Если мы добавляем новый реквизит в заимствованный справочник или документ, нам необходимо захватить в расширение соответствующую роль, которая предоставляет права на чтение этого справочника/документа, иначе новый реквизит не будет показан на форме из-за отсутствия прав.
    • Контролируемые свойства: Некоторые свойства заимствованных объектов являются "контролируемыми". Если значение такого свойства в расширяемой конфигурации отличается от значения, установленного в расширении, это может привести к некорректному подключению расширения или его неработоспособности, что в свою очередь может повлиять на отображение элементов формы.
  5. Кэш пользователя и настройки формы:

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

  6. Место вызова кода:

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

  7. Влияние СКД:

    Динамические списки используют Систему Компоновки Данных (СКД) для формирования данных. Хотя возможности СКД для динамических списков урезаны, она все равно участвует в процессе. Убедитесь, что наши изменения совместимы с логикой СКД, используемой динамическим списком. После изменения запроса динамического списка иногда требуется явно обновить настройки компоновщика настроек, чтобы изменения вступили в силу. Например, следующий код может помочь принудительно восстановить настройки:

    
    Список.КомпоновщикНастроек.Восстановить(СпособВосстановленияНастроекКомпоновкиДанных.Полное);
    

    Здесь Список – это имя элемента формы типа ДинамическийСписок.

Заключение

Проблема с неотображением программно добавленной колонки в динамическом списке, как мы выяснили, часто кроется в неверной идентификации целевого элемента формы или нюансах работы с расширениями и запросами. Мы должны тщательно проверять все аспекты: от корректности запроса и свойства ПутьКДанным до влияния расширений, прав доступа и пользовательских настроек. Использование отладчика и методов для получения исполняемой схемы СКД помогут нам точно определить, на каком этапе происходит сбой и эффективно решить проблему.

← На главную