1С несовместимые типы ссылка

Область применения: управляемое приложение, мобильное приложение, обычное приложение.

1.1. В языке запросов возможно обращаться не только к полям исходных таблиц запроса, перечисленных в предложении ИЗ , но и к полям таблицы, на которую ссылается поле исходной таблицы запроса, если это поле имеет ссылочный тип. Имена полей при этом пишутся "через точку". Применение такой конструкции приводит к неявному соединению с дополнительными таблицами для получения значений полей "через точку".

Например, в запросе

ВЫБРАТЬ
ТоварныеЗапасы.Товар КАК Товар,
ТоварныеЗапасы.Количество КАК Количество,
ТоварныеЗапасы.Товар.Артикул КАК Артикул
ИЗ
РегистрНакопления.ТоварныеЗапасы КАК ТоварныеЗапасы
.

кроме явно указанной в предложении ИЗ таблицы РегистрНакопления.ТоварныеЗапасы неявно участвует таблица Справочник.Товары для получения значения поля Артикул . А в случае использования ограничений доступа на уровне записей (RLS), к запросу добавляются ещё и таблицы, участвующие в RLS к таблице Справочник.Товары .

1.2. Большое число исходных таблиц запроса приводит к его усложнению и может значительно увеличивать время его выполнения. Особенно это важно помнить в тех случаях, когда поле таблицы ссылочного типа имеет составной тип и может содержать ссылки на несколько таблиц. В таком случае, получение полей других таблиц "через точку" от такого поля составного типа приведет к соединениию со всеми таблицами, ссылки на которые могут оказаться в данном поле и в RLS к этим таблицам.

Например, в приведенном ниже запросе получение даты регистратора приведет к неявному соединению с таблицами всех документов — регистраторов регистра ТоварныеЗапасы

ВЫБРАТЬ
.
ТоварныеЗапасы.Регистратор.Дата,
.
ИЗ
РегистрНакопления.ТоварныеЗапасы КАК ТоварныеЗапасы
.

Подобное получение данных "через точку" от ссылочных полей составного типа крайне нежелательно. Каждое исключение из этого правила должно тщательно анализироваться.

2.1. Следует избегать избыточности при создании полей составных ссылочных типов. Необходимо указывать ровно столько возможных типов для данного поля, сколько необходимо. Не следует без необходимости использовать типы "любая ссылка" или "ссылка на любой документ" и т.п.

Читайте также:  Построение гистограммы в маткаде

Вместо этого следует более тщательно проанализировать прикладную логику и назначить для поля ровно те возможные типы ссылок, которые необходимы для решения задачи.

2.2. Для того чтобы избежать запросов с использованием большого числа исходных таблиц следует жертвовать компактностью хранения данных ради производительности и помещать соответствующие данные в исходную таблицу запроса.

Например, в регистре ТоварныеЗапасы можно завести реквизит ДатаРегистратора , заполнять его при проведении документов и использовать затем в запросах:

ВЫБРАТЬ
.
ТоварныеЗапасы.ДатаРегистратора,
.
ИЗ
РегистрНакопления.ТоварныеЗапасы КАК ТоварныеЗапасы
.

Это приведет к дублированию информации и некоторому (незначительному) увеличению ее объема, но может существенно повысить производительность и стабильность работы запроса.

2.3. При необходимости следует жертвовать компактностью и универсальностью кода ради производительности:

  • Как правило, для выполнения конкретного запроса в данных условиях не нужны все возможные типы данной ссылки. В этом случае, следует ограничить количество возможных типов при помощи функции ВЫРАЗИТЬ .
  • Если данный запрос является универсальным и используется в нескольких разных ситуациях (где типы ссылки могут быть разными), то можно формировать запрос динамически, подставляя в функцию ВЫРАЗИТЬ тот тип, который необходим при данных условиях.

Это увеличит объем исходного кода и, возможно, сделает его менее универсальным, но может существенно повысить производительность и стабильность работы запроса.

Запрос.Текст = "ВЫБРАТЬ
| Продажи.Регистратор.Номер,
| Продажи.Регистратор.Дата,
| Продажи.Контрагент,
| Продажи.Количество,
| Продажи.Стоимость
|ИЗ
| РегистрНакопления.Продажи КАК Продажи
|ГДЕ .

В данном запросе используется обращение к реквизитам регистратора. Регистратор является полем составного типа, которое может принимать значения ссылки на один из 56 видов документов.
SQL-текст этого запроса будет включать 56 левых соединений с таблицами документов. Это может привести к серьезным проблемам производительности при выполнении запроса.

Для решения данной конкретной задачи нет необходимости соединяться со всеми 56 видами документов. Условия запроса таковы, что при его выполнении будут выбраны только движения документов РеализацияТоваровУслуг и ЗаказыПокупателя . В этом случае можно значительно ускорить работу запроса, ограничив количество соединений при помощи функции ВЫРАЗИТЬ() .

Читайте также:  Init display first что это в биосе

Запрос.Текст = "ВЫБРАТЬ
| ВЫБОР
| КОГДА Продажи.Регистратор ССЫЛКА Документ.РеализацияТоваровУслуг
| ТОГДА ВЫРАЗИТЬ(Продажи.Регистратор КАК Документ.РеализацияТоваровУслуг).Номер
| КОГДА Продажи.Регистратор ССЫЛКА Документ.ЗаказПокупателя
| ТОГДА ВЫРАЗИТЬ(Продажи.Регистратор КАК Документ.ЗаказПокупателя).Номер
| КОНЕЦ ВЫБОРА КАК Номер,
| ВЫБОР
| КОГДА Продажи.Регистратор ССЫЛКА Документ.РеализацияТоваровУслуг
| ТОГДА ВЫРАЗИТЬ(Продажи.Регистратор КАК Документ.РеализацияТоваровУслуг).Дата
| КОГДА Продажи.Регистратор ССЫЛКА Документ.ЗаказПокупателя
| ТОГДА ВЫРАЗИТЬ(Продажи.Регистратор КАК Документ.ЗаказПокупателя).Дата
| КОНЕЦ ВЫБОРА КАК Дата,
| Продажи.Контрагент,
| Продажи.Количество,
| Продажи.Стоимость
|ИЗ
| РегистрНакопления.Продажи КАК Продажи
|ГДЕ
| Продажи.Регистратор ССЫЛКА Документ.РеализацияТоваровУслуг
| ИЛИ Продажи.Регистратор ССЫЛКА Документ.ЗаказыПокупателя";

Этот запрос является более громоздким и, возможно, менее универсальным (он не будет правильно работать для других ситуаций — когда возможны другие значения типов регистратора). Однако, при его выполнении будет сформирован SQL запрос, который будет содержать всего два соединения с таблицами документов. Такой запрос будет работать значительно быстрее и стабильнее, чем запрос в его первоначальном виде.

Значения типа Тип в запросах 1С могут использоваться при наложении условий, в сравнениях, упорядочивании и группировках. Для работы с типами предусмотрено несколько механизмов, которые покрывают все потребности разработчика. Рассмотрим их.

Функция ТИПЗНАЧЕНИЯ

Функция ТИПЗНАЧЕНИЯ имеет единственный параметр, куда передается значение, для которого требуется определить тип. Функция возвращает значения типа Тип. Чаще всего функция используется совместно с литералом ТИП в условиях запроса.

Рассмотрим примеры использования. Вывод в результат запроса типа Регистратора:

Закупки.Регистратор КАК Регистратор ,

ТИПЗНАЧЕНИЯ( Закупки.Регистратор ) КАК ТипРегистратора

РегистрНакопления.Закупки КАК Закупки

Использование функции ТИПЗНАЧЕНИЯ в операции сравнения:

Закупки.Регистратор КАК Регистратор

РегистрНакопления.Закупки КАК Закупки

ТИПЗНАЧЕНИЯ( Закупки.Регистратор ) = ТИП( Документ.ПриобретениеТоваровУслуг )

Литерал ТИП

В литерал ТИП передается имя примитивного типа или таблицы ссылочного типа. Результатом конструкции будет значение типа Тип.

Примеры имен типов:

ТИП(Строка)
ТИП(Число)
ТИП( Перечисление.СтавкиНДС )
ТИП( Справочник.Номенклатура )
ТИП( Документ.ПриобретениеТоваровУслуг )
ТИП( ПланСчетов.Хозрасчетный )
ТИП( ПланОбмена.Полный )

Использование в запросе:

Закупки.Регистратор КАК Регистратор ,

КОГДА ТИПЗНАЧЕНИЯ( Закупки.Регистратор ) = ТИП( Документ.ПриобретениеТоваровУслуг )

ТОГДА «Приобретение товаров»

КОНЕЦ КАК ТипИсточника

РегистрНакопления.Закупки КАК Закупки

Оператор ССЫЛКА

Оператор позволяет проверить, является ли значение выражения, указанного справа от него, ссылкой на таблицу, указанную слева. Результат оператора — значение типа Булево.

Читайте также:  Блок питания eps 121e

Закупки.Регистратор КАК Регистратор

РегистрНакопления.Закупки КАК Закупки

Закупки.Регистратор ССЫЛКА Документ.ПриобретениеТоваровУслуг

Для ссылочных таблиц оператор ССЫЛКА является эквивалентом сравнения

Остались вопросы?
Спросите в комментариях к статье.

1 комментарий

Скажите, пжст, для оптимальной производительности что лучше использовать:

ТипЗначения() ИЛИ «Регистартор Ссылка Документ…»?

Несовместимые типы «ВЫРАЗИТЬ» — такое сообщение появляется, когда программист 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. Мы работаем в Москве и области.

Оцените статью
Добавить комментарий

Adblock
detector