Почему в расширении "слетают" пути к данным у колонок динамического списка и как это исправить?

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

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

Проанализируем ситуацию. Основная причина такого поведения — ошибки в работе механизма расширений на некоторых версиях платформы «1С:Предприятие» (в частности, проблема была явно выражена на релизах ветки 8.3.27). Платформа некорректно обрабатывает изменения в заимствованных формах, особенно когда дело касается текста запроса динамического списка.

К счастью, есть надежные способы обойти эту проблему. Рассмотрим их по шагам.

Надежное решение: Программное изменение запроса динамического списка

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

Разберем по шагам, как это сделать:

  1. Заимствуйте форму в расширение. Добавьте нужную форму списка в ваше расширение, но не трогайте текст запроса у основного реквизита формы (динамического списка) через конфигуратор.

  2. Создайте обработчик события формы. В расширении для заимствованной формы создайте обработчик события ПриСозданииНаСервере. Важно выбрать тип вызова "После", чтобы сначала выполнился основной код типовой конфигурации, а уже потом — ваш.

  3. Получите и измените текст запроса. В созданном обработчике получите текущий текст запроса динамического списка, добавьте в него необходимые поля или соединения (например, через ЛЕВОЕ СОЕДИНЕНИЕ), а затем присвойте измененный текст обратно.

Посмотрим на пример. Допустим, нам нужно в список документов "Реализация товаров и услуг" добавить колонку с дополнительным реквизитом номенклатуры.


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

    // Получаем текущий текст запроса из динамического списка
    // "Список" - это имя основного реквизита формы (динамического списка)
    ТекущийТекстЗапроса = Элементы.Список.ТекстЗапроса;

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

    // ВАЖНО: После изменения запроса нужно программно добавить и саму колонку на форму
    // Создаем новый элемент формы - поле таблицы
    НоваяКолонка = Элементы.Добавить("СписокМойДополнительныйРеквизит", Тип("ПолеФормы"), Элементы.Список);
    НоваяКолонка.Вид = ВидПоляФормы.ПолеВвода;
    НоваяКолонка.ПутьКДанным = "Список.МойДополнительныйРеквизит";
    НоваяКолонка.Заголовок = "Доп. реквизит";

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

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

Альтернативные и менее рекомендуемые подходы

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

1. Заимствование всех связанных объектов

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

2. Добавление реквизитов только кодом

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

Важные моменты и рекомендации

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

  2. Сбрасывайте пользовательские настройки. Иногда вы все сделали правильно, но новая колонка не появляется. Причина может быть в сохраненных пользовательских настройках формы. Перед тем как искать ошибку в коде, попробуйте сбросить настройки для своей учетной записи (Еще -> Изменить форму -> Еще -> Установить стандартные настройки).

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

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

← К списку