Предистория: 1С:Комплексная автоматизация, добавлена собственная подсистема обмена с внешней WMS-системой (аутсорсинг складских услуг); одним из распоряжением на отгрузку со склада на аутсорсе является расходный ордер на товары. Обмен с внешней системой протоколируется.
Общая постановка задачи: в форму управления отгрузками товаров с ордерных складов добавить дополнительные колонки (внешний статус отгрузки, наличие проблем обмена информацией, визуализация статуса обмена в виде пиктограммы и т.д.).
В целом задача сводится к 2 этапам:
- Подготовка запроса получения данных по внешней WMS-системе
- Объединение типового запроса динамического списка с запросом из п.1
Пункт первый в целом в рамках данной статьи не интересен: текст подготовлен в обычном конструкторе запросов и возвращается функцией общего модуля. Данные запроса помещаются во временную таблицу ВТ_ДанныеWMS
А вот пункт 2 - то, что нам нужно! Если мы будем работать с текстом запроса как с текстом, а не как с объектом, то мы столкнемся со следующими проблемами:
- При обновлении конфигурации с большей долей вероятности столкнемся с тем, что типовой запрос динамического списка будет изменен и это потребует внесение изменений.
- Если мы захотим объединить запросы, сохранив типовой, то нам потребуется придумать и написать некий парсер текста, чтобы "точечно" вставить нужные конструкции.
- Проблемы варианта "для ленивых" - в конструкторе запросов составить итоговый запрос динамического списка - рассматривать даже не будем)
Давайте посмотрим, что можно сделать, используя схему запроса. Контекст процедуры:
Форма - Обработка.УправлениеОтгрузкой.Форма.Форма
Первый этап - "склейка" текстов запросов и инициализация объекта СхемаЗапроса
ТекстЗапроса = Форма.ОрдераВРаботе.ТекстЗапроса;
ТекстЗапроса = wms_ИнтеграцияСервер.ЗапросВТ_ДанныеОрдераWMS() + ТекстЗапроса;
СхемаЗапроса = Новый СхемаЗапроса;
СхемаЗапроса.УстановитьТекстЗапроса(ТекстЗапроса);
В запросе ЗапросВТ_ДанныеОрдераWMS в последнем пакете идет помещение данных во временную таблицу ВТ_ДанныеWMS. Ссылка на расходный ордер в данной ВТ находится в поле с псевдонимом Документ. Последний пакет итогового запроса - это непосредственно данные для вывода в форму отгрузки. Нам остается связать виртуальную таблицу с основным источником данных списка ордеров в работе и добавить в выбранные поля необходимые данные.
У динамического списка назначена основная таблица - ЖурналДокументов.СкладскиеОрдера. Настраиваем связь между таблицами:
// получаем общее количество пакетов
КоличествоПакетов = СхемаЗапроса.ПакетЗапросов.Количество();
// получаем итоговый пакет запроса, который и будем модифицировать
ИтоговыйПакет = СхемаЗапроса.ПакетЗапросов[КоличествоПакетов-1];
ЗапросВыборка = ИтоговыйПакет.Операторы[0];
// В первоого качестве источника связи выбираем временную таблицу ВТ_ДанныеWMS
ИсточникДанныеWMS = ЗапросВыборка.Источники.Добавить("ВТ_ДанныеWMS", "ВТ_ДанныеWMS");
// В качестве "таблицы-приемника" связи выбираем таблицу с основными данными
ПриемникСвязи = ЗапросВыборка.Источники.НайтиПоИмени("ЖурналДокументов.СкладскиеОрдера");
// Создаем соединение
ИсточникДанныеWMS.Соединения.Добавить(ПриемникСвязи);
// задаем условие связи
ИсточникДанныеWMS.Соединения[0].Условие = Новый ВыражениеСхемыЗапроса(ПриемникСвязи.Источник.Псевдоним+".Ссылка = ВТ_ДанныеWMS.Документ");
// и устанавливаем тип соединения
ИсточникДанныеWMS.Соединения[0].ТипСоединения = ТипСоединенияСхемыЗапроса.ПравоеВнешнее;
В данном примере специально оставил
ИсточникДанныеWMS.Соединения.Добавить(ПриемникСвязи);
чтобы можно было показать, как изменить тип соединения. По умолчанию устанавливается левое внешнее соединение. В приведенном примере, чтобы не изменять ТипСоединения можно было бы поменять источник и приемник связи местами:
ПриемникСвязи.Соединения.Добавить(ИсточникДанныеWMS);
Далее добавляем поля из временной таблицы ВТ_ДанныеWMS и назначаем им нужные псевдонимы. Например, добавим в выборку поле внешнего статуса WMS с псевдонимом СтатусWMS
ПолеСтатус = ЗапросВыборка.ВыбираемыеПоля.Добавить("ВТ_ДанныеWMS.СтатусWMS");
КолонкаПакета = ИтоговыйПакет.Колонки.Найти(ПолеСтатус);
КолонкаПакета.Псевдоним = "СтатусWMS";
Теперь остается переопределить текст запроса динамического списка:
Форма.ОрдераВРаботе.ТекстЗапроса = СхемаЗапроса.ПолучитьТекстЗапроса();