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