1С:Предприятие предоставляет возможность в запросах разыменовывать ссылочные поля, т.е. обращаться к подчиненным полям «через точку». Очень удобная возможность, которая позволяет упростить текст запроса. Но следует понимать каким образом в платформе реализован данный функционал и чем он опасен. Разберемся более подробно.
При обращении к подчиненному полю «через точку» происходит неявное соединение с таблицей этого типа. Например, обращение в запросе
ВЫБРАТЬ
ЗаказыКлиентовОстатки.Номенклатура.Артикул ,
ЗаказыКлиентовОстатки.ЗаказаноОстаток
ИЗ
РегистрНакопления.ЗаказыКлиентов.Остатки КАК ЗаказыКлиентовОстатки
Приведет к неявному соединению с таблицей справочника Номенклатура, а реальный запрос, который будет выполняться к базе будет аналогичен этому:
ВЫБРАТЬ
СпрНоменклатура.Артикул ,
ЗаказыКлиентовОстатки.ЗаказаноОстаток
ИЗ
РегистрНакопления.ЗаказыКлиентов.Остатки КАК ЗаказыКлиентовОстатки
ЛЕВОЕ СОЕДИНЕНИЕ Справочник.Номенклатура КАК СпрНоменклатура
ПО ЗаказыКлиентовОстатки.Номенклатура = СпрНоменклатура.Ссылка
На первый взгляд все корректно и правильно, но как система поведет себя, когда разыменовывается поле составного типа? Система будет соединяться СО ВСЕМИ таблицами, входящими в составной тип! Т.е. запрос
ВЫБРАТЬ
ЦеныНоменклатурыПоставщиков.Регистратор.Номер ,
ЦеныНоменклатурыПоставщиков.Цена
ИЗ
РегистрСведений.ЦеныНоменклатурыПоставщиков КАК ЦеныНоменклатурыПоставщиков
будет преобразован во что-то вроде:
ВЫБРАТЬ
ВЫБОР
КОГДА ЦеныНоменклатурыПоставщиков.Регистратор ССЫЛКА Документ.ЗаказПоставщику
ТОГДА ДокЗаказПоставщику.Номер
КОГДА ЦеныНоменклатурыПоставщиков.Регистратор ССЫЛКА Документ.КорректировкаРегистров
ТОГДА ДокКорректировкаРегистров.Номер
КОГДА ЦеныНоменклатурыПоставщиков.Регистратор ССЫЛКА Документ.ПоступлениеТоваровУслуг
ТОГДА ДокПоступлениеТоваровУслуг.Номер
КОГДА ЦеныНоменклатурыПоставщиков.Регистратор ССЫЛКА Документ.РегистрацияЦенНоменклатурыПоставщика
ТОГДА ДокРегистрацияЦенНоменклатурыПоставщика.Номер
КОНЕЦ КАК Номер ,
ЦеныНоменклатурыПоставщиков.Цена
ИЗ
РегистрСведений.ЦеныНоменклатурыПоставщиков КАК ЦеныНоменклатурыПоставщиков
ЛЕВОЕ СОЕДИНЕНИЕ Документ.ЗаказПоставщику КАК ДокЗаказПоставщику
ПО ЦеныНоменклатурыПоставщиков.Регистратор = ДокЗаказПоставщику.Ссылка
ЛЕВОЕ СОЕДИНЕНИЕ Документ.КорректировкаРегистров КАК ДокКорректировкаРегистров
ПО ЦеныНоменклатурыПоставщиков.Регистратор = ДокКорректировкаРегистров.Ссылка
ЛЕВОЕ СОЕДИНЕНИЕ Документ.ПоступлениеТоваровУслуг КАК ДокПоступлениеТоваровУслуг
ПО ЦеныНоменклатурыПоставщиков.Регистратор = ДокПоступлениеТоваровУслуг.Ссылка
ЛЕВОЕ СОЕДИНЕНИЕ Документ.РегистрацияЦенНоменклатурыПоставщика КАК ДокРегистрацияЦенНоменклатурыПоставщика
ПО ЦеныНоменклатурыПоставщиков.Регистратор = ДокРегистрацияЦенНоменклатурыПоставщика.Ссылка
И ко всей этой конструкции будут добавлены ограничения на уровне записей (RLS), если они используются. Все это может существенно замедлить выполнение запроса.
Иногда при написании запроса известно какая ссылка будет находиться в поле составного типа. В этом случае правильно привести составной тип к одному необходимому и избежать соединения со всеми таблицами составного типа. Для приведения составного типа к какому-то одному используется оператор
Выразить ( Выражение > КАК Тип значения >)
Параметр можно привести к ссылочному типу или к одному из примитивных типов.
Если содержит в составном типе требуемый , то приведение типа считается осуществимым, и для каждого значения указанного типа результатом будет это самое значение. Для значений других типов результатом приведения типа будет значение NULL.
Если не содержит в составном типе требуемый , то выполнение данного запроса завершится ошибкой.
Пример использования оператора Выразить, когда известно какая ссылка будет находиться в поле составного типа:
ВЫБРАТЬ
ВЫРАЗИТЬ (ЦеныНоменклатурыПоставщиков.Регистратор КАК Документ.ЗаказПоставщику).Номер КАК Номер,
ЦеныНоменклатурыПоставщиков.Цена
ИЗ
РегистрСведений.ЦеныНоменклатурыПоставщиков КАК ЦеныНоменклатурыПоставщиков
ГДЕ
ЦеныНоменклатурыПоставщиков.Регистратор ССЫЛКА Документ.ЗаказПоставщику
В запросе выше пожертвовали компактностью получения поля Номер ради производительности. В результате текст запроса получился более громоздким, но запрос выполнится быстрее за счет того, что не будет лишних ненужных соединений со всеми таблицами составного поля Регистратор.
Остались вопросы?
Спросите в комментариях к статье.
• 1С8 примеры запросов 1С8. » 1С8 пример запроса. Функция ВЫРАЗИТЬ().
Пример использования функции ВЫРАЗИТЬ( КАК ) в запросе 1с.
Функция пытается привести значение к указанному типу. Возвращает значение указанного типа . Если привести не удается, функция возвращает NULL.
Параметры функции:
Выражение — преобразуемое выражение;
УказаниеТипа (Строка) — указывает тип, к которому надо привести выражение. Может содержать имя таблицы. Например «СТРОКА(1000)», «ЧИСЛО(15,4)», Справочник.Номенклатура :
Еще пример: ВЫРАЗИТЬ(ВозвращенныеМатериалы.Номенклатура КАК Справочник.Номенклатура)
Так выглядит сам запрос и результат запроса:
Предлагаем решение Ваших задач 1С.
Внедрение 1С:
- Организуем вам индивидуальное экспресс обучение программам 1С.
- Мы поможем Вам начать работать с программами 1С.
- Мы поможем Вам настроить ваши отчеты в 1С.
- Установим и настроим 1С под ваши задачи.
- Поможем сделать ввод начальных остатков по складам и контрагентам
- Перенесем данные из старых систем.
- Подскажем как избежать ошибок.
Доработка и сопровождение 1С:
- Доработаем существующие или создадим новые печатных формы и документы.
- Разработаем внешние отчеты по Вашим требованиям.
- Напишем внешние обработоки по загрузке документов из учетных (торговых) систем в бухгалтерию.
- Разработаем приложения для выгрузки данных на сайты.
Ориентировочная стоимость работ программиста 1С : 500 р. за 1 час работы.
Звоните: 8 916 710 83 51 Ольга
© j008.ru 2014 Обратная связь: j008@j008.ru
Несовместимые типы «ВЫРАЗИТЬ» — такое сообщение появляется, когда программист 1С 8.2 или 8.3 в запросе пытается сравнить два различных типа.
Функция Выразить() позволяет привести значение поля запроса 1С к определенному типу. Это может понадобиться в двух случаях:
1. Получить нужную разрядность числа или нужное количество символов строкового значения. Количество символов полей неограниченного типа приходится ограничить из-за определенных особенностей.
Получите 267 видеоуроков по 1С бесплатно:
ВЫРАЗИТЬ(Номенклатура.Комментарий КАК СТРОКА(300))
ВЫРАЗИТЬ(Номенклатура.Цена КАК ЧИСЛО(15, 2)) КАК Сумма
2. Преобразовать поле составного типа в поле с одним типом. Это может понадобиться в целях оптимизации запросов. Если в типизированное поле попадёт значение другого типа, то система вернёт NULL, поэтому всегда необходимо дополнительно устанавливать условие в секции «ГДЕ», ограничивая его оператором ССЫЛКА.
ВЫБРАТЬ
…
ВЫРАЗИТЬ(Продажи.Регистратор КАК Документ.Реализация)
…
ИЗ
…
ГДЕ Продажи.Регистратор ССЫЛКА Документ.Реализация
Как избежать ошибок
Ошибки типа «Несовместимые типы ВЫРАЗИТЬ …» могут возникать при неправильном использования синтаксиса.
К примеру, конструкция «ВЫРАЗИТЬ(«123″ КАК ЧИСЛО(5, 2)) КАК Сумма» считается ошибочной, так как в запросе нельзя штатными способами преобразовывать из одного типа в другой.
Если Вы начинаете изучать 1С программирование, рекомендуем наш бесплатный курс (не забудьте подписаться на YouTube — регулярно выходят новые видео):
К сожалению, мы физически не можем проконсультировать бесплатно всех желающих, но наша команда будет рада оказать услуги по внедрению и обслуживанию 1С. Более подробно о наших услугах можно узнать на странице Услуги 1С или просто позвоните по телефону +7 (499) 350 29 00. Мы работаем в Москве и области.