Содержание:
1. Виртуальная таблица в запросе
4. Порядок и Итоги в конструкторе запросов в 1С
1. Виртуальная таблица в запросе
Заказчику требовалось получить данные сразу из нескольких таблиц с массивом информации. Рассмотрим в данной статье какие закладки для этого потребовались.
Для решения задачи переходим в конструктор запроса в 1С (через кнопку «с обработкой результата»), выбираем «Запрос пакета2». Добавляем в запрос виртуальную таблицу СвободныеОстаткиОстатки, из которой выведем поле ВНаличииОстаток.
При использовании виртуальных таблиц в 1С активируется новая иконка, это означает, что в нее нужно заглянуть и задуматься, нужно ли тут что-нибудь сделать.
Новая иконка в виртуальных таблицах в 1С
Иконка называется «Параметры виртуальной таблицы».
Параметр «Период» - это дата, на которую мы получаем остатки, если оно не заполнено, будут выведены актуальные остатки. Мы его заполним параметром «&МоментВремени».
Проваливаемся в поле «Условие». Тут мы можем наложить отбор, который сократит выводимую в запрос виртуальную таблицу еще до запуска запроса, что существенно облегчит задачу платформе при обработке запроса. Мы хотим, чтобы в запрос прилетели остатки только по номенклатуре из табличной части моего документа.
Сделаем так- выбираем отбор по номенклатуре, условие «В» (потому что номенклатур может быть не одна), затем ставим две скобочки и пробел между ними, кликаем правой мышкой и система предлагает нам перейти в еще один конструктор запроса в 1С – переходим.
Новый конструктор запросов в 1С
Здесь нам пригодилась припасенная временная таблица запроса, выбираем из нее номенклатуру. Теперь номенклатура в виртуальной таблице остатков будет ограничена списком номенклатуры из временной таблицы запроса, которая создана нами из реальной таблицы «Табличная часть документа реализация». Вот так в одной картинке мы подружили три понятия из языка запросов. Закрываем конструктор запроса. Отбор получился вот такой.
Отбор конструктора запросов в 1С
Чтобы данные не вывелись «сами по себе», когда в запросе участвуют несколько таблиц, таблицы нужно связать по ключевым полям. Иногда конструктор запросов в 1С автоматически настраивает связь, но ее в любом случае стоит проверить. В нашем примере свяжем по «Номенклатуре».
2. Связи и левое соединение
Обратите внимание, после добавления второй таблицы в запрос, в конструкторе появилась новая закладка «Связи».
Закладка Связи в конструкторе запросов в 1С
Переходим на эту закладку, настраиваем связь. Связи – это отдельная обширная тема, уровень понимания которой прямо влияет на сложность доступных Вам запросов. В нашем примере мы выведем все поля временной таблицы товаров (об этом свидетельствует установленная галка) и привяжем к ней поля, «которые подойдут по условию связи» из виртуальной таблицы остатков (об этом свидетельствует отсутствующая галка). Условие выберем равенство полей «Номенклатура» в обеих таблицах.
Связь «все поля к полям, которые подойдут» называется левое соединение.
Связи – левые соединения
Связи настроили, нажимаем «Ок», проверяем результат.
В запросе появилась виртуальная таблица остатков с параметрами и связь (Левое соединение), а еще конструктор объявил второй параметр «Момент времени» в коде.
Виртуальная таблица остатков с левым соединением
Добавим в запрос еще два важных штриха. Мы получили табличную часть товаров и прикрутили остатки к ней. Запрос сейчас работает так, что если в документе будут дубли товаров, то остатки по данным позициям будут задвоены и данные, соответственно получатся некорректными. Схлопнем дубли при помощи группировки.
Проваливаемся в конструктор запросов в 1С, (в первый запрос «ВТ_Товары») открываем закладку «Группировка», группируем по номенклатуре. Количество и сумму просуммируем, а цену суммировать нелогично, выведем среднюю, предполагая, что цена с одном документе одна.
Группировка в конструкторе запроса в 1С
3. Проверка на NULL
От дублей избавились, но представим еще такой случай. Товар в документе может быть, а вот остатков, но нему может и не быть. В этом случае запрос выдаст значение NULL в поле остатка. Если предполагается, что результаты запроса будут как-то дальше обрабатываться, то такое поле может дать ошибку. Чтобы этого избежать есть специальная функция, которую мы сейчас найдем в конструкторе.
Переходим на закладку «Таблицы и поля», топаем на поле остатков номенклатуры и проваливаемся в него через «карандашик».
Путь через остатки номенклатуры
В этом редакторе полей представлен большой выбор выражений, при помощи которых можно «доработать» выбранное поле. Мы воспользуемся функцией ЕСТЬNULL, которая подменит значение NULL на указанное нами значение, мы указали «0». Проверка на NULL готова, нажимаем ОК.
Доработка поля в редакторе полей
Данный редактор полей может затереть имя поля и превратить его в «Поле1», если мы до этого не сохраняли запрос. Это не всегда имеет значение, но мы на всякий случай проверим это на закладке «Объединения псевдонимы». Имя поля, это то, что в тексте запроса пишется после слова «КАК».
Объединения псевдонимы в конструкторе запросов в 1С
Тут вы можете самостоятельно назвать поле, также эта закладка используется для сопоставления полей при объединении запросов.
Запрос готов, проверяем результат.
Готовый запрос из конструктора запросов в 1С
В первом запросе появилась группировка, а во втором проверка на NULL и новое имя поля.
4. Порядок и Итоги в конструкторе запросов в 1С
Осталось рассмотреть Порядок и Итоги. Провалитесь в конструктор запросов в 1С через «обработку результата» и на закладке «Порядок» отсортируем данные по номенклатуре. Тут есть только один нюанс. Если Вы сортируете числовые поля, то все просто, сортировка будет чётко работать, но если вы хотите отсортировать ссылочное поле, например, Номенклатуру, то сортировка даст странный результат, т.к. по умолчанию упорядочивание идет по ссылке (ГУИДу номенклатуры, это такое странное, длинное сочетание букв и цифр 57bc05ab-fd1a-11e8-80cb-00155dfd940d, который можно иногда видеть, когда попадаются «битые ссылки»), так вот сортировка по этому ГУИДу никак не даст нужного результата. Поэтому при сортировке ссылочных полей нужно устанавливать флаг «Авто упорядочивание», в этом случае будет сортировка по основному представлению, ну и чтобы уж совсем закрыть вопрос, убедитесь, что основное представление номенклатуры именно наименование, а не код.
Итак, включили сортировку по номенклатуре.
Сортировка по номенклатуре в конструкторе запросов в 1С
Теперь добавим в итоговую таблицу поле «Характеристика» из таблицы остатков, проверку на NULL удобнее вставить прямо в тексте, просто скопировав из соседнего поля.
Конструктор запросов в 1С с обработкой результатов
Вставка проверки на NULL
На закладке «Итоги» добавим Итоговое поле по количеству номенклатуры. Обратите внимание, в выпадающем окне представлен список стандартных функций, а если провалиться по точкам, то Вы сможете написать более сложное выражение при помощи встроенных операторов и функций.
Стандартные функции в конструкторе запросов в 1С
Нажимаем «Ок» и проанализируем результат.
Запрос изменился, появилась сортировка и итоги, но кроме этого снова изменился код. В готовой выборке итоговое поле создает отдельную группировку, Вы можете самостоятельно посмотреть, как она выглядит в консоли запросов или в СКД. В данной статье я намеренно не отвлекаюсь на результат запроса, чтобы сфокусироваться именно на том что делает конструктор. Так вот конструктор запросов в 1С понимает, что выборка с появлением итогов изменилась, поэтому меняется и код, обрабатывающий результат запроса.
Теперь алгоритм обходит результат по группировкам двумя вложенными циклами. Выборка по номенклатуре (это группировочное поле), тут мы получаем итоги, затем проваливаемся в детальные записи и обходим остатки по характеристикам. Конструктор сделал за нас большой кусок работы осталось прописать необходимый нам алгоритм в предложенную заготовку.
Алгоритм, прописанный конструктором запросов в 1С
Таким образом на обзоре нехитрого запроса мы рассмотрели основные и наиболее часто встречаемые функции конструктора запросов в 1С и обсудили практические нюансы, связанные с обработкой массивов информации.
Специалист компании «Кодерлайн»
Дмитрий Доронов