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

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

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

Анализируем ситуацию: в чем заключается проблема?

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

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

Выявляем ключевую причину исчезновения колонки

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

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

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

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

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

Как выявить место подмены запроса: используем отладчик

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

  1. Точки останова: Установите точку останова в начале обработчика ПриСозданииНаСервере для вашей формы. Пройдите по коду, отслеживая свойство ТекстЗапроса у вашего динамического списка (например, Элементы.СписокНоменклатура.ТекстЗапроса).

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

  3. Пошаговое выполнение: Выполняйте код по шагам (F10, F11), заходя внутрь подозрительных функций. Каждый раз после выполнения потенциально изменяющего запрос кода, проверяйте содержимое ТекстЗапроса. Таким образом, вы точно обнаружите, где происходит нежелательная подмена.

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

Эффективное решение: программное добавление колонки в расширении

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

Шаг 1: Модифицируем текст запроса программно

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

  1. Получаем текущий запрос: В обработчике ПриСозданииНаСервереПосле получаем ссылку на нужный динамический список и его текущий текст запроса.

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

Пример концептуального кода для модификации запроса:


&НаСервере
Процедура ПриСозданииНаСервереПосле(Отказ, СтандартнаяОбработка)
    // Имя динамического списка, к которому добавляем колонку
    ИмяДинамическогоСписка = "СписокНоменклатура"; 
    
    // Получаем элемент динамического списка
    ДинамическийСписок = Элементы[ИмяДинамическогоСписка];
    
    // Проверяем, что запрос существует и не пуст
    Если Не ДинамическийСписок.ТекстЗапроса.Пустая() Тогда
        // Модифицируем текст запроса, добавляя новое поле (пример)
        // Допустим, нужно добавить поле "МоеНовоеПоле"
        // Важно: нужно найти подходящее место для вставки. 
        // Часто это после ключевого слова "ВЫБРАТЬ"
        // или перед "ИЗ", чтобы не нарушить структуру.
        // Здесь показан простой пример заменой "ВЫБРАТЬ".
        // В реальном запросе, возможно, потребуется более сложная логика
        // для корректной вставки нового поля в список выбираемых полей.
        ДинамическийСписок.ТекстЗапроса = СтрЗаменить(ДинамическийСписок.ТекстЗапроса, "ВЫБРАТЬ", "ВЫБРАТЬ" + Символы.ПС + "    Т.МоеНовоеПоле КАК МоеНовоеПоле," + Символы.ПС);
        // ... (далее следует Шаг 2)
    КонецЕсли;
КонецПроцедуры

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

Шаг 2: Программно добавляем элемент формы для отображения колонки

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

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

  2. Настраиваем свойства: Для нового элемента формы задаем следующие ключевые свойства:

    • Вид: Указываем подходящий вид, например, ВидПоляФормы.ПолеВвода.
    • ПутьКДанным: Критически важно! Здесь мы указываем путь к нашему новому полю в динамическом списке. Формат: ИмяДинамическогоСписка.ПсевдонимПоляИзЗапроса. Например, если список называется СписокНоменклатура, а псевдоним поля в запросе — МоеНовоеПоле, то ПутьКДанным будет СписокНоменклатура.МоеНовоеПоле.
    • Заголовок: Устанавливаем понятный заголовок для колонки.
    • Видимость: Устанавливаем в Истина.

Продолжение примера кода из Шага 1:


&НаСервере
Процедура ПриСозданииНаСервереПосле(Отказ, СтандартнаяОбработка)
    // ... (код из Шага 1)
    Если Не ДинамическийСписок.ТекстЗапроса.Пустая() Тогда
        ДинамическийСписок.ТекстЗапроса = СтрЗаменить(ДинамическийСписок.ТекстЗапроса, "ВЫБРАТЬ", "ВЫБРАТЬ" + Символы.ПС + "    Т.МоеНовоеПоле КАК МоеНовоеПоле," + Символы.ПС);
        
        // Добавляем новый элемент формы для отображения колонки
        НовыйЭлементКолонки = Элементы.Добавить("МоеНовоеПоле", Тип("ПолеФормы"), ДинамическийСписок);
        НовыйЭлементКолонки.Вид = ВидПоляФормы.ПолеВвода; 
        НовыйЭлементКолонки.ПутьКДанным = ИмяДинамическогоСписка + ".МоеНовоеПоле";
        НовыйЭлементКолонки.Заголовок = "Моя новая колонка";
        НовыйЭлементКолонки.Видимость = Истина;
        
        // Можно также настроить ширину, позицию и другие свойства
        // НовыйЭлементКолонки.Ширина = 150;
        // НовыйЭлементКолонки.Положение = ПоложениеЭлементаФормы.Последний;
    КонецЕсли;
КонецПроцедуры

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

Дополнительные рекомендации и потенциальные причины

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

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

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

  3. Свойства видимости: Проверьте свойства Видимость и ПользовательскаяВидимость не только у самой колонки, но и у ее родительских групп. Возможно, колонка находится в группе, которая скрыта.

  4. Сброс настроек формы: В некоторых случаях, если проблема связана с пользовательскими настройками формы, сброс настроек к стандартным может помочь. Это можно сделать через меню "Все действия" -> "Изменить форму" -> "Стандартные настройки".

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

Тщательный анализ ситуации с помощью отладчика и применение программного подхода к изменению запроса и добавлению элементов формы позволит вам эффективно решать проблемы с отображением колонок в динамических списках 1С:ERP и УТ.

← На главную