1с проверить что тип ссылка
Проверка типа ссылки в запросах 1С: Предприятия 8
Очередная краткая заметка по не вполне очевидному оператору языка запросов 1С: Предприятия 8.
В запрос необходимо будет передать два параметра (начало и конец периода). Условие по виду движения, очевидно, не нужно, так как «маловероятно» , что документ списания будет делать приход
Вопросы и ответы
Несколько вопросов и ответов со старого сайта.
Вопрос (ZolteR): а вот у меня параметр &Контрагент составной (Склады или контрагенты) и почему при выборе одного из них в поле ввода выдает ошибку на другое?
Ответ: на первый взгляд, нужно определять тип значения поля до вызова запроса и, соответственно, использовать разные запросы. Если честно, не понял вопрос. Желательно задачу полностью поставить.
Вопрос (Владимир): несовместимые типы «ССЫЛКА»
Соотвественно ошибка идет и при выполнении программы. Галка о том, что ДокументОсновние может быть основанием ОтчетаКомитента поставлена. Какие могут быть идеи?
Ответ: по идее-то да (не должно влиять на сравнение по типу), но для отладки все-таки попробуйте завести.
Еще можно попробовать выполнить тестирование и исправление ИБ (включая реиндексацию и реструктуризацию).
Категория: Программирование, 1С | Опубликовано 07.06.2009 | Редакция от 15.01.2017
ТИПЗНАЧЕНИЯ, ССЫЛКА, ТИП в запросах 1С 8.3 на примерах
В запросах 1С 8.3 существует две конструкции, которые позволяют работать с типами данных:
Несколько примеров
Предположим, что в нашей конфигурации существует документ «ПродажаТоваров».
Состав реквизитов следующий:
То есть покупки у нас может совершать, как сотрудник, так и сторонний покупатель.
Пример №1 — Получаем тип поля в результате запроса
Сделаем запрос к документу «ПродажаТоваров», в котором выберем все документы продажи где можно будет увидеть наименование покупателя, а с помощью функции ТИПЗНАЧЕНИЯ() в отдельной колонке определим тип покупателя.
ВЫБРАТЬ
ПродажаТоваров.Ссылка КАК ДокументПродажи,
ПродажаТоваров.Покупатель КАК Покупатель,
ТИПЗНАЧЕНИЯ(ПродажаТоваров.Покупатель) КАК ТипПокупателя
ИЗ
Документ.ПродажаТоваров КАК ПродажаТоваров
Результат запроса может выглядеть так:
Пример №2 — Отбор с помощью функций ССЫЛКА и ТИП(…)
Функцию ТИПЗНАЧЕНИЯ() удобно применять совместно с функцией ТИП( ), для проверки на соответствие определённому типу значения. Немного модифицируя запрос из примера №1, выведем записи только с теми документами, в которых тип покупателя сотрудник. Для наглядности оставим поле «ТипПокупателя».
ВЫБРАТЬ
ПродажаТоваров.Ссылка КАК ДокументПродажи,
ПродажаТоваров.Покупатель КАК Покупатель,
ТИПЗНАЧЕНИЯ(ПродажаТоваров.Покупатель) КАК ТипПокупателя
ИЗ
Документ.ПродажаТоваров КАК ПродажаТоваров
ГДЕ
ТИПЗНАЧЕНИЯ(Покупатель) = ТИП(Справочник.Сотрудники)
Стоит отметить, что аналогом такой связки ( ТИПЗНАЧЕНИЯ() + ТИП() ), исключительно для ссылочных типов данных, может служить оператор ССЫЛКА.
Тогда текст запроса мог бы выглядеть так:
ВЫБРАТЬ
ПродажаТоваров.Ссылка КАК ДокументПродажи,
ПродажаТоваров.Покупатель КАК Покупатель,
ТИПЗНАЧЕНИЯ(ПродажаТоваров.Покупатель) КАК ТипПокупателя
ИЗ
Документ.ПродажаТоваров КАК ПродажаТоваров
ГДЕ
Покупатель ССЫЛКА Справочник.Сотрудники
Пример №3 — Использование в конструкции ВЫБОР … КОГДА … КОНЕЦ
Также функция ТИПЗНАЧЕНИЯ() часто находит своё применение в конструкциях условного оператора «ВЫБОР».
Синтаксис оператора «ВЫБОР»:
Допустим, в нашей информационной базе предусмотрена система скидок в зависимости от типа покупателя. Если покупатель сотрудник делаем скидку 10%.
Используя связку, функция ТИПЗНАЧЕНИЯ() и условный оператор «ВЫБОР», можем рассчитать в запросе сумму со скидкой в отдельном поле.
Текст запроса может выглядеть так:
ВЫБРАТЬ
ПродажаТоваров.Ссылка КАК Ссылка,
ПродажаТоваров.Покупатель КАК Покупатель,
ПродажаТоваров.СуммаДокумента КАК СуммаДокумента,
ВЫБОР
КОГДА ТИПЗНАЧЕНИЯ(ПродажаТоваров.Покупатель) = ТИП(Справочник.Сотрудники)
ТОГДА ПродажаТоваров.СуммаДокумента — ПродажаТоваров.СуммаДокумента * 0.1
ИНАЧЕ ПродажаТоваров.СуммаДокумента
КОНЕЦ КАК СуммаСоСкидкой
ИЗ
Документ.ПродажаТоваров КАК ПродажаТоваров
К сожалению, мы физически не можем проконсультировать бесплатно всех желающих, но наша команда будет рада оказать услуги по внедрению и обслуживанию 1С. Более подробно о наших услугах можно узнать на странице Услуги 1С или просто позвоните по телефону +7 (499) 350 29 00. Мы работаем в Москве и области.
Программирование в 1С для всех
Ссылка указывает на данные экземпляра объекта, но не хранит их, т.е. получив ссылку на конкретный экземпляр объекта, мы сможем узнать всю информацию об экземпляре этого объекта, но не сможем внести какие-нибудь коррективы в эту информацию.
Мы помним, что в платформе 1С 8.3. существуют три вида объектов. Это объекты метаданных, общие объекты и универсальные коллекции значений.
Так вот, ссылка может быть только у объектов метаданных.
Замечу что, ссылка указывает не на сам объект, а на экземпляр объекта. Хотя, очень часто употребляют выражения «ссылка объекта», «ссылка на объект» и т.п.
Ссылку можно использовать в качестве переменной, и также ссылку можно указывать, как реквизит других объектов метаданных.
Например, в моей конфигурации есть справочник Контрагенты.
А также какой-то документ, пусть будет Оплата. И я могу какому-то реквизиту документа Оплата присвоить тип — ссылка на справочник Контрагент.
Это значит, теперь в документе Оплата можно хранить информацию о контрагенте, который сделал оплату.
Если мы используем ссылку в качестве реквизита какого-то объекта, то при редактировании экземпляра, на который указывает ссылка, сам реквизит не изменится.
Поясню на примере. Я выше создал документ Оплата и реквизит Оплативший для этого документа с типом СправочникСсылка.Контрагенты.
Если я переименую элемент справочника Контрагенты.
Затем, зайду обратно в выше созданный документ Оплата, то увижу, что отображение контрагента в реквизите поменялось автоматически.
Что это значит? Это не значит, что реквизит Оплативший элемента и сам элемент справочника Номенклатура поменялся автоматически. Нет, это значит, что данный реквизит хранит указатель на экземпляр объекта, который отображается посредством наименования. Поменяли наименование, поменялось только отображение, если бы поменяли какой-нибудь другой реквизит справочника Контрагенты, то пользователь бы ничего не заметил.
Получить ссылку 1С
Каким образом программно получить ссылку на экземпляр объекта, который уже есть в базе?
Сделать это можно несколькими способами: найти по коду, найти по наименованию, найти по реквизиту и найти по нескольким реквизитам через запрос. Я рассмотрю первые два метода.
Для демонстрации этих методов, на основной форме документа Оплата я создам команду «Установить контрагента», которую размещу в командной панели формы.
При выполнении этой команды я буду в поле Оплативший записывать определенного контрагента. Для этого я создам обработчики команды на клиенте и на сервере.
Первый способ получения ссылки: найти по коду, для поиска по коду необходимо использовать функцию менеджера объекта НайтиПоКоду.
Функция НайтиПоКоду вернёт ссылку на экземпляр объекта справочник Контрагенты, которому соответствует код 000000002. Почему мы задали код в виде строки, а не в виде цифры, например? Чтобы понять это, нужно открыть непосредственно редактор справочника Контрагенты в конфигураторе, перейти на закладку «Данные» и посмотреть, какой тип кода у этого справочника.
Тип кода у справочника Контрагенты — строка, поэтому код мы ищем по строковому значению.
Таким образом, данный код:
возвращает ссылку на справочник Контрагенты, код у которого 000000002. Если такой нет, возвращается пустая ссылка (о них ниже), если с таким кодом несколько элементов, то возвращается один из них, какой конкретно — предугадать невозможно, платформа выберет элемент по своим внутренним идентификаторам.
Рассмотрим синтаксис этой функции для менеджера справочника:
Код – непосредственно тот код, по которому мы ищем наш элемент;
ПоискПоПолномуКоду — если стоит параметр Истина, то поиск будет вестись по кодам всей иерархии, т.е. Вам необходимо будет указывать код каждой группы, куда входит элемент через флеш. Например, так: 001/005/110, где слева будет располагаться самая верхняя группа, а справа непосредственно код элемента.
Данное поле необязательно, по умолчанию – Ложь;
Родитель – для иерархических справочников можно указать группу, тогда поиск будет вестись внутри группы. Данное поле необязательно;
Владелец – для подчиненных справочников можно указать владельца, тогда поиск будет вестись только среди элементов, подчиненных данному владельцу. Данное поле необязательно.
Второй способ получения ссылки: найти по наименованию, для поиска по наименованию необходимо использовать функцию менеджера объекта НайтиПоНаименованию.
Этот способ можно применить только для тех объектов, у которых имеется стандартный реквизит Наименование.
Например, у справочников этот реквизит имеется.
А у документов его нет.
В случае этой функции, поиск ведется по тому значению, которое в поле Наименование объекта
Синтаксис функции для менеджера справочника следующий:
«Наименование» – непосредственно то наименование, по которому мы ищем наш элемент;
«ТочноеСоответствие» — если стоит параметр Ложь, то поиск будет вестись не точно, т.е. когда левая часть наименования элемента и строка поиска будут совпадать (например, Металл и Металл 01), то поиск выдаст результат. Если стоит Истина, то будут найдены только те элементы, наименование которых будет точно совпадать со строкой поиска.
Данное поле необязательно, по умолчанию – Ложь.
Помните это, что по умолчанию поиск ведется не точно;
Параметры «Родитель» и «Владелец» точно такие же, как для процедуры НайтиПоКоду.
Пустая ссылка 1С
У Вас уже, наверное, назрел вопрос: что будут возвращать методы НайтиПоКоду, НайтиПоНаименованию, если такой элемент справочника не был найден. Они будут возвращать Пустую ссылку. Пустая ссылка — это пустое значение какого-нибудь справочника или документа. У менеджеров справочника или документа есть методы, которые возвращают пустую ссылку соответствующих объектов.
ПустаяНоменклатура= Справочники.Номенклатура.ПустаяСсылка();
ПустаяОплата = Документы.Оплата.ПустаяСсылка();
Переменные ПустаяНоменклатура и ПустаяОплата содержат в себе пустые ссылки на каждый объект.
Обращаю Ваше внимание, что для каждого вида справочника и каждого документа будет своя собственная пустая ссылка.
Данный метод очень удобно использовать, когда нам необходимо знать, найден ли элемент справочника по коду (названию) или нет.
Например, доработаем код выше: если элемента с таким названием нет, то выведем сообщение.
ПустаяСсылка() – это метод менеджера объекта. Также есть метод ссылки объекта Пустая(), который возвращает тип булево. Истина — если это пустая ссылка. Код выше можно переделать:
Метод Пустая() удобно использовать работая в клиентском контексте (в том числе на тонком клиенте), потому что менеджер объекта это «тяжелый» объекта и с ним можно работать только в серверном контексте. Т.е. установку контрагента можно сделать таким способом:
В этом коде я получаю по наименованию ссылку на нужного контрагента, делаю это в серверном методе, поскольку обращаюсь к менеджеру справочника, записываю если он не пустой, а потом в клиентском методе проверяю, найден контрагент по такому наименованию или нет, если не найден то вывожу предупреждение.
Более подробно и основательно начальные вопросы программирования в 1С есть вы можете изучить в
Книга «Программировать в 1С за 11 шагов»
Изучайте программирование в 1С в месте с моей книгой «Программировать в 1С за 11 шагов»
Книга написана понятным и простым языком — для новичка.
О том как разрабатывать под управляемым приложением 1С, читайте в книге Книга «Основы разработки в 1С: Такси»
Отличное пособие по разработке в управляемом приложении 1С, как для начинающих разработчиков, так и для опытных программистов.
Промо-код на скидку в 15% — 48PVXHeYu
Эти книги, плюс книга по программированию оперативного учета имеются в едином комплекте: комплект книг по разработке в 1С.
Только для читателей моего блога,
промо-код на скидку в 300 рублей на весь комплект: blog
Если Вам понравился этот урок, был полезен или помог решить какую-нибудь проблему, то Вы можете поддержать мой проект, перечислив любую сумму.
можно оплатить вручную:
Яндекс.Деньги — 410012882996301
Web Money — R955262494655
Проверка на существование ссылки
В данных печати не всегда есть «ДокументОснование.ЗаказКлиента», поэтому вылезает ошибка «Поле объекта не обнаружено (ДокументОснование)».
Нужна проверка «если этих полей не существует«.. Помогите
PS: ЗначениеЗаполнено естественно не работает
Проверка на существование треугольника, вычисление площади и периметра
Необходимо написать программу, вообщем сгенерировать три случайных числа (стороны треугольника).
Проверка на существование Задачи
Подскажите пожалуйста, как можно проверить существует ли уже эта задача, перед записью новой
Существование обьекта и получение ссылки
Доброго времени суток. Есть приложение, в котором вызываются dll(№1). В приложении подключена.
Проверка на существование
есть таблица Client со столбцами (Name,LastName,MobilePhoneNumber,Email) и нужно проверить на.
Burkaton, вообще проверка на пустую ссылку в реквизите ссылочного типа, проверяется следующем образом.
Но у вас ДокументОснование составной тип (Скорее всего, проверьте конфигураторе). Вам необходимо с начало отобрать все документы которые имеют реквизит ЗаказКлиента. А потом уже обращаться к данному реквизиту.
вы вопрос до конца дочитали?
Проверка на заполненность значения подразумевает, что ссылка ТОЧНО есть. А вопрос был в том, как проверить есть-ли она или нет?
Решение
Проверка на существование
Есть один txt-файл. В нем построчно написаны файлы и их вес в байтах. Пример: files.rar 12345678.
Проверка файла на существование
Добрый день! Подскажите пожалуйста как проверить файл на существование по пути, прописанному в.
Проверка на существование переменной
Всем доброго времени суток! Подскажи существует ли в JS аналог проверки на существование.
Проверка на существование треугольника
Не знаю, как сделать проверку, внутри кнопки try не работает,как можно сделать её? private void.
Проверка на существование БД MySQL
Здравствуйте! Подскажите пожалуйста. Я создаю базу MySQL с помощью mysql_create_db. А как.
Как проверить тип значения в запросе
В 8.2 сработает такая проверка:
КОГДА ТИПЗНАЧЕНИЯ(ДатыЗапретаИзменения.Пользователь) = ТИП(Перечисление.ВидыНазначенияДатЗапрета)
а как прописать в 8.1?
(2) Поручик,
и что в 8.1 отрабатывает в запросе
ГДЕ ТИПЗНАЧЕНИЯ(Регистратор) = &ТипРегистратора
или
ГДЕ ТИПЗНАЧЕНИЯ(Регистратор) = ТИП(Документ.ВидДокумента)
а нихрена оно не отрабатывает в 8.1
для документов (перечислений) проходит конструкция «ОсновныеНачисленияРаботниковОрганизаций.Регистратор ССЫЛКА Документ.ПутевойЛист»
а как для справочинка проверить (в регистре измерение имеет составной тип) и как проверить какое значение выбрано?
(3) в справочнике так же
ГДЕ Измерение ССЫЛКА Справочник.Номенклатура
ГДЕ Измерение ССЫЛКА Перечисление.ВидыПлатежейВБюджет
И вот еще странность: ТИПЗНАЧЕНИЯ() в данном запросе у меня вместо ожидаемого «Контрагенты» выдает «Контрагент». Если смотреть на справочник в конфигураторе 8.3, там есть «Представление объекта:» и там как раз написано Контрагент, а как же получить в запросе название типа, чтобы было так:
Иванов Иван Иванович | Справочник | Контрагенты |
В результате хотелось бы в запросе к реквизиту объекта получить вид и тип ссылочного типа. Реквизит может иметь составной тип данных.
Справочник | Контрагенты | Иванов Иван Иванович
Документ | РасходныйКссовыйОрдер | Расходный кассовый ордер №00001 от 01.01.2014