Приветствуем вас, коллеги! Сегодня мы с вами глубоко погрузимся в одну из распространенных задач при разработке на платформе 1С:Предприятие – организацию выбора документов или элементов справочника с предварительным отбором, когда стандартная кнопка "Показать все" на форме оказывается недоступной. Давайте вместе разберемся, почему это происходит и как правильно реализовать этот функционал, чтобы система работала эффективно и предсказуемо.
Когда кнопка "Показать все" на управляемой форме 1С становится недоступной, это часто указывает на то, что форма используется в режиме выбора или на нее уже применен какой-либо отбор, который не позволяет сбросить все фильтры стандартным способом. В контексте нашей задачи, где речь идет о выборе документов, проблема усугубляется возможной неверной реализацией механизма выбора.
Мы проанализируем ситуацию, выясним причину такого поведения и рассмотрим несколько подходов к решению проблемы, отталкиваясь от рекомендаций фирмы "1С" и практического опыта.
Прежде чем перейти к решениям, давайте четко определимся с понятиями ФормаСписка и ФормаВыбора в управляемых формах 1С.
Форма списка предназначена для просмотра и работы со всем набором данных объекта (например, справочника или документа). Ее основная задача – предоставить пользователю полный обзор данных и инструменты для их редактирования.
Форма выбора, напротив, предназначена для выбора одного или нескольких элементов из списка с целью их подстановки в другое место (например, в поле табличной части или реквизит формы). Ее функционал ограничен задачей выбора.
Платформа 1С может автоматически генерировать форму выбора, если для объекта не создана отдельная форма выбора, но, как мы выясним, это не всегда оптимально с точки зрения производительности и удобства.
Важный момент: Свойство РежимВыбора
Свойство РежимВыбора у управляемой формы задается в конфигураторе и нельзя изменить программно в режиме 1С:Предприятие. Если форма была открыта как форма списка, она останется формой списка, даже если мы попытаемся изменить это свойство через встроенный язык. Это означает, что мы не можем "на лету" превратить форму списка в форму выбора простым изменением свойства.
Кнопка "Показать все" предназначена для сброса всех текущих отборов и фильтров на форме списка, возвращая ее к полному отображению данных. Когда форма открывается в режиме выбора или с уже примененным программным отбором (например, через параметры открытия), система предполагает, что пользователь работает с ограниченным набором данных, и возможность сбросить этот отбор может быть нежелательной или даже некорректной для текущего сценария. Отсюда и недоступность кнопки.
Теперь, когда мы понимаем природу проблемы, давайте рассмотрим варианты ее решения.
Этот подход часто используется, когда для объекта не создана отдельная ФормаВыбора, и мы хотим использовать существующую ФормаСписка, но в режиме выбора и с предварительно заданным отбором. Мы разберем его по шагам.
Шаг 1: Формирование отбора
Прежде чем открыть форму, нам необходимо сформировать структуру отбора, которую мы передадим в качестве параметра. Отбор представляет собой коллекцию элементов, где каждый элемент задает поле, вид сравнения и значение.
Обратите внимание: если вы хотите отобрать документы по списку значений (например, по нескольким видам документов или по списку контрагентов), используйте ВидСравненияКомпоновкиДанных.ВСписке вместо ВидСравненияКомпоновкиДанных.Равно. Это распространенная ошибка, которая может привести к некорректному отбору или его полному отсутствию.
// Пример формирования отбора
Перем ОтборДокументов;
ОтборДокументов = Новый Структура;
// Отбор по виду документа
ОтборДокументов.Вставить("ВидДокумента", "РасходнаяНакладная"); // Или используйте перечисление
// Если нужно отобрать по нескольким видам
// ОтборДокументов.Вставить("ВидДокумента", Новый СписокЗначений());
// ОтборДокументов.ВидДокумента.Добавить("РасходнаяНакладная");
// ОтборДокументов.ВидДокумента.Добавить("ПриходнаяНакладная");
// Отбор по контрагенту
ОтборДокументов.Вставить("Контрагент", МойОбъект.Контрагент);
// Отбор по дате (например, документы за текущий месяц)
ОтборДокументов.Вставить("Дата", НачалоМесяца(ТекущаяДата()));
ОтборДокументов.Вставить("ДатаКонец", КонецМесяца(ТекущаяДата())); // Для диапазона дат
Шаг 2: Открытие формы списка в режиме выбора
Для открытия формы мы используем метод ОткрытьФорму(), передавая в него имя формы, параметры открытия и обработчик выбора. Ключевым параметром здесь является РежимОткрытияФормы.Выбор.
// Создаем параметры открытия формы
Перем ПараметрыОткрытия;
ПараметрыОткрытия = Новый Структура;
ПараметрыОткрытия.Вставить("Отбор", ОтборДокументов);
ПараметрыОткрытия.Вставить("РежимОткрытияФормы", РежимОткрытияФормы.Выбор);
// Можно добавить и другие параметры, например, для начального значения
// ПараметрыОткрытия.Вставить("Значение", МойОбъект.ДокументОснование);
// Определяем имя формы списка, которую хотим открыть
Перем ИмяФормыСписка;
ИмяФормыСписка = "Документ.РеализацияТоваровУслуг.Форма.ФормаСписка"; // Замените на вашу форму
// Открываем форму
ОткрытьФорму(ИмяФормыСписка, ПараметрыОткрытия, ЭтотОбъект, "МояУникальнаяСтрокаДляОбработчика");
Шаг 3: Обработка выбора
После того как пользователь выберет документ на открытой форме, необходимо обработать этот выбор. Для этого в вызывающей форме (в нашем случае, ЭтотОбъект) должен быть метод ОбработкаВыбора().
На форме выбора (которую мы открыли) для возврата значения используется метод ОповеститьОВыборе(). Этот метод передает выбранное значение обратно в вызывающую форму.
// В модуле формы, откуда вызывалась форма выбора
Процедура ОбработкаВыбора(ВыбранноеЗначение, ИсточникВыбора)
Если ИсточникВыбора = "МояУникальнаяСтрокаДляОбработчика" Тогда
Если ВыбранноеЗначение <> Неопределено Тогда
// Здесь обрабатываем выбранное значение
// Например, присваиваем его реквизиту формы
МойОбъект.ВыбранныйДокумент = ВыбранноеЗначение;
КонецЕсли;
КонецЕсли;
КонецПроцедуры
// Пример кода на форме выбора, который вызывается при выборе
// Например, в обработчике события списка "ПриВыборе" или при нажатии кнопки "Выбрать"
// Перем ВыбранныйЭлемент; // Получаем его из текущей строки списка
// ОповеститьОВыборе(ВыбранныйЭлемент);
Преимущества этого подхода:
Недостатки:
Фирма "1С" настоятельно рекомендует использовать разные формы для списка и для выбора. Это связано с методологией работы платформы и вопросами производительности. Мы рассмотрим этот подход как лучшую практику.
Шаг 1: Создание новой управляемой формы выбора
В конфигураторе для вашего объекта (например, документа "РеализацияТоваровУслуг") создайте новую управляемую форму. Назовите ее, например, "ФормаВыбораДокументов" или "ФормаВыбора".
Шаг 2: Настройка свойства РежимВыбора
В палитре свойств новой формы установите свойство РежимВыбора в значение Истина. Это ключевой шаг, который делает форму именно формой выбора.
Шаг 3: Разработка интерфейса формы выбора
На эту форму вы можете добавить все необходимые элементы управления:
Шаг 4: Реализация отбора и обработчика выбора
На этой форме вы можете программно установить отбор при открытии, а также реализовать логику кнопки "Выбрать", которая будет вызывать ОповеститьОВыборе().
// Пример кода в модуле формы выбора (при открытии)
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
Если Параметры.Свойство("Отбор") Тогда
// Применяем переданный отбор к списку формы
// Например, если основной реквизит формы - ДинамическийСписок
Для Каждого ЭлементОтбора Из Параметры.Отбор Цикл
Перем ЭлементДинамическогоСпискаОтбор;
ЭлементДинамическогоСпискаОтбор = Список.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
ЭлементДинамическогоСпискаОтбор.ЛевоеЗначение = Новый ПолеКомпоновкиДанных(ЭлементОтбора.Ключ);
ЭлементДинамическогоСпискаОтбор.ВидСравнения = ВидСравненияКомпоновкиДанных.Равно; // Или ВСписке
ЭлементДинамическогоСпискаОтбор.ПравоеЗначение = ЭлементОтбора.Значение;
ЭлементДинамическогоСпискаОтбор.Использование = Истина;
КонецЦикла;
КонецЕсли;
КонецПроцедуры
// Пример кода в модуле формы выбора (при нажатии кнопки "Выбрать" или двойном клике)
Процедура СписокПриАктивизацииСтроки(Элемент) // Или другая процедура
Если Элемент.ТекущиеДанные <> Неопределено Тогда
ОповеститьОВыборе(Элемент.ТекущиеДанные.Ссылка);
КонецЕсли;
КонецПроцедуры
Шаг 5: Вызов формы выбора
Вызов такой формы будет аналогичен предыдущему решению, но вместо ФормаСписка мы укажем имя нашей новой ФормаВыбора. Параметры отбора передаются точно так же.
// Создаем параметры открытия формы
Перем ПараметрыОткрытия;
ПараметрыОткрытия = Новый Структура;
ПараметрыОткрытия.Вставить("Отбор", ОтборДокументов); // Отбор, сформированный как в Решении 1
// Определяем имя нашей новой формы выбора
Перем ИмяФормыВыбора;
ИмяФормыВыбора = "Документ.РеализацияТоваровУслуг.Форма.ФормаВыбораДокументов"; // Наша новая форма
// Открываем форму
ОткрытьФорму(ИмяФормыВыбора, ПараметрыОткрытия, ЭтотОбъект, "МояУникальнаяСтрокаДляОбработчика");
Преимущества этого подхода:
Недостатки:
Мы с вами подробно рассмотрели проблему недоступности кнопки "Показать все" при организации выбора документов с отбором. Выяснили, что это связано с режимом открытия формы и наличием предварительных фильтров. Мы проанализировали два основных подхода к решению этой задачи:
Настоятельно рекомендуем использовать второй подход – создание отдельной формы выбора. Это соответствует методологии платформы 1С, обеспечивает лучшую производительность, гибкость и чистоту кода. Помните о правильном использовании ВидСравненияКомпоновкиДанных.ВСписке для множественного отбора и всегда передавайте параметры открытия формы через структуру.
Надеемся, что этот материал поможет вам эффективно решать задачи по выбору данных в 1С:Предприятие. Удачи в разработке!
← К списку