Разработка и оптимизация запросов в 1С:Предприятие 8.3. Модуль 2. Синтаксис текста запроса
На данной странице задавайте вопросы по материалам и практическим заданиям второго модуля курса «Разработка и оптимизация запросов в 1С:Предприятие 8.3».
Практические задания
К сожалению, у Вас недостаточно прав для дальнейшего просмотра.
Если Вы приобрели курс, но еще не активировали токен — пожалуйста, активируйте доступ по инструкциям, высланным на Ваш email после покупки.
Если Вы не залогинены на сайте — залогиньтесь, вернитесь на эту страницу и обновите ее.
Если Вы залогинены, у Вас активирован токен доступа, но Вы все равно видите эту запись — напишите нам на e-mail поддержки.
Комментарии / обсуждение (1 016):
Комментарии закрыты

6 видео 2 модуля:
Для ссылки сначала обращение к БД для вывода Ссылки, а потом еще обращение для вывода представления этой ссылки. Для получения виртуального поля Представление всего одно обращение, поэтому его и рекомендовано выводить в отчете?
Здравствуйте.
Да, вы всё верно поняли.
Такой запрос с методической точки зрения составлен неправильно?
РеализацияТоваров.Контрагент КАК Контрагент
ИЗ
Документ.РеализацияТоваров КАК РеализацияТоваров
ГДЕ
РеализацияТоваров.Товары.Номенклатура = &Номенклатура
Почему Вы именно так его написали? Ведь и верхний вариант работает
РеализацияТоваровТовары.Ссылка.Контрагент КАК Контрагент
ИЗ
Документ.РеализацияТоваров.Товары КАК РеализацияТоваровТовары
ГДЕ
РеализацияТоваровТовары.Номенклатура = &Номенклатура
Так как, если бы задача стояла еще и номенклатуру вывести, то он был бы составлен некорректно?
Добрый день!
Рабочие оба варианта, но второй более производительный. В первом варианте вы для каждого документа РеализацияТоваров выбираете данные из ТЧ Товары и затем накладываете фильтр на вложенный запрос. Во втором варианте вы сразу работаете непосредственно с таблицей ТЧ. Последний вариант быстрее. Если бы стояла задача вывести дополнительно номенклатуру, то запрос выглядел бы так:
РеализацияТоваровТовары.Ссылка.Контрагент КАК Контрагент,
РеализацияТоваровТовары.Номенклатура КАК Номенклатура
ИЗ
Документ.РеализацияТоваров.Товары КАК РеализацияТоваровТовары
ГДЕ
РеализацияТоваровТовары.Номенклатура = &Номенклатура
Добрый день!
Часто вижу, что разработчики помещают результат запроса в выборку, после чего обходят ее записи.
1) Использование выборки более производительнее, чем выгрузка результата запроса в таблицу значений и дальнейший ее обход в цикле? По логике это ведь равнозначные операции?
2) В каких ситуациях использовать выборку методически более правильно?
Касаемо ТЗ на ум приходит то, что она в основном служит для передачи ее параметром в другие процедуры\функции, а также загрузки тз в табличную часть, а с записями выборки логичнее работать сразу после получения ее из запроса, например, для создания новых элементов справочника или модификации старых, верно?
Добрый день!
1) По производительности это практически равнозначные операции. Только при работе с ТЗ это будет два действия — поместить и обойти, а при работе с выборкой результата запроса — только обойти.
2) Ну вы в принципе сами же и ответили на свой вопрос. ТЗ мы чаще используем, когда нужно «попридержать» данные для дальнейших каких-либо преобразований, передач и пр. Т.е. используем как промежуточное место хранения результата.
Обход же выборки предполагает, что мы поработали с записью выборки и больше она нам не нужна — идем дальше. Существует несколько разных способов обхода выборки – в линейном порядке, в иерархическом порядке или по группировкам. Таких возможностей нет у ТЗ. Эти возможности особенно интересны и полезны при разработке отчетов.
Добрый день
Сработает ли конструкция НЕ Договор.Заказ В (&СписокЗаказов) для пустых ссылок или нужно отдельно Договор.Заказ = Значение(Справочник.Заказы.ПустаяСсылка) или НЕ Договор.Заказ В (&СписокЗаказов). Спасибо
…
(текст комментария доступен только участникам Мастер-группы)
Добрый вечер, Василий
Может все же есть способ обращаться из конструктора запроса к значениям перечислений или предопределенным элементам конфигурации для добавление в функцию Значение()? Бывает что и запрос не свернуть и значение забудешь:-(
…
(текст комментария доступен только участникам Мастер-группы)
Добрый день! Подскажите, пожалуйста, как выделить сразу все документы продажи, чтобы, например, сделать все не проведенными?
…
(текст комментария доступен только участникам Мастер-группы)
После переопределения основного представления справочника «номенклатура», при обращении к этому справочнику и к любым полям, имеющим ссылку на этот справочник, вылезает ошибка «Преобразование значения к типу Число не может быть выполнено». С чем это связано и как исправить?
…
(текст комментария доступен только участникам Мастер-группы)
Добрый день! Почему в УПОРЯДОЧИТЬ ПО, когда задаешь поле Цена, все прекрасно упорядочивается, а вот по полю Товар никак не хочет, скрины прилагаю!
…
(текст комментария доступен только участникам Мастер-группы)
Ок! Спасибо!
Применила АВТОУПОРЯДОЧИВАНИЕ на примере, где разбирала ключевое слово РАЗЛИЧНЫЕ, добавила АВТОУПОРЯДОЧИВАНИЕ и получила нужный результат, товары в алфавитном порядке, слово РАЗЛИЧНЫЕ убрала, чтобы видеть сметану по 48 руб, в повторяющихся строках. Еще раз, спасибо!
…
(текст комментария доступен только участникам Мастер-группы)
Здравствуйте.
После входа в «модельную» базу через несколько секунд выходит ошибка «обнаружено нарушение целостности системы».
Ниже тест, если нажать «показать информацию для технической поддержки»:
«Платформа: 1С:Предприятие 8.3 (8.3.13.1513)
Конфигурация: Профессиональная разработка запросов в 1С:Предприятие 8 (1.1)
Режим: Файловый (без сжатия)
Приложение: Толстый клиент
Локализация: Информационная база: русский (Россия), Сеанс: русский
Вариант интерфейса: Версия 8.2
Ошибки:
———————————————————————————
02.01.2019 22:40:14
Обнаружено нарушение целостности системы»
После этого предлагается закрыть или перезапустить. В базе нельзя работать. Подскажите, пожалуйста, что с этим делать?
…
(текст комментария доступен только участникам Мастер-группы)
Спасибо!
Во 2 задании 2 модуля использую такой текст запроса:
ВЫБРАТЬ ПЕРВЫЕ 1
ПоступлениеТоваровТовары.Номенклатура КАК Номенклатура,
ПоступлениеТоваровТовары.Цена КАК Цена
ИЗ
Документ.ПоступлениеТоваров.Товары КАК ПоступлениеТоваровТовары
ГДЕ
ПоступлениеТоваровТовары.Номенклатура = &Номенклатура
И ПоступлениеТоваровТовары.Ссылка.Проведен
УПОРЯДОЧИТЬ ПО
Цена УБЫВ
Он отличается от указанного в решении, где используется группировка и агрегатная функция.
Какой запрос оптимальнее и почему?
…
(текст комментария доступен только участникам Мастер-группы)
Понял. Просто я просмотрел сначала всё видео модуля, а только потом стал делать ДЗ.
Решал задачу про телефоны, записанные некорректно, решил иначе, чем приведено в курсе
(по опыту работы с базами..)
А можно ли более компактно написать такой шаблон?
Спасибо!
…
(текст комментария доступен только участникам Мастер-группы)
да уж.. спасибо!
Здравствуйте, Василий!
Возникло два вопроса по консоли запросов..
1) Почему-то в консоли запросов могу только вручную написать условие для цены. Это отличие версии или такой режим?
2) Есть ли какая-то настройка, чтобы попасть в документ из результатов запроса (расшифровка)?
…
(текст комментария доступен только участникам Мастер-группы)
Да, под тонкий клиент, оказывается. Спасибо!
Про ссылку тоже понял.
Проблема с правами доступа при установке флажка “Показывать план выполнения запроса”. Использую модельную базу для решения практических заданий, выложенную на этой странице. Снимок возникающего сообщения об ошибке прикреплен.
…
(текст комментария доступен только участникам Мастер-группы)
Захожу под администратором — других пользователей в модельной базе нет… Просмотрела все установленные галочки для роли ПолныеПрава. Как проверить права на запись в каталог, указанный на скриншоте, не знаю. Научите, пожалуйста.
Использую 1С:Предприятие 8.3, учебная версия (8.3.13.1644) и Модельную базу для решения практических заданий, приведенную на данной странице. Все настройки по умолчанию, ничего не меняла.
…
(текст комментария доступен только участникам Мастер-группы)
Спасибо!
Здравствуйте!
Сегодня скачала с сайта ИТС обработку КонсольЗапросов для запуска в 1С:Предприятие версии 8.3. (дата ее изменения 31.01.2018). При вызове Конструктора запроса из поля «Текст запроса: » возникает ошибка. К сожалению, моих знаний на данный момент времени недостаточно, чтобы самостоятельно понять как исправить эту ошибку. Помогите, пожалуйста. Снимок с текстом ошибки прилагается. Спасибо.
…
(текст комментария доступен только участникам Мастер-группы)
Спасибо огромное! Но возник следующий вопрос: в SQL Server Profiler все равно не удается получить один итоговый запрос, если в запросе 1С используется временные таблицы. Это уже по сути получается пакет запросов. Я так понимаю в этом случае и не получится получить запрос одним текстом как в 1С, а нужно из SQL Server Profiler вытаскивать создание каждой временной таблицы и конечный запрос, а потом выполнить их всех вместе в SQL Server Management Studio? Если это так, то подскажите по каким (хотя бы косвенным) признакам можно определить необходимые нам запросы, отделив их от служебных.
…
(текст комментария доступен только участникам Мастер-группы)
Здравствуйте!
Консоль запросов формирует следующий SQL-текст запроса:
SELECT
T1._IDRRef
FROM dbo._Reference16 T1
LEFT OUTER JOIN (SELECT
T5._Fld2794_TYPE AS Fld2794_TYPE,
T5._Fld2794_RTRef AS Fld2794_RTRef,
T5._Fld2794_RRRef AS Fld2794_RRRef,
T5._Fld2795RRef AS Fld2795RRef
FROM (SELECT
T4._Fld2794_TYPE AS Fld2794_TYPE,
T4._Fld2794_RTRef AS Fld2794_RTRef,
T4._Fld2794_RRRef AS Fld2794_RRRef,
T4._Fld2795RRef AS Fld2795RRef,
MAX(T4._Period) AS MAXPERIOD_
FROM dbo._InfoRg2793 T4
GROUP BY T4._Fld2794_TYPE,
T4._Fld2794_RTRef,
T4._Fld2794_RRRef,
T4._Fld2795RRef) T3
INNER JOIN dbo._InfoRg2793 T5
ON T3.Fld2794_TYPE = T5._Fld2794_TYPE AND T3.Fld2794_RTRef = T5._Fld2794_RTRef AND T3.Fld2794_RRRef = T5._Fld2794_RRRef AND T3.Fld2795RRef = T5._Fld2795RRef AND T3.MAXPERIOD_ = T5._Period) T2
LEFT OUTER JOIN dbo._Chrc280 T6
ON T2.Fld2795RRef = T6._IDRRef
ON ((0x08 = T2.Fld2794_TYPE AND 0x00000010 = T2.Fld2794_RTRef AND T1._IDRRef = T2.Fld2794_RRRef) AND (T6._Description = ?))
p_0: ‘контролер’
Этот запрос не выполняется в SQL Server Management Studio из-за того, что наименование свойства вынесено в самый низ запроса: p_0: ‘контролер’, а вместо него в тексте запроса стоит вопросительный знак. В чём причина такого формирования SQL-текста запроса? И есть ли способ получить SQL-текст запроса, который можно скопировать и без редактирования выполнить в SQL Server Management Studio (чтобы этот способ работал для запросов любой сложности)?
…
(текст комментария доступен только участникам Мастер-группы)
…
(текст комментария доступен только участникам Мастер-группы)
Василий, спасибо вам! Очень интересные лекции!
Про объектную модель запроса вообще впервые слышу. Теперь буду использовать.
Сформировала план запроса в конфигурации с включенным режимом совместимости с 8.2 и в конфигурации 8.3.11.
Воочию увидела, что теперь используется таблица итогов для среза последних!
А в 8.2 получался максимальный период из основной таблицы и присоединялся к основной таблице.
…
(текст комментария доступен только участникам Мастер-группы)
Вопрос по видео 11.
По какому алгоритму рассчитывается в запросе разность дат в днях?
Пробовала разное время задавать, так что получалось почти 1 день с секундой и почти 3 дня.
Например: 05.02.2018 0:00:01 и 07.02.2018 23:59:59; 05.02.2018 23:59:59 и 07.02.2018 0:00:01
Но результат все равно выдает 2 дня. Получается в данном случае часы и минуты вообще игнорируются? Во всех случаях результат:
РАЗНОСТЬДАТ(&Дата1, &Дата2, ДЕНЬ)=2
…
(текст комментария доступен только участникам Мастер-группы)
В задании 8 в качестве решения указано:
Мне кажется более универсально будет учесть вариант, когда в номер случайно вбили букву вместо цифры:
…
(текст комментария доступен только участникам Мастер-группы)
И еще вопрос. У меня база развернута из дт, приложенного к базе. Консоль запросов скачала с ИТС. Но в ней нет кнопочки выполнить, которую показывает ведущий. Почему? Прикладываю две картинки — как в видео и как у меня.
…
(текст комментария доступен только участникам Мастер-группы)
Спасибо!
Как будет более оптимально?
Или
Во втором случае не будет дополнительного соединения регистра с таблицей справочника? Или все равно будет?
…
(текст комментария доступен только участникам Мастер-группы)
Здравствуйте!
Хочу спросить, влияет ли порядок условий на скорость выполнения запроса? Например, на выборку документов нужно наложить 4 условия: ПометкаУдаления, Наименование (Подобно), а также два поля для которых значениями являются два массива допустимых значений (в первом массиве 2 значения; во втором 4). В каком порядке следует расположить эти условия, чтобы производительность была оптимальной????
…
(текст комментария доступен только участникам Мастер-группы)
Спасибо! А где можно поподробнее ознакомится с возможностями оптимизатора? Есть какая-то дополнительная информация?
…
(текст комментария доступен только участникам Мастер-группы)
Здравствуйте.
А почему для решения практического задания №5 берем регистр накопления именно виртуальная таблица Обороты, а не просто регистр Продажи? В чем их отличие?
…
(текст комментария доступен только участникам Мастер-группы)
Поняла, спасибо!
День добрый.
вопрос по работе с менеджером временных таблиц.
допустим в запросе1 мы создали временную таблицу — ВТ_Тест с полями номенклатура и количество. к запросу подключали менеджер ВТ.
далее, после выполнения запроса, создаем новый текст запроса, но хотелось бы обратиться к временной таблице ВТ_Тест, созданной в запросе1. Приходится вручную создавать описание временной таблицы с указанием наименования полей. А если в таблице десятки полей?
существует ли способ, позволяющий облегчить данный процесс?
…
(текст комментария доступен только участникам Мастер-группы)
Спасибо, нечто подобное применяется при варианте добавления табличной части объекта в запрос через параметр.
Сначала делаем обычный запрос к необходимым полям табличной части документа, после завершения работы конструктора, в тексте запроса ручками меняем имя ТЧ на &параметр в который и будем передавать нашу табличную часть. Заходим в конструктор запроса, помещаем все во временную таблицу..
…
(текст комментария доступен только участникам Мастер-группы)
День добрый.
1 Вопрос по конструкцию языка запросов «ВЫРАЗИТЬ».
Используется, чтобы привести поле «Документ» к некоторому определенному типу. Это позволит избежать соединений с лишними таблицами.
А как быть, если нужен не один определенный тип документа, а, например, два.
поступление и реализация?
2 Так же интересует вопрос: в параметрах виртуальной таблицы «ВЫРАЗИТЬ» дает прирост производительности? исключает лишние соединения?
…
(текст комментария доступен только участникам Мастер-группы)
Спасибо, Василий.
Как происходит сортировка табличных частей, если она не задана явно? Происходит ли сортировка по номеру строки или она может быть произвольной? Требуется ли указание явной сортировки по номеру строки, если в алгоритме требуется, чтобы строки были упорядочены? Есть ли описание этого момента где-то в документации?
…
(текст комментария доступен только участникам Мастер-группы)
А как можно объяснить то, что в подавляющем большинстве случаев строки оказываются в порядке номеров строк? Это какие-то особенности СУБД?
И еще вопрос не совсем по запросам, но может вы ответите. А в случае объектной работы с табличной частью порядок тоже может быть произвольным? Например в случае использования «ТабЧасть.Выгрузить()», «Для Каждого Строка Из ТабЧасть Цикл». Или здесь уже происходит неявная сортировка?
…
(текст комментария доступен только участникам Мастер-группы)
Василий, день добрый!
мы не проходили в курсе метод запроса ВыполнитьПакет()?
Может быть есть где ознакомиться подробнее с методом?
…
(текст комментария доступен только участникам Мастер-группы)
спасибо. все понятно.
Василий, день добрый.
подскажите, пожалуйста, есть ли решение следующей задачи:
необходимо средствами запроса добавлять к числовому полю строку. и получать на выходе строку.
например кол-во проданного товара с единицами измерения?
10 шт.
30 кг.
Не получается через функцию выразить, работает только со своим же типом. т.е. число нельзя выразить как строку.
как быть?
…
(текст комментария доступен только участникам Мастер-группы)
Я мб зря накинулся по 8 часов изучать на старте запросы, но что то мозг совсем буксанул на формулировке на 84 странице 2 модуля.
«Если ограничение доступа установлено на конкретное поле, такое поле будет получено из базы, если ограничение выполняется.
Если ограничение доступа установлено на Прочие поля, данные будут получены, если ограничение выполняется для всех полей объекта, участвующих в запросе.»
Я раз 18 прочел и не понял, что именно подразумевалось. Допустим я менеджер продаж, сделал отчем с таблицами и полями на которые у меня ограничение, я не увижу вообще поле? Или ограничение на данные, которые я получу? В общем просьба понять два этих предложения, мб просто сформулировать их под другим углом. За ранее, спасибо.
…
(текст комментария доступен только участникам Мастер-группы)
С утра уже лучше, спасибо))
Василий, почему в результате запроса, который выводит моя консоль, число строк указывается равным нулю, хотя это не так на самом деле?
…
(текст комментария доступен только участникам Мастер-группы)
Василий, 1. почему мой план запроса не такой как у Вас?
2. Куда идет мой комментарий в этом форуме, после того, как я нажимаю кнопку «добавить коммент»? Почему я его не вижу?
…
(текст комментария доступен только участникам Мастер-группы)
Василий, почему мой план запроса выглядит не так как у Вас?
…
(текст комментария доступен только участникам Мастер-группы)
Здравствуйте.
Практическое задание №18. Далее мое мнение, не претензия.
Приведенное решение справедливо только для управляемого интерфейса. Было бы корректно отметить это и привести решение, подходящее и для обычного интерфейса. Запросы ведь в любом интерфейсе присутствуют.
Переопределять представление справочника через модуль менеджера в рамках курса по запросам, на мой взгляд, нелогично.
Скорее следовало бы разработать свой запрос, который в последствии можно использовать вместо стандартной обработки в нужных обработчиках. Например, такой:
ВЫБРАТЬ ПЕРВЫЕ 50
Номенклатура.Артикул + «-» + Номенклатура.Наименование КАК НовоеПредставление,
Номенклатура.Наименование КАК Наименование
ИЗ
Справочник.Номенклатура КАК Номенклатура
ГДЕ
Номенклатура.ЭтоГруппа = 0
АВТОУПОРЯДОЧИВАНИЕ
По-моему, в некоторых типовых «старых» конфах подобная замена представления и сделана.
…
(текст комментария доступен только участникам Мастер-группы)
Я точно не вспомню в какой именно конфигурации, под рукой нет, чтобы посмотреть, но Вы сами привели две возможные.
«Анализируется, в какой текст запроса на уровне СУБД оно разворачивается.» — стал понятен смысл задания, благодарю за ответ.
Я полагал, что смысл иной — получить в т.ч. с помощью запроса новое формирование Представления. Вопросов нет.
Здравствуйте.
Прошел первые два модуля курса.
По-моему, есть неполная информация.
В методичке несколько раз упоминается, что «на MS SQL Server существует ограничение, не позволяющее использовать более 256 таблиц в запросе». Стр. 82, 117, например.
Это ведь актуально только для 2005-й версии, MS SQL 2008 и более поздних версий не имеет такого ограничения, я не прав?
…
(текст комментария доступен только участникам Мастер-группы)
День добрый! Скачана консоль с сайта итс для 8.3 запускаю в тонком и толстом клиенте пробовал, но почему то в
«Условиях» нет установки произвольного запроса, прикрепляю скрин
…
(текст комментария доступен только участникам Мастер-группы)
Спасибо!
Модуль 2, задание 14 (Работа с иерархическим справочником). Добрый день, при проверке значения, которое хранится в ячейке поля Регион (то ли там нуль, то ли пустое значение, то ли пустая ссылка) открываем обработку в конфигураторе с целью перехватить событие в отладчике. Напротив условия ЕСЛИ ТипЗнч (расшифровка…) ставим точку отладчика , затем
ПЕРЕКЛЮЧАЕМСЯ В ПОЛЬЗОВАТЕЛЬСКИЙ РЕЖИМ, СОВЕРШАЕМ ДВОЙНОЙ КЛИК В ЭТОМ ПОЛЕ, ОСТАНАВЛИВАЕМСЯ НА ТОЧКЕ ОСТАНОВА ….. У меня никакой остановки в точке останова не происходит. Точка как была красной, так и осталась. Стрелки на ней нет. Может быть я неправильно переключаюсь в пользовательский режим? Может еще что?
…
(текст комментария доступен только участникам Мастер-группы)
Добрый день!
При выполнении практического задания №16 по модулю 2 (когда хочу показать план выполнения запроса) выходит ошибка (прилагаю файл).
Как ее избежать?
…
(текст комментария доступен только участникам Мастер-группы)
Почему не открывается план выполнения запроса?
…
(текст комментария доступен только участникам Мастер-группы)
Задание 12
Запрос
Номенклатура.Наименование КАК Наименование
ИЗ
Справочник.Номенклатура КАК Номенклатура
ГДЕ
Номенклатура.ВидНоменклатуры = Значение(Перечисления.ВидыНоменклатуры.Услуга)
Выдает ошибку:
Номенклатура.ВидНоменклатуры = Значение(<<?>>Перечисления.ВидыНоменклатуры.Услуга)
В чем может быть проблема?
…
(текст комментария доступен только участникам Мастер-группы)
спасибо.
Добрий день. А почему Перечисление, а не Перечисления? В конфигураторе указано Перечисления.
…
(текст комментария доступен только участникам Мастер-группы)
спасибо большое.
Здравствуйте!
Тренер при выполнении практического задания № 8 использует регулярное выражение вида «+7(___)___-__-__».
Но такое выражение будет включать в себя любые символы, не только числовые.
Подскажите, пожалуйста, как составить выражение, которое бы проверяло еще и тип символов.
…
(текст комментария доступен только участникам Мастер-группы)
Спасибо!
При открытии в пользовательском режиме в толстом клиенте Конструктора запросов в консоли запросов, выходит ошибка. Как ее исправить?
…
(текст комментария доступен только участникам Мастер-группы)
ПОПРОБУЮ. НО ВЕДЬ ДЕЛО ТО В ТОМ, что в других ИБ работает, а в вашей нет, это ИБ из выгрузки Query-Homework-Template. ЕЩЕ ВОПРОС по теме: Группировка результатов запроса
это и есть агрегатная функция?
…
(текст комментария доступен только участникам Мастер-группы)
Во общем такая ситуация. Я обработку добавлял в конфигурацию, устанавливал ее в ПОДСИСТЕМУ —ЗАПРОСЫ. Но при запуске в Пользовательском режиме в подсистеме обработку не наблюдал. Тогда я ее загружал из файла в пользовательском режиме. Поэтому и возникала такая ошибка. Я ее удалив из конфигуратора. Загружаю из файла в толстом клиенте, возникает теперь ошибка (как в скрине), загружаю из файла в Тонком клиенте. вроде проблем нет. У меня конечно есть консоль, вашего исполнения: Console_Spec8_RU ( Это из курса «Быстрый старт в профессию», но она не запускается, вероятно она из под старой версией 8.2
…
(текст комментария доступен только участникам Мастер-группы)
Добрый день!
Почему некоторые видео ответы не запускаются? При вводе ключа компьютер не реагирует
…
(текст комментария доступен только участникам Мастер-группы)
МОДУЛЬ 2, ЗАДАНИЕ 2 (Почему запрос выдает две строки, а не одну с максимальной ценой закупки?)
—-
ВЫБРАТЬ
ПоступлениеТоваров.Товары.(
Номенклатура КАК Номенклатура,
МАКСИМУМ(Цена) КАК Цена
) КАК Товары
ИЗ
Документ.ПоступлениеТоваров КАК ПоступлениеТоваров
ГДЕ
ПоступлениеТоваров.Товары.Номенклатура = &Номенклатура
СГРУППИРОВАТЬ ПО
ПоступлениеТоваров.Товары.(Номенклатура)
…
(текст комментария доступен только участникам Мастер-группы)
Сегодня при решении очередной реальной задачи для ЕРП столкнулся с необъяснимым для меня поведением системы. Суть проблемы следующая. Параметр ЦеноваяГруппа может иметь по условию значения двух типов: Справочник.Номенклатура и Справочник.ЦеновыеГруппы. Пишу в консоли такой запрос:
&ЦеноваяГруппа ССЫЛКА Справочник.Номенклатура
//&ЦеноваяГруппа ССЫЛКА Справочник.ЦеновыеГруппы
при этом тип параметра ЦеноваяГруппа определяю как Номенклатура (Справочник.Номенклатура). Выполняю, получаю ожидаемый результат — одна запись, со значением Истина.
Теперь меняю комментарии:
//&ЦеноваяГруппа ССЫЛКА Справочник.Номенклатура
&ЦеноваяГруппа ССЫЛКА Справочник.ЦеновыеГруппы
Пытаюсь выполнить запрос. Результата вообще нет! (При этом в реальной обработке выводилось сообщение о несовместимых типах для ссылки). Как это понимать? (Интересно, что сравнение вида ТипЗначения(&ЦеноваяГруппа) = Тип(Справочник.ЦеновыеГруппы) дает верный результат при любом значении параметра).
…
(текст комментария доступен только участникам Мастер-группы)
Т.е. это ошибка платформы и надо писать в 1С?
…
(текст комментария доступен только участникам Мастер-группы)
Вот, что ответили в 1С.
«Дело в том, что язык запросов выдает эту ошибку если в типе проверяемого выражения отсутствует ссылка на проверяемую таблицу.
Например, если поле содержит ссылку только на справочник «номенклатура», то нельзя проверять его на ссылку на справочник «Ценовые группы»».
Тогда у меня вопрос: если в обработке я объявил реквизит составного типа (содержащий два перечисленных выше типа), то какого типа будет параметр запроса, если в него передать значение такого реквизита? Подозрение, что он не будет составного типа! Потому что, скажем, если составной тип получить в результате запроса, то все работает корректно. Вот такой пример:
Номенклатура.Ссылка КАК Ссылка
ПОМЕСТИТЬ ВременнаяТаблица
ИЗ
Справочник.Номенклатура КАК Номенклатура
ГДЕ
НЕ Номенклатура.ЭтоГруппа
ОБЪЕДИНИТЬ ВСЕ
ВЫБРАТЬ ПЕРВЫЕ 1
ЦеновыеГруппы.Ссылка
ИЗ
Справочник.ЦеновыеГруппы КАК ЦеновыеГруппы
;
////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
ВременнаяТаблица.Ссылка КАК Ссылка,
ВременнаяТаблица.Ссылка ССЫЛКА Справочник.Номенклатура КАК ЭтоНоменклатура
ИЗ
ВременнаяТаблица КАК ВременнаяТаблица
Если все это, действительно, так, то как же передать в запрос параметр так, чтобы у него сохранился составной тип?
…
(текст комментария доступен только участникам Мастер-группы)
Получается, что лучше вообще не использовать проблемный оператор Ссылка, а применять универсальную функцию ТипЗначения.
…
(текст комментария доступен только участникам Мастер-группы)
Здравствуйте, имеется вопрос/замечание по 18й практической задаче.
Имеем проблемную строку:
В вашем примере ошибок нет и представление формируется как null по той причине, что вызовов процедуры ОбработкаПолученияПредставления для групп номенклатуры нет. В вашем варианте порядок полей добавления в процедуре ОбработкаПолученияПолейПредставления такой:
Поля.Добавить("Наименование");
Но стоит поменять порядок полей в массиве:
Поля.Добавить("Артикул");
И запрос начинает вызывать процедуру ОбработкаПолученияПредставления для групп. Что мы имеем: для групп недоступен реквизит, т.к. он установлен только для элементов, соответственно в конкатенации строк значение первой переменной = NULL и возникает ошибка приведения:
Преобразование значения к типу Число не может быть выполнено.
Первый вопрос: В чем причина такого поведения платформы, почему всего лишь из-за порядка полей источников меняется алгоритм работы?
Для исправления такой особенности я написал следующий код:
Возврат;
КонецЕсли;
Если ЗначениеЗаполнено(Данные.Наименование) и ЗначениеЗаполнено(Данные.Артикул) Тогда
СтандартнаяОбработка = Ложь;
Представление = Данные.Артикул + " - " + Данные.Наименование;
КонецЕсли;
Второй вопрос. В «боевых» условиях такой подход применим? Как бы Вы решили подобную проблему, если менять порядок полей нельзя и надо как-то работать с тем, что есть?
…
(текст комментария доступен только участникам Мастер-группы)
У меня произошёл сходный случай. Чтобы Представление корректно отображалось и для групп и для товаров с пустым артикулом, использовал такой код:
Поля.Добавить("Артикул");
Поля.Добавить("Наименование");
СтандартнаяОбработка = Ложь;
КонецПроцедуры
Процедура ОбработкаПолученияПредставления(Данные, Представление, СтандартнаяОбработка)
СтандартнаяОбработка = Ложь;
Представление = "";
Если Данные.Артикул <> NULL И Не ПустаяСтрока(Данные.Артикул) Тогда
Представление = Данные.Артикул + " - ";
КонецЕсли;
Представление = Представление + Данные.Наименование;
КонецПроцедуры
При этом, если использовать такой порядок получения полей
Поля.Добавить("Наименование");
то в результате представление для групп всё равно получается NULL (хотя отладка показывает, что в случае групп переменной «Представление» на выходе присвоено корректное значение, совпадающее с наименованием).
Но стоит поменять строки местами и поставить Наименование перед Артикулом
Поля.Добавить("Артикул");
и всё встаёт на свои места и консоль уже отображает нормальное текстовое представление и для групп.
Есть ли какие-то соображения по поводу такого поведения платформы?
…
(текст комментария доступен только участникам Мастер-группы)
Забыл прикрепить скрин к своему комментарию…
Здравствуйте, скажите, пожалуйста, какую конструкцию для определения типа Вы используете на практике в работе?
ТИПЗНАЧЕНИЯ(ТоварныеЗапасы.Регистратор) = ТИП(Документ.РасходТовара)
или
ТоварныеЗапасы.Регистратор ССЫЛКА Документ.РасходТовара)
Есть ли между ними разница в плане производительности?
…
(текст комментария доступен только участникам Мастер-группы)
Здравствуйте.
При попытке повторить действия тренера в тестовой базе, после открытия Консоли запроса, и попытки добавить РегистрНакопления.Продажи (или любой другой объект базы) возникает ошибка которая не позволяет проводить практические задания на тестовой базе. Платформа 8.3.1.2924.
…
(текст комментария доступен только участникам Мастер-группы)
Вопрос по задаче 16. На мой взгляд, в приведенном решении не хватает предложения Различные, ведь никто не запрещает пользователю продать в одном документе один и тот же товар.
…
(текст комментария доступен только участникам Мастер-группы)
Вопрос по задаче 10. На мой взгляд, приведенное решение также не совсем корректно. Оно не выводит записи, в которых названию города предшествуют пробелы (очень частая ситуация при работе пользователей с текстовыми полями). Я сделал такой вариант:
Контрагенты.Ссылка КАК Ссылка
ИЗ
Справочник.Контрагенты КАК Контрагенты
ГДЕ
Контрагенты.Город ПОДОБНО "%" + &Город
Хотя, он тоже не идеален, т.к. выведет записи типа Новый Смоленск. Использовал принцип: лучше вывести лишнее, чем пропустить необходимое.
…
(текст комментария доступен только участникам Мастер-группы)
Вернулся домой, начал сравнивать свои решения с эталонными. Возник вопрос по задаче 8. На мой взгляд, приведенное решение не совсем корректно. Ведь никто не запрещал пользователю вводить в поле Телефоны произвольный текст, например такой: +7(ааа)ббб-сс-ее, который этот запрос воспримет как правильный. Мой вариант решения такой:
Контрагенты.Ссылка КАК Ссылка,
Контрагенты.Телефон
ИЗ
Справочник.Контрагенты КАК Контрагенты
ГДЕ
НЕ Контрагенты.Телефон ПОДОБНО "+7([0-9][0-9][0-9])[0-9][0-9][0-9]-[0-9][0-9]-[0-9][0-9]"
…
(текст комментария доступен только участникам Мастер-группы)