Ошибка вызова внешней компоненты 1С
Содержание
Ниже перечислены основные объекты 1С, которые используются при работе с управляемыми формами. Даны краткие примеры кода, демонстрирующие традиционное использование данных объектов при написании конфигураций 1С.
ЭтаФорма
Используется в модуле формы, в процедурах &НаКлиенте и &НаСервере .
Позволяет обращаться и к элементам формы и к реквизитам.
Обращение к элементу формы происходит через объект Элементы и выглядит так:
ЭтаФорма.Элементы.НомерВерсии.Заголовок = «v.»+ВерсияПрограммы;
Обращение к реквизиту, существующему на форме, происходит так:
ЭтаФорма.ТекстОбъявления=»Здравствуйте, товарищи!»;
Упрощенное обращение к элементам формы и реквизитам
В модуле формы, в принципе, можно не указывать ключевое слово ЭтаФорма . Можно обращаться к элементам формы и к реквизитам упрощенно:
// Элемент формы
Элементы.НомерВерсии.Заголовок = «v.»+ВерсияПрограммы;
// Реквизит формы
ТекстОбъявления=»Здравствуйте, товарищи!»;
Особенности получения реквизитов форм (важно!)
Если реквизит формы имеет простой тип — Строка , Число , Дата … то получить (установить) значение реквизита можно просто по имени:
Текст=НаименованиеТовара; // Наименование товара — это реквизит формы
Однако, таким образом невозможно получить реквизиты «сложного» типа — ТаблицаЗначений , ДеревоЗначений . При попытке получить реквизит с таким типом по наименованию, будет возвращен объект типа ДанныеФормыКоллекция .
Чтобы получить значение реквизита со «сложным» типом, нужно воспользоваться функцией РеквизитФормыВЗначение() :
ТекущаяТаблица=РеквизитФормыВЗначение(«ВыбранныеОбъектыСтроительства»);
Для установки значения «сложного» реквизита, можно воспользоваться функцией ЗначениеВРеквизитФормы(, ) , оба параметра обязательны.
Функции РеквизитФормыВЗначение() и ЗначениеВРеквизитФормы() доступны только на Сервере.
Объект
Строго говоря, такого ключевого слова в пределах формы нет. Просто, когда создается форма, например, форма элемента, 1С автоматически создает на форме реквизит с именем Объект . Через данный реквизит доступны свойства текущего объекта, который редактируется на форме.
или, более полная запись:
ЭтотОбъект
Содержит сам объект. Предназначено для получения объекта в модуле объекта или модуле формы.
Использование: Только чтение.
Доступность: Сервер, толстый клиент, внешнее соединение.
Во времена толстого клиента вызов процедуры модуля объекта из модуля формы был прост. Достаточно было определить процедуру модуля как экспортируемую и вызвать её в модуле формы.
Времена меняются, платформу 1С оптимизируют и совершенствуют, толстый клиент забывают, всем подавай тонкий или web-клиент. Разработчики начинают переводить обычные формы на управляемые, но не все так просто, появляются некоторые сложности в связи с разделением выполнения программного кода на два контекста: сервер и клиент. Поэтому выше приведенный пример кода работать не будет в тонком клиенте.
Новые типы данных
Так же из-за управляемых форм появились новые типы данных. Имеется форма:
Запоминаем типы реквизитов и смотрим какие типы в отладке для этих реквизитов:
Новые типы данных формы
Делаем вывод, для отображения данных самого объекта используется тип ДанныеФормыСтруктура , для отображения дерева значений — ДанныеФормыДерево , для табличной части — ДанныеФормыКоллекция и т.д. То есть в модуле формы на клиенте мы работаем не с самим объектом а с его представлением! Поэтому, методы, которые доступны, например, для табличной части в модуле объекта НЕ ДОСТУПНЫ в модуле формы.
Борьба с новыми типами
Разработчики платформы 1С предоставили две функции:
- РеквизитФормыВЗначение — преобразует указанный реквизит формы в объект прикладного типа.
- ДанныеФормыВЗначение — преобразует данные формы в объект прикладного типа.
Вызов этих функций доступен только на сервере. Вернемся к нашей задаче и напишем код для тонкого клиента в модуле формы в событии ПриСозданииНаСервере , который будет вызывать функцию из модуля объекта:
&НаСервере
СпрОбъект1 = РеквизитФормыВЗначение(«Объект»);
СпрОбъект1.ВывестиСообщение(Объект.Реквизит1);
КонецПроцедуры
Работает и с помощью одной функции и с помощью другой О_о. Напишем код по преобразованию ДанныеФормыДерево в объект прикладного типа:
&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
ДеревоЗначений1 = РеквизитФормыВЗначение(«Реквизит1»);
ДеревоЗначений2 = ДанныеФормыВЗначение(ЭтаФорма.Реквизит1, Тип(«ДеревоЗначений»));
КонецПроцедуры
ДеревоЗначений1 и ДеревоЗначений2 имеют одинаковый тип — ДеревоЗначений. Так в чем же разница этих функций???
ДанныеФормыВЗначение — функция глобального контекста. Производит преобразование типа объекта поддерживаемого формой в тип объекта базы данных: ДанныеФормыСтруктура —> СправочникОбъект.Справочник1 .
РеквизитФормыВЗначение — функция модуля формы, то есть вызывается на сервере в контексте формы (&НаСервере). Если вы попытаетесь вызвать данную функцию вне контексте формы, то платформа сгенерирует исключительную ошибку:
&НаСервереБезКонтекста
Процедура ПреобразованиеТипа()
// Этот код неправильный, контекст формы не доступен, будет ошибка!
СпрОбъект2 = ДанныеФормыВЗначение(Объект, Тип(«СправочникОбъект.Справочник1»));
СпрОбъект2.ВывестиСообщение(Объект.Реквизит1);
КонецПроцедуры
Вот и все отличия.
Обработка показывает все реквизиты выбранного объекта, позволяет их редактировать, а также сравнить два объекта одного типа. Поддерживает любые конфигурации, в типовые устанавливается автоматически.
Текущая версия: для обычных форм 1.09, для управляемых 1.12.
Скачать обработку (для 1C 8.2, 1С 8.3 (обычные формы), epf файл, 47 KB)
Скачать обработку (для 1С 8.2, 1С 8.3 (управляемые формы), epf файл, 22 KB)
Последняя версия для 1С 8.1: 1.05
Скачать обработку (для 1С 8.1, epf файл, 48 KB)
Что делать если обработка не открывается
Обработка очень полезна, например, в таких случаях:
надо разобраться в незнакомой базе
обновился релиз конфигурации и в документ добавилось новое поле (скрытое, но форме его нет). При этом для новых документов оно устанавливается при их создании, а про старые естественно забыли. Что для пользователя выражается в том, что два совершенно одинаковых документа дают разные проводки 🙁
просто содержимое поля не лезет в отведенное ему на форме место, а надо просмотреть полностью (особенно этим страдают табличные части — разработчики очень любят ограничивать ширину колонок и вдобавок не давать ее изменять)
надо перейти к связанной информации (например, открыть указанную в накладной ГТД) только вот это поле забыли сделать доступным (т.е. ни кнопки с точками или лупой ни F4) (а еще бывает что вместо поля ввода делают поле выбора, надпись или поле вообще на форме отсутствует 🙁)
надо сравнить два объекта одного вида
Отличительными особенностями являются
возможность подключения к типовым конфигурациям в качестве печатной формы (т.е. в чисто пользовательском режиме, конфигуратор не нужен)
возможность записи объекта в режиме «обмен данными — загрузка» — т.е. «как есть»
Установка (нормальный интерфейс)
Открыт обработку, действовать по инструкции на экране. (Т.е. нажать кнопку «Установка в правом верхнем углу и в следующем окне подтвердить установку.
Установка («управляемый» интерфейс)
Внимание: Данный вариант установки работает только в типовых конфигурациях 1С.
1. Перейти в раздел «Администрирование» и там — «Дополнительные отчеты и обработки».
2. Нажать кнопку «Добавить» и выбрать файл dannye-objecta-upr.epf
3. В окне настроек обработки проверить, что:
Публикация: Используется
Отмечены галочки: использовать для формы списка, использовать для формы объекты
4. Подтвердить установку, нажав ОК
Использование обработки
Из формы документа, элемента справочника. либо формы списка
Нормальный интерфейс — нажать кнопку «Печать…»
«Управлячемый» интерфейс — нажать кнопку заполнение
Выбрать в меню «Данные объекта» — откроется форма обработки
Для просмотра реквизита (например в документе ест реквизит «Договор», он недоступен для изменения. а Вам надо открыть карточку этого договора).
Как получить реквизит от ссылочного значения на клиенте
В форме обработки кликнуть по значению реквизита.
Для изменения реквизита — установить галочку рядом со значением. После этого значение можно изменить.
Для сохранения изменений — нажать кнопку небходимого варианта сохранения запись в режиме «обмен данными — загрузка», обычная запись. проведение (только для документов).
Если нужно часть измененных реквзиитов записать а часть ен записывать — снимите галочки напротив того, что ен надо записывать.
В обработке есть «Данные реквизита» — это все равно как Вы бы открыли значение по ссылке (например, карточку контрагента) и в нем повторно вызвали обработку.
Сравнение объектов можно осуществить:
Выбрав в обработку 2 объекта
2. Вызвав обработку из одного объекта, затем (не закрывая окна) из другого. Будет предложени осуществить сравнение.
3. (Только «управляемый» интерфейс). Выбрать в списке 2 объекта сразу (для этого удерживаем кнопку Ctrl) и вызываем обработку — будет осуществлено сравнение объектов.
Скриншоты (нормальный интерфейс)
Скриншоты («управляемый» интерфейс)
Примеры использования обработки для разбора проблемных ситуаций.
Изменения в версии 1.12 (17.10.2017)
- Для варианта с управляемыми формами исправлена ошибка (не обновлялся реквизит в табличной части, если сам объект имел реквизит шапки с таким же именем)
Изменения в версии 1.10 (06.01.2017)
- Для варианта с управляемыми формами исправлена работа в некоторых типовых конфигурациях (Бухгалтерия, УНФ)
Изменения в версии 1.09 (07.07.2015)
- Добавлен вывод полей «Родитель», «Владелец»
- Для версии под управляемый интерфейс обеспечена работа без модальных окон.
Изменения в версии 1.08 (03.04.2014)
Для версии под нормальный интерфейс улучшена совместимость при работе в конфигурации «Управление производственным предприятием» (УПП) 1.3.
Изменения в версии 1.07 (03.04.2013)
Есть версия обработки под «управляемые» формы (функция автоматической установки и обновления есть только в версии под нормальные формы)
Исправлена ошибка (в дистрибутиве обработки были установлены права)
Изменения в версии 1.06 (13.05.2012)
Показ поля «Версия объекта»
Исправлена ошибка (в обработке нельзя было установить права только на чтение)
Изменения в версии 1.05 (04.05.2011)
Исправлена ошибка (при работе под 8.2 не была доступна запись документа в режиме проведения)
Изменения в версии 1.04 (13.04.2011)
Исправлена ошибка (при работе под 8.2 по двойному клику мыши не открывались реквизиты)
Теперь обработка может переходить к показу реквизитов ссылочного типа.
То есть: допустим, что вы открыли просмотр реквизитов документа «Реализация товаров, услуг». В данном документе есть реквизит «Контрагент» типа «СправочникСсылка.Контрагенты». Нажав на данном реквизите правой кнопкой мыши, Вы получите контекстное меню, в котором есть пункты «Данные реквизита» и «Данные реквизита в новом окне». Выбрав один из них, сможете просмотреть реквизиты соответствующего контрагента.
Изменения в версии 1.03 (15.10.2010)
Добавлена возможность задавать пользователей и их права доступа к обработке.
Изменения в версии 1.02 (21.08.2010)
Поддерживаются конфигурации, в которых справочник внешних обработок называется «Дополнительные печатные формы».
Изменения в версии 1.01 (28.01.2010)
Исправлена ошибка возникавшая при пустом Объекте1 и выбранном Объекте2 (спасибо rasswet, показавшему ее);
Галочка «подробно» срабатывает сразу, не надо нажимать на «Показать»;
Колонка «Тип значения» переименована в «Возможный тип значения» и показывает тип значения, определенный для данного реквизита в конфигураторе. Для реквизитов, имеющих составной тип, дополнительно к этому показывается тип значения этого реквизита в просматриваемом объекте.
Если Вы подключали обработку себе в конфигурацию, то для ее обновления:
скачайте обработку, откройте ее, как внешнюю, она сама подскажет что и как нажать (кнопка «Установка», выбрать «Обновить обработку в базе», нажать кнопку «Выполнить»)
Реквизиты формы
Набор реквизитов формы описывает состав данных, которые отображаются, редактируются или хранятся в форме. При этом реквизиты формы сами по себе не обеспечивают возможности отображения и редактирования данных. Для отображения и редактирования служат элементы формы (смотрите раздел «Элементы формы» данной главы), связанные с реквизитами формы. Совокупность всех реквизитов формы будем называть данными формы.
Важно! Необходимо помнить, что, в отличие от обычных форм, все данные управляемой формы должны быть описаны в виде реквизитов. Не допускается использование переменных модуля формы в качестве источников данных для элементов формы.
Имеется возможность назначить Основной реквизит формы , т. е. реквизит, который будет определять стандартную функциональность формы (расширение формы). Следует помнить, что основной реквизит у формы может быть только один.
Расширение формы – это дополнительные свойства, методы и параметры формы объекта УправляемаяФорма, характерные для объекта, являющегося основным элементом формы.
В процессе разработки формы можно явно задать возможность просмотра и редактирования конкретных реквизитов формы, в разрезе ролей, с помощью свойств Просмотр и Редактирование (подробнее смотрите раздел «Ролевая настройка формы» главы «Редакторы»). Кроме того, доступность того или иного реквизита в самой форме можно настраивать с помощью функциональных опций (подробнее о функциональных опциях можно посмотреть в главе «Управление интерфейсом конфигурации»).
Свойство реквизита формы Сохраняемые данные является признаком того, что интерактивное изменение реквизита будет приводить к попытке блокировки данных формы для редактирования, а также к автоматической установке признака модифицированности формы.
Типы данных, доступные в управляемой форме
Управляемая форма отличается от обычной формы также и типами данных, с которыми она работает. Если обычная форма работает с большинством типов, которые предоставляет 1С:Предприятие (в том числе и вида СправочникОбъект, ДокументОбъект и т. д.), то в управляемой форме можно выделить следующие категории типов:
- типы, которые непосредственно используются в форме – это те типы, которые существуют на стороне тонкого и Веб-клиента (например, Число, СправочникСсылка.Товары, ГрафическаяСхема, ТабличныйДокумент);
- типы, которые будут преобразованы в специальные типы данных – типы данных управляемой формы. Такие типы отображаются в списке реквизитов формы в круглых скобках, например (СправочникОбъект.Товары);
- динамический список (подробнее см. раздел «Динамический список» данной главы).
Преобразование прикладных объектов в данные формы
Некоторые прикладные типы (такие как СправочникОбъект и т. д.) не существуют на стороне тонкого и Веб-клиентов (подробнее см. главу «Концепция управляемого приложения»). Поэтому для представления в форме таких прикладных типов в платформе введены специальные типы данных, предназначенные для работы в управляемых формах. Эта особенность управляемого приложения обуславливает необходимость выполнять преобразование прикладных объектов в данные формы (и обратно).
Используются следующие типы данных:
- ДанныеФормыСтруктура – содержит набор свойств произвольного типа. Свойствами могут быть другие структуры, коллекции или структуры с коллекциями. Таким типом представляется, например, в форме СправочникОбъект.
- ДанныеФормыКоллекция – это список типизированных значений, похожий на массив. Доступ к элементу коллекции осуществляется по индексу или по идентификатору. Доступ по идентификатору может отсутствовать в некоторых случаях. Это обусловлено типом прикладного объекта, который представлен этой коллекцией. Идентификатором может быть любое целое число. Таким типом представляется, например, в форме табличная часть.
- ДанныеФормыСтруктураСКоллекцией – это объект, который представлен в виде структуры и коллекции одновременно. С ним можно обращаться как с любой из этих сущностей. Таким типом представляется, например, в форме набор записей.
- ДанныеФормыДерево – объект предназначен для хранения иерархических данных.
Прикладной объект представлен либо одним, либо несколькими элементами данных формы. В общем виде иерархия и состав данных формы зависят от сложности и взаимосвязи прикладных объектов управляемой формы.
Например, документ, содержащий табличную часть, будет представлен объектом типа ДанныеФормыСтруктура (собственно документ), которому подчинен объект типа ДанныеФормыКоллекция (табличная часть документа).
Важно! Во время разработки конфигурации важно помнить, что прикладные объекты доступны только на сервере, в то время как объектами данных форм можно пользоваться и на сервере, и на клиенте.
Передача данных между клиентской и серверной частями управляемой формы
Фактически можно сказать, что данные формы – это унифицированное представление данных различных прикладных объектов, с которыми форма работает единообразно и которые присутствуют и на сервере, и на клиенте. То есть форма содержит некоторую «проекцию» данных прикладных объектов в виде своих собственных типов данных и выполняет преобразование между ними при необходимости. Однако в случае если разработчик конфигурации реализует свой алгоритм обработки данных, то преобразование данных (из специализированных типов в прикладные и обратно) он должен выполнять самостоятельно.
При редактировании реквизитов формы в специализированном редакторе (подробнее см. раздел «Реквизиты формы» главы «Редакторы») имеется возможность влиять на передачу данных между клиентом и сервером во время работы формы. Для этого служит колонка редактора реквизитов Использовать всегда . Действие этого свойства различается для трех типов реквизитов:
- Для реквизита, подчиненного динамическому списку (колонке динамического списка):
- свойство включено – реквизит всегда считывается из базы данных и включается в данные формы;
- свойство выключено – реквизит считывается из базы данных и включается в данные формы только тогда, когда есть видимый в данный момент элемент формы, связанный с реквизитом или его подчиненным реквизитом.
- Для реквизита, подчиненного коллекции движений:
- свойство включено – движения документа считываются из базы данных и будут присутствовать в данных формы;
- свойство выключено – движения документа не будут считываться из базы данных и не попадут в данные формы (если нет элемента формы, ссылающегося на движения документа).
- Остальные реквизиты формы:
- свойство включено – реквизит будет присутствовать в данных формы вне зависимости от того, есть или нет хоть один элемент формы, который связан с реквизитом или его подчиненным реквизитом;
- свойство выключено – реквизит будет присутствовать в данных формы только в том случае, если есть элемент формы, связанный с реквизитом или его подчиненным реквизитом. В отличие от реквизитов динамического списка, здесь не играет роли видимость элемента, связанного с реквизитом.
Примечание. Следует помнить, что свойство, установленное у родительского реквизита, действует на все подчиненные реквизиты. Например, если свойство Использовать всегда снято у табличной части документа, то система считает, что это свойство снято и у всех подчиненных реквизитов (несмотря на фактическое состояние свойства).
Методы для преобразования данных прикладных объектов в данные формы
Для конвертирования прикладных объектов в данные формы и обратно существует набор глобальных методов:
- ЗначениеВДанныеФормы(),
- ДанныеФормыВЗначение(),
- КопироватьДанныеФормы().
Важно! Методы, работающие с прикладными объектами, доступны только в серверных процедурах. Метод для копирования значений между данными формы доступен на сервере и на клиенте, так как не требует прикладных объектов в качестве параметров.
Во время конвертирования данных формы в прикладной объект нужно учитывать их совместимость.
- ЗначениеВДанныеФормы() – преобразует объект прикладного типа в данные формы;
- ДанныеФормыВЗначение() – преобразует данные формы в объект прикладного типа;
- КопироватьДанныеФормы() – производит копирование данных формы, обладающих совместимой структурой. Возвращает значение Истина, если копирование произведено, или Ложь, если структура объектов несовместима.
Примечание. При выполнении стандартных действий (открытие формы, выполнение стандартной команды Записать и т. д.) формы с основным реквизитом, преобразование выполняется автоматически.
Приведем пример, как использовать преобразование данных в собственных алгоритмах.
&НаСервере Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
КонецПроцедуры
&НаКлиенте Процедура Записать()
ЗаписатьНаСервере();
КонецПроцедуры
&НаСервере Процедура ЗаписатьНаСервере()
ОбъектТовар = ДанныеФормыВЗначение(Объект, Тип(«СправочникОбъект.Товары»)); ОбъектТовар.Записать();
КонецПроцедуры
Также у объекта УправляемаяФорма существуют методы, доступные на сервере:
- ЗначениеВРеквизитФормы() – выполняет преобразование объекта прикладного типа в заданный реквизит формы.
- РеквизитФормыВЗначение() – преобразует реквизит данных формы в объект прикладного типа.
Использование данных методов обычно удобнее, так как они, имеют, например, информацию о типе реквизита формы. Кроме того, метод РеквизитФормыВЗначение() выполняет установку соответствия данных формы и объекта, которая используется при формировании сообщений. Подробнее об этом можно прочитать в главе «Сервисные возможности навигации».
Приведем пример использования этих методов.
&НаСервере Процедура ПересчитатьНаСервере()
// Преобразует реквизит Объект в прикладной объект. Документ = РеквизитФормыВЗначение(«Объект»); // Выполняет пересчет методом, определенным в модуле документа. Документ.Пересчитать(); // Преобразует прикладной объект обратно в реквизит. ЗначениеВРеквизитФормы(Документ, «Объект»);
КонецПроцедуры
Программный интерфейс
ДанныеФормыДерево (FormDataTree)
- НайтиПоИдентификатору (FindById)
- ПолучитьЭлементы (GetItems)
Описание:
Предназначен для моделирования дерева в данных управляемой формы.
Данный объект может быть сериализован в/из XDTO. Тип XDTO, соответствующий данному объекту определяется в пространстве имен. Имя типа XDTO:
ПолучитьЭлементы (GetItems)
Синтаксис:
ПолучитьЭлементы()
Возвращаемое значение:
Тип: ДанныеФормыКоллекцияЭлементовДерева.
Описание:
Получает коллекцию элементов дерева верхнего уровня.
Доступность: клиент, сервер, тонкий клиент, веб-клиент.
НайтиПоИдентификатору (FindById)
Синтаксис:
НайтиПоИдентификатору()
Параметры:
(обязательный)
Тип: Число. Идентификатор элемента дерева.
Возвращаемое значение:
Тип: ДанныеФормыЭлементДерева.
Описание:
Получает элемент коллекции по идентификатору.
Доступность: клиент, сервер, тонкий клиент, веб-клиент.
ДанныеФормыЭлементДерева (FormDataTreeItem)
Свойства:
()
- ПолучитьИдентификатор (GetId)
- ПолучитьРодителя (GetParent)
- ПолучитьЭлементы (GetItems)
- Свойство (Property)
Описание:
Элемент дерева данных формы.
ДанныеФормыКоллекцияЭлементовДерева (FormDataTreeItemCollection)
Элементы коллекции: ДанныеФормыЭлементДерева
Для объекта доступен обход коллекции посредством оператора Для каждого … Из … Цикл. При обходе выбираются элементы коллекции. Возможно обращение к элементу коллекции посредством оператора . В качестве аргумента передается индекс элемента.
Описание:
Коллекция элементов дерева.
Доступность: клиент, сервер, тонкий клиент, веб-клиент.
См. также:
- ДанныеФормыЭлементДерева, метод ПолучитьЭлементы
- ДанныеФормыДерево, метод ПолучитьЭлементы
Особенности работы с деревом значений
Обновление дерева
Существует проблема падения платформы при обновлении дерева.
Если в дереве был развернут какой-либо узел и выбран подчиненный узел, то при обновлении дерева функцией ЗначениеВДанныеФормы происходит падение платформы.
Решение: перед обновлением нужно очищать дерево.
Например:
&НаСервере Процедура ОчиститьДерево(элементы) Для каждого элемент из элементы Цикл ОчиститьДерево(элемент.ПолучитьЭлементы()); КонецЦикла; элементы.Очистить(); КонецПроцедуры
&НаКлиенте Процедура НаДатуПриИзменении(Элемент) ЗаполнитьДеревоПонятий(); КонецПроцедуры
Печать (Ctrl+P)
Для конвертирования прикладных объектов в данные формы и обратно существует набор глобальных методов:
- ЗначениеВДанныеФормы(),
- ДанныеФормыВЗначение(),
- КопироватьДанныеФормы().
Методы, работающие с прикладными объектами, доступны только в серверных процедурах. Метод для копирования значений между данными формы доступен на сервере и на клиенте, так как не требует прикладных объектов в качестве параметров.
Во время конвертирования данных формы в прикладной объект нужно учитывать их совместимость.
- ЗначениеВДанныеФормы () ‑ преобразует объект прикладного типа в данные формы.
- ДанныеФормыВЗначение () ‑ преобразует данные формы в объект прикладного типа.
- КопироватьДанныеФормы () ‑ производит копирование данных формы, обладающих совместимой структурой. Возвращает значение Истина, если копирование произведено, или Ложь, если структура объектов несовместима.
При преобразовании данных формы в прикладные объекты и обратно используется кеширование объектов, но при этом выполняется проверка актуальности версии объекта в кеше.
ПРИМЕЧАНИЕ. При выполнении стандартных действий (открытие формы, выполнение стандартной команды Записать и т. д.) в форме с основным реквизитом преобразование выполняется автоматически.
Приведем пример, как использовать преобразование данных в собственных алгоритмах.
Также у объекта ФормаКлиентскогоПриложения существуют методы, доступные на сервере:
- ЗначениеВРеквизитФормы() ‑ выполняет преобразование объекта прикладного типа в заданный реквизит формы.
- РеквизитФормыВЗначение () ‑ преобразует реквизит данных формы в объект прикладного типа.
Использование данных методов обычно удобнее, так как они имеют, например, информацию о типе реквизита формы. Кроме того, метод РеквизитФормыВЗначение() выполняет установку соответствия данных формы и объекта, которая используется при формировании сообщений.
Также следует помнить, что при преобразовании в данные формы (как с помощью метода ЗначениеВДанныеФормы(), так и с помощью метода ЗначениеВРеквизитФормы()) объектов типа ТаблицаЗначений или ДеревоЗначений нужно учитывать следующую особенность: в преобразуемом объекте должны существовать все колонки, которые существуют в данных формы.
ВНИМАНИЕ! Колонки реквизитов, не связанные с данными, не участвуют в преобразовании значений между данными формы и объектами информационной базы и обратно. Колонки, отсутствующие в данных объекта, очищаются при преобразовании в данные формы.
При переносе объекта в данные формы платформой, или при вызове методов ЗначениеВДанныеФормы (), ЗначениеВРеквизитФормы (), переносятся только данные объекта. Внутренние состояние объекта в данные формы не переносится. Например, значение ссылки нового, которая установлена в объект методом УстановитьСсылкуНового() , будет утеряна в процессе преобразования объекта в данные формы и обратно.
В качестве первого параметра методов РеквизитФормыВЗначение () и ДанныеФормыВЗначение() могут выступать только реквизиты формы следующих типов:
- ДанныеФормыСтруктура,
- ДанныеФормыКоллекция,
- ДанныеФормыСтруктураСКоллекцией,
- ДанныеФормыДерево.
Приведем пример использования этих методов.
При работе с 1С может возникнуть ошибка Не найден файл внешней компоненты.
Прочитав статью, вы узнаете:
- как определить причину указанной ошибки;
- получите рекомендации по исправлению проблемы.
Причины возникновения ошибки
Ошибка Не найден файл внешней компоненты возникает при использовании в 1С дополнительных сервисов, например:
- Сервис Банковских выписок;
- Сервис мониторинга банков;
- Сервис регистрации;
- Сервис склонения Morpher;
- Сервис Спарк риски;
- и т.д.
За каждый такой загружаемый сервис в 1С отвечает своя константа. Если открыть Конфигуратор 1С, то в ветке Константы можно увидеть список этих специализированных констант.
При загрузке указанных сервисов константа «взводится» в положение Используется.
Рекомендации по исправлению ошибки
Если по каким-то причинам при проведении банковских выписок, склонении ФИО в формах документа и т.д. выходит ошибка, что не найден файл внешней компоненты, начинать нужно с проверки состояния констант, отвечающих за данную компоненту в 1С.
Посмотреть состояние константы можно из 1С: кнопка Главное меню — Все функции — Константы.
Флаг сервиса должен быть взведен. Если сервис не используется, программа компоненту «не видит». Выставите флаг сервиса вручную.
Если после установки флага автоматическую загрузку компоненты 1С не выполняет, приходится «загружать» ее «вручную». В этих случаях программисты пишут маленькие внешние обработки, которые позволяют загрузить нужную компоненту самостоятельно.
Перестал работать сервис склонений ФИО в программе 1С. Программист написал внешнюю обработку, проверяющую состояние константы Использовать сервис склонения «Морфер» и загружающую компоненту принудительно.
В программном коде обработки программист прописал принудительную установку константы ИспользоватьСервисСклоненияMorpher для загрузки сервиса Морфер.
Пошаговая инструкция работы с обработкой установки сервиса Морфер.
Шаг 1. Подключение внешней обработки в программе.
Откройте форму подключения внешних печатных форм, отчетов и обработок в 1С: раздел Администрирование — Настройки программы — Печатные формы, отчеты и обработки — Дополнительные отчеты и обработки.
По кнопке Добавить из файла… загрузите внешнюю обработку ЗагрузкаСервисаМорфер.
Шаг 2. Настройка внешней обработки.
Укажите раздел размещения обработки и пользователей, которым предоставлен доступ к ней.
Шаг 3. Запуск обработки.
Перейдите в раздел, который указали в настройке и откройте ссылку Дополнительные обработки.
В окне дополнительных обработок установите курсор на указанной обработке и нажмите кнопку Выполнить.
Шаг 4. Проверка подключения сервиса Морфер.
Проверьте использование сервиса в программе по кнопке Проверить.
Шаг 5. Установка сервиса Морфер.
Включите использование сервиса Морфер и загрузите программно соответствующую компоненту по кнопке Применить.
Шаг 6. Проверьте установку компоненты по кнопке Проверка.
Сервис загружен!
Помимо проблем с загрузкой компонент причиной ошибки может быть используемая Платформа 1С. Именно для встроенных в программу компонент появление ошибки вызывается зачастую чисто техническими параметрами Платформы, которую используют пользователи 1С.
Например, печать штрихкодов в 1С 8.3 для 64-х разрядной Платформы на текущий момент не выполняется. Требуется установить 32-разрядную Платформу 8.3. Подробно об этом мы рассказали в статье .
И не забывайте самое главное правило при поиске ошибок: перед тем, как лезть в проблему глубоко — перезагрузите компьютер или сервер, если установлена не файловая. а клиент-серверная 1С. Часто именно такой простой способ дает отличные результаты. Особенно, если все раньше «работало» и вдруг… перестало.
Если перезагрузка не помогла, тогда начинаем работать с ошибкой, подключая нужных специалистов.
См. также:
- Ошибка работы с интернет Удаленный узел не прошел проверку в 1С: как исправить
- Конфигурация узла распределенной ИБ не соответствует ожидаемой
- 1C Отчетность: не удалось расшифровать файл
- Этот хост неизвестен 1С: как исправить
- Ошибка при выполнении операции с информационной базой 1С 8.3
Если Вы еще не являетесь подписчиком системы БухЭксперт8:
Активировать демо-доступ бесплатно →
или
Оформить подписку на Рубрикатор →
После оформления подписки вам станут доступны все материалы по 1С Бухгалтерия, записи поддерживающих эфиров и вы сможете задавать любые вопросы по 1С.
Помогла статья?
Получите еще секретный бонус и полный доступ к справочной системе БухЭксперт8 на 14 дней бесплатно
Ошибка при выполнении файловой операции при чтении xls файла методом прочитать объекта ТабличныйДокумент.
Скрин сообщения
Данный объект 1C умеет не только записывать в Excel, но возможна и обратная операция с ограничениями, свойственными табличному документу.
В чем плюсы такой методики чтения
- Всё производится встроенными средствами;
- достаточно быстро;
- код в 2 строки
- данные не требуется преобразовывать, обычно всё считывается достаточно корректно, их можно проверить средствами 1С.
- возможно считывать значения ячеек как текст (без авто-преобразования),
- доступно на сервере, где excel вообще нельзя установить (linux, OSx).
Причина ошибки
Отличительной особенностью, вызывающей данную ошибку, является то, что 1С нужен монопольный доступ на время считывания.
Если же документ открыт, то выходит ошибка при выполнении файловой операции чтения.
COM-Объекта Excel.Application в данном ситуации просто открывает еще один экземпляр, а также в нём можно скрыть отображение сообшения о режиме «чтения».
Другой причиной может быть: отсутствие прав на чтение этого файла
Решение:
Закрыть открытую в Excel (или другой программе) книгу, проверить права на файл (возможность открытия в его в Excel, косвенный признак его наличия)
Избегай конкретных обещаний. Текст должен быть чарующе неопределенным.
Формат JSON в 1С до версии 8.3.6 не реализован, но нижет я приведу примеры функций которые можно использовать для полноценной работы JSON в 1С предыдущий версий.
JSON (JavaScript Object Notation) это текстовый формат обмена данными, широко используемый в веб-приложениях. По сравнению с XML он является более лаконичным и занимает меньше места. Кроме этого все браузеры имеют встроенные средства для работы с JSON.
Необходимость работы с этим форматом на уровне платформы обусловлена не только тем, что это «модный современный» формат, который прикладные решения 1С:Предприятия сами по себе могут использовать для интеграции со сторонними приложениями. Другая причина заключается ещё и в том, что JSON активно используется в HTTP интерфейсах. А в 1С:Предприятии как раз есть такие механизмы, в которых хочется использовать этот формат. Это REST интерфейс приложения, автоматически генерируемый платформой, и HTTP-сервисы, которые вы можете создавать самостоятельно.
В платформе с версии 8.3.6:
Потоковое чтение и запись JSON:
Объекты потоковой работы — это общие объекты ЧтениеJSON и ЗаписьJSON. Они последовательно читают JSON из файла или строки, или последовательно записывают JSON в файл или строку. Таким образом, чтение и запись JSON происходят без формирования всего документа в памяти.
В качестве иллюстрации потокового чтения JSON можно привести следующий пример:
Код 1C v 8.3 // Пример чтения JSON.
ЧтениеJSON = Новый ЧтениеJSON;
// Либо открыть файл, из которого будет выполняться чтение, // либо установить строку, из которой будет выполняться чтение.
ЧтениеJSON.ОткрытьФайл(«ИмяФайла»);
//ЧтениеJSON.УстановитьСтроку(«СтрокаJSON»);
Пока ЧтениеJSON.Прочитать() Цикл
TипJSON = ЧтениеJSON.ТипТекущегоЗначения;
Если TипJSON = ТипЗначенияJSON.Число ИЛИ TипJSON = ТипЗначенияJSON.Строка ИЛИ TипJSON = ТипЗначенияJSON.Булево ИЛИ TипJSON = ТипЗначенияJSON.Null Тогда
// Обработать значение
Значение = ЧтениеJSON.ТекущееЗначение;
ИначеЕсли ТипJSON = ТипЗначенияJSON.Комментарий Тогда
// Обработать комментарий
Комментарий = ЧтениеJSON.ТекущееЗначение;
ИначеЕсли TипJSON = ТипЗначенияJSON.ИмяСвойства Тогда
// Обработать имя свойства
ИмяСвойства = ЧтениеJSON.ТекущееЗначение;
ИначеЕсли TипJSON = ТипЗначенияJSON.НачалоМассива ИЛИ TипJSON = ТипЗначенияJSON.КонецМассива ИЛИ TипJSON = ТипЗначенияJSON.НачалоОбъекта ИЛИ TипJSON = ТипЗначенияJSON.КонецОбъекта ИЛИ TипJSON = ТипЗначенияJSON.Ничего Тогда
// Обработать начало/коней массива/объекта или отсутствие данных, // ТекущееЗначение читать не нужно.
КонеиЕсли;
КокецЦикла;
ЧтениеJSON.Закрыть();
// При записи JSON вы самостоятельно формируете его структуру. Чтобы «подстраховать» вас от ошибок, объект ЗаписьJSON автоматически проверяет правильность записываемой структуры.
// Для увеличения скорости работы эту проверку можно отключить. В примере ниже это строка:
ЗаписьJSON.ПроверятьСтруктуру = Ложь;
// Также при записи вы можете управлять некоторыми параметрами формируемого текста, например использованием двойных кавычек, переносом строк, символами отступа и экранированием символов.
// В примере ниже для форматирования текста используется символ табуляции:
ПараметрыЗаписиJSON = Новый ПараметрыЗаписиJSON( , Символы.Таб) ;
ЗаписьJSON.ОткрытьФайл(«ИмяФайла», , , ПараметрыЗаписиJSON);
// Потоковая запись JSON может выглядеть следующим образом. Записывается массив из четырёх элементов. Три из них примитивного типа, а четвёртый элемент — это объект с двумя свойствами:
// Пример записи JSON. ЗаписьJSON = Новый ЗаписьJSON;
// Для увеличения скорости работы можно отключить автоматическую проверку // правильности структуры записываемого документа JSON. ЗаписьиЗСЖ.ПроверятьСтруктуру = Ложь;
// Для красоты результирующего текста можно увеличить «лесенку».
// Стандартный отступ — 1 пробел.
ПараметрыЗаписиJSON = Новый ПараметрыЗаписиJSON( , Символы.Таб);
// Либо открыть файл, в который будет выполнена запись,
// либо указать, что запись будет выполнена в строку, которую вернет метод Закрыть().
ЗаписьJSON.ОткрытьФайл(«ИмяФайла», , , ПараметрыЗаписиJSON);
//ЗаписьJSON.УстановитьСтроку(ПараметрыЗаписиJSON);
// Записать массив.
ЗаписьJSON.ЗаписатьНачалоОбъекта();
ЗаписьJSON.ЗаписатьИмяСвойства(«СвойствоТипаМассив»);
ЗаписьJSON.ЗаписатьНачалоМассива();
// Первый элемент массива — Строка. ЗаписьJSON.ЗаписатьЗначение(«Значение строка»);
// Второй элемент массива — Число. ЗаписьJSON.ЗаписатьЗначение(12.345, Истина);
// Третий элемент массива — Булево. ЗаписьJSON-ЗаписатьЗначение(Истина);
// Четвертый элемент массива — объект с двумя свойствами. ЗаписьJSON.ЗаписатьНачалоОбъекта();
// Первое свойство объекта — Строка
ЗаписьJSON.ЗаписатьИмяСвойства(«СвойствоТипаСтрока»);
ЗаписьJSON.ЗаписатьЗначение(«Значение строка»);
// Второе свойство объекта — Неопределено
ЗаписьJSON.ЗаписатьИмяСвойства(«СвойствоТипаНеопределено»);
ЗаписьJSON.ЗаписатьЗначение(Неопределено);
ЗаписьJSON.ЗаписатьКонецОбъекта();
Запись JSON. ЗаписатьКонецМассива () ;
ЗаписьJSON.ЗаписатьКонецОбъекта();
ЗаписьJSON.Закрыть();
//CTpoKaJSON = ЗаписьJSON.Закрыть();
Результат такой записи:
Код 1C v 8.х
{
«СвойствоТипаМассив»:
}
Сериализация примитивных типов и коллекций в JSON
Вторая группа средств работы с JSON хороша тем, что избавляет вас от рутинной работы по чтению/записи каждого отдельного значения или свойства. При чтении документы JSON отображаются в фиксированный набор типов платформы: Строка, Число, Булево, Неопределено, Массив, ФиксированныйМассив, Структура, ФиксированнаяСтруктура, Соответствие, Дата. Соответственно, в обратную сторону, композиция объектов этих типов позволяет сформировать в памяти и быстро записать в файл структуру JSON. Таким образом, чтение и запись небольшого объема JSON заранее известной структуры можно производить немногими строчками кода.
Основное назначение этих средств мы видим в обмене информацией с внешними системами, чтении конфигурационных файлов в формате JSON.
Сериализацию вы можете выполнять с помощью методов глобального контекста ПрочитатьJSON() и ЗаписатьJSON(). Они работают в связке с объектами ЧтениеJSON и ЗаписьJSON.
В качестве примера десериализации JSON можно рассмотреть чтение массива из двух объектов:
Код 1C v 8.3 // В качестве примера десериализации JSON можно рассмотреть чтение массива из двух объектов:
// Код 1С:Предприятия, выполняющий десериализацию, может выглядеть следующим образом:
// Пример чтения JSON.
ЧтениеJSON = Новый ЧтениеJSON();
ЧтениеJSON.ОткрытьФайл(«ИмяФайла»);
Сотрудники = ПрочитатьJSON(ЧтениеJSON);
ЧтениеJSON.Закрыть();
Для каждого Сотрудник из Сотрудники Цикл
// Обработать данные сотрудника.
ИмяСотрудника = Сотрудник.имя; ФамилияСотрудника = Сотрудник.фамилия; ВозрастСотрудника = Сотрудник.возраст;
КонецЦикла;
// А пример сериализации (записи) в JSON может выглядеть так:
// Пример записи JSON
Структура = Новый Структура;
Вставить(«Фамилия»,»Иванов»);
Зставить(«Имя», «Иван»);
Вставить(«Отчество», «Иванович»);
Зставить(«Возраст», 40) ;
Зставить(«Женат», Истина);
Телефоны = Новый Массив;
Телефоны.Добавить(«8-999-999-99-90») ;
Телефоны.Добавить(«8-999-999-99-91») ;
Структура.Вставить(«Телефоны», Телефены);
ЗаписьJSON = Новый ЗаписьJSON;
ЗаписьJSON.ОткрытьФайл(«ИмяФайла», , , Новый ПapaмeтpыЗaпиcиJS0N( , Символы.Таб) ) ;
ЗаписатьJSON(ЗаписьJSON, Структура);
ЗаписьJSON.Закрыть();
// Результат записи:
{
«Фамилия»: «Иванов»,
«Имя»: «Иван»,
«Отчество»: «Иванович»,
«Возраст»: 40,
«Женат»: true,
«Телефоны»:
}
Подробнее вы можете посмотреть
В платформе с версии 8.3.7:
Полностью автоматизировали работу с JSON и реализовали в платформе третью группу средств. Они позволяют сериализовать в JSON прикладные типы 1С:Предприятия: ссылки, объекты, наборы записей и вообще любые типы, для которых поддерживается XDTO сериализация. Конечно же, мы обеспечили и обратную операцию — десериализацию. Зачем это нужно!?
Прежде всего, и в основном, XDTO сериализацию в JSON мы рекомендуем использовать при обмене данными между двумя прикладными решениями 1С:Предприятия. По сравнению с XML формат JSON более компактный, сериализация/десериализация в/из JSON выполняется быстрее. Кроме этого мы предприняли дополнительные меры для того, чтобы сократить объём передаваемых данных.
Кроме обмена между приложениями 1С:Предприятия этот механизм можно использовать и для обмена с внешними системами, готовыми принимать типы данных 1С:Предприятия. Например, XDTO сериализацию в JSON можно использовать для организации собственного HTTP интерфейса прикладного решения. Сервис на платформе 1С:Предприятия будет формировать ответ в памяти в виде строки JSON. А затем передавать её при помощи объекта HTTPСервисОтвет. Реализованный нами механизм сериализации полностью соответствует стандарту JSON. Поэтому внешняя система не должна испытывать каких-либо трудностей с десериализацией.
Использование XDTO сериализации в JSON для других задач видится нам маловероятным. Потому что если внешняя система не готова работать с прикладными типами 1С:Предприятия, то зачем их ей передавать? А если предполагается обмениваться только примитивными типами и коллекциями, то для этой задачи хорошо подходят методы ПрочитатьJSON() и ЗаписатьJSON(). Подробнее
ДО платформы версии 8.3.6, т.е. 8.3.5 и ниже:
На HelpF уже есть статья где описан пример: Работа с форматом JSON в 1С но не приведены функции, вот они:
Код 1C v 8.х Функция ПреобразоватьвСистему(Число10,система) Экспорт
Если система > 36 или система < 2 тогда
Сообщить(«Выбранная система исчисления не поддерживается»);
Возврат -1;
КонецЕсли;
СтрокаЗначений = «0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ»;
СтрокаСистема = «»;
Пока Число10 > 0 цикл
РезДеления = Число10/система;
ЧислоСистема = цел(РезДеления);
остатокОтДеления = Число10 — система*(ЧислоСистема);
СтрокаСистема = сред(СтрокаЗначений,остатокОтДеления+1,1)+ СтрокаСистема;
Число10 = ?(ЧислоСистема=0,0,РезДеления);
КонецЦикла;
Нечётное = стрДлина(СтрокаСистема) — цел(стрДлина(СтрокаСистема)/2)*2;
Если Нечётное тогда
СтрокаСистема = «0»+СтрокаСистема;
КонецЕсли;
Возврат СтрокаСистема;
КонецФункции
Функция URLEncode(стр) Экспорт
Длина=СтрДлина(Стр);
Итог=»»;
Для Н=1 По Длина Цикл
Знак=Сред(Стр,Н,1);
Код=КодСимвола(Знак);
если ((Знак>=»a»)и(Знак<=»z»)) или
((Знак>=»A»)и(Знак<=»Z»)) или
((Знак>=»0″)и(Знак<=»9″)) тогда
Итог=Итог+Знак;
Иначе
Если (Код>=КодСимвола(«А»))И(Код<=КодСимвола(«п»)) Тогда
Итог=Итог+»%»+ПреобразоватьвСистему(208,16)+»%»+ПреобразоватьвСистему(144+Код-КодСимвола(«А»),16);
ИначеЕсли (Код>=КодСимвола(«р»))И(Код<=КодСимвола(«я»)) Тогда
Итог=Итог+»%»+ПреобразоватьвСистему(209,16)+»%»+ПреобразоватьвСистему(128+Код-КодСимвола(«р»),16);
ИначеЕсли (Знак=»ё») Тогда
Итог=Итог+»%»+ПреобразоватьвСистему(209,16)+»%»+ПреобразоватьвСистему(145,16);
ИначеЕсли (Знак=»Ё») Тогда
Итог=Итог+»%»+ПреобразоватьвСистему(208,16)+»%»+ПреобразоватьвСистему(129,16);
Иначе
Итог=Итог+»%»+ПреобразоватьвСистему(Код,16);
КонецЕсли;
КонецЕсли;
КонецЦикла;
Возврат Итог;
КонецФункции
Функция СформироватьСтрокуJSONИзМассива(Объект)
СтрокаJSON = «»;
КонецФункции
Функция СформироватьСтрокуJSONИзСтруктуры(Объект)
СтрокаJSON = «{«;
Для каждого Элемент Из Объект Цикл
Если Элемент.Значение = «» Тогда
Продолжить;
КонецЕсли;
СтрокаJSON = СтрокаJSON + «»»» + Элемент.Ключ + «»»» + «:»;
Если ТипЗнч(Элемент.Значение) = Тип(«Строка») Тогда
СтрокаJSON = СтрокаJSON + «»»» + Элемент.Значение + «»»»;
ИначеЕсли ТипЗнч(Элемент.Значение) = Тип(«Число») Тогда
СтрокаJSON = СтрокаJSON + СтрЗаменить(Строка(Элемент.Значение), Символы.НПП, «»);
ИначеЕсли ТипЗнч(Элемент.Значение) = Тип(«Булево») Тогда
СтрокаJSON = СтрокаJSON + Формат(Элемент.Значение, «БЛ=false; БИ=true»);
ИначеЕсли ТипЗнч(Элемент.Значение) = Тип(«Дата») Тогда
СтрокаJSON = СтрокаJSON + Формат(Элемент.Значение — Дата(1970,1,1,1,0,0), «ЧГ=0»);
ИначеЕсли ТипЗнч(Элемент.Значение) = Тип(«Массив») Тогда
СтрокаJSON = СтрокаJSON + СформироватьСтрокуJSON(Элемент.Значение);
ИначеЕсли ТипЗнч(Элемент.Значение) = Тип(«Структура») Тогда
СтрокаJSON = СтрокаJSON + СформироватьСтрокуJSON(Элемент.Значение);
ИначеЕсли ТипЗнч(Элемент.Значение) = Тип(«ТаблицаЗначений») Тогда
СтрокаJSON = СтрокаJSON + СформироватьСтрокуJSON(Элемент.Значение);
Иначе
СтрокаJSON = СтрокаJSON + «»»» + URLEncode(Строка(Элемент.Значение)) + «»»»;
КонецЕсли;
СтрокаJSON = СтрокаJSON + «,»;
КонецЦикла;
Если Прав(СтрокаJSON, 1) = «,» Тогда
СтрокаJSON = Лев(СтрокаJSON, СтрДлина(СтрокаJSON)-1);
КонецЕсли;
Возврат СтрокаJSON + «}»;
КонецФункции
Функция СформироватьСтрокуJSON(Объект) Экспорт
СтрокаJSON = «»;
Если ТипЗнч(Объект) = Тип(«Массив») Тогда
СтрокаJSON = СформироватьСтрокуJSONИзМассива(Объект);
ИначеЕсли ТипЗнч(Объект) = Тип(«Структура») Тогда
СтрокаJSON = СформироватьСтрокуJSONИзСтруктуры(Объект);
ИначеЕсли ТипЗнч(Объект) = Тип(«ТаблицаЗначений») Тогда
СоставСтруктуры = «»;
Для каждого Колонка Из Объект.Колонки Цикл
СоставСтруктуры = СоставСтруктуры + ?(ЗначениеЗаполнено(СоставСтруктуры), «,», «») + Колонка.Имя;
КонецЦикла;
МассивСтрок = Новый Массив;
Для каждого Строка Из Объект Цикл
СтруктураКолонок = Новый Структура(СоставСтруктуры);
ЗаполнитьЗначенияСвойств(СтруктураКолонок, Строка);
МассивСтрок.Добавить(СтруктураКолонок);
КонецЦикла;
СтрокаJSON = СформироватьСтрокуJSONИзМассива(МассивСтрок);
КонецЕсли;
Возврат СтрокаJSON;
КонецФункции
Процедура ЗаполнитьДанныеИзОтветаJSON(Результат, ТекстJSON, ТипДанных)
ТекстJSON = СокрЛП(Сред(ТекстJSON, 2));
НомерЗначения = 0;
Пока ТекстJSON <> «» Цикл
ПервыйСимвол = Лев(ТекстJSON, 1);
Если ПервыйСимвол = «{» Тогда
Значение = Новый Структура;
ЗаполнитьДанныеИзОтветаJSON(Значение, ТекстJSON, «Структура»);
Если ТипДанных = «Структура» Тогда
Результат.Вставить(«Значение» + ?(НомерЗначения = 0, «», НомерЗначения), Значение);
НомерЗначения = НомерЗначения + 1;
ИначеЕсли ТипДанных = «Массив» Тогда
Результат.Добавить(Значение);
КонецЕсли;
ИначеЕсли ПервыйСимвол = «» И ТипДанных = «Массив» Тогда
ТекстJSON = СокрЛП(Сред(ТекстJSON, 2));
Если Лев(ТекстJSON, 1) = «,» Тогда
ТекстJSON = СокрЛП(Сред(ТекстJSON, 2));
КонецЕсли;
Возврат;
Иначе
Если ТипДанных = «Структура» Тогда
Поз = Найти(ТекстJSON, «:»);
Если Поз = 0 Тогда
Прервать;
КонецЕсли;
ИмяЗначения = СокрЛП(Лев(ТекстJSON, Поз-1));
ТекстJSON = СокрЛП(Сред(ТекстJSON, Поз+1));
Если Лев(ТекстJSON, 1) = «{» Тогда
Значение = Новый Структура;
ЗаполнитьДанныеИзОтветаJSON(Значение, ТекстJSON, «Структура»);
ИначеЕсли Лев(ТекстJSON, 1) = «» ИЛИ Символ = «}» Тогда
Поз = Сч;
Прервать;
КонецЕсли;
КонецЦикла;
Если Поз = 0 Тогда
Значение = ТекстJSON;
ТекстJSON = «»;
Иначе
Значение = Лев(ТекстJSON, Поз-1);
ТекстJSON = СокрЛП(Сред(ТекстJSON, Поз + ?(Сред(ТекстJSON, Поз, 1) = «,», 1, 0)));
КонецЕсли;
Значение = СокрЛП(Значение);
КонецЕсли;
Результат.Вставить(ИмяЗначения, Значение);
ИначеЕсли ТипДанных = «Массив» Тогда
Поз = 0;
Для Сч = 1 По СтрДлина(ТекстJSON) Цикл
Символ = Сред(ТекстJSON, Сч, 1);
Если Символ = «,» ИЛИ Символ = «]» ИЛИ Символ = «}» Тогда
Поз = Сч;
Прервать;
КонецЕсли;
КонецЦикла;
Если Поз = 0 Тогда
Значение = ТекстJSON;
ТекстJSON = «»;
Иначе
Значение = Лев(ТекстJSON, Поз-1);
ТекстJSON = СокрЛП(Сред(ТекстJSON, Поз + ?(Сред(ТекстJSON, Поз, 1) = «,», 1, 0)));
КонецЕсли;
Значение = СокрЛП(Значение);
Результат.Добавить(Значение);
КонецЕсли;
КонецЕсли;
КонецЦикла;
КонецПроцедуры
Функция ЗаполнитьСтруктуруИзОтветаJSON(Знач ТекстJSON) Экспорт
Результат = Новый Структура;
ТекстJSON = СтрЗаменить(ТекстJSON, «\»»», «»»»);
ТекстJSON = СтрЗаменить(ТекстJSON, «»»», «»);
Если Лев(ТекстJSON, 1) = «{» Тогда
ЗаполнитьДанныеИзОтветаJSON(Результат, ТекстJSON, «Структура»);
ИначеЕсли Лев(ТекстJSON, 1) = «
////////////////////////////////////////////////////////
// преобразование сложной структуры
Данные = Новый Структура;
Данные.Добавить(«server», 10234);
Данные.Добавить(«users», Новый Массив);
Данные.Добавить(«hash», «8263ad83ce»);
Данные.users.Добавить(3745);
Данные.users.Добавить(7462);
Данные.users.Добавить(2374);
СтрокаJSON = СформироватьСтрокуJSONИзСтруктуры(Данные);
// результатом будет строка
// {«server»:»10234″,»users»:,»hash»:»8263ad83ce»}
////////////////////////////////////////////////////////
// еще один пример массива
Данные = Новый Структура;
Данные.Вставить(«server», 10234);
Данные.Вставить(«users», Новый Массив);
Данные.users.Добавить(Новый Структура(«id,name», 3745, «Jack»));
Данные.users.Добавить(Новый Структура(«id,name», 7246, «Nick»));
СтрокаJSON = СформироватьСтрокуJSONИзСтруктуры(Данные);
// результатом будет строка
// {«server»:»10234″,»users»:[{«id»:»3745″,»name»:»Jack»},{«id»:»7462″,»name»:»Nick»}>
////////////////////////////////////////////////////////
// преобразование таблицы значений
ТаблПользователей = Новый ТаблицаЗначений;
ТаблПользователей.Колонки.Добавить(«id»);
ТаблПользователей.Колонки.Добавить(«name»);