Как настроить отбор при выборе константы и передать таблицу значений между формами в 1С

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

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

Настройка отбора для констант при выборе значения

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

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

Способ 1. Настройка в свойствах поля формы

Самый простой вариант — создать общую форму для настройки констант и установить отбор непосредственно в свойствах элемента управления:

  1. Откроем форму, на которой размещено поле ввода константы.
  2. Выделим элемент формы (Поле ввода), связанный с константой ТипЦеныЗакупки.
  3. В палитре свойств найдем пункт Параметры выбора.
  4. Нажмем на кнопку выбора и добавим новый элемент отбора. В поле Имя параметра укажем Отбор.ЦенаЗакупки, а в поле Значение установим Истина.

Способ 2. Программная установка отбора

Если логика должна быть более гибкой, мы можем использовать событие НачалоВыбора. Разберем программный способ реализации:


&НаКлиенте
Процедура ТипЦеныЗакупкиНачалоВыбора(Элемент, ДанныеВыбора, СтандартнаяОбработка)
    
    СтандартнаяОбработка = Ложь;
    
    ПараметрыОтбора = Новый Структура;
    ПараметрыОтбора.Вставить("ЦенаЗакупки", Истина);
    
    ПараметрыФормы = Новый Структура;
    ПараметрыФормы.Вставить("Отбор", ПараметрыОтбора);
    
    ОткрытьФорму("Справочник.ТипЦен.ФормаВыбора", ПараметрыФормы, Элемент);
    
КонецПроцедуры

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

Передача таблицы значений между формами

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

Вариант 1. Преобразование в массив структур

Проанализируем принцип работы клиент-серверного взаимодействия. Чтобы передать данные, их нужно «сериализовать» в типы, доступные на клиенте (Массив, Структура).

Рассмотрим пример подготовки данных на сервере и их передачи:


// На сервере преобразуем ТЗ в массив структур
&НаСервере
Функция ПодготовитьДанныеДляПередачи(ТаблицаИсточник)
    МассивРезультат = Новый Массив;
    Для Каждого СтрокаТЗ Из ТаблицаИсточник Цикл
        НоваяСтруктура = Новый Структура;
        // Заполняем структуру данными из колонок ТЗ
        Для Каждого Колонка Из ТаблицаИсточник.Колонки Цикл
            НоваяСтруктура.Вставить(Колонка.Имя, СтрокаТЗ[Колонка.Имя]);
        КонецЦикла;
        МассивРезультат.Добавить(НоваяСтруктура);
    КонецЦикла;
    Возврат МассивРезультат;
КонецФункции

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

Вариант 2. Использование временного хранилища

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

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

Вариант 3. Работа с возвратом результата

Если нам нужно не просто передать данные «туда», но и получить результат обратно, проанализируем использование ОписаниеОповещения. Посмотрим на пример вызова формы выбора:


&НаКлиенте
Процедура ВыполнитьВыбор(Команда)
    
    Оповещение = Новый ОписаниеОповещения("РезультатВыбораЗавершение", ЭтотОбъект);
    
    ПараметрыФормы = Новый Структура("МножественныйВыбор", Истина);
    ОткрытьФорму("Справочник.ТипЦен.ФормаВыбора", ПараметрыФормы, , , , , Оповещение);
    
КонецПроцедуры

&НаКлиенте
Процедура РезультатВыбораЗавершение(Результат, ДополнительныеПараметры) Экспорт
    Если Результат <> Неопределено Тогда
        // Обработка полученных данных
    КонецЕсли;
КонецПроцедуры

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

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

← На главную