1с конвертация установить предопределенное значение справочника

Обновлено: 07.07.2024

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

Применимость

В статье рассматривается платформа 1С:Предприятие версии 8.3.4.465. Материал актуален и для текущих релизов платформы.

Предопределенные элементы в «1С:Предприятие 8.3»

При реализации алгоритмов разработчики часто опираются на определенные данные – элементы справочников, планов счетов, планов видов расчета и т.д.

Во встроенном языке существуют методы для поиска данных, например, НайтиПоКоду() или НайтиПоНаименованию().

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

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

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

Таким образом, у предопределенных данных есть две “стороны”: во-первых, существует список предопределенных элементов, созданный в конфигураторе, а, во-вторых, для данных информационной базы указывается, является ли конкретный элемент предопределенным.

Предопределенные элементы могут быть созданы у:

  • справочников;
  • планов счетов;
  • планов видов характеристик;
  • планов видов расчета.

В статье рассмотрены новшества, касающиеся предопределенных данных на платформе 8.3, а также особенности работы с ними в распределенных базах (как центральных, так и периферийных) и в информационных базах в режиме разделения данных.

Справочник организации - предопределенный элемент

Для примера, создадим в справочнике Организации предопределенный элемент ОсновнаяОрганизация:

Для увеличения нажмите на изображение.

Обращение к этому элементу из программного кода будет следующим:

Код обращения

В платформе 8.3 реализована возможность связать предопределенные данные с элементами соответствующего типа.

Для этого у объектов, которые могут иметь предопределенные элементы (они указаны выше), добавлено новое свойство ИмяПредопределенныхДанных. Оно отображается в списке стандартных реквизитов:

ИмяПредопрделенныхДанных

Выберем при помощи запроса все поля из справочника Организации:

Выбор полей

Для увеличения нажмите на изображение.

На рисунке видно, что в поле ИмяПредопределенныхДанных указан именно тот идентификатор, который мы ввели в режиме конфигуратора.

Предопределенный элемент в списке отображается специальной пиктограммой:

Предопределенный элемент

Чтобы “отсоединить” элемент данных от элемента предопределенных данных, нужно присвоить свойству ИмяПредопределенныхДанных пустую строку и записать элемент:

&НаКлиенте
Процедура Отсоединить ( Команда )
ОтсоединитьНаСервере ();
КонецПроцедуры

Пиктограмма в списке изменилась:

Отсоединенный элемент

Теперь предопределенный элемент существует только в конфигурации и в данных нет элемента, привязанного к идентификатору ОсновнаяОрганизация:

Идентификатор ОсновнаяОрганизация

Для увеличения нажмите на изображение.

Обращение из программного кода к предопределенному элементу вызовет исключение:

Предопределенный элемент отсутствует в данных

Чтобы связать предопределенный элемент с новой записью, нужно присвоить свойству ИмяПредопределенныхДанных имя предопределенного элемента:

&НаКлиенте
Процедура Привязать ( Команда )
ПривязатьНаСервере ();
КонецПроцедуры

Чтобы выгрузить один объект источника в несколько объектов приемника, можно использовать мощный инструмент расширения возможностей правил конвертации – «ВыгрузитьПоПравилу».

Синтаксис функции:

Пример реальной задачи. Необходимо выгрузить справочник – «НоменклатурныеГруппы» в три объекта на стороне приемника: «НоменклатурнаяГруппа» (справочник), «ЗаказНаПроизводство» (документ), «СтатусыЗаказов» (регистр сведений). Для решения данной задачи можно использовать функцию «ВыгрузитьПоПравилу».

В правилах выгрузки данных (далее-ПВД) в обработчике «ПередОбработкой» происходит выгрузка в объект приемника «НоменклатурнаяГруппа» по стандартной выгрузке (ИмяПКО), а в обработчике «ПослеВыгрузки» происходит выгрузка в объекты «ЗаказНаПроизводство» и «СтатусыЗаказов» с помощью функции «ВыгрузитьПоПравилу»:


2. Выгрузка иерархического справочника (элементы и папки)

Если необходимо выгрузить иерархический справочник (элементы и папки) с учетом иерархии и поиск в базе приемника будет осуществляться по внутреннему идентификатору объекта источника (по полям поиска не будет продолжен поиск), то для корректной выгрузки иерархии необходимо установить галочку – «Поиск» у реквизита «ЭтоГруппа» (см. рисунок 1).


Рисунок 1 – Выгрузка иерархического справочника.

Если не установить галочку «Поиск» у реквизита «ЭтоГруппа», то папки объекта будут выгружаться как элементы.

3. Реквизиты объекта для правил регистрации объектов

Объекты регистрируются по правилам регистрации объектов к выгрузке только при изменении реквизитов объекта, которые указаны в правилах конвертации свойств (далее-ПКС) объекта (правила обмена данными). При необходимости регистрировать объект к выгрузке и при изменении реквизитов, которые не указаны в ПКС, достаточно данные реквизиты добавить в ПКС и установить галочку – «отключить» (см. рисунок 2).


Рисунок 2 – Реквизиты объекта для правил регистрации объекта.

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

4. Зарегистрировать объект к выгрузке другим объектом (объектами)

Когда стоит задача выгружать вместо регистрируемого объекта другой объект, то при регистрации исходного объекта в правилах регистрации объектов в обработчике «ПослеОбработки» через метод «ЗарегистрироватьИзменения» плана обмена можно зарегистрировать необходимый объект на узлах плана обмена.

Синтаксис метода:

ЗарегистрироватьИзменения (Узлы, Данные)


Пример реальной задачи. Несколько документов «Списания с расчетного счета» по одному документу «Заявка на расходование ДС» необходимо выгружать из конфигурации источника в один документ «Списания с расчетного счета» конфигурации приемника. При изменении документа «Списания с расчетного счета» регистрируется к обмену документ «Заявка на расходование ДС», который при выгрузке собирает по определенным правилам данные со всех документов «Списания с расчетного счета».

В продолжение пункта 4. При выгрузке любого объекта происходит проверка, соответствует ли он существующим правилам регистрации. Если при регистрации вместо исходного объекта регистрируется к выгрузке другой объект, то новый объект также будет проходить проверку по своему типу правил регистрации объектов. В случае несоответствия правилам регистрации, объект будет выгружать, как «УдалениеОбъекта».

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

Описание параметра Выгрузка:

Выгрузка (только чтение) – Булево – параметр определяет контекст выполнения правила регистрации. Истина – правило регистрации выполняется в контексте выгрузки объекта. Ложь – правило регистрации выполняется в контексте перед записью объекта.


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

6. Выбор правила конвертации объектов по умолчанию

Если по одному объекту источнику в правилах конвертации объектов присутствуют несколько правил, то система будет использовать по умолчанию правило, которое совпадает по наименованию с наименованием объекта источника (см. рисунок 3).


Рисунок 3 – Выбор правила конвертации объекта по умолчанию.

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

7. Создание документов (справочников) через ПКО на стороне приемника

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

- определить правило заполнения нового документа (справочника) на стороне приемника (например, через входящие данные);
- описать заполнение реквизита нового документа (справочника) в исходном объекте (например, через исходящие данные);
- заполнять при выгрузке на стороне источника новый документ (справочник) уникальным значением (например, числом).

Пример реальной задачи. Необходимо на стороне приемника создавать новые документы «ДокументРасчетовСКонтрагентом» в документе ввод начальных остатков по счетам взаиморасчетов. На стороне источника заполняем реквизит «ДокументРасчетовСКонтрагентом» при выгрузке начальных остатков по счетам взаиморасчетов уникальным значением (числом):


В исходном объекте («ВводНачальныхОстатков») описываем правила выгрузки реквизита «ДокументРасчетовСКонтрагентом»:


Определяем правило заполнения «ДокументаРасчетовСКонтрагентом» на стороне приемника (см. рисунок 4).


Рисунок 4 – Правили выгрузки «ДокументРасчетовСКонтрагентов».

В конвертации данных нельзя создать параметр с типом «ТаблицаЗначений» на вкладке «Параметры» (см. рисунок 5).


Рисунок 5 – Допустимые типы для параметров конвертации данных.

Возможность создать параметр с типом «ТаблицаЗначений» при необходимости присутствует в системе, необходимо в общем обработчике «ПередЗагрузкойДанных» определить параметр.


Также необходимо в общем обработчике «ПослеЗагрузкиДанных» удалить данный параметр.


9. Выгрузка реквизитов со значением перечисления или предопределенного значения справочника

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

Пример реальной задачи. В базе приемника присутствует реквизит – «ТипПлатежа» с типом «Перечисление». При выгрузке реквизита (обработчик: «Перед выгрузкой») можно указать текстовое значение равное наименованию элемента перечисления на стороне базы приемника (см. рисунок 6). Данный подход может ускорить процесс разработки в конвертации данных.


Рисунок 6 – Заполнение реквизита с типом «Перечисление».

10. Ускорение процесса выгрузки с помощью параметра «ВыгрузитьОбъект» («ВыгрузитьТолькоСсылку»)

Когда необходимо выгрузить большой объем данных и нет необходимости выгружать полностью ссылочные данные, то можно сократить объем выгружаемых данных с помощью параметров «ВыгрузитьОбъект» («ВыгрузитьТолькоСсылку») в обработчике «ПриВыгрузке» правил конвертации свойств (ПКС):


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

Рассмотренные приемы работы позволят повысить производительность и эффективность работы с программой конвертацией данных 2.1.

Статью подготовил Аналитик-эксперт по информационным системам "ИнфоСофт" Ретунский Александр.

Если Вы приобрели курс, но еще не активировали токен — пожалуйста, активируйте доступ по инструкциям, высланным на Ваш email после покупки.

Если Вы не залогинены на сайте — залогиньтесь, вернитесь на эту страницу и обновите ее.

Если Вы залогинены, у Вас активирован токен доступа, но Вы все равно видите эту запись — напишите нам на e-mail поддержки.

Комментарии / обсуждение (143):


КонвертацияОбъектовИнформационныхБаз как найти?
Ее нет в конфигураторе Конвертации?

Извиняюсь заранее если вопросы кажутся глупыми.
Открываю Конфигуратор Конвертации
Захожу в Глобальный поиск меню Правка ввожу ПроизвестиЧтениеДанных()
Надеюсь найти все вхождения этой процедуры в Конфигурации
Результата нет
Что делаю не так и как правильно?

У меня к сожалению не получилось войти в отладчик, как было показано на уроке, хотя я повторил все действия.
Мне бы для начала зайти в отладчик при загрузке объекта.
Пока в моем представлении алгоритм работы системы такой:
Конвертация готовит XML файл содержащий Правила и Список Объектов
Этот файл мы открываем в УОД, которая его обрабатывает
Как отловить этот момент.Мне хочется на примере простой конвертации пройти по коду и посмотреть процесс.
Но не получается войти даже в отладчик.В доп материалах, есть видео, где автор показывает, как исправив ошибку в наименовании флага в форме попасть в отладку.Нашел этот фрагмент и кажется все правильно.
Но в отладчик не вхожу.Есть ли способы попасть в отладку миную штатные средства.Ведь ясно же ,что автор нашел ошибку в коде, прогнав УОД через отладку

Спасибо за терпение, в отладчик попал.
Пока через код обработки УОД.

.Конвертация 2.1.8.2
Не могу попасть в отладчик со стороны загрузки

Добрый день. В ПКО для ПланаВидовХарактеристик пишу

ОписаниеТипов = Новый ОписаниеТипов("СправочникСсылка.Сотрудники");
УзелТипы = одПолучитьXMLПредставлениеОписанияТипов(ОписаниеТипов);
ДобавитьПодчиненный(Приемник, УзелТипы);

В источнике у меня справочник называется СотрудникиПоставщиков, а в приемнике Сотрудники. Поскольку я нахожусь на стороне базы источника (в обработчике ПриВыгрузке), когда я пытаюсь передать в ОписаниеТипов СправочникСсылка.Сотрудники, пишет про несоответствие типов, и правильно, потому что в базе источнике нет такого типа. А если я в описании типов передаю СправочникСсылка.СотрудникиПоставщиков, то при выгрузке не ругается, но зато ругается при загрузке, потому что в базе приемнике нет такого типа СправочникСсылка.СотрудникиПоставщиков. Если в обеих базах справочник называется одинаково, проблемы не возникает. Если вот так:

УзелТипы = СоздатьУзел("Типы");
УзелТип = СоздатьУзел("Тип");
УзелТип.ЗаписатьТекст("СправочникСсылка.Сотрудники");
ДобавитьПодчиненный(УзелТипы, УзелТип);
ДобавитьПодчиненный(Приемник, УзелТипы);

то проблемы тоже не возникает.
Но все таки, как использовать функцию одПолучитьXMLПредставлениеОписанияТипов в случае когда справочники в разных базах называются по разному?

Я попробовал задачу 1.7.3 решить с помощью разных ПВД. В первом варианте создал ПВД и соответствующее ПКО «БухгалтерскаяОперация_ВыгрузитьПоПравилу». Во втором варианте изменил структуру ВыборкаДанных и напрямую в ПКО «БухгалтерскаяОперация_УказаниеПравила» указал соответствующее правило выгрузки. И для теста создал 2-ой документ «Инвентаризация».
В первом варианте все выгрузилось без проблем. Во втором варианте выгрузился только 1 документ (но в решении преподавателя (и его правилах) все выгрузилось, буду искать ошибку).

С точки зрения оптимальности, какое лучше ПВД применять на реальных задачах?

Загрузил с сайта разработанные правила и там такая же ошибка получается. Подскажите в чем проблема?


Я дописал ветку иначе стало выгружать но на 1 объект меньше чем в видео у меня 18 объектов выгружает а не 19. Кто не прав в видео дальше комментируется и вопрос просто рано возник?

Добрый день.
Делаю обмен данными договоров из 1С Документооборот (2.1.9) в 1С УПП (1.3.86).

В ПКО.ДоговорыКонтрагентов доп.свойстве ПКС.Сумма ПередВыгрузкой передаю данные в ПКО РС.ЗначенияСвойствОбъектов:

ИсходящиеДанные = Новый Структура("Объект, Свойство, Значение");
ИсходящиеДанные.Свойство = "10 СуммаДоговора(руб)";
ИсходящиеДанные.Значение = Источник.Сумма;
ИсходящиеДанные.Объект = Источник.Ссылка;

В ПКО РС.ЗначенияСвойствОбъектов значение ПКС.Объект (в уроке он назывался Контрагент) передается ссылка на договор контрагента и не находит в уже выгруженных данных и поэтому зацикливается.

Что нужно сделать, чтобы убрать цикличность ссылок?

Благодарю за быстрый ответ.
Использовала ПКС, поскольку аналогичные реквизиты Внутреннего документа из ДО должны загрузиться в соответствующие свойства объектов или категории объектов. Поэтому, ВыгрузитьПоПравилу() тут не подойдет. РС в РС не выгружается, а заполняется из данных справочника ВнутренниеДокументы.

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

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

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