При разработке инструментов обмена данными часто возникает задача сделать обработку универсальной или хотя бы гибкой. Если изначально вы создали алгоритм, который жестко прописан под конкретный справочник, то следующим логичным шагом будет добавление возможности выбора объекта метаданных самим пользователем. В этой статье мы подробно разберем, как доработать форму обработки, реализовать логику выбора и правильно организовать выгрузку данных в формат XML, используя современные механизмы платформы 1С:Предприятие 8.3.
Самый распространенный и масштабируемый способ — это добавление на форму реквизита с типом Строка, который будет отображаться как поле выбора. Это позволит пользователю выбирать один из доступных справочников из выпадающего списка. Рассмотрим по шагам, как это реализовать.
Для начала создадим реквизит формы, назовем его, например, ИмяВыбранногоСправочника. В свойствах этого реквизита на форме установим флаг Режим выбора из списка. Проанализируем, как наполнить этот список. Мы можем сделать это вручную в конфигураторе, добавив строки с именами справочников, но более профессиональным подходом будет программное заполнение при открытии формы. Это гарантирует, что имена метаданных будут написаны без ошибок.
Разберем пример кода для заполнения списка выбора в модуле формы:
&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
// Очищаем и заполняем список выбора программно
ЭлементСписка = ЭтаФорма.Элементы.ИмяВыбранногоСправочника.СписокВыбора;
ЭлементСписка.Очистить();
// Добавляем конкретные справочники, с которыми работает обработка
ЭлементСписка.Добавить("Клиенты", "Справочник 'Контрагенты'");
ЭлементСписка.Добавить("Номенклатура", "Справочник 'Товары'");
КонецПроцедуры
В данном примере первым параметром метода Добавить передается реальное имя справочника в метаданных (Имя), а вторым — синоним, который увидит пользователь. Это важный момент: в коде мы будем оперировать строкой "Клиенты", а пользователь будет видеть понятное название.
Если справочников всего два (как в исходном вопросе), можно использовать переключатели. Это делает интерфейс более наглядным, так как все варианты выбора видны сразу. В 1С это реализуется через один реквизит числового типа (например, ТипВыгрузки), где значение 0 соответствует первому справочнику, а значение 1 — второму.
Рассмотрим настройку элементов формы для этого случая:
ВыбранныйВариант с типом Число.0, у второго — 1.Такой подход избавляет пользователя от лишних кликов для открытия выпадающего списка.
Когда пользователь выбрал объект, нам нужно программно сформировать запрос к базе данных. Вместо того чтобы писать отдельные условия Если... ИначеЕсли... для каждого справочника, мы применим метод подстановки имени таблицы в текст запроса. Выясним, как это сделать безопасно.
Проанализируем пример функции выгрузки, использующей СтрШаблон для формирования текста запроса:
&НаСервере
Процедура ВыполнитьВыгрузкуНаСервере()
// Проверяем, выбрано ли значение
Если ПустаяСтрока(Объект.ИмяВыбранногоСправочника) Тогда
Сообщить("Пожалуйста, выберите справочник для выгрузки!");
Возврат;
КонецЕсли;
// Формируем текст запроса динамически
ТекстЗапроса = СтрШаблон("ВЫБРАТЬ * ИЗ Справочник.%1", Объект.ИмяВыбранногоСправочника);
Запрос = Новый Запрос(ТекстЗапроса);
РезультатЗапроса = Запрос.Выполнить();
// Подготовка файла XML
ЗаписьXML = Новый ЗаписьXML;
ПутьКФайлу = "C:\Export\data.xml"; // В реальной задаче путь также выбирается пользователем
ЗаписьXML.ОткрытьФайл(ПутьКФайлу);
ЗаписьXML.ЗаписатьОбъявлениеXML();
ЗаписьXML.ЗаписатьНачалоЭлемента("ДанныеВыгрузки");
// Используем СериализаторXDTO для записи объектов
Выборка = РезультатЗапроса.Выбрать();
Пока Выборка.Следующий() Цикл
ОбъектСправочника = Выборка.Ссылка.ПолучитьОбъект();
СериализаторXDTO.ЗаписатьXML(ЗаписьXML, ОбъектСправочника, НазначениеТипаXML.Явное);
КонецЦикла;
ЗаписьXML.ЗаписатьКонецЭлемента();
ЗаписьXML.Закрыть();
Сообщить("Выгрузка успешно завершена в файл: " + ПутьКФайлу);
КонецПроцедуры
Почему мы используем СериализаторXDTO? В отличие от простой записи таблицы значений через ФабрикаXDTO, сериализатор умеет корректно обрабатывать ссылки, дополнительные реквизиты и, что самое важное, табличные части справочников. Это делает выгрузку полной и пригодной для последующей загрузки в другую информационную базу.
Рассмотрим ситуацию, когда в справочнике не сто элементов, а сто тысяч. Если мы выполним РезультатЗапроса.Выгрузить(), платформа попытается поместить все данные в оперативную память в виде таблицы значений. Это может привести к значительному замедлению работы или даже аварийному завершению сеанса.
Чтобы избежать подобных проблем, мы используем последовательный обход выборки (Пока Выборка.Следующий() Цикл). В этом случае в памяти одновременно находится только один объект справочника. Для еще большей оптимизации в запросе стоит выбирать только нужные поля, а не использовать ВЫБРАТЬ *, если полная копия объекта не требуется.
Важно помнить, что в комплекте поставки платформы или в составе ИТС часто идет готовая обработка "Выгрузка и загрузка данных XML". Как было отмечено в обсуждении на форуме, она находится в каталоге EXE/EXTREPS/UNIREPS83/UploadToXML. Если ваша задача не является учебной и вам нужно быстро перенести данные, целесообразно использовать именно её. Она уже поддерживает:
При доработке вашей обработки не забудьте про несколько важных моментов, которые отличают качественный программный продукт:
ПравоДоступа("Чтение", Метаданные.Справочники[ИмяСправочника]).Файл для проверки существования директории.Состояние() для вывода прогресса в строку состояния или специальный индикатор на форме.Таким образом, мы выяснили, что задача выбора справочника решается сочетанием настройки элементов интерфейса (Поле выбора или Переключатель) и динамического формирования текста запроса на стороне сервера. Использование СериализаторXDTO делает код универсальным и надежным для работы с любыми типами справочников в системе 1С:Предприятие.