Почему в форме списка 1С можно настраивать группировки, но нельзя добавлять новые поля (колонки)? Разбор архитектуры управляемого интерфейса

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

Разработчики и администраторы систем на платформе «1С:Предприятие 8» часто сталкиваются со странным на первый взгляд поведением интерфейса управляемых форм. Представьте ситуацию: пользователь открывает форму списка (например, список номенклатуры или документов), хочет добавить новую колонку (реквизит) через команду «Изменить форму», но обнаруживает, что этой команды либо вообще нет в меню «Еще», либо в списке доступных полей отсутствуют нужные реквизиты. При этом в меню «Настроить список» на вкладке «Группировка» пользователь может спокойно группировать данные по любым реквизитам, включая реквизиты реквизитов (через точку).

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

Суть парадокса: почему группировки работают, а поля — нет?

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

  1. Подсистема визуального отображения (Элементы управляемой формы). За нее отвечает механизм, вызываемый через команду «Изменить форму».
  2. Подсистема выборки данных (Система компоновки данных — СКД). За нее отвечает механизм настройки динамического списка, вызываемый через команду «Настроить список».

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

Когда мы пытаемся добавить новую колонку на форму через «Изменить форму», платформа физически создает новый программный объект типа ПолеФормы и связывает его с путем к данным. Если в свойствах формы в конфигураторе снят флаг «Разрешить изменять форму» (или у пользователя недостаточно прав), платформа жестко блокирует любое редактирование состава элементов формы. Кнопка «Изменить форму» просто исчезает из интерфейса, лишая пользователя возможности вытащить дополнительные реквизиты (например, артикул номенклатуры в списке товаров).

В то же время, механизм группировки работает по совершенно иным законам. Когда пользователь заходит в «Настроить список» и добавляет группировку по какому-либо полю, структура элементов формы (количество и состав колонок) **не меняется**. Платформа не создает новые объекты ПолеФормы. Она лишь указывает механизму СКД, который управляет динамическим списком, перестроить визуальное представление данных из плоской таблицы в дерево. Поскольку этот процесс не нарушает структуру элементов формы и не создает новых визуальных элементов управления, запрет «Разрешить изменять форму» на него никак не влияет.

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

Как решить проблему: пошаговое руководство

Рассмотрим, как исправить эту ситуацию и предоставить пользователям возможность полноценно настраивать форму списка под свои задачи.

Решение 1. Включение возможности изменения формы в конфигураторе

Если пользователю критически важно самостоятельно добавлять новые колонки на форму (например, выводить реквизиты связанных объектов через точку), необходимо проверить настройки самой формы в конфигураторе.

Выполним следующие шаги для анализа и настройки:

  1. Откроем конфигурацию в режиме «Конфигуратор» и найдем нужную форму списка (например, форму списка справочника «Номенклатура»).
  2. Двойным кликом откроем редактор формы и перейдем в палитру свойств самой формы (кликнув на корневой элемент «Форма» в левом верхнем углу).
  3. Прокрутим список свойств до раздела «Использование».
  4. Найдем свойство «Разрешить изменять форму» (в некоторых версиях платформы или режимах совместимости оно может называться иначе, но суть остается прежней). Если флаг снят, установим его.
  5. Сохраним конфигурацию базы данных и запустим систему в режиме «1С:Предприятие».

После включения этого свойства в меню «Еще» появится долгожданная команда «Изменить форму», и пользователи смогут свободно управлять видимостью колонок и добавлять новые реквизиты.

Решение 2. Программное добавление полей при создании формы

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

Проанализируем пример кода, который динамически добавляет колонку в список при создании формы:


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

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

Решение 3. Использование механизма «ПриПолученииДанныхНаСервере» для оптимизации вывода данных

Иногда требуется вывести в список данные, которых изначально нет в запросе динамического списка (например, остатки товаров на складах, статусы заказов или сложные расчетные показатели). Если просто добавить такие поля через сложные соединения в запросе списка, система может начать сильно "тормозить" при прокрутке.

Для таких задач в платформе начиная с версии 8.3.10 существует эффективный механизм — обработчик события ПриПолученииДанныхНаСервере. Рассмотрим этот метод по шагам.

Сначала мы добавляем на форму пустую колонку (например, «Остаток»), а затем в модуле формы прописываем обработчик события динамического списка:


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

Этот подход позволяет кардинально повысить производительность работы формы списка, так как тяжелые расчетные запросы выполняются не для всей таблицы базы данных, а только для тех 15-30 строк, которые физически отображаются на экране монитора пользователя в данный момент времени.

Ограничения платформы: почему поля иногда пропадают?

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

Платформа 1С очень бережно относится к трафику между сервером приложений и СУБД. Если в свойствах динамического списка в конфигураторе для какого-либо поля не установлен флаг «Использовать всегда», платформа при формировании SQL-запроса исключает это поле из выборки, если оно физически не выведено на форму. Как результат — пользователь не сможет увидеть это поле в настройках компоновки или в списке доступных полей формы.

Если вы столкнулись с такой проблемой, откройте свойства динамического списка в конфигураторе, перейдите на вкладку «Настройки компоновки данных» и для нужного поля установите свойство «Использовать всегда» в значение Истина.

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

← На главную