WS-ссылка
WS-ссылка — это общий объект конфигурации. Она предназначена для описания в прикладном решении «статической» ссылки на некоторый внешний веб-сервис стороннего поставщика.
WS-ссылка представляет собой WSDL описание веб-сервиса, импортированное из указанного источника. WS-ссылка недоступна для редактирования, однако можно просмотреть ее структуру и структуру типов данных, которые используются для описания параметров и возвращаемых значений:
Дальнейшая работа с такой ссылкой выполняется средствами встроенного языка.
Описание ссылки на веб-сервис в дереве конфигурации, с помощью объекта WS-ссылка, удобно для редко меняющихся сервисов. Описание веб-сервиса получается один раз, при создании объекта конфигурации, и хранится в конфигурации. Поэтому все обращения к такой ссылке из встроенного языка будут выполняться быстро. Однако в случае изменения описания веб-сервиса, потребуется повторный импорт его описания в WS-ссылку.
Динамическое обращение к веб-сервисам
Для работы с часто меняющимися веб-сервисами во встроенном языке предусмотрена возможность динамического считывания описания веб-сервиса и построение его прокси. Также эта возможность позволяет вызывать веб-сервисы, расположение которых станет известно только уже в процессе выполнения программы. Однако, несмотря на все преимущества, такой способ работы медленнее, т. к. каждый раз при создании прокси веб-сервера будет тратиться время на получение описания веб-сервиса.
Ниже приведен пример создания прокси веб-сервиса и использования одного из методов веб-сервиса.
Пустая ссылка, дата или строка в запросе 1С 8.3
Рассмотрим основные методы использования пустых значений в условиях запросов 1С 8.3.
Проверка на NULL
выполняется с помощью конструкции ЕСТЬ NULL, например:
ВЫБРАТЬ
ВнутренниеЗаказыОстатки.Заказчик,
ВнутренниеЗаказыОстатки.КоличествоОстаток
ИЗ
РегистрНакопления.ВнутренниеЗаказы.Остатки КАК ВнутренниеЗаказыОстатки
ГДЕ
ВнутренниеЗаказыОстатки.КоличествоОстаток ЕСТЬ NULLПолучите 267 видеоуроков по 1С бесплатно:
Пустая дата в запросе 1С
Пустая дата в запросе устанавливается конструкцией ДАТАВРЕМЯ(1, 1, 1, 0, 0, 0), пример:
ВЫБРАТЬ
СчетНаОплатуПокупателю.Ссылка,
СчетНаОплатуПокупателю.ДатаОтгрузки
ИЗ
Документ.СчетНаОплатуПокупателю КАК СчетНаОплатуПокупателю
ГДЕ
СчетНаОплатуПокупателю.ДатаОтгрузки = ДАТАВРЕМЯ(1, 1, 1, 0, 0, 0)
Пустая ссылка (значение) в запросе 1С 8.2 и 8.3
Для ссылочных значений (справочники, документы, перечисления, планы счетов и т.д) для проверки необходимо использовать конструкцию «ЗНАЧЕНИЕ(Справочник.ИмяСправочника.ПустаяСсылка)». Например:
ВЫБРАТЬ
Номенклатура.Ссылка
ИЗ
Справочник.Номенклатура КАК Номенклатура
ГДЕ
Номенклатура.Родитель = ЗНАЧЕНИЕ(Справочник.Номенклатура.ПустаяСсылка)
Проверка на пустую строку в запросе 1С
В условиях для нахождения пустой строки необходимо использовать пустое значение строки — «», например:
ВЫБРАТЬ
Банки.Ссылка
ИЗ
Справочник.Банки КАК Банки
ГДЕ
Банки.Код = «»
Будет полезно — рубрикатор статей по языку запросов 1С.
Если Вы начинаете изучать 1С программирование, рекомендуем наш курс (не забудьте подписаться на YouTube — регулярно выходят новые видео):
К сожалению, мы физически не можем проконсультировать бесплатно всех желающих, но наша команда будет рада оказать услуги по внедрению и обслуживанию 1С. Более подробно о наших услугах можно узнать на странице Услуги 1С или просто позвоните по телефону +7 (499) 350 29 00. Мы работаем в Москве и области.
Пустая ссылка составного типа в запросе

Автор: Admin 28 февраля, 2019
Запросы, Программирование
Пришла на днях задачка от клиента: Хочу говорит такой-сякой отчет, с такими то данными, ресурсами, группировкам и т.д. Но главное условие этого отчета, что бы выводились только те документы, у которых некий реквизит “ДокументОснование” был не пустой. Фигня делов, накидал сделал и понял… не работает главное условие. Итак разберемся.
Есть к примеру у нас документ “ЗарплатаСотрудника” с реквизитом “ДокументОснование” составного типа:
Пример документа с реквизитовПервое что я сделал на автомате при реализации условия, что ссылка составного типа не должны быть пустой, это использовал значение “null”:
ВЫБРАТЬ ЗарплатаСотрудника.Ссылка КАК Ссылка, ЗарплатаСотрудника.ДокументОснование КАК ДокументОснование ИЗ Документ.ЗарплатаСотрудника КАК ЗарплатаСотрудника ГДЕ НЕ ЗарплатаСотрудника.ДокументОснование ЕСТЬ NULL
ВЫБРАТЬ ЗарплатаСотрудника.Ссылка КАК Ссылка, ЗарплатаСотрудника.ДокументОснование КАК ДокументОснование ИЗ Документ.ЗарплатаСотрудника КАК ЗарплатаСотрудника ГДЕ НЕ ЗарплатаСотрудника.ДокументОснование ЕСТЬ NULL |
Соответственно не получив результат вспомнил, что NULL – это по сути отсутствующие значения, а не как не нулевое или пустое. Это значение появляется в результате соединений в запросе, обращениям к реквизитам для битой ссылки…
Тогда пришлось использовать второй на вскидку вариант: значение “Неопределено”:
ВЫБРАТЬ ЗарплатаСотрудника.Ссылка КАК Ссылка, ЗарплатаСотрудника.ДокументОснование КАК ДокументОснование ИЗ Документ.ЗарплатаСотрудника КАК ЗарплатаСотрудника ГДЕ НЕ ЗарплатаСотрудника.ДокументОснование = НЕОПРЕДЕЛЕНО
ВЫБРАТЬ ЗарплатаСотрудника.Ссылка КАК Ссылка, ЗарплатаСотрудника.ДокументОснование КАК ДокументОснование ИЗ Документ.ЗарплатаСотрудника КАК ЗарплатаСотрудника ГДЕ НЕ ЗарплатаСотрудника.ДокументОснование = НЕОПРЕДЕЛЕНО |
Этот вариант оказался более рабочим, но и здесь была проблема: если в документе в реквизите “ДокументОснование” никогда ничего не выбирали, то там действительно будет значение “Неопределено”. Но если в этом реквизите был выбран тип значения, а само значение выбрано не было – то в этом случае в реквизите будет уже пустая ссылка этого типа, а не значение “Неопределено”. Что меня не устраивало.
И остался у меня последний вариант: проверка на пустую ссылку для всех типов:
ВЫБРАТЬ ЗарплатаСотрудника.Ссылка КАК Ссылка, ЗарплатаСотрудника.ДокументОснование КАК ДокументОснование ИЗ Документ.ЗарплатаСотрудника КАК ЗарплатаСотрудника ГДЕ НЕ ЗарплатаСотрудника.ДокументОснование = НЕОПРЕДЕЛЕНО И НЕ(ЗарплатаСотрудника.ДокументОснование = ЗНАЧЕНИЕ(Документ.Анкета.ПустаяСсылка) ИЛИ ЗарплатаСотрудника.ДокументОснование = ЗНАЧЕНИЕ(Документ.Встреча.ПустаяСсылка) ИЛИ ЗарплатаСотрудника.ДокументОснование = ЗНАЧЕНИЕ(Документ.ЗапланированноеВзаимодействие.ПустаяСсылка) ИЛИ ЗарплатаСотрудника.ДокументОснование = ЗНАЧЕНИЕ(Документ.НазначениеОпросов.ПустаяСсылка))
ВЫБРАТЬ ЗарплатаСотрудника.Ссылка КАК Ссылка, ЗарплатаСотрудника.ДокументОснование КАК ДокументОснование ИЗ Документ.ЗарплатаСотрудника КАК ЗарплатаСотрудника ГДЕ НЕ ЗарплатаСотрудника.ДокументОснование = НЕОПРЕДЕЛЕНО И НЕ(ЗарплатаСотрудника.ДокументОснование = ЗНАЧЕНИЕ(Документ.Анкета.ПустаяСсылка) ИЛИ ЗарплатаСотрудника.ДокументОснование = ЗНАЧЕНИЕ(Документ.Встреча.ПустаяСсылка) ИЛИ ЗарплатаСотрудника.ДокументОснование = ЗНАЧЕНИЕ(Документ.НазначениеОпросов.ПустаяСсылка)) |
Данный вариант оказался рабочим и документы с пустым полем “ДокументОснование” не попадали в отчет. Но мне данное решение показалось не оптимальным: как минимум оно выглядело не красиво, а как максимум при добавлении нового типа в данный реквизит, пришлось бы переписывать запрос отчета.
Полазив на форумах и почитав методическую информацию было найдено решение со значением NULL. Поскольку NULL появляется при соединения, то в запросе можно получить у реквизита “ДокументОснование” ссылку. Соответственно на уровне SQL все ссылочные значения, получаемые через точку, формируются через левое соединение, что и даст нам NULL при пустых значениях:
ВЫБРАТЬ ЗарплатаСотрудника.Ссылка КАК Ссылка, ЗарплатаСотрудника.ДокументОснование КАК ДокументОснование ИЗ Документ.ЗарплатаСотрудника КАК ЗарплатаСотрудника ГДЕ НЕ ЗарплатаСотрудника.ДокументОснование.Ссылка ЕСТЬ NULL
ВЫБРАТЬ ЗарплатаСотрудника.Ссылка КАК Ссылка, ЗарплатаСотрудника.ДокументОснование КАК ДокументОснование ИЗ Документ.ЗарплатаСотрудника КАК ЗарплатаСотрудника ГДЕ НЕ ЗарплатаСотрудника.ДокументОснование.Ссылка ЕСТЬ NULL |
Вот таким нехитрым способом удалось решить задачу. Если можете предложить решение лучше или оптимальнее пишите. Всегда интересно узнать что-то новое.
УстановитьСсылкуНового() или «как узнать ссылку на объект до записи»
Многие знают, что любому объекту ссылочного типа в 1С ссылка присваивается при записи в базу данных. То есть, если объект новый, то реквизит
Если Ссылка = Справочники.Контрагенты.ПустаяСсылка() Тогда
//Это новый контрагент
Иначе
//Это ранее записанный контрагент
КонецЕсли;
При записи объекта устанавливается случайная ссылка, так что предугадать ее у вас вряд ли получится. Тем не менее, существуют ситуации, когда полезно и даже необходимо знать ссылку на объект еще до записи этого объекта в базу. Приведем несколько примеров:
- При обмене данными необходимо программно создать некоторые записи в регистрах, включающие ссылку на объект обмена. При этом в базе-источнике таких регистров нет. Пример такой задачи мы подробно рассмотрим ниже.
- При оптимизации работы программного кода. Например, нужно программно создать контрагента, его договор и установить этот договор как Основной. Если идти классическим путем, то нужно сначала создать и записать элемент справочника Контрагенты, пройдя при этом все процедуры записи (а это может занять значительное время). Далее, нужно создать элемент справочника ДоговорыКонтрагентов, установив в качестве Владельца ссылку на контрагента. И наконец, получив заново объект элемента справочника Контрагенты, заполнить там реквизит ОсновнойДоговор и записать его, пройдя заново все процедуры записи.
Эту процедуру можно ускорить, зная заранее ссылку на еще не созданный ДоговорКонтрагента. В этом случае уже не требуется два раза получать и записывать Контрагента.
Как узнать ссылку на объект до его записи
Последовательность действий:
- Сгенерировать уникальный идентификатор объекта.
- Зарезервировать ссылку по уникальному идентификатору
- Установить зарезервированную ссылку для нового объекта.
УИД = новый УникальныйИдентификатор;
//Создаем ссылку по этому идентификатору. Для этого нужно знать тип объекта
НоваяСсылка = Справочники.Контрагенты.ПолучитьСсылку(УИД);
//Устанавливаем ссылку для нового объекта
СправочникОбъект.УстановитьСсылкуНового(НоваяСсылка);
После этого объект можно записать. Будет установлена заранее известная ссылка.
Особенности получения ссылок на новые объекты при обмене данными
Рассмотрим, как получить ссылку на незаписанный объект на примере следующей задачи:
При обмене данными между двумя базами передается документ приобретения товаров. В базе источнике есть реквизит с типом Булево, показывающий получение оригиналов документов от поставщика. В базе-приемнике отметка о получении оригиналов реализована через регистр сведений с измерением — ссылкой на документ и ресурсом — ссылкой на перечисление.
Для решения этой задачи будет использоваться обработчик ПослеЗагрузки в правилах конвертации документа приобретения. Реквизит ОригиналыПолучены будет передаваться в виде параметра.
Код будет выглядеть так:
ОригиналыПолучены = ПараметрыОбъекта[«ОригиналыПолучены»];Если ОригиналыПолучены Тогда
//Если записывается новый объект, создадим его ссылку
//В противном случае используем найденную
Если НЕ ОбъектНайден Тогда
СсылкаДокумента = Документы.ПоступлениеТоваровУслуг.ПолучитьСсылку(новый УникальныйИдентификатор);
Объект.УстановитьСсылкуНового(СсылкаДокумента);
Иначе
СсылкаДокумента = Ссылка;
КонецЕсли;
МЗ=РегистрыСведений.СтатусыДокументов.СоздатьМенеджерЗаписи();
МЗ.Организация = Объект.Организация;
//Устанавливаем в записи регистра сведений ссылку, полученную для еще не записанного объекта
МЗ.Документ = СсылкаДокумента;
МЗ.Статус = Перечисления.СтатусыДокументовПоступления.ОригиналПолучен;
МЗ.Записать();
КонецЕсли;
ВАЖНО!!! Если в обмене участвуют другие объекты, имеющие ссылки на наш документ приобретения товаров (например, счета-фактуры), то в них вы скорее всего получите <Объект не найден>, т.к. мы заменили ссылку на документ. Для того чтобы этого избежать, нужно в правилах конвертации документа на вкладке Настройки установить флаг Не запоминать выгруженные объекты. При использовании этого флага система не будет сохранять документы в специальной таблице кеширования, а каждый раз будет подбирать ссылку этого объекта заново, уже с учетом внесенных нами изменений.