1с неверный тип параметра допустимы только примитивные типы ссылки структура

Обновлено: 08.07.2024

Система типов — это особая система, по которой организуются данные, используемые прикладными решениями. Система типов позволяет представить информацию реального мира в терминах, «понятных» для «1С:Предприятия 8».

Система типов предоставляет широкие возможности как для описания непосредственно бизнес-логики прикладных решений, так и для выполнения задач промежуточной обработки данных.

Описание системы типов содержится в синтакс-помощнике, во встроенной справке и в документации.

Основной особенностью системы типов является то, что есть типы, существующие в любом прикладном решении. Сами эти типы определены на уровне платформы и присутствуют всегда, независимо от действий разработчика. Наряду с ними в конкретном прикладном решении могут существовать различные типы данных, присущие именно этому конкретному прикладному решению. Для таких типов данных на уровне платформы определены лишь общие правила их создания, шаблоны. А конкретные типы данных создаются платформой уже исходя из того, каким образом разработчик формирует и модифицирует структуру прикладного решения.

Типы данных, определенные на уровне платформы

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

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

Примитивные типы данных — это такие типы как Строка, Число, Дата, Булево и другие. Эти типы не являются чем-то особенным для «1С:Предприятия 8». Как правило, такие типы данных существуют и в других программных системах.

Система типов

Значения примитивных типов являются простыми неделимыми значениями, в которых нельзя выделить отдельные составляющие. Например, значениями типа Число могут быть 1, 8, 15 и др. Чтобы создать значение примитивного типа, в тексте программы нужно указать его литерал — символьный идентификатор значения.

Универсальные коллекции значений

Также, существуют более сложные типы данных. Например, платформа поддерживает целый ряд типов, которые представляют собой универсальные коллекции значений: Массив, Структура, СписокЗначений и другие.

Система типов

Общие типы

Кроме этого в платформе реализованы специфические типы данных, реализующие ту или иную функциональность прикладных решений: ТекстовыйДокумент, ТабличныйДокумент, ХранилищеЗначения, ПостроительЗапроса и другие.

Система типов

Общие типы называют также общими объектами. Значения этих типов, в отличие от значений примитивных типов, представляют собой совокупность значений отдельных свойств объекта. Поэтому их называют экземплярами объектов.

Экземпляры объектов создаются с помощью специального оператора встроенного языка — Новый.

Интерфейсные типы

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

Система типов

Типы данных, образуемые в прикладном решении

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

Как правило, появление новых типов данных в прикладном решении связано с использованием прикладных объектов конфигурации. Поэтому такие типы называют еще прикладными типами или прикладными объектами.

Система типов

На уровне платформы поддерживается несколько классов (шаблонов) прикладных объектов, которые сами по себе не могут быть использованы в конкретном прикладном решении. Например, можно перечислить такие классы прикладных объектов как Справочники, Документы, Регистры сведений, Планы видов характеристик и пр.

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

Разработчик, создавая прикладное решение, не имеет возможности использовать эти классы напрямую, однако может добавить в свое прикладное решение новый объект конфигурации, наследующий всю функциональность того или иного класса:

Система типов

Например, разработчик может добавить в свое прикладное решение новый справочник Номенклатура, который будет наследовать функциональность класса Справочники, или новый документ КассовыйОтчет, который будет наследовать функциональность класса Документы.

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

Например, после создания нового справочника Номенклатура, становятся доступны следующие типы данных:
  • СправочникМенеджер.Номенклатура;
  • СправочникСсылка.Номенклатура;
  • СправочникОбъект.Номенклатура;
  • СправочникВыборка.Номенклатура;
  • СправочникСписок.Номенклатура.

Система типов описывает лишь общую «структуру» такого типа, правила, по которым будут формироваться объекты этого типа. Конкретное имя типа, состав свойств и методов объекта будут зависеть от того, как разработчик назовет объект конфигурации и какие, например, реквизиты, табличные части он в него добавит.

Система типов

В то же время, после создания нового регистра накопления ПродажиКомпании, состав новых типов данных будет уже другим:
  • РегистрНакопленияМенеджер.ПродажиКомпании,
  • РегистрНакопленияВыборка.ПродажиКомпании,
  • РегистрНакопленияСписок.ПродажиКомпании,
  • РегистрНакопленияНаборЗаписей.ПродажиКомпании,
  • РегистрНакопленияЗапись.ПродажиКомпании,
  • РегистрНакопленияКлючЗаписи.ПродажиКомпании.

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

Еще один момент, на котором следует акцентировать внимание, проще всего продемонстрировать на примере.

Допустим, в прикладном решении созданы два новых справочника: Номенклатура и Цены. Несмотря на то, что оба эти объекта унаследовали функциональность соответствующего класса Справочники, и для них в прикладном решении был создан один и тот же состав типов данных, «одноименные» типы данных будут являться различными типами данных. Например, СправочникОбъект.Номенклатура и СправочникОбъект.Цены — это различные типы данных.

Так происходит потому, что разработчик может дополнительно к базовой функциональности, унаследованной от соответствующего класса, добавить свою, особенную для каждого объекта конфигурации. Например, оба упомянутых выше справочника могут содержать табличные части (это унаследовано от класса Справочники). Однако для справочника Цены разработчик не создаст ни одной табличной части, в то время как для справочника Номенклатура он создаст, например, три табличные части. Очевидно, что структура хранения данных типа СправочникОбъект.Номенклатура будет значительно отличаться от структуры хранения данных типа СправочникОбъект.Цены.

Соединение и выполнение некоторых API команд происходит успешно, если в параметрах команд простые типы (Число, Дата, Булево), а если в параметрах необходимо передать Массив, или структуру то вызов не проходит.
Скорей всего необходимо Объект 1с (Массив, Структуру и т.п.) перевести в Тип который ожидает сервис.

ОбъектXDTO = Сериализатор.ЗаписатьXDTO(Новый Массив());
Ответ=Client.getCurrencyList("demo_api", "demo@example.com", "demo",ОбъектXDTO);

в первых 3 параметрах указывается информация аутентификации, а в 4 параметр надо для этой функции передать пустой массив.

При этом при вызове функции выдается ошибка
"Ошибка установки соответствия префикса и URI пространства имен"

Видимо надо каким то образом указать, что мой массив принадлежит тому пространству имен который ожидает сервис. Не пойму как это сделать

Подключение к веб сервису:

ОпределениеТ=Новый WSОпределения("http://www.drebedengi.ru/soap/dd.wsdl");
WSСервис=ОпределениеТ.Сервисы[0];
Client=Новый WSПрокси(ОпределениеТ, WSСервис.URIПространстваИмен, WSСервис.Имя, WSСервис.ТочкиПодключения[0].Имя);

За ранее хочу сказать, что с XDTO и сервисами только пытаюсь, что то делать, поэтому возможно неправильно использую термнилагию.


(СвойствоСписок это сойство тип СтрокаТаблицы у которой максимальное количество -1

только один пакет "http://www.w3.org/2001/XMLSchema"

Пробовал написать вот так:
ПространствоИмен="http://www.w3.org/2001/XMLSchema";

При использовании anyType массивом он будет только когда 2 элемента
Связывался с разработчиком, он говорит что этот параметр должен быть пустой, он служебный и заполнять его не надо.
Но при этом он ругается, что параметр не заполнен при вызове из 1с.

(6) 2 элемента ситуацию не спасло. все равно пишет
"Ошибка SOAP сервера: getCurrencyList: Parameter 'idList' must be an array"

попробовал записать этот объект в хмл вот такой код:

(9)
Первый вариант
"Ошибка при вызове метода объекта модели XDTO.
Второй вариант:
"Обязательный параметр не задан: :ddengiService:getCurrencyList(. idList. )"
Вообще
-<message name="getCurrencyList"><part name="apiId" type="xsd:string"/><part name="login" type="xsd:string"/><part name="pass" type="xsd:string"/><part name="idList" type="xsd:anyType"/></message>
там эни тайп. Спроси у разработчика какой должен быть xml запроса
Он посоветовал, поставить php там есть рабочий пример на пхп.
Пошел, ставить, поидее там же и будет видно какой должен быть XML запрос.

можешь сохранить в файл и дописать ипорт
смотри v8: Заполнение массива XDTO
82

targetNamespace="http://xml.apache.org/xml-soap"
xmlns="http://www.w3.org/2001/XMLSchema"
xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/"

(16) Сохранил в файл, что ты указал. Далее в конфу в пакеты XDTO загрузил эту схему далее:
Ошибка:
как выглядит MAP в ХМЛ:

Что касается (14) (15) не совсем понял как импортировать это, поидее (16) уже готовый тип.

-<service name="ddengiService">-<port name="SoapPort" binding="typens:SoapBinding"><soap:address location="http://www.drebedengi.ru/soap/"/></port></service></definitions>

(18) Сохранил wsdl далее в какое место файла необходимо вставить:
Выдается ошибка при выполнении:
"Фатальная ошибка:
Extra content at the end of the document
Не совсем понял, для чего ты указываешь:
"Там в файле есть секция определяющая путь к первису и точки подключения"
Смотри v8: Заполнение массива XDTO
82 там после
импорт идет в секции типов Попробуй создать эту секцию со свои пространством имен

Добавил вот это:

В прокси появились доп. пакеты:
"http://schemas.xmlsoap.org/soap/encoding/"

Ошибка:
Несоответствие типов XDTO:
Тип 'Map' не найден
Тип объекта не является открытым
ошибка выдается при выполнении строки Объект.Добавить.
(29) ты указал на код "Set currency list"
поидее, это какая то запись в базу.
В параметрах надо указать "list" думаю это не тоже самое, что и "idList" в параметрах вызова операции getCurrencyList
Судя по всему Веб сервис там ожидает только числовые значения, т.к. выдается ошибка на какой то другой
Попробовал указать 0, тогда вызов проходит getCurrencyList (думал это уже не случится=)), но ответ приходит пустой.
Написал еще разработчику, может подскажет какими значениями надо заполнить параметр idList чтобы получить норм ответ.
Serginio1, а как то можно в схеме wsdl которую мы указываем, для параметра idList указать, что он не является обязательным?
Когда в конфу загружаешь по ссылке wsdl, то там у параметров показывается свойство: Возможно пустое, там оно везде Ложь
(34) Возможно ошибки были при возврате значения
v8: Заполнение массива XDTO
см 100 Там точно возвращался map а 1С не могла разобрать этот тип

(37) у меня возвращается Неопределено, и ошибки не выскакивает

Ошибка:
Ошибка разбора XML: - [79,28]
Фатальная ошибка:
Попробовал просто удалить эту строку idList, тогда параметр не требуется но при вызове функции, но сервер все равно выдает ошибку:

Т.е. это на стороне сервера.

(38) Знач проблема на сервере или что то нужно подставлять по умолчанию
minOccurs это для полей структуры. Хрень сморозил. Есть понятие возможно пустое значение, но туда передается anySimpleType

Нашел еще один варинат работы через SOAP клиент, с помощью , но результат тот же.

Ошибка:
"Произошла исключительная ситуация (Client): Client:Incorrect number of parameters supplied for SOAP request HRESULT=0x80070057: Параметр задан неверно.
- Client:Unspecified client error. HRESULT=0x80070057: Параметр задан неверно."

Уже можно указать "" в качестве параметра, но при попытке выполнить выдает:
Произошла исключительная ситуация (SoapMapper): SoapMapper:Restoring data into SoapMapper anyType failed HRESULT=0x8007000E: Недостаточно памяти для завершения операции.
- Client:Unspecified client error. HRESULT=0x8007000E: Недостаточно памяти для завершения операции.

Думал, мб с 1с что то. Сделал подключение через SoapClient с помощью AutoIT результат, тот же не удается выполнить команды.

(43) у меня что то проблемы с установкой PHP на комп, точнее с портом 80.

Пробовал Денвер, поидее ничего не надо прописывать, устанавливаешь и все.
Вообщем пока php код не могу выполнить.

(43) похоже на php все работает. вызов проходит нормально. Приплыли.

Далее в коде пытаюсь выполнить:
Объект = Фабрика.Создать(Фабрика.Тип("http://www.w3.org/2001/XMLSchema-instance","nil"));

Это неопределено в отладчике.
А вот если присвоить это значение какомунибудь anyType она правильно прописывает.

"А вот если присвоить это значение какомунибудь anyType она правильно прописывает."
Возможно, но как это сделать, чтобы передать в параметр WS операции.

В XML файле получается так:

При вызове операции выдается ошибка.
Ошибка SOAP сервера: getCurrencyList: Parameter 'idList' must be an array

message name="getCurrencyList"><part name="apiId" type="xsd:string"/><part name="login" type="xsd:string"/><part name="pass" type="xsd:string"/><part name="idList" type="xsd:anyType" nillable="true"/>

(69) Вообще то nillable="true" для anyType это не совсем то. Кстати, а что возвращает то сервис?

Ответ от разработчика:
"Вам нужно добиться, чтобы передаваемый XML был таким-же, как у PHP скрипта.
На самом деле не только у PHP скрипта, многие стандартные библиотеки, в частности под все мобильные устройства - тоже умеют это делать, т.к. независимые разработчики это реализовали в приложениях.

Каким должно быть значение параметра, чтобы 1с сгенерил такой XML - вам нужно разобраться."

(70) сервис вернет, поидее массив записей о движениях, вроде как.

"и что возвращает http://www.soapui.org"
Честно говоря не понял, для чего этот сервис.
"Нагрузочное тестирование веб сервисов" ?

странно, что он выдает ответ
Ошибка SOAP сервера: getCurrencyList: Parameter 'idList' must be an array
А какой эррай если передается nil?

Понимаю, что это не особо средствами 1с. Но все же, лучше чем ничего.

Огромное спасибо за помощь Serginio1

(81) А объекты ты можешь из XML ответа подгружать используя прокси фабрику.

Объект Структура создается с помощью конструктора Новый.

Структура1 = Новый Структура;

Со структурами можно работать и в серверном и клиентском контексте, причем в клиентском контексте с ними можно работать как под толстым клиентом, так и под тонким клиентом.
В значения структуры можно записать переменные любого типа, но использование типов в этом случае очень сильно зависит от контекста и от вида клиента: мы не можем в клиентском контексте задать значение, тип которого работает только в серверном контексте (например, ДокументОбъект.<>).

Как создать новую структуру, Вы знаете, теперь выясним, как создаются новые элементы данного объекта. Делается это с помощь метода Вставить.

Вот его синтаксис:

Вставить(<Ключ>,<Значение>);

Параметр Ключ имеет тип значения Строка. Он может иметь любое название, какое захочет разработчик (но помним про ограничения в названиях переменных). Параметр Значение может иметь любой тип.

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

Не всегда обязательно использовать метод Вставить, чтобы добавить пару КлючИЗначение в структуру, иногда это можно сделать в конструкторе. Тогда конструктор будет иметь следующий вид:

Структура1 = Новый Структура(Ключ, Значение);

Переделаем предыдущий пример:

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

В структуру можно записывать не только примитивные типы, но также любые другие объекты «1С:Предприятия», вплоть до других структур. Причем значения типов разных ключей структуры могут быть разными.

Структура 1С в отладке

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

Изменить значение ключа структуры 1С

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

Или напрямую обращаемся к ключу

Обход коллекции структуры 1С

Обход структуры осуществляется с помощью оператора цикла Для каждого…Цикл.

Обойдем уже созданную структуру.

Обход коллекции структуры

Безошибочное получение значения элемента

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

Этот метод – Свойство.

Данный метод является функцией и возвращает Истину, если указанный ключ есть, и Ложь, если указанного ключа нет.

Рассмотрим синтаксис метода:

Свойство(<ИмяКлюча>,<ЗаписываемоеЗначение>);

В параметр «ЗаписываемоеЗначение» будет возвращено найденное значение. В том случае, если ключа нет в структуре, то данному параметру присвоится значение Неопределено. Обращаю Ваше внимание, что параметр «ЗаписываемоеЗначение» где-то должен быть определен.

В переменную А запишется значение, которое связанно с Ключ1.

Но если мы напишем так.

То ни какой ошибки не возникнет, и в переменной А присвоится значение Неопределено.

Статьи о других универсальных коллекциях значений в 1С


Отличное пособие по разработке в управляемом приложении 1С, как для начинающих разработчиков, так и для опытных программистов.

  1. Очень доступный и понятный язык изложения
  2. Книга посылается на электронную почту в формате PDF. Можно открыть на любом устройстве!
  3. Поймете идеологию управляемого приложения 1С
  4. Узнаете, как разрабатывать управляемое приложение;
  5. Научитесь разрабатывать управляемые формы 1С;
  6. Сможете работать с основными и нужными элементами управляемых форм
  7. Программирование под управляемым приложением станет понятным


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

можно оплатить вручную:

Очень часто возникает необходимость где-то задать перечисление типов. Например, это может быть колонка таблицы значений, в которой могут содержаться значения разных типов. Для создания списка типов используется общий объект Описание типов 1С.

Как правило, объект описание типов 1С сам по себе нигде не используется, в основном он нужен в качестве параметра разных объектов, например, таблицы значений 1С. На примере таблицы значений и покажем, как работать с описанием типов. Описание типов можно создать только для одного типа, например, для типа Число будет следующее описание типа.

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

Чтобы получить быстро полное название нужной ссылки, можно воспользоваться контекстной подсказкой метода Тип.

Описание типа 1С

После того, как мы создали описание типов, этот объект можно использовать, например, при создании таблицы значений.

Выше показано самое простое использование описания типов. Для числа, строки и даты мы можем использовать Квалификаторы. Это общие объекты – КвалификаторыЧисла, КвалификаторыСтроки, КвалификаторыДаты. Они также задаются при помощи конструктора Новый и имеют следующие синтаксисы.

Квалификатор числа 1С

Для числа будет следующий синтаксис квалификатора.

Новый КвалификаторыЧисла(<ЧислоРазрядов>, <ЧислоРазрядовДробнойЧасти>, <ДопустимыйЗнак>)

Где: ЧислоРазрядов – общее число разрядов;

ЧислоРазрядовДробнойЧасти – число разрядов после запятой;

ДопустимыйЗнак – системное перечисления (значения Любой, Неотрицательный).

Например, задать неотрицательно число с 6 разрядами и 2 дробными разрядами будет так:

Квалификатор строки 1С

Для строки будет следующий синтаксис квалификатора.

Новый КвалификаторыСтроки(<ДлинаСтроки>, <ДопустимаяДлина>)

Где: ДлинаСтроки – длина задаваемой строки

ДопустимаяДлина – системное перечисление ДопустимаяДлина, которое определяет, будет строка переменная или фиксированная.

Например, задать строку длинной 10 символов фиксированной длины нужно так:

Обратите внимание, что КвалификаторСтроки задаем третьим параметром.

Квалификатор даты 1С

Для даты будет следующий синтаксис квалификатора.

Где ЧастиДаты – системное перечисление, с тремя значениями Время, Дата, ДатаВремя.

Например, задать дату, которая будет иметь формат времени нужно так:

Обратите внимание, что КвалификаторДаты задаем третьим параметром.

Общий вариант синтаксиса с использование типов выглядит так:

Новый ОписаниеТипов(<Типы>, <КвалификаторыЧисла>, <КвалификаторыСтроки>, <КвалификаторыДаты>, <КвалификаторыДвоичныхДанных>)

Массив типов в описание типов

Кроме использования одного типа в синтаксисе описания типов, можно использовать массив типов, например, сделаем колонку таблицы значений, у которая может принимать значения примитивных типов Строка, Число, Дата, Булево. Для этого нужно все типы перечислить в массиве, причём типы должны быть не в виде строк, как мы делали ранее, а в виде значений типа Тип.

Также можно «собрать» массив из ссылочных типов, например из справочников:

Описание типов на основании описания типов

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

Например, мы создали описание типов для чисел, строк и булево.

Теперь нам нужно новое описание типов, в котором будут такие типы как Число, Строка и Дата (тип Булево нам не нужно).

Для этого мы можем использовать следующий конструктор описания типов:

Новый ОписаниеТипов(<ИсходноеОписаниеТипов>, <ДобавляемыеТипы>, <ВычитаемыеТипы>, <КвалификаторыЧисла>, <КвалификаторыСтроки>, <КвалификаторыДаты>, <КвалификаторыДвоичныхДанных>)

Где, в качестве первого параметра указывается описание типов, на основании которого создается это описание, а в качестве второго и третьего параметра – добавляемые и вычитаемые типы (могут быть как в виде массивов, так и в виде строк).

Давайте продолжим код выше:

В этом код в новое описание типов, мы добавили тип Дата, и вычли тип Булево.



Отличное пособие по разработке в управляемом приложении 1С, как для начинающих разработчиков, так и для опытных программистов.

  1. Очень доступный и понятный язык изложения
  2. Книга посылается на электронную почту в формате PDF. Можно открыть на любом устройстве!
  3. Поймете идеологию управляемого приложения 1С
  4. Узнаете, как разрабатывать управляемое приложение;
  5. Научитесь разрабатывать управляемые формы 1С;
  6. Сможете работать с основными и нужными элементами управляемых форм
  7. Программирование под управляемым приложением станет понятным


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

Читайте также: