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