Как правильно выбирать значение из Таблицы Значений и настроить размер окна выбора

Программист IT и автоматизация бизнеса
← На главную

В процессе разработки на платформе 1С:Предприятие часто возникает необходимость предоставить пользователю возможность выбора конкретной строки из подготовленного массива данных. Самым простым и быстрым способом кажется использование стандартного метода ВыбратьСтроку(), который доступен для объекта ТаблицаЗначений. Однако, как показывает практика и обсуждения на форумах, этот метод имеет существенные недостатки, главным из которых является невозможность программно управлять размерами окна и сохранять их для последующих открытий.

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

Проблема стандартного метода ВыбратьСтроку()

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


Запрос = Новый Запрос; 
Запрос.Текст = "ВЫБРАТЬ Ссылка, Наименование ИЗ Справочник.Номенклатура";
    
РезультатЗапроса = Запрос.Выполнить(); 
ТЗ = РезультатЗапроса.Выгрузить();
Адрес = ТЗ.ВыбратьСтроку("Выберите нужную позицию");

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

Решение №1: Создание собственной формы выбора

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

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

Шаг 2: Настройка параметров формы. Для того чтобы форма «запоминала» свои размеры, проанализируем свойства формы. Нам необходимо установить флаг СохранятьПараметрыОкна и убедиться, что свойство КлючСохраненияПоложенияОкна заполнено уникальным строковым идентификатором. Это позволит системе записывать координаты и размеры окна в настройки пользователя.

Шаг 3: Передача данных и возврат результата. Рассмотрим пример кода, который вызывает нашу форму и получает выбранное значение:


// В модуле, где вызывается выбор:
ФормаВыбора = ПолучитьФорму("Обработка.УниверсальныйВыбор.Форма.ФормаВыбора");
ФормаВыбора.ТаблицаДляВыбора = ТЗ; // ТЗ - наша таблица значений
ВыбраннаяСтрока = ФормаВыбора.ОткрытьМодально();

Если ВыбраннаяСтрока <> Неопределено Тогда
    // Обработка результата
КонецЕсли;

В самой форме выбора нам нужно обработать событие Выбор табличного поля. Посмотрим на реализацию внутри формы:


Процедура ТабличноеПолеВыбор(Элемент, ВыбраннаяСтрока, Колонка, СтандартнаяОбработка)
    СтандартнаяОбработка = Ложь;
    Закрыть(ВыбраннаяСтрока); // Возвращаем выбранную строку ТЗ
КонецПроцедуры

Решение №2: Особенности работы в Управляемых формах (8.3)

В управляемом приложении работа с таблицей значений на клиенте ограничена. Вы не можете просто передать объект ТаблицаЗначений с сервера на клиент. Проанализируем современный подход:

  1. Помещение во временное хранилище. Сформированную таблицу на сервере мы помещаем в хранилище с помощью метода ПоместитьВоВременноеХранилище(ТЗ, ЭтаФорма.УникальныйИдентификатор).
  2. Передача адреса. В форму выбора передается только адрес (строка).
  3. Отображение. В форме выбора на сервере (в обработчике ПриСозданииНаСервере) мы получаем таблицу обратно: ЗначениеИзХранилища(Адрес) и загружаем её в реквизит формы типа ТаблицаЗначений методом ЗначениеВРеквизитФормы.

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

Решение №3: Использование Списка Значений (СписокЗначений)

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

Этот объект имеет метод ВыбратьЭлемент(). Визуально это окно выглядит аккуратнее, и оно автоматически подстраивается под содержимое. Рассмотрим пример реализации:


Список = Новый СписокЗначений;
Список.ЗагрузитьЗначения(ТЗ.ВыгрузитьКолонку("Наименование"));
ВыбранныйЭлемент = Список.ВыбратьЭлемент("Выберите значение из списка");

Если ВыбранныйЭлемент <> Неопределено Тогда
    Значение = ВыбранныйЭлемент.Значение;
КонецЕсли;

Продвинутые методы: Построитель отчета и Редактор ТЗ

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

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

Рекомендации по выбору способа

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

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

← На главную