Как создать правило для конвертации значения неопределенного типа?
Приемник: Субконто1
ДокументСсылка.АвансовыйОтчет, ПеречислениеСсылка.ВидыНачисленийПоОплатеТруда, ПеречислениеСсылка.ВидыРасчетовСПокупателями, ДокументСсылка.Сторно, ПеречислениеСсылка.Пол, ДокументСсылка.ТЭЦ_ДокументОперация, ПеречислениеСсылка.СпособыУчетаГПиПФ, ДокументСсылка.Выписка, ПеречислениеСсылка.ПериодичностьУплатыНалога, ПеречислениеСсылка.ВидыОбеспеченияОбязательств, СправочникСсылка.ТЭЦ_ДомаТЭЦ, ПеречислениеСсылка.Булево, СправочникСсылка.ТЭЦ_Недоимка, ПеречислениеСсылка.ВидыДоходов, ПеречислениеСсылка.ВидыРасходов, ПеречислениеСсылка.СпособыПоступленияОС, ПеречислениеСсылка.СЗВОсобыеУсловияТруда, ПеречислениеСсылка.РазрезыДеятельности, ПеречислениеСсылка.ТЭЦ_ВидыУведомлений, ДокументСсылка.ТЭЦ_Квартплата, ПеречислениеСсылка.БазаРаспределенияКосвенныхРасходов, ДокументСсылка.Операция, ДокументСсылка.ТЭЦ_СчетФактура, СправочникСсылка.СтавкиНП, ПеречислениеСсылка.СЗВОснованияВыслугиЛет2002, СправочникСсылка.ОКСМ, ПеречислениеСсылка.ИсточникиЦелевыхПоступлений, СправочникСсылка.ВидыНоменклатуры, ПеречислениеСсылка.ВнереализационныеДоходы, СправочникСсылка.Номенклатура, СправочникСсылка.Контрагенты, СправочникСсылка.Договоры, СправочникСсылка.СтатьиКоммерческихРасходов, СправочникСсылка.Банки, СправочникСсылка.ОбъектыСтроительства, ПеречислениеСсылка.СпособыНачисленияАмортизацииНМА, ДокументСсылка.ТЭЦ_СписаниеОС, СправочникСсылка.ТЭЦ_Счет60, СправочникСсылка.БланкиСтрогойОтчетности, ПеречислениеСсылка.ТипОС, СправочникСсылка.ЦенныеБумаги, ПеречислениеСсылка.СостоянияНМА, ПеречислениеСсылка.ПричиныСписанияНМА, СправочникСсылка.ДоходыБудущихПериодов, ПеречислениеСсылка.ВариантыОтпускныхЦен, СправочникСсылка.НазначенияИспользования, ПеречислениеСсылка.СЗВОтчетныйПериод, ПеречислениеСсылка.НазначенияЦелевыхСредств, ПеречислениеСсылка.Бюджеты, СправочникСсылка.ТЭЦ_ТипыНоменклатуры, ДокументСсылка.РасходныйОрдер, ПеречислениеСсылка.СЗВПараметр3ИТС, СправочникСсылка.СтатьиЗатратОбслуживающихПроизводств, ПеречислениеСсылка.УсловияВыбытияИмущества, ПеречислениеСсылка.МетодыНачисленияАмортизации, ДокументСсылка.ТЭЦ_СчетФактураЭнергосбыт, СправочникСсылка.ВариантыРасчетаНалогов, СправочникСсылка.ПрочиеДоходыИРасходы, ПеречислениеСсылка.СпособыВеденияНалоговогоУчета, СправочникСсылка.СтатьиРасходовНаПродажу, ПеречислениеСсылка.ГруппыНМА, СправочникСсылка.ДвиженияДенежныхСредств, ПеречислениеСсылка.СЗВТипФормы, ДокументСсылка.ПлатежноеПоручение, ПеречислениеСсылка.СпособыПоступленияНМА, СправочникСсылка.ДокументыУдостоверяющиеЛичность, ПеречислениеСсылка.БУ, СправочникСсылка.ФП_ВыгрузкаДанных, ДокументСсылка.СчетФактура, СправочникСсылка.ТЭЦ_ВариантыРеализации, СправочникСсылка.НематериальныеАктивы, ПеречислениеСсылка.ПризнакДоходаРасхода, ДокументСсылка.ТЭЦ_ПриходТМЦ, ПеречислениеСсылка.СЗВОснованияВыслугиЛет, СправочникСсылка.Оборудование, ДокументСсылка.ТЭЦ_АктПоВекселям, ДокументСсылка.ТЭЦ_СудебныйИск, ПеречислениеСсылка.БазаРаспределенияПрямыхРасходов, ДокументСсылка.ПлатежноеТребование, ПеречислениеСсылка.ВидыПрочихДоходовИРасходов, ДокументСсылка.ТЭЦ_АктПеремещенияОС, СправочникСсылка.ТЭЦ_ЧастныеЛица, ДокументСсылка.ТЭЦ_СчетФактураАвансовый, ДокументСсылка.ТЭЦ_УслугиСвязи, ДокументСсылка.ТЭЦ_Взаимозачет, СправочникСсылка.Резервы, СправочникСсылка.СтатьиОбщепроизводственныхЗатрат, СправочникСсылка.Сотрудники, ПеречислениеСсылка.СпособыНачисленияАмортизацииОС, СправочникСсылка.СтавкиНДС, ПеречислениеСсылка.УсловияИлиВидыПоступлений, ДокументСсылка.ТЭЦ_ЗаписьКнигиПродажРуками, ПеречислениеСсылка.СтоимостьВыпуска, СправочникСсылка.ТЭЦ_СтатьиЗатратВспомПроизводств, ПеречислениеСсылка.ТипыТМЦ, ДокументСсылка.ТЭЦ_СписаниеОтклоненийМатериалов, СправочникСсылка.Материалы, ПеречислениеСсылка.КатегорияПлательщикаПФ, СправочникСсылка.СтатьиЗатратНаСтроительство, ДокументСсылка.ТЭЦ_АктПеремещенияМатериалов, ПеречислениеСсылка.ВидыАктивовИобязательств, ПеречислениеСсылка.СЗВОснованияИТС2002, ПеречислениеСсылка.НДСпоНепром, СправочникСсылка.СтатьиИздержекОбращения, ПеречислениеСсылка.ТипыНоменклатуры, СправочникСсылка.ЕдиницыИзмерений, ДокументСсылка.ТЭЦ_Счет, ПеречислениеСсылка.СЗВОснованияИТС, ПланСчетовСсылка.Основной, ПеречислениеСсылка.ПодстановкаСуммыНДС, ПеречислениеСсылка.ПризнакЗадолженности, СправочникСсылка.ВидыСубконто, ПеречислениеСсылка.ТипыТоваров, СправочникСсылка.ТЭЦ_ГруппыКонтрагентов, ДокументСсылка.ТЭЦ_ЗаписьКнигиПродаж, ДокументСсылка.ТЭЦ_ВозвратПоАвансам, ДокументСсылка.ЗакрытиеМесяца, СправочникСсылка.РасходыБудущихПериодов, ДокументСсылка.ТЭЦ_ВводОСВЭксплуатацию, ПеречислениеСсылка.ТипыЗаписейКнигиПокупок, СправочникСсылка.ГТД, ПеречислениеСсылка.МетодыОпределенияВыручки, ПеречислениеСсылка.ДиректКостингБазаРаспределения, ДокументСсылка.ТЭЦ_ЗаписьКнигиПокупок, ПеречислениеСсылка.ВидыКонтрагентов, ПеречислениеСсылка.НалогПени, СправочникСсылка.НалогиИОтчисления, СправочникСсылка.МестаХранения, СправочникСсылка.ТЭЦ_ГТС, ПеречислениеСсылка.РаскрываемыеРазделыОтчетности, ПеречислениеСсылка.Фонды, ПеречислениеСсылка.УсловияПоступленияИВыбытия, ПеречислениеСсылка.ВидыНачислений, ПеречислениеСсылка.Налоги, ПеречислениеСсылка.АмортизационныеГруппы, ДокументСсылка.ТЭЦ_ЗакрытиеАналитикиПоСчету20, ПеречислениеСсылка.ВидыПлатежейВБюджет, ДокументСсылка.ТЭЦ_ЗаписьКнигиПокупокРуками, ПеречислениеСсылка.СостоянияОС, ДокументСсылка.ТЭЦ_РазноскаВыписки, ПеречислениеСсылка.МетодыРасчетаСебестоимости, СправочникСсылка.ТЭЦ_Отрасли, ПеречислениеСсылка.УсловияИлиВидыРасходов, СправочникСсылка.СтатьиОбщехозяйственныхЗатрат, СправочникСсылка.ТЭЦ_Жильцы, ПеречислениеСсылка.ГруппыОС, СправочникСсылка.ФП_Справочники, ПеречислениеСсылка.УсловияПолученияИмущества, ПеречислениеСсылка.СЗВОсобыеУсловияТруда2002, ДокументСсылка.ТЭЦ_ЗакрытьОстаткиПоСчету60, ДокументСсылка.ТЭЦ_РаспределениеСчетов, ПеречислениеСсылка.ПрибылиИУбытки, СправочникСсылка.ТЭЦ_СтатьиНедостачи, ПеречислениеСсылка.ТипыБанковскихСчетов, СправочникСсылка.РасчетныеСчета, ПеречислениеСсылка.ГруппыВидыРасходов, ПеречислениеСсылка.ВнереализационныеРасходы, СправочникСсылка.Валюты, ПеречислениеСсылка.ФондыОМС, ПеречислениеСсылка.ВидыПлатежейВФонды, ПеречислениеСсылка.ТерриториальныеУсловия, СправочникСсылка.Подразделения, ПеречислениеСсылка.СпособыСписания97, СправочникСсылка.СтатьиЗатратНаПроизводство, ПеречислениеСсылка.ВидыПлатежныхДокументов, ДокументСсылка.ПереносОпераций, СправочникСсылка.ТЭЦ_ОбъектыАналитики, СправочникСсылка.ТЭЦ_ПодразделенияОС, ПеречислениеСсылка.ХарактерРаботы, СправочникСсылка.КлассификаторЕН, ДокументСсылка.ТЭЦ_СписаниеМатериалов, ПеречислениеСсылка.ТипыЗаписейКнигиПродаж, ДокументСсылка.ТЭЦ_РаспределениеОтклоненийМатериалов, ПланВидовХарактеристикСсылка.ВидыСубконто, ДокументСсылка.ТЭЦ_Удержание_квартплата, ПеречислениеСсылка.ВидыРезервов, ДокументСсылка.Доверенность, ПеречислениеСсылка.ЛьготыПоЖильцу, СправочникСсылка.БанковскиеСчета, ДокументСсылка.ТЭЦ_РазнесениеОплатыПоСч60, ПеречислениеСсылка.СпособПогашенияСтоимости, ПеречислениеСсылка.ДиректКостингВидыПродукции, ПеречислениеСсылка.ТипОстаткаАванса, ПеречислениеСсылка.ВидыАккредитива, ПеречислениеСсылка.ВидыПлатежа, ДокументСсылка.ПриходныйОрдер, СправочникСсылка.ОсновныеСредства, ПеречислениеСсылка.ПричиныВыбытияОС, ПеречислениеСсылка.ТипыВычетов, ПеречислениеСсылка.ВидыДвиженийДенежныхСредств, СправочникСсылка.ПрочиеОбъектыУчета
Источник: Субконто1 тип х.з.
в ПКО ПередВыгрузкой
Если ТипЗнч(Источник)=Тип(«ДокументСсылка.Мой») Тогда
ИмяПКО=»ПравилоДляДокументМой»;
ИначеЕсли ТипЗнч(Источник)=Тип(«ДокументСсылка.Мой2») Тогда
ИмяПКО=»ПравилоДляДокументМой2″;
//. и т.д
КонецЕсли;
Конвертация данных: разбить документ на два одного типа?
В целом все правильно, только нужно сделать уникальное поле поиска при загрузке. Сейчас у тебя по ссылке/номеру данные каждой следующей партии перезаписывают предыдущую выгрузку этого документа. Без ПКО с одним ПВД трудно угадать, но полагаю что в XML-файле есть записи по каждой партии. Еще можно чуть-чуть подправить правила загрузки. Или правила поиска.
Конвертация настолько гибкая, что можно одно и тоже сделать несколькими способами 🙂
- Вконтакте
Xris, при «выгрузке» — это значит в файл попадает только одна партия?
1) проверить, что алгоритм ПВД работает — втыкнуть что-то типа Сообщить() или запись в журнал регистрации, чтобы убедится в том, что данные подготовлены верно.
2) далее поиграйтесь с настройками вашего ПКО ВозвратПоставщику_КорректировкаПриобретения. Там есть поиск по уникальному идентификатору, было бы неплохо выгружать ваши виртуальные документы с новым уникальным идентификатором. Как это делается не помню — наверное есть переменная, которую можно подсмотреть в описании обработчиков. Точно помню, что можно самостоятельно создать собственный узел для выгрузки объекта.
А еще лучше посмотрите типовые примеры конвертиции, там где «два в один», «один в два», «регистр в справочник», «справочник в документ» и т.п.
Name already in use
v8-code-style / docs / checks / code_typification.md
- Go to file T
- Go to line L
- Copy path
- Copy permalink
6 contributors
Users who have contributed to this file
- Open with Desktop
- View raw
- Copy raw contents Copy raw contents
Copy raw contents
Copy raw contents
[TOC text numbered hierarchy levels=2-5]
- Снизить количество ошибок, выявляемых на этапе разработки
- Исключить практику написания кода в режиме отладки за счет максимально возможной типизации кода для статического анализатора в 1C:EDT.
- Более простой код для чтения человеком
- Типизация кода позволит активнее применять различные средства анализа кода
- Более качественный рефакторинг при модификации кода
- Поддержка документирующих комментариев в актуальном (правдивом) состоянии
- Применение инструментов автоматической обработки кода (авто-форматирование, авто-перевод кода и так далее).
- Упрощение поддержки кода новыми разработчиками
Как это работает
При изучении возможностей типизации следует учитывать, что:
- Язык исполнения 1С:Предприятия 8 является/остается динамически-типизируемым
- Все возможности вычисления типизации — это базовые возможности ядра 1C:EDT
- Плагин 1С:Стандарты разработки V8 добавляет только контроль типов в 1C:EDT и проблемных ситуаций на основе базовых возможностей 1C:EDT
Динамический расчет типов, выполняемый в 1С:EDT на основе контекста 1С:Предприятия и метаданных конфигурации.
Отслеживание состояния типов переменных
Система типизации кода 1C:EDT отслеживает тип переменных в зависимости от их использования (местоположения в коде)
Отслеживание состояния типов свойств
При анализе объектов данных (Data-flow analysis), создаваемых программно, система типизации 1C:EDT учитывает только те типы, которые были указаны в момент инициализации свойства в объекте данных.
При фактической смене типа значения у свойства объекта, который допускает такое поведение в run-time 1С:Предприятия 8 , система типизации и анализа объектов данных в 1C:EDT не учитывает эту смену.
В этом случае, правильным подходом является: указание начального типизированного значения, и не допускать изменения типа значения далее в коде. Т.е., фактически — есть два варианта у переменных:
- Тип определен пользователем явно, и дальше он меняться не будет, а попытку изменения — можно будет отслеживать.
- Если тип неопределен явно, то он ВСЕГДА будет неопределен и далее, и плагин будет во всех местах его считать именно неопределенным. Фактически — данный подход запрещает использовать конструкцию Перем без явного указания типа в комментарии.
Статическое указание типов в документирующих/типизирующих комментариях, ссылки на функции-конструкторы и ссылки на входящие параметры других методов.
Существуют стандартные инструменты в 1C:EDT и добавляемые расширениями (плагинами) инструменты, которые помогают типизировать код.
Использование контекстного помощника ввода
- Для того, чтобы код был максимально типизирован изначально — при написании кода следует использовать контент-ассист (или контекстный помощник ввода) Ctrl+Space, который подсказывает все известные свойства и методы объекта.
- При этом, если помощник ввода не подсказывает нужные свойства — следует сначала уточнить типы (исправить типы) для текущего объекта и продолжить набор текста по известным свойствам.
- Использование типизации кода снижает потребность написания кода в режиме отладки с целью определения типов переменных, т.к. типы переменных подсказывает среда разработки.
- Для проверки, того, что объект имеет статический или динамический тип — необходимо выделить нужный объект и нажать F2 для отображения описания объекта — перед именем объекта должен отображаться его тип.
- Важно! Типизирующие комментарии не могут переопределять типы, которые рассчитала EDT, а могут только их дополнять. Это значит, что если вы укажите в комментарии к функции что вы ожидаете на вход тип, например ПолеВвода , а в контекстной подсказке у вас показываются методы других типов, например, ГруппаФормы , то это значит, что EDT нашла места вызова этой функции, в которых передается другой тип. И это убрать или переопределить типы — нельзя на текущий момент.
Внимание! Контекстный помощник ввода работает при наборе документирующих комментариев.
Как диагностировать причины не типизированного кода
- при наведении мышкой на объект в коде — панель всплывающей подсказки не показывает тип, значит, система типизации 1C:EDT не смогла его расчитать.
- в коде после точки обращения к свойству/методу вызвать контент-ассист (нажать Ctrl+Space ) — подсказка ввода не показывает свойства в формате Объект.Свойство <Тип свойства>
Обратите внимание! В подсказке ввода — после имени свойства указан тип свойства <Тип свойства> в фигурных скобках и после
Тип объекта — тип, из которого это свойство получено, т.к. у объекта может несколько типов.
Чтобы найти причины не типизированного кода, можно следовать некоторым пунктам:
- Необходимо найти самый первый объект в цепочке вызова в данной строке
- Высянить есть ли у этого объекта тип — навести мышкой или нажать F2 для вывода подсказки
- Перейти к определению этого объекта — нажать F3 и в месте определения выяснить тип
- Определить тип слишком общим (абстрактным), например, УправляемаФорма , ТаблицаЗначений , Массив , Структура , ДокументОбъект , СправочникСсылка и т.д. без спецификации каких либо конкретных свойств к которым необходимо обращаться
- Корректно ли написан типизирующий документирующий комментарий
- Если типы корркетные — следует начиная от места определения объекта/переменной до места потери типа — проверить все места использования: пере-присвоения значения переменной, передача её в вызов метода и т.д.
Генератор документирующих комментариев
- Позволяет сформировать начальное документирующее описание метода, чтобы далее легче было до-редактировать
- Заполняет известные типы входящих параметров или возвращаемых значений на основе расчетной типизации кода текущего модуля
- Позволяет до заполнить отсутствующие секции или параметры в существующем документирующем комментарии и выполняет стандартное форматирование с учетом модели данных. Это позволяет увидеть ошибочно написанные конструкции, которые не соответствуют формату документирующего комментария
Панель структуры документирующего комментария
Позволяет увидеть структуру данных документирующего комментария, так как её считывает 1C:EDT, увидеть расхождения с тем, что ожидал разработчик и тем что он написал.
Что такое «Строгая типизация»
Кратко: это контроль (валидация) наличия всех типов, как декларативных, так и динамически-рассчитанных, в коде 1С:Предприятия 8 . Этот контроль предоставляется расширением «1С:Стандарты разработки V8» для 1С:EDT.
- Контроль наличия типов в месте создания объекта, переменной
- Контроль наличия типов в месте использования (обращение к свойствам или методам объекта)
- Контроль типов возвращаемых значений для функций, свойств объектов, переменных
- Запрет смены типов для переменных, и свойств объектов
- Пересечение типов при передаче объектов в параметры вызываемого метода
- Контроль декларируемых типов и типов из системы «анализа потока данных» (Data-flow analysis, DFA) для «пользовательских» объектов данных, т.е. специфичных структур и таблиц значений, создаваемых пользователем в коде
- Возможность включать «строгую типизацию» только в выбранных модулях, или для проекта в целом
Чем не является «Строгая типизация»
- Не ООП
- Не добавляется иерархия типов 1С, и не меняется если иерархия есть
- Не добавляется понятия абстрактных объектов, или «Интерфейсов» для общего поведения объектов и их «реализация» в конкретных объекта
- Не меняется система типов 1С:Предприятия 8 — только контролируется существющие типы
Аналогия TypeScript и JavaScript
У многих разработчиков 1С возникает справедливая ассоциация с языком TypeScript . При разработке «Строгой типизации» мы действительно «подглядывали» в связку этих двух языков TS + JS .
В чем «Строгая типизация 1С» похожа на TypeScript :
- Результирующий код 1С — всё так же исполняется в 1С:Предприятии, как TypeScript после компиляции исполняется в браузере
- Статическая типизация проверяется в языке 1С:Предприятия 8
- Типы теперь необходимо записывать, если их невозможно вычислить. Не имеет значения в каком формате запись — через «двоеточие» или через «два слеша», до переменной или после — это «вопрос вкуса», главное — типы необходимо где-то записать.
- Ошибки типизации отображаются только в IDE, при этом в run-time 1С:Предприятия 8 смена типа по-прежнему возможна
- В рамках одного приложения можно только в одном/некоторых модулях включить «Строгую типизацию» — остальные модули могут быть по-прежнему слабо-типизированными
- Взаимодействие модулей «Строгой типизации» с модулями без «строгой типизации» по прежнему возможно, аналогично как TypeScript взаимодействует с модулями JS
В чем отличие «Строгой типизации» от TypeScript :
- Нет процесса трансляции/компиляции (Trans-piling) в язык 1С — модули со строгой типизацией исполняются «как есть» в run-time 1С:Предприятия 8
- Не добавляется ООП в язык 1С, т.к. это противоречит идеологии языка 1С:Предприятия 8
- Не добавляется поддержка «библиотек» (модулей), при этом понятие «модулей» в 1С:Предприятия 8 присутствует — тут 50/50, не стоит холиварить на эту тему.
- «Строгая типизация» не добавляет никаких функциональных возможностей в язык 1С:Предприятия 8
- Не добавляются «Интерфейсы» в язык 1С:Предприятия 8
Включение строгой типизации
При использовании дополнительного расширения «1С:Стандарты разработки» для 1С:EDT рекомендуется для модуля включить строгую типизацию, которая будет контролировать, что все типы были созданы правильно, во всех местах используется жесткие ссылки на объекты-создатели, что нет смены типа у переменной.
Контроль типизации будет выполняться для всего модуля, включая не экспортные методы. Контролируется наличие типов всех переменных, используемых вызовов общих модулей, при обращении к полям/свойствам объектов контролируется их наличие и их типы. Это означает, что для не экспортых методов необходимо писать типизирующие документирующие комментарии для входящих параметров и типы возвращемых значений функций, если код написан не прозрачно для анализа системы типизации 1C:EDT. Написание текстов описаний методов и параметров для других разработчиков — не является обязтельным в контексте типизации кода.
Для включения строгой типизации, необходимо в заголовке модуля указать аннотацию до первого семантического объекта (области, процедуры, переменной):
Далее 1C:EDT будет отображать ошибки, если с объектами и их типами что-то не корректное.
Групповое включение строгой типизации можно выполнить командой Включить строгую типизацию (@strict-types) в модулях в контекстном меню:
- в навигаторе 1С: для проекта в целом, для выделенного списка объектов метаданных
- в навигаторе файлов (Project Explorer): для выделенного списка каталогов или файлов модулей
- в редакторе модуля — подменю Source: для текущего открытого модуля
Применение строгой типизации
В каких случаях рекомендуется применять:
- Для всех новых конфигураций, не имеющих большого наследия не типизированного кода, для всех модулей следует включать строгую типизацию.
- Для существующих модулей рекомендуется сначала выполнить адаптацию кода и после включить строгую типизацию.
Стандарт 1С Описание процедур и функций п.2 требует наличие описания только программного интерфейса. Это означает, что:
- для экспортных методов из области «ПрограммныйИнтерфейс» необходимо указывать описание смысла методов и параметров для программиста, так же обязательное указание типов
- для экспортных служебных методов (из любых других областей модуля) обязательно только указание типизирующих документирующих комментариев
Система типизации кода в 1C:EDT работает по принципу расширения типов, собирая информацию о типах из всех возможных источников.
В данном примере — EDT сама рассчитает 2 типа — Массив|Число , и, при помощи коментария — мы расширим тип переменной МояПеременная до третьего типа — Булево . Теперь — EDT позволит вам выполнять любые действия над этой перменной, если это действие можно выполнить хотябы над одним типом (рассчитанным EDT, или добавленным вами через типизирующий комментарий).
Сокращение типа локальной переменной или параметра
- Можно безопасно сократить (или фактически установить для статического анализатора) тип локальной переменной метода, входящего параметра или переменной модуля (объекта, формы) метода через проверку типа:
при этом внутри условия переменная будет указанного в проверке типа, как в рантайме, так и для статического анализатора. Условие проверки должно быть простым.
Для задачи переопределения расчетных типов на основе кода, которые считает система 1C:EDT, необходимо указать в документирующих комментариях тип входящего параметра.
Следует учитыать, что для метода система типизации 1C:EDT собирает все локальные вызовы в текущем модуле и анализирует типы передаваемые в вызов — внутри метода тип параметра будет расчетный, но при вызове локальной метода система строгой типизации будет отображать ошибку несоответствия типов:
В этом случае, переменная Док будет уже иметь два расчетных типа. Например, если у документа РасходТовара нет реквизита Автор и нет функции в модуле объекта ВернутьМакет , то в теле метода никаких ошибок.
Если есть цель выяснить — будут ли проблемы при передачи нового типа в функцию, необходимо код писать безопасно, с проверкой типа параметра:
Возможности типизирующих документирующих комментариев
Документирующие комментарии необходимы для 2х целей:
- Декларирование типов входящих параметров и возвращаемых значений функций
- Описание назначения процедуры, параметров и полей для разработчиков
1C:EDT поддерживает решение этих целей независимо друг от друга: можно писать описания без типов, или типы без описаний, или комбинация типов и описаний.
Описание структуры данных док.коммента
Структуру данных документирующего комментария можно представить в следующем упрощенном иерархическом виде:
Рассмотрим подробнее на примерах возможности документирующих комментариев.
Описание — многострочное, со ссылками
В секции параметры, после ключевого слова Параметры — обязательно идет двоеточие
Иначе секция параметров — превращается в описание метода
Возможно описание поля/параметра без указания типа, но лучше так не делать
Обычно, описание поля/параметра идет после секции определения типов
Возможно указание описания для каждого типа поля/параметра, когда каждый тип записан с новой строки, через дефис-минус. Не допускается использование различных видов «тире» (длинных, коротких, средних и т.д.)
Простой вариант записи нескольких типов — через запятую
В простом случае — описание поля/параметра может быть многострочным
Описание единственного типа элементов коллекции
Описание составного типа элементов коллекции через запятую
Возможность указывать расширение полей для типа, строго после двоеточия в конце однострочного описания
Можно не писать описание, оставлять только типы и обязательное двоеточие
Не всегда возможно правильно определять что сейчас «описание без типа» или «тип без описания», поэтом может требоваться указание дефиса после списка типов для явного опредлеения секции типов
В этом случае без секция со списком типов превращается в просто текстовое описание
Декларацию списка типов возвращаемого значения нужно записывать явно с дефисом в конце или с новой строки
Декларацию списка типов возвращаемого значения можно записывать каждый с новой строки
Бесполезная ссылка на функцию-конструктор в описании к параметру
Ссылка на тип не комбинируется с описанием для текущего элемента, должны быть записаны вместо типа
В возвращаемом значении функции можно указывать ссылки на тип
В возвращаемом значении функции можно указывать ссылки на локальные не экспортные функции конструкторы объектов данных, если функция должна возвращать заполненный объект, но модуль не должен позволять через API создавать новый пустой объект данных
Система типизации 1C:EDT поддерживает ссылки на типы вместо их прямого указания. Использовать ссылки на типы удобно для сокращения объема текста в документирующих комментариях. Так же, это повышает точность описания типов при изменении сложных объектов данных и не требует модификаций при рефакторинге.
Ссылка на типы из объектов метаданных
Множество различных объектов метаданных производят коллекции типов. Документирующий комментарий позволяет ссылаться на этот тип.
Рассмотрим различные примеры ссылок на такие типы.
Ссылка на Табличную часть объекта
Ссылка на Строку Табличной части объекта
Такая ссылка еще не поддерживается в 1C:EDT!
Ссылка на тип реквизита объекта или реквизита Табличной части объекта
Ссылка на объект из пакета XDTO
Явное использование типов объектов XDTO в коде при указании пространства имен и имени типа в строковом литерале:
Иногда необходимо добавить сложную логику при создании объетов на основе фабрики:
Ссылка на Форму
Ссылка на форму указывается по полному имени формы
Ссылка на Элемент Формы, Реквизит формы
Ссылка тип реквизита формы
Ссылка тип элемента формы
Ссылка на Текущие данные динамического списка формы
Использование ссылки на тип текущих данных динамического списка на форме не поддерживается в документирующих комментариях. Вместо этого следует передавать сам элемент формы и далее обрабатывать ТекущиеДанные
Ссылка на Строку таблицы значений формы
Такая ссылка еще не поддерживается в 1C:EDT!
Ссылка на типы объектов кода
В ссылка типизирующих комментариев можно переиспользовать описанные типы из возвращаемого значения функций или входящих параметров метода.
Ссылка на тип параметра метода в модели менеджера, объекта, общем модуле
Ссылка на тип параметра экспортного метода из модуля менеджера
Ссылка на тип параметра экспортного метода из модуля объекта
Наследование типов параметров по сигнатуре метода
При размещении процедур в общих модулях (обычно «Переопределяемый») из общих процедуры могут быть вызваны наследники какого-либо механизма библиотеки.
В модуле менеджера соответствующих объектов можно сослаться на сигнатуру параметров метода, чтобы не описывать полностью все типы. Необходимо указать только ссылку на метод, других комментариев или элементов документирующих комментариев быть не должно.
В этом случае будет выполнено сопоставление имен параметров текущего метода с именами параметров метода «интерфейса».
Типизация локальной переменной в строке
Для локальных переменных возможно указание типов в строке инициализации.
Поддерживаются ссылки на типы:
Внимание! В целом, такой подход следует считать исключеним и не практиковать в коде, если возможно спроектировать код более прозрачно для вычисления типов.
Лучшие практики написания типизированного кода
Здесь собраны примеры решения различных задач типизации. Если вы не нашли здесь какой-либо случай, но самостоятельно разобрались как правильно решать — просим вас добавить пример на эту страницу через контрибутинг в проект.
Инициализация локальных переменных
- Запрещается инициализация переменных через Перем т.к. такая переменная инициализируется с типом Неопределенно и дальнейшая смена типа значения может быть не видна для статического анализатора
- Запрещается инициализировать переменные внутри циклов или условий и последующим использованием их вне циклов/условий — т.к. 1С:Предприятие создает все локальные переменные сразу при входе в процедуру — то статическому анализатору невозможно отследить, где была создана переменная и с каким типом
- Уточнение типа локальной переменной, инициализированной, например, функцией возвращающей более общий тип, возможно через указание типа в строке:
Текущей функциональностью 1C:EDT является запись типа в одну строку в комментарии — что исключает местное описание сложных объектов данных (ТЗ, Структура, массив из структур) — для них необходимо использовать ссылки на функции конструкторы этих объектов.
Допускается применение типизатора созданного через Новый ОписаниеТипов(. ) для формирования переменных с необходимым типом начального пустого значения.
Инициализация переменных модуля
Переменные модуля объекта, формы, конфигурации, включая глобальные переменные (экспортные), следует объявлять со статическим указанием типа в комментарии. Также следует инициализировать переменную модуля начальным/пустым значением в коде модуля (после всех процедур и функций). Для модуля формы допускается инициализация начального/пустого значения в обработчиках событий ПриСозданииНаСервере для серверных переменных и в обработчике ПриОткрытии для клиентских переменных.
Исключением могут быть не экспортные переменные модуля, используемые только внутри общих механизмов и не имеющие обращений внутри текущего модуля объекта или формы.
Инициализация ключей структуры
- Значения ключей структуры (как в конструкторе, так и при добавлении в структуру) должны быть инициализированы сразу с пустым значением того типа, который будет использоваться в последствии. Динамическая типизация не позволяет рассчитать смену типа свойства структуры и, если не указывать пустое значение нужного типа, свойство будет инициализировано с типом Неопределенно.
- Смена типа значения ключа структуры — не допускается.
- При добавлении ключа в существующую структуру следует писать код «прозрачно» для статического анализатора, таким образом чтобы вставка ключа и его использование были в одной области видимости.
- Допускается использовать безопасный доступ к полю структуры в случае, когда структура чужая по отношению к текущему коду и описать поля и их типы нет возможности. Если необходимо безопасно проверить наличие ключа, если ключ опционален. Такой код является кандидатом для рефакторинга.
Функциональность будет реализована в 1C:EDT будущих версий.
- Ограничение на получение значение ключа через метод «Свойство» не следует использовать: выглядит неплохо, но не анализируемая типизация
- В общем случае — запрещено создавать массив Новый Массив; без указания типа его значений, если далее в коде текущего модуля происходит обращение к элементам массива.
- Не рекомендуется использовать в качестве значений объекты разных типов: строки с числами, простые типы со ссылочными, объекты БД и структуры и т.д.
- Если значение массива сложное, рекомендуется использовать функцию-конструктор для инициализации пустого массива или массива с данными
- Если в функции создается массив и наполняется значениями, допустимо описывать возвращаемое значение типов элементов массива в описании функции, если в самой функции не происходит обращения к элементам массива.
- В документирующих комментариях следует указывать тип элементов массива для параметров и возвращаемых значений.
Описание таблицы значений, дерева значений
- Следует при описании объекта ТаблицаЗначений , ДеревоЗначений всегда описывать все колонки и их типы.
- В общем случае запрещается использовать описание типа ТаблицаЗначений в качестве входящего параметра экспортного метода, с описанием колонок. Правильно использовать ссылку на функцию-конструктор создающий эту таблицу.
- Исключением могут быть методы обрабатывающие произвольные таблицы, место создания которых неизвестно, но код метода рассчитывает на наличие определенных колонок. Все колонки, на которые рассчитывает код, с их типами должны быть указаны в документирующем описании.
- Исключением являются методы обрабатывающие таблицу значений с неопределенным набором колонок, например «копирование таблицы в структуру», при этом код не обращается к колонкам напрямую СтрокаТЗ.Номенклатура = . а использует для обращения список колонок, сформированный в рантайме СтрокаТЗ[ИмяКолонки] = . .
Описание строки таблицы или дерева значений
Следует использовать один из двух вариантов:
- прямое указание колонок, на которые рассчитывает код в данной процедуре
- ссылка на строку ТЗ из функции-конструктора таблицы значений:
- Соответствие — это фактически сложный тип с фиксированным набором колонок (ключ и значение) или аналогичен массиву из структур с 2 колонками. При этом описание типов у ключа и значения есть по умолчанию — Произвольный , и необходимо создавать функцию конструктор которая инициализирует соответствие и описывает типы ключа и значения.
- Следует избегать комбинации различных типов в ключе и в значении соответствия.
- Нет возможности указать типы ключа и занчения для инициализируемой переменной в строчном коментарии
- При получении объекта данных из какого-либо контейнера, следует указывать ссылку на функцию-конструктор
Описание списка значений
- СписокЗначений — это фактически сложный тип с определенным элементом коллекции, у которого типизируется только одно свойство «Значение». При этом описание типов у значения есть по умолчанию — Произвольный , и необходимо создавать функцию конструктор которая инициализирует список и описывает типы значения.
- Если список значений используется для передачи данных наружу из текущей фукцнии в которой был создан — следует использовать возвращаемое значение функции-конструктора нового пустого списка или функции-получателя с заполненными данными в списке.
- Как в случае с Соответствие нет возможности указать тип значения для инициализируемой переменной в строке
Функции-конструкторы сложных объектов данных
Для сложных типов, создаваемых на основе абстрактных платформенных типов ( Структура , Соответствие , ТаблицаЗначений , ДеревоЗначений и др.), следует использовать функцию-конструктор данных.
Наименование функции следует выбирать как Новый / Новая / Новое ( New ) и наименование объекта данных.
- Конструктор данных может так же выполнять функцию заполнения данных т.е. предоставлять новый объект с заполненными данными. Например, функция выполняет запрос к БД и возвращает таблицу значений с колонками и данными.
Указание ссылки на функцию-конструктор данных
При описании параметра метода следует указывать ссылку на функцию-конструктор данных без указания исходного базового типа данных (структура, таблица значений и т.д.).
Функции-получатели сложных объектов данных
При обработке более общих типов объектов в общих модулях может потребоваться получить заранее известный комплексный тип ( Структура , ТаблицаЗначений , ДеревоЗначений ), при этом, функции-конструктора таких данных может не существовать, например, когда данные создаются объектом метаданных, формой, СКД и так далее. Для таких случаев следует использовать функцию-получатель, описывающую тип возвращаемого значения со всеми необходимыми свойствами/полями объекта. Для клиентских процедур не рекомендуется использовать конструкторы из модулей с контекстом ‘Сервер’, но без контекста ‘Вызов сервера’.
Ограничение на использование Функций-конструкторов
- Не следует создавать фиктивные функции-конструкторы, лишь для целей ссылки на возвращаемые типы. Следует проектировать код таким образом, чтобы функции-конструкторы создавали или получали объекты.
- Функции-конструкторы данных являются частью работы какого-либо объекта метаданных или функциональной подсистемы — поэтому должны располагаться в коде модулей этих объектов/подсистем.
- Созданный объект данных в текущем модуле передается в другой модуль или возвращается экспортной функцией — является частью API этого модуля.
Ограничение на использование в документирующих описаниях Массивов, ТЗ, Структур
Для параметров экспортных методов рекомендуется указывать ссылку на функцию-конструктор таких объектов.
Не рекомендуется указывать в качестве параметров не экспортных методов сложные типы на основе Массивов , Таблиц Значений , Структур и т.д., если объект является цельным, созданным в текущем модуле и контекст передачи объекта ограничен текущим модулем. В этом случае 1C:EDT не выполняет динамическую типизацию таких параметров, а использует указанные статические типы в описании метода.
Допускается описание таких типов во входящих параметрах, если описывается часть объекта или программный интерфейс объекта, например несколько колонок ТЧ.Товары для которых выполняется расчет, при этом не существует одной единой функции-конструктора на которую можно сослаться в описании.
Описание программных интерфейсов для реализации в прикладных объектах
Существует понятие «описания программного интерфейса объекта» и его реализация в прикладных объектах конфигурации. С применением библиотечного подхода к разработке конфигураций, библиотека может описывать некий программный интерфейс который должен быть реализован в прикладном объекте, для того чтобы библиотечный механизм имел доступ к объекту.
Например, механизм «Свойства» из библиотеки БСП описывает интерфейс объекта: Наличие табличной части ДополнительныеРеквизиты , содержит колонки Свойство , Значение , ТекстоваяСтрока с определенными типами. Далее общий механизм библиотеки может обращаться к объекту например, при записи УправлениеСвойствами.ПередЗаписьюНаСервере(ЭтотОбъект, ТекущийОбъект); объекта из формы.
Следует описывать интерфейс входящего объекта для той части объекта, которая требуется для работы механизма. При этом, следует учитывать, что механизм расширений свойств в документирующих комментариях поддерживается для тех типов, у которых возможны пользовательские свойства. Например: элементы коллекции вместо самих коллекций — тип ТабличнаяЧасть не имеет пользовательских свойств, а тип СтрокаТабличнойЧасти может иметь; тип ДанныеФормыКоллекция не имеет пользовательских свойств, а тип ДанныеФормыЭлементКоллекции может иметь.
Описание используемых реквизитов и элементов форм для общего кода по работе с формами
- Допускается описание части формы, общие для нескольких форм или реализация некого интерфейса для общего механизма конфигурации. Например, части одного общего механизма, подключенные к множеству объектов конфигурации (дополнительные реквизиты, контактная информация и т.д.).
- Если используется конкретная форма, следует в документирующих комментариях модулей (общих, менеджеров) указывать полную ссылку на форму.
- Для функций общих модулей, рассчитывающих на дополнительные свойства и методы расширения типа ФормаКлиентскогоПриложения следует использовать соответствующие типы расширений управляемой формы: РасширениеУправляемойФормыДляОбъектов , РасширениеУправляемойФормыДляДокумента , РасширениеУправляемойФормыДляДинамическогоСписка и так далее.
Получение и открытие формы
- При использовании методов ПолучитьФорму() и ОткрытьФорму() с присвоением возвращаемого значения формы после открытия — следует указывать строковый литерал с полным именем формы первым параметром.
- Не следует выносить строковый литерал в отдельную переменную т.к. в этом случае переменная форма будет содержать общий тип ФормаКлиентскогоПриложения а не конкретный тип формы справочника номенклатуры, и весь контекст формы не будет доступен. В 1C:EDT на текущий момент поддерживается полная типизация только для полных имен форм, ссылки на основные формы для объекта метаданного ФормаОбъекта , ФормаСписка и т.д. возвращают общий тип ФормаКлиентскогоПриложения , полная типизация может быть поддержана в будущих версиях.
Экспортные процедуры и функции
- Все параметры методов и возвращаемые значения функций должны содержать описания типов, при этом пояснения к параметрам следует описывать в соответствии со стандартом
- Локальные процедуры и функции не обязаны содержать описаний типов в документирующих комментариях и могут быть полностью расчетными, если код написан прозрачно для статического анализатора.
Разрыв прямого контекста выполнения кода
- В случае разрыва прямого вызова методов в рамках одного модуля (когда из одного метода напрямую вызывается другой метод) — следует описывать типы входящих параметров для не экспортных методов.
Использование временного хранилища и других контейнеров
- Поместить во временное хранилище и после получить из него — можно все что угодно, поэтому необходимо выделять функцию возвращающую тип помещенный во временное хранилище использовать на нее ссылку при получении:
- Аналогичный подход следует использовать при помещении пользовательского объекта внутрь другого объекта-контейнера, например ДополнительныеПараметры у объектов, или Параметры формы, пользовательские параметры элементов СКД , ДополнительныеПараметры у обработчиков оповещения и так далее.
Использование строковых литералов в качестве имен
Не следует обращаться к элементу именованной коллекции, например ВсеЭлементыФормы и другие, через строковый индекс с именем элемента. Вместо этого следует обращаться напрямую к элементу так как в этом случае статический анализатор может контролировать наличие элемента, его тип.
Исключением может быть:
- обращение к элементам и свойствам создаваемым программно и в момент статического анализа их еще не существует. При этом следует указывать тип локальной переменной полученного значения и уже потом обращаться к ее свойства:
- наличие таких элементов в коллекции может быть опциональным, при этом выполняется проверка наличия элемента. Например: исходный объект с неопределенными свойствами создается где-то вне и передается в текущую функцию входящим параметром.
Ограничение на использование реквизитов формы с типом «Произвольный»
Реквизит формы с типом Произвольный в коде следует рассматривать как «черный ящик». Статический анализатор не отслеживает изменение типа реквизита формы, поэтому весь обслуживающий этот реквизит код должен использовать проверку типа значения.
В общем случае не следует использовать реквизит с типом Произвольный на форме, т.к. при этом разработчик самостоятельно несет ответственность за инициализацию значения в этом реквизите, за то, что все типы данных хранимые в реквизите могут быть сериализованы/десериализованы при передаче с клиента на сервер и обратно. Так же значение реквизита будет передаваться между клиентом и сервером всегда т.к. Платформа не контролирует модификацию значений, например внутри структуры, помещенной в произвольный реквизит.
Реквизит с типом Произвольный следует заменять на честные реквизиты формы с определенными типами. Исключением может быть хранимые данные общих механизмов библиотек, которые через программный интерфейс инициализируют и обрабатывают хранимое в этом реквизите значение.
Если заменить реквизит с типом Произвольный нет возможности, следует использовать функцию-конструктор для инициализации значения и дальнейших ссылок на типы. При этом не следует напрямую обращаться к реквизиту — для получения значения следует использовать функцию-получатель.
Использование параметров формы
- Запрещается использовать параметр с типом «Произвольный» для передачи структуры параметров для инициализации формы.
- В редакторе формы на вкладке «Параметры» следует описывать все параметры, на которые опирается форма при открытии, включая необязательные.
Выборка и выгрузка из результата запроса
При типизации выборки/выгрузки из результата запроса следует использовать возможности:
- Статическое описание всех полей выборки (полей таблицы значений выгрузки) в возвращаемом значении функции-получателе данных. Может применяться для функций, динамически формирующих текст запроса и выборку, а так же все экспортные функции, возвращающие выборку.
- Динамическая типизация полей выборки на основе текста запроса. В будущих версиях 1C:EDT может быть реализована возможность обращаться к полям запроса, при условии что текст запроса и выборка (результат запроса) находятся в одной процедуре, текст запроса не содержит ошибок (открывается «Конструктором запросов»), выборка/выгрузка из результата запроса не передается в другой модуль для обработки.
Передача пользовательского объекта данных в другой модуль
Объекты данных созданные пользовательским кодом и использованные вне текущего модуля — должны быть описаны функцией возвращающей значение.
Использование типа созданного в текущем модуле, но не предназначенного для создания в другом модуле — следует использовать не экспортную функцию-конструктор, при этом существует 2 варианта:
- Экспортная функция, которая возвращает это значение вместе с данными (функция-получатель) — в ней нужно в возвращаемом значении указать функцию-конструктор
- Реализация какого-либо интерфейса из переопределяемого модуля — в этом случае, можно использовать ссылку на параметр
Описание типов макетов СКД и Табличного документа
- В случае получения макета через универсальную процедуру — следует указывать в строке тип макета.
Ограничение на создание пользовательских объектов-копий (Структуры, ТЗ) из платформенных объектов
Использование конвертации данных с произвольным соответствием объектов между базами для задачи организации обмена данными
В данной публикации мы расскажем как задать произвольное соответствие между различными базами при выгрузке/загрузке данных. Из этой статьи вы узнаете как обойти некоторые ограничения накладываемые конфигураций «конвертация данных» от 1С, когда это необходимо. Также в качестве бонуса покажем некоторые дополнительных приемов и механизмов.
Произвольное соответствие между базами.
Решаемая проблема (приблизительные примеры):
Вариант 1. Существует несколько баз данных (БП, УТ собственно не важно) и между ними организован обмен. Переодически возникают конфликтные ситуации — «одновременное» создание объектов, к примеру, контрагентов. Что собственно нарушает концепцию «единоначалия». Т.е получаем наличие двух как-бы одинаковых аналитик в разных базах.
При использовании стандартных возможностей «конвертации» поиск происходит по GUID и даст отрицательный результат. При использовании дополнительных полей поиска можем в какой-то момент опять не найти пару. Скжаем сразу, варианты дать по рукам, заставить перебить и т.д. отдельные пути.
Вариант2. Существует набор баз и мы решили установить между ними обмен. Соотвественно, как вариант можем получить в качестве ТЗ excel файл, ручное указание соответсвия (когда сажаем кого-то и он вручную сопоставляет объекты). К тому же, уровень соответсвия может быть чудовищный для программиста — Номенклатуры базы 1 из папок «запчасти для кранов» и «запчасти для камазов» переместить в паку базы 2 «запчасти основные».
Ограничимся наличием в наших подсистемах библиотекой стандартных подсистем (БСП), в текущий момент присутсвует во всех стандартных конфигурациях.
Решение:
Чтобы получить 100% надежный вариант хотелось бы организовать поиск в соответсвии GUID_1 базы 1 = GUID_X базы 2, т.е. чтобы при выгрузке объекта, к примеру, номенклатура «подшипник конический» (GUID_1) для базы 1 произвелся поиск в базе 2 по уникальному идентификатору (GUID_X) и нашлась бы номенклатура»подшипник модель №1″.
Это можно сделать, к примеру, подменив GUID_1 при выгрузке на GUID_X используя регистр сведений «соотвествия объектов информационных баз». Однако, заменить GUID в правилах конвертации данных нельзя. Можно добавить свои поля поиска, можно установить свое правило поиска — но это не всегда даст желаемый результат.
Поступим следующим образом:
1. Запишем соотвествие в регистр сведений «соотвествия объектов информационных баз», указав:
УзелИнформационнойБазы — необходимый узел между нашими базами, или произвольный даже не существующий, совершенно не важно (мы то его будем знать, а значит всегда найдем
УникальныйИдентификаторИсточника — ссылку на номенклатуру «подшипник конический» база 1
УникальныйИдентификаторПриемника — уникальный идентификатор GUID_X строкой в 36 символов база 2
ТипПриемника — Тип объекта базы 2, к примеру так, ТипЗнч(Номенклатура.Ссылка)
ТипИсточника — Тип объекта базы 1
УникальныйИдентификаторИсточникаСтрокой -уникальный идентификатор строка 36 объекта базы 1, к примеру так, Строка(Номенклатура.Ссылка.UUID())
Для решения этой задачи достаточно написать обработку или воспользоваться механизмами конфигурации.
2. Снимем галки поиска для ПКО Номенклатура, как показано на рисунке.
Настройка ПКО Номенклатуры
3. Добавим новое свойство для объекта и назовем его UUID. Далее в настройках ПКС установим флаг «получать из входящих данных», его у нашего объекта такого поля нет, установим флаг — передавать в параметр и поиск объекта при загрузке по свойству. Вставим код в обработчик перед выгрузкой:
ПКС номенклатуры нового свойства UUID
мойЗапрос = новый Запрос;
ТекущийUUID = строка(Источник.Ссылка.UUID());
// найдем план обмена или установим свой
ПланобменаСсылка = ПланыОбмена.Полный.ПолучитьСсылку(Новый УникальныйИдентификатор(«00000000-0000-0000-0000-000000000001»));
Если мояВыборка.Следующий() Тогда
ВнешнийUUID = мояВыборка.УникальныйИдентификаторПриемника;
// Подставим во входящие данные наш ГУИД
ВходящиеДанные = новый структура(«UUID»,ВнешнийUUID);
ВходящиеДанные.Вставить(«УникальныйИдентификатор»,ВнешнийUUID);
// Создадим основное поле поиска «Уникальный идентификатор», правим xml файл вручную
мойУзел = СоздатьУзел(«Свойство»);
УстановитьАтрибут(мойУзел,»Имя»,»<УникальныйИдентификатор>«);
УстановитьАтрибут(мойУзел,»Тип»,»Строка»);
одЗаписатьЭлемент(мойУзел,»Значение»,ВнешнийUUID);
ДобавитьПодчиненный(УзелКоллекцииСвойств,мойУзел);
Иначе
// Нет соотвествия, тогда ничего не меняем
ВходящиеДанные = новый структура(«UUID»,ТекущийUUID);
ВходящиеДанные.Вставить(«УникальныйИдентификатор»,ТекущийUUID);
мойУзел = СоздатьУзел(«Свойство»);
УстановитьАтрибут(мойУзел,»Имя»,»<УникальныйИдентификатор>«);
УстановитьАтрибут(мойУзел,»Тип»,»Строка»);
одЗаписатьЭлемент(мойУзел,»Значение»,ТекущийUUID);
ДобавитьПодчиненный(УзелКоллекцииСвойств,мойУзел);
КонецЕсли;
4. Проверяем результат. Если у нас установлено соответсвие, то в качестве основного поля поиска «Уникальный идентификатор» выгрузится правильный GUID_X, в противном случае GUID_1.