Собственные наработки и набитые шишки в моей практике по программированию в 1С.
Страницы
среда, 22 июня 2016 г.
Использование параметров связи. Ускоряем соединение наборов данных.
Добавляю в качестве заметочки по СКД, поскольку приходится делать не весьма часто и вспоминать как и где применял не очень просто. В итоге уходит время на поиски где это делал, а потом время на поиски, а как это сделать. И еще время опять-же проверить, правильно — ли сделал.
Так вот, для чего это надо:
Например есть несколько наборов данных. И вот как правило надо бы как-то использовтаь быстрый отбор из верхнего набора, но как. В СКД это вполне возможно.
Порой для получения определенного результата компоновки необходимо создать в СКД связи наборов данных. О том, когда это нужно и как это сделать мы и постараемся рассказать в нашей статье.
Схема компоновки данных, реализованная в 1С, поддерживает три типа источника данных (Рис.1)
Источники данных
Наиболее очевидным и часто используемым разработчиками источником данных является «Запрос».
Конструктор запросов, реализованный в 8 версии 1С очень удобен, и, в большинстве случаев, связать между собой несколько таблиц, сделать необходимые группировки и отборы можно прямо в нем.
В сложных случаях, когда требуется или целесообразней использовать выполнение некоторого кода (допустим, загрузка данных из стороннего файла) или когда нет возможности использовать запрос, на помощь приходит источник данных «Объект». Произвольный код, выполняемый в модуле, на выходе должен иметь некоторую структуру, к которой СКД сможет обратиться.
Третий источник данных «Объединение». Фактически, этот источник можно рассматривать как один из видов связи. Он объединяет (сводит в одну несколько таблиц), не сопоставляя, однако совпадение тех или иных полей. То есть, если в двух объединяемых таблицах 3 и 4 строки соответственно, то в результирующем источнике данных, будет 7 строк.
Постановка задачи
В качестве полигона для испытаний мы выберем базу УПП, версии 1.3.92.3, работающую в режиме обычного приложения.
Перед нами поставлена следующая задача: используя только СКД создать отчет, который бы выводил таблицу закупаемой номенклатуры из документа, с ценами, взятыми из файла, присланного контрагентом.
Таким образом, мы должны:
- Взять табличную часть документа поступления;
- Загрузить файл в источник данных «Объект»;
- Связать эти два источника по определенному параметру (в нашем случае это будет код);
- Вывести результирующую таблицу.
Процесс выполнения
Пройдем все перечисленные шаги:
- Создаем запрос к табличной части документа поступления (Рис.2)
- Создаем набор данных объект (Рис.3);
Здесь важно обратить внимание на «Имя объекта, содержащего данные», именно это имя нам придется указать в коде модуля отчета.
- Переходим в модуль отчета и создаем там процедуру «ПриКомпоновкеРезультата» (Рис.4);
Саму процедуру получения данных из внешнего файла мы описывать не будем, обратим внимание на ту часть кода, которая обязательно должна присутствовать в компоновке для того, чтобы мы могли получить данные для «Набора данных 2» (Рис.5).
Важно! При создании «Объекта» в коде процедуры при компоновке, значение параметра СтандартнаяОбработка должно быть Ложь.
Переходим на закладку «Связи наборов данных».
Связываем наборы
Заходим на соответствующую закладку схемы (Рис.6).
Мы видим табличную часть, которая очень похожа на табличную часть, которая есть в конструкторе запросов, за некоторым исключением. Для набора источника и набора приемника связи нельзя установить галочку «Все», зато добавлены несколько дополнительных колонок.
В связях наборов данных можно установить только связь, подобную внешнему левому соединению конструктора запроса.
Прежде, чем создать связь, давайте определимся с назначением колонок:
- Источник связи – первый набор данных, из которого возьмутся все имеющиеся значения;
- Приемник связи – набор данных, из которого выберутся значения, соответствующие нашему условию;
- Выражение источник – поле или выражение первого набора данных, по которому будет происходить сопоставление;
- Выражение приемник – поле или выражение зависимого набора;
- Параметр – если в этом поле указать имя параметра, то связь с набором – приемником будет осуществляться только по указанному в параметре значению;
- Список параметров – определяет возможность использования списка значений в качестве параметра;
- Условие связи – указав здесь выражение с использованием полей источника, можно создать условие, выполнение которого будет служить сигналом к установлению связи;
- Начальное значение – показывает начальное значение связи;
- Обязательная связь – определяет, задействованы ли поля, используемые в источнике (установлено ЛОЖЬ) или в приемнике (установлено ИСТИНА) и на основании этого добавляет связь в макет.
- В качестве источника связи будет выступать результат нашего запроса;
- В качестве приемника будет выступать объект;
- Выражение источник будет «НоменклатураКод»;
- Выражение приемник «Номенклатура»;
- Связь будет обязательной (Рис.7).
Если бы мы в качестве условия связи указали наименование какой-либо номенклатуры, или её вид воспроизводства или еще что-то, мы могли бы получить более точную выборку для нашей задачи. Результат наших действий можно увидеть на рис.8
Для двух нижних строк отчета в файле с ценами не нашлось соответствия.
В некоторых отчетах требуется получать данные из нескольких наборов, при этом связь между наборами данных требуется выполнять по периодам. В данной статье описывается, каким образом можно сделать такой отчет при помощи системы компоновки данных.
Допустим, нам требуется выдать в отчет данные по остаткам товаров на складах по месяцам и для каждого месяца для каждого товара выдать объем продаж по товарам за этот период.
Для реализации такого отчета создадим два набора данных:
1. Набор данных с остатками по периодам.
2. Набор данных с продажами товаров за период.
Для того чтобы получить остатки по товарам по периодам, воспользуемся виртуальной таблицей ОстаткиИОбороты регистра накопления:
Продажи за период можно получить при помощи виртуальной таблицы Обороты регистра накопления:
Так как система компоновки данных позволяет выполнять связь между наборами данных только по их полям, нам нужно обеспечить в обоих наборах данных поля начала и конца периода. Для этого переделаем запросы наборов данных следующим образом:
Набор данных остатков:
Набор данных продаж:
Теперь мы имеем возможность связать эти наборы данных друг с другом по полям — периодам.
Из описания связей видно, что для записей набора данных Остатки будут получаться записи набора данных ПродажиЗаПериод для нужного периода и нужных товаров. При этом значения полей НачалоПериода и КонецПериода набора данных Остатки будет использоваться в качестве значений параметров виртуальной таблицы Обороты .