Почему не отображаются изменения в форме списка справочника в 1С 8.3 и как это исправить?

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

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

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

Причина №1: Динамическое переопределение форм через менеджер справочника

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

Для того чтобы понять, какая именно форма открывается, нам необходимо заглянуть в модуль менеджера справочника Партнеры. В платформе 1С:Предприятие существует предопределенное событие ОбработкаПолученияФормы. Этот обработчик позволяет перехватить запрос на открытие формы и динамически подменить ее на другую в зависимости от текущих настроек системы или прав пользователя.

Проанализируем логику работы этого механизма. В конфигурациях ERP, КА и УТ справочник Партнеры тесно связан с механизмами полнотекстового поиска. Если в вашей информационной базе по каким-то причинам отключен полнотекстовый поиск (например, в разделе «НСИ и администрирование — Общие настройки — Полнотекстовый поиск»), система автоматически перенаправляет вызов со стандартной формы списка на специальную облегченную форму — ФормаСпискаБезПолнотекстовогоПоиска.

Именно поэтому, когда вы вносите изменения в стандартную ФормаСписка, вы не видите их в режиме предприятия. Программа просто открывает другую форму! Чтобы проверить это и решить проблему, выполните следующие действия:

  1. Откройте конфигуратор и найдите справочник Партнеры.
  2. Разверните ветку Формы. Обратите внимание на наличие формы с именем ФормаСпискаБезПолнотекстовогоПоиска.
  3. Перенесите все ваши доработки (добавление колонки Поле1, настройку видимости и т.д.) на эту форму.
  4. Альтернативный вариант: перейдите в пользовательский режим, откройте раздел НСИ и администрирование — Общие настройки, найдите раздел полнотекстового поиска и включите его. После этого система начнет открывать вашу стандартную ФормаСписка.

Стоит также рассмотреть, как именно работает отладка в таких сценариях. Почему точка останова в процедуре ПриСозданииНаСервере стандартной формы списка не срабатывала у автора? Дело в том, что отладчик не может зайти в модуль формы, которая вообще не создается! Точку останова следовало ставить гораздо раньше — в модуле менеджера справочника Партнеры в предопределенной процедуре ОбработкаПолученияФормы. Давайте посмотрим, как выглядит этот обработчик изнутри:


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

Благодаря этому коду платформа перехватывает стандартный вызов и подставляет совершенно другой объект метаданных. Понимание этого механизма убережет вас от многих часов бесплодных поисков причин «исчезновения» колонок на формах списков любых других справочников и документов.

Причина №2: Произвольный запрос в Динамическом списке

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

На управляемых формах списков в современных конфигурациях практически никогда не используется простое отображение таблицы справочника. Вместо этого применяется мощный инструмент — Динамический список. По умолчанию динамический список может работать в режиме автоматического считывания данных, но для сложных справочников разработчики фирмы «1С» используют режим произвольного запроса. В этом режиме данные собираются из множества таблиц (партнеры, контрагенты, контактная информация, дополнительные реквизиты) с помощью SQL-подобного запроса.

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

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

ВЫБРАТЬ
    СправочникПартнеры.Ссылка КАК Ссылка,
    СправочникПартнеры.Наименование КАК Наименование,
    СправочникПартнеры.Поле1 КАК Поле1
ИЗ
    Справочник.Партнеры КАК СправочникПартнеры

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

Причина №3: Ошибка при копировании формы («Форма не найдена»)

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

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

Современный подход: Как решить задачу без изменения типовой конфигурации

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

Вариант 1. Использование механизма «Дополнительные реквизиты» (Без программирования)

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

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

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

Вариант 2. Использование расширений конфигурации (Если требуется код)

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

Рассмотрим алгоритм создания расширения для нашей задачи:

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

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

Использование расширений гарантирует, что при следующем обновлении конфигурации «1С:Комплексная автоматизация» ваши изменения не затрутся, а процесс обновления пройдет в автоматическом режиме без привлечения программистов.

Заключение

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

← На главную