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