В процессе разработки на платформе 1С:Предприятие 8.3 часто возникают задачи, связанные с ограничением выбора данных для пользователя и эффективной передачей информации между программными интерфейсами. В этой статье мы разберем две важные темы: как установить фильтр для выбора значения константы и как правильно передать таблицу значений из одной формы в другую, учитывая особенности клиент-серверной архитектуры.
Рассмотрим ситуацию, когда в конфигурации созданы две константы: ТипЦеныЗакупки и ТипЦеныПродажи. Обе они ссылаются на справочник ТипЦен. Нам необходимо сделать так, чтобы при выборе значения для закупки отображались только те элементы, у которых установлен флаг ЦенаЗакупки.
Важно понимать ограничение метаданных: в отличие от реквизитов справочников, напрямую в объекте Константа задать Параметры выбора нельзя. Это ограничение обходится на уровне интерфейса.
Способ 1. Настройка в свойствах поля формы
Самый простой вариант — создать общую форму для настройки констант и установить отбор непосредственно в свойствах элемента управления:
ТипЦеныЗакупки.Отбор.ЦенаЗакупки, а в поле Значение установим Истина.Способ 2. Программная установка отбора
Если логика должна быть более гибкой, мы можем использовать событие НачалоВыбора. Разберем программный способ реализации:
&НаКлиенте
Процедура ТипЦеныЗакупкиНачалоВыбора(Элемент, ДанныеВыбора, СтандартнаяОбработка)
СтандартнаяОбработка = Ложь;
ПараметрыОтбора = Новый Структура;
ПараметрыОтбора.Вставить("ЦенаЗакупки", Истина);
ПараметрыФормы = Новый Структура;
ПараметрыФормы.Вставить("Отбор", ПараметрыОтбора);
ОткрытьФорму("Справочник.ТипЦен.ФормаВыбора", ПараметрыФормы, Элемент);
КонецПроцедуры
В данном примере мы отключаем стандартную обработку и вызываем форму выбора вручную, передавая в неё структуру отбора. Это позволяет динамически управлять списком доступных элементов.
Вторая проблема, с которой часто сталкиваются разработчики — передача таблицы значений (ТЗ) между формами. Сложность заключается в том, что объект ТаблицаЗначений существует только на сервере, а метод ОткрытьФорму работает исключительно на клиенте. Напрямую передать ТЗ в параметрах формы невозможно.
Вариант 1. Преобразование в массив структур
Проанализируем принцип работы клиент-серверного взаимодействия. Чтобы передать данные, их нужно «сериализовать» в типы, доступные на клиенте (Массив, Структура).
Рассмотрим пример подготовки данных на сервере и их передачи:
// На сервере преобразуем ТЗ в массив структур
&НаСервере
Функция ПодготовитьДанныеДляПередачи(ТаблицаИсточник)
МассивРезультат = Новый Массив;
Для Каждого СтрокаТЗ Из ТаблицаИсточник Цикл
НоваяСтруктура = Новый Структура;
// Заполняем структуру данными из колонок ТЗ
Для Каждого Колонка Из ТаблицаИсточник.Колонки Цикл
НоваяСтруктура.Вставить(Колонка.Имя, СтрокаТЗ[Колонка.Имя]);
КонецЦикла;
МассивРезультат.Добавить(НоваяСтруктура);
КонецЦикла;
Возврат МассивРезультат;
КонецФункции
// На клиенте вызываем форму
&НаКлиенте
Процедура ПередатьДанные(Команда)
МассивДанных = ПодготовитьДанныеДляПередачи(МояТаблица);
ПараметрыОткрытия = Новый Структура("ДанныеТаблицы", МассивДанных);
ОткрытьФорму("ВнешняяОбработка.МояОбработка.Форма.ВспомогательнаяФорма", ПараметрыОткрытия);
КонецПроцедуры
Вариант 2. Использование временного хранилища
Выясним, как сделать передачу более производительной. Если таблица большая, преобразование в массив структур может замедлить работу. В этом случае правильнее использовать Временное хранилище.
ПоместитьВоВременноеХранилище.ПриСозданииНаСервере, получаем данные методом ПолучитьИзВременногоХранилища.ДанныеФормыКоллекция) с помощью метода ЗначениеВДанныеФормы.Вариант 3. Работа с возвратом результата
Если нам нужно не просто передать данные «туда», но и получить результат обратно, проанализируем использование ОписаниеОповещения. Посмотрим на пример вызова формы выбора:
&НаКлиенте
Процедура ВыполнитьВыбор(Команда)
Оповещение = Новый ОписаниеОповещения("РезультатВыбораЗавершение", ЭтотОбъект);
ПараметрыФормы = Новый Структура("МножественныйВыбор", Истина);
ОткрытьФорму("Справочник.ТипЦен.ФормаВыбора", ПараметрыФормы, , , , , Оповещение);
КонецПроцедуры
&НаКлиенте
Процедура РезультатВыбораЗавершение(Результат, ДополнительныеПараметры) Экспорт
Если Результат <> Неопределено Тогда
// Обработка полученных данных
КонецЕсли;
КонецПроцедуры
Этот подход соответствует современным стандартам разработки (асинхронность и отказ от модальности), обеспечивая стабильную работу конфигурации в веб-клиенте и тонком клиенте.
Подводя итог, можно сказать: для простых отборов в константах используйте свойства элементов формы, а для передачи сложных структур данных между формами выбирайте между массивом структур (для небольших данных) и временным хранилищем (для больших таблиц значений). Это обеспечит чистоту кода и высокую скорость работы интерфейса.