Почему реквизит Комментарий не отображается в списке Изменить форму и как это исправить?

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

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

Анализ причины: почему платформа скрывает реквизит

Для начала проанализируем внутренние механизмы работы платформы 1С с динамическими списками. Основная причина, по которой реквизит исчезает из выбора, заключается в особенностях формирования SQL-запроса к базе данных. Если в настройках динамического списка (в тексте запроса) используется ключевое слово РАЗЛИЧНЫЕ (или DISTINCT в терминах SQL), платформа автоматически накладывает ограничения на типы данных, которые могут быть выбраны.

Реквизит Комментарий, как правило, имеет тип Строка неограниченной длины. Согласно правилам работы большинства систем управления базами данных (MS SQL Server, PostgreSQL), выполнение операции DISTINCT (выбор уникальных записей) для полей неограниченной длины невозможно или крайне непроизводительно. Платформа 1С:Предприятие «превентивно» скрывает такие поля из списка доступных, чтобы предотвратить возникновение ошибок выполнения запроса на уровне СУБД.

Важно понимать, что РАЗЛИЧНЫЕ — это неявная группировка. СУБД не может сравнить две строки неограниченной длины между собой, чтобы определить их уникальность, без предварительного преобразования. Именно поэтому поле становится недоступным не только напрямую, но и «через точку» от ссылки.

Способ 1. Использование функции ПОДСТРОКА в запросе

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

Разберем по шагам процесс изменения запроса:

  1. Откроем форму списка документа в конфигураторе (или через расширение).
  2. Перейдем к свойствам основной таблицы (динамического списка).
  3. Откроем редактор текста запроса.
  4. Найдем выборку поля комментария и обернем её в функцию ПОДСТРОКА.

Пример преобразования кода запроса:


ВЫБРАТЬ РАЗЛИЧНЫЕ
    ДокументЗаявка.Ссылка КАК Ссылка,
    ДокументЗаявка.Номер КАК Номер,
    ДокументЗаявка.Дата КАК Дата,
    // Вместо ДокументЗаявка.Комментарий используем:
    ПОДСТРОКА(ДокументЗаявка.Комментарий, 1, 1000) КАК КомментарийСтр
ИЗ
    Документ.ЗаявкаНаОплату КАК ДокументЗаявка

В данном примере мы ограничиваем длину выводимого комментария до 1000 символов. Этого обычно достаточно для отображения в списке, и такое поле СУБД сможет обработать даже при наличии ключевого слова РАЗЛИЧНЫЕ. После этого поле КомментарийСтр появится в списке доступных в меню Изменить форму.

Способ 2. Оптимизация запроса (удаление РАЗЛИЧНЫЕ)

Проанализируем ситуацию: действительно ли в вашем списке необходимо использовать РАЗЛИЧНЫЕ? Часто разработчики добавляют это слово «на всякий случай» или при левом соединении с табличными частями, когда возникают дубли строк. Если логика запроса позволяет избавиться от РАЗЛИЧНЫЕ, это будет лучшим решением для производительности.

Рассмотрим вариант замены соединения с табличной частью на использование условий В (ВЫБРАТЬ...) или агрегатных функций. Если убрать РАЗЛИЧНЫЕ, платформа моментально вернет возможность выбора строк неограниченной длины в пользовательских настройках формы.

Способ 3. Программная настройка доступных полей

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

Проверим и при необходимости добавим поле программно:


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

Дополнительные факторы влияния

Выясним, какие еще причины могут приводить к исчезновению реквизита Комментарий:

Рекомендации по реализации в расширениях

Если ваша конфигурация находится на поддержке, крайне не рекомендуется вносить изменения напрямую. Лучше всего создать расширение и в нем переопределить запрос динамического списка, применив функцию ПОДСТРОКА. Это позволит сохранить возможность обновления основной конфигурации и решит проблему пользователя.

Проанализируем производительность: использование ПОДСТРОКА практически не нагружает сервер, в то время как попытка вывести «чистое» поле неограниченной длины в списке с РАЗЛИЧНЫЕ привела бы к ошибке выполнения SQL. Таким образом, ограничение длины в запросе — это не «костыль», а технически грамотный способ обхода ограничений реляционных баз данных в контексте платформы 1С.

← На главную