Конвертация данных 2

Переезжали мы на новый сервер. На нем SQL и 1C. В сравнении со старыми был намного круче. И тест Гилева это тоже подтвердил: против 10-15 на старых серверах выдавал 39. Поэтому мы сразу после покупки перенесли базу и начали работу.

Но в какой-то момент что-то пошло не так — пользователи стали жаловаться на медленную работу. Произвели определенные настройки сервера и служб (какие — тема отдельного поста) и решили перезагрузить сервер, благо скорость перезагрузки — 2 минуты (на других серверах до 10 доходило). После этого при входе в 1С получаем следующее сообщение:

«Внимание!!! При обновлении данных, после последней реструктуризации, произошла ошибка. Повторить обновление?» «Да, Нет»

После нажатия кнопки «Да» появляется следующее:

«Обнаружена незавершенная операция сохранения конфигурации. Для продолжения работы необходимо завершить операцию.»

Первое, что решил сделать — CHECKDB на в Managment Studio — после 2х часов ожидания (база 500 ГБ) — все ОК.

На просторах сети нашел информацию, что такая же ошибка бывает при динамическом обновлении.

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

Решение:

  1. То, чего не хватало для решений из сети:

sp_configure ‘allow updates’, 1
reconfigure with override
go

2. Переводим базу в режим восстановления

alter database set EMERGENCY, SINGLE_USER

3. Выполняем тестирование базы:

dbcc checkdb(‘db_name’, REPAIR_ALLOW_DATA_LOSS)

4. Выводим базу из режима восстановления:

alter database set ONLINE, MULTI_USER

5. В принципе, если уверены что с самой базой все ок, то можно не делать 2-4 пункты. Далее выполняем два запроса в профайлере SQL:

delete from config where FileName = ‘commit’
delete from config where FileName = ‘ dbStruFinal’

Эти записи и отвечают за динамическое обновление — можно не бояться их удалять.

В рабочих версиях баз запросы:

select * from Config WHERE FileName = ‘commit’

select * from Config WHERE FileName = ‘dbStruFinal’

будут пустые.

6. возвращаем настройки:

sp_configure ‘allow updates’, 0
go

7. После этого удалось запустить конфигуратор и база заработала.

Также база может заработать после удаления первого флага.

Предыстория

Нужно нам было создать новый регистр сведений «ЖурналОтслеживанияСообщений». Добавили в конфигурацию, загрузили данные. Затем пошла работа по оптимизации. Пришлось менять структуру регистра. Но не тут-то было!

Тут все ясно. Записи стали неуникальными, нужно их удалить!

Самой простой способ это:

НоваяЗапись = РегистрыСведений.ЖурналОтслеживанияСообщений.СоздатьНаборЗаписей(); НоваяЗапись.Записать();

Таким методом мы очистим регистр в 1С очень быстро (но это будет и нашей ошибкой).

Ошибка

Казалось бы, в регистре пусто, и можно обновлять 1С. Не хочу вас удивить, но будет снова ошибка:

Что же представляет ошибка:

В процессе обновления информационной базы произошла критическая ошибка
по причине:
Попытка вставки неуникального значения в уникальный индекс:
Microsoft SQL Server Native Client 11.0: The CREATE UNIQUE INDEX statement terminated because a duplicate key was found for the object name «dbo._InfoRgChngR34546NG» and the index name «_InfoR34546_ByNodeMsg_RNTSRRRRRRNG». The duplicate key value is (0x00000011,d7, , Sep 27 4015 10:22PM, 768404,00,00,00,00,00,00).
HRESULT=80040E2F, SQLSrvr: SQLSTATE=23000, state=1, Severity=10, native=1505, line=1

Пояснение

Давайте разберемся со структурой SQL. У нас есть регистр «ЖурналОтслеживанияСообщений», он в SQL находится в таблице «_InfoR34546». Проверить это вы можете специальными обработками или методом «тыка» (нам это не придется делать т.к. в тексте ошибки уже указано название таблицы).

А теперь поясню, что же произошло. Когда мы загрузили данные в регистр, то в SQL они попали в таблицу » _InfoR34546″. Когда мы кодом в 1С очистили таблицу, то эти данные удалились из таблицы » _InfoR34546″, но они скопировались в таблицу «_InfoRgChngR34546». Это и стало проблемой.

Решение

Для решения возникшей проблемы нам понадобится очистить SQL таблицу » _InfoRgChngR34546″.

Расскажу на примере «Microsoft SQL Server Management Studio». Заходим в «Management Studio». Находим нашу базу, открываем вкладку таблиц, кликаем на любую и жмем кнопку «Новый запрос»:. Теперь набираем запрос

Truncate table «_InfoRgChngR34546 »

У вас может быть и другая таблица! Не забывайте!

И жмем выполнить или клавишу «F5». Вот такой должен быть результат:

Все, теперь можно спокойно обновлять 1С, и ошибки не будет!

При работе в «1С:Предприятие» может всплыть следующее сообщение: «Для работы с новой версией 1С:Предприятия должно быть выполнено преобразование информационной базы». Почему появляется это окно и как можно устранить ошибку?

В большинстве случаев причина появления окна – недавний переход программы с устаревшей версии платформы на более новую. У разных платформ информационная база 1С формируется по-своему и принимает разный состав. Всё, что требуется сделать – произвести конвертацию базы данных (структура которой соответствует устаревшей платформе) в самый новый формат.

Преобразование БД

Процедура эта несложная, однако, сначала рекомендуется создать резервную копию базы, на случай, если во время конвертирования произойдёт ошибка (например, отключится компьютер, в результате информационная база 1С , как и сама программа, могут повредиться). Затем примените следующий алгоритм действий:

  • Откройте БД в режиме конфигуратора;
  • Вы увидите сообщение с предложением конвертировать информационную базу. Нажмите подтверждение;

  • Закройте конфигуратор.

Откройте базу данных – она должна запуститься без проблем. Если после преобразования окно с ошибкой продолжает появляться, можно попробовать выполнить процедуру повторно. В случае, когда и это не помогает, необходимо обратиться к программисту 1С. Иногда при выполнении операции программа может подвисать. Не надо в этот момент предпринимать никаких действий.

Важно! Информационная база 1С , преобразованная последней версией программы, не может быть открыта на предыдущих версиях.

Песочница

авторитет 18 сентября 2013 в 15:24

1С, восстановление конфигурации информационной базы с использованием MS SQL

В свое время столкнулся с проблемой: при обновлении конфигурации из хранилища, произошел сбой, и закрылась 1С.

Как выяснилось позднее – произошло разрушение хранилища конфигурации и при обновлении конфигурации из хранилища слетела и конфигурация БД. Подобная ошибка возникала прежде при динамическом обновлении ИБ.

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

При следующем запуске конфигуратора вышла ошибка: «Внимание!!! При обновлении данных, после последней реструктуризации, произошла ошибка. Повторить обновление?» при утвердительном ответе получаем сообщение: «Обнаружена незавершенная операция сохранения конфигурации. Для продолжения работы необходимо завершить операцию» после этого приложение закрывается.

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

Вариант 1 (при наличии бэкапа SQL c копией с идентичной конфигурацией):

Разворачивается копия ИБ, и выполняется запрос следующей конструкции:
USE GO DELETE FROM .. GO INSERT INTO .. SELECT * FROM .. GO
При этом пере заливается таблица в которой хранится конфигурация ИБ. Желательно после данной операции выполнить тестирование и исправление ИБ.

Вариант 2 (при отсутствии бэкапа):

К данному варианту обратились как к последней соломинке. Т.к. конфигурация была в стадии разработки и про бэкап немного позабыли понадеясь на хранилище.
В базе удаляются две записи из таблицы «Config» по значению в столбце «FileName» — dbStruFinal и commit

Выполняется следующий запрос:
USE GO DELETE FROM . WHERE FileName = «dbStruFinal» GO DELETE FROM . WHERE FileName = «commit» GO
Как ни странно база оживает.

Теги: 1с предприятие 8.2, SQL, восстановление конфигурации

Теория

В штатной справке по Конвертации данных об этих параметрах написано следующее:

ВходящиеДанные — Произвольный — произвольные вспомогательные данные, переданные правилу конвертации из других правил (например из правила выгрузки данных или правила конвертации свойств). Значение параметра, как правило, имеет тип Структура, где ключи значений соответствуют структуре свойств объекта приемника. Таким образом, при конвертации свойств (в правиле конвертации свойств), конвертируемые данные (или часть данных) могут быть получены из этого параметра.

ИсходящиеДанные — Произвольный — произвольные вспомогательные данные. Данные передаются по следующим правилам:

1) ПВД.ИсходящиеДанные -> ПКО.ВходящиеДанные

2) ПКО.ВходящиеДанные -> ПКС.ВходящиеДанные

3) ПКС.ИсходящиеДанные -> ПКО.ВходящиеДанные

Попробуем разобраться подробнее, как передаются данные параметры.

Шаг 1. ПВД (Правило выгрузки данных)

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

Шаг 2. ПКО (Правило конвертации объектов)

После выполнения ПВД, параметр передается в ПКО-приемник уже как ВходящиеДанные. К этому параметру можно обратиться в коде, например, поместив еще один элемент в структуру.

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

Шаг 3. ПКС (Правило конвертации свойств)

После выполнения кода в ПКО, параметр будет передан в ПКС как ВходящиеДанные. Здесь обращаем внимание на следующую особенность: из ПВД уходят ИсходящиеДанные, в ПКО приходят ВходящиеДанные. Из ПКО уходят ВходящиеДанные, в ПКС также приходят ВходящиеДанные.

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

При совпадении наименовании ключа структуры входящих данных, поля будут заполнятся автоматически из входящих данных. Если наименование в структуре различаются, значение необходимо переназначить в ПКС вручную.

Шаг 4. Снова ПКО

Если поле имеет не примитивный тип данных, то система продолжит конвертацию объекта по правилу. Параметр ИсходящиеДанные, заданный в ПКС, будет передан в ПКО как ВходящиеДанные.

Практика

Задача: Необходимо настроить передачу документа (для примера будем использовать документ ПоступлениеТоваровУслуг) из базы Источника(1С:ERP Управление предприятием 2) в базу Приемник(Управление производственным предприятием 1.3) через регистр сведений «Сопоставление номенклатуры». У документа есть табличная часть Товары, в которой имеется поле «Номенклатура.

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

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

Регистр хранится в базе Источнике.

Решение:

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

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

//Формируем Новую табличную часть, которую будем помещать во входящие данные ТЧ = Источник.Товары.Выгрузить(); //Массив Номенклатур для загрузки в колонку ТЧ МассивНоменклатур = Новый Массив; //для того, чтобы не выполнять запрос в цикле, помещаем в запрос всю ТЧ Источника Запрос = Новый Запрос; Запрос.Текст = «ВЫБРАТЬ | СопоставлениеНоменклатурыУППERP.НоменклатураУПП КАК НоменклатураУПП, | ПриобретениеТоваровУслугТовары.Номенклатура КАК Номенклатура |ИЗ | Документ.ПриобретениеТоваровУслуг.Товары КАК ПриобретениеТоваровУслугТовары | ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.pll_СопоставлениеНоменклатурыУППERP КАК СопоставлениеНоменклатурыУППERP | ПО ПриобретениеТоваровУслугТовары.Номенклатура = СопоставлениеНоменклатурыУППERP.НоменклатураERP |ГДЕ | ПриобретениеТоваровУслугТовары.Ссылка = &Источник» Запрос.УстановитьПараметр(«Источник», Источник); РезультатЗапроса = Запрос.Выполнить(); ДетальныеЗаписи = РезультатЗапроса.Выбрать(); Пока ДетальныеЗаписи.Следующий() Цикл //проверяем, найдено ли соответствие Если ЗначениеЗаполнено(ДетальныеЗаписи.НоменклатураУПП) Тогда МассивНоменклатур.Добавить(ДетальныеЗаписи.НоменклатураУПП); Иначе //Отказ, если ничего не найдено Сообщить(«Для документа » + Источник.Ссылка + » не найдено соответствие номенклатур ERP-УПП. Номенклатура » +ДетальныеЗаписи.Номенклатура.Наименование+». Выгрузка документа отменена!»); Отказ = Истина; Прервать; КонецЕсли; КонецЦикла; Если НЕ Отказ Тогда //помещаем новую табличную часть во входящие данные ТЧ.Колонки.Удалить(«Номенклатура»); ТЧ.Колонки.Добавить(«Номенклатура», Новый ОписаниеТипов(«СправочникСсылка.НоменклатураУПП»)); ТЧ.ЗагрузитьКолонку(МассивНоменклатур,»Номенклатура»); ВходящиеДанные = Новый Структура; ВходящиеДанные.Вставить(«Товары»,ТЧ); КонецЕсли;

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

Правила обмена готовы. Сохраняем созданные правила. Попытаемся выгрузить из базы Источника и загрузить в Приемник тестовый документ. После загрузки в Приемник видим, что номенклатура была передана корректно, но колонка ЕдиницаИзмерения не загрузилась.

Связана эта ситуация с тем, что свойство ЕдиницаИзмерения привязана к номенклатуре-владельцу. Следовательно, нужно передать из ПКС единиц измерения номенклатуру-владельца в ПКО ЕдиницыИзмерения.

Добавим в обработчик события Перед выгрузкой для ПКС ЕдиницаИзмерения следующий код:

ИсходящиеДанные = Новый Структура(«Владелец»); ИсходящиеДанные.Владелец = ОбъектКоллекции.Номенклатура;

То, что указываем в ПКС как ИсходящиеДанные, в ПКО будет уже ВходящиеДанные.

В ПКО ЕдиницыИзмерения установим Галку «Получить из входящих данных» для Поля «Владелец».

Также не забудем дописать в ПКО ПриобретениеТоваровУслуг строку кода для выгрузки единиц измерений в ТЧ

Исправленный код ПКО ПриобретениеТоваровУслуг для Единиц измерения //Формируем Новую табличную часть, которую будем помещать во входящие данные ТЧ = Источник.Товары.Выгрузить(); //Массив Номенклатур для загрузки в колонку ТЧ МассивНоменклатур = Новый Массив; МассивЕдиницИзмерения = Новый Массив; //для того, чтобы не выполнять запрос в цикле, помещаем в запрос всю ТЧ Источника Запрос = Новый Запрос; Запрос.Текст = «ВЫБРАТЬ | СопоставлениеНоменклатурыУППERP.НоменклатураУПП КАК НоменклатураУПП, | ПриобретениеТоваровУслугТовары.Номенклатура КАК Номенклатура |ИЗ | Документ.ПриобретениеТоваровУслуг.Товары КАК ПриобретениеТоваровУслугТовары | ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.pll_СопоставлениеНоменклатурыУППERP КАК СопоставлениеНоменклатурыУППERP | ПО ПриобретениеТоваровУслугТовары.Номенклатура = СопоставлениеНоменклатурыУППERP.НоменклатураERP |ГДЕ | ПриобретениеТоваровУслугТовары.Ссылка = &Источник»; Запрос.УстановитьПараметр(«Источник», Источник); РезультатЗапроса = Запрос.Выполнить(); ДетальныеЗаписи = РезультатЗапроса.Выбрать(); Пока ДетальныеЗаписи.Следующий() Цикл //проверяем, найдено ли соответствие Если ЗначениеЗаполнено(ДетальныеЗаписи.НоменклатураУПП) Тогда МассивНоменклатур.Добавить(ДетальныеЗаписи.НоменклатураУПП); МассивЕдиницИзмерения.Добавить(ДетальныеЗаписи.Номенклатура.ЕдиницаИзмерения); Иначе //Отказ, если ничего не найдено Сообщить(«Для документа » + Источник.Ссылка + » не найдено соответствие номенклатур ERP-УПП. Номенклатура «+ДетальныеЗаписи.Номенклатура.Наименование+ «. Выгрузка документа отменена!»); Отказ = Истина; Прервать; КонецЕсли; КонецЦикла; Если НЕ Отказ Тогда //помещаем новую табличную часть во входящие данные ТЧ.Колонки.Удалить(«Номенклатура»); ТЧ.Колонки.Добавить(«Номенклатура», Новый ОписаниеТипов(«СправочникСсылка.НоменклатураУПП»)); ТЧ.ЗагрузитьКолонку(МассивНоменклатур,»Номенклатура»); ТЧ.Колонки.Добавить(«ЕдиницаИзмерения», Новый ОписаниеТипов(«СправочникСсылка.УпаковкиЕдиницыИзмерения»)); ТЧ.ЗагрузитьКолонку(МассивЕдиницИзмерения,»ЕдиницаИзмерения»); ВходящиеДанные = Новый Структура; ВходящиеДанные.Вставить(«Товары»,ТЧ); КонецЕсли;

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

Послесловие

Исходящие и Входящие данные — неотъемлемый функционал КД2. Без него невозможно представить сложных обменов. К сожалению, на Инфостарте я не нашел статьи, в которой бы разбирались эти моменты, потому решил написать самостоятельно.

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

Правила обмена разрабатывались в системе Конвертация данных, редакция 2.1 (2.1.8.2) для конфигураций 1С:ERP Управление предприятием 2 (2.4.10.62) и Управление производственным предприятием, редакция 1.3 (1.3.86.3). Справочник НоменклатураУПП и регистр сведений СопоставлениеНоменклатурыУППERP являются самостоятельно добавленными объектами и отсутствуют в типовой версии 1С:ERP Управление предприятием 2.

UPD.

За два с лишним месяца, прошедших с написания статьи, правила обмена были переосмыслены и переписаны с нуля несколько раз. Во многом благодаря комментариям ниже к посту.

Внесенные изменения и отпимизации:

1) Общая оптимизация (не нужно выгружать результат запроса в таблицу значений, обращаться через точку к переменным ссылочного типа и проч.);

2) В случаях, когда входящих и исходящих данных может быть несколько, либо вы дорабатываете уже существующие правила, неплохо бы делать такую вот проверку:

Если ТипЗнч(ВходящиеДанные) <> Тип(«Структура») Тогда ВходящиеДанные = Новый Структура; КонецЕсли;

Чтобы случайно не «обнулить» уже существующие данные в переменной.

3) Реализована подмена номенклатуры на сопоставленную на уровне запроса, а не его пост-обработкой в таблице значений;

4) «Сообщить()» везде заменено на «ОбщегоНазначения.СообщитьПользователю()»;

5) Реализовано разделение табличной части Товары на две табличных части Товары и Услуги в зависимости от типа номенклатуры. (т.к. в УПП две табличных части, а не одна).

Отредактированный пример кода:

ТЗТовары = Новый ТаблицаЗначений(); Запрос = Новый Запрос; Запрос.Текст = «ВЫБРАТЬ | pll_СопоставлениеНоменклатурыУППERP.НоменклатураУПП КАК Номенклатура, | ХарактеристикиНоменклатурыДополнительныеРеквизиты.Значение КАК Серия, | ПриобретениеТоваровУслугТовары.Номенклатура.Представление КАК ПредставлениеНоменклатуры, | ПриобретениеТоваровУслугТовары.Номенклатура.Типноменклатуры КАК ТипНоменклатуры, | ПриобретениеТоваровУслугТовары.Номенклатура.ЕдиницаИзмерения КАК ЕдиницаИзмерения, | ПриобретениеТоваровУслугТовары.* |ИЗ | Документ.ПриобретениеТоваровУслуг.Товары КАК ПриобретениеТоваровУслугТовары | ЛЕВОЕ СОЕДИНЕНИЕ Справочник.ХарактеристикиНоменклатуры.ДополнительныеРеквизиты КАК ХарактеристикиНоменклатурыДополнительныеРеквизиты | ПО ПриобретениеТоваровУслугТовары.Характеристика = ХарактеристикиНоменклатурыДополнительныеРеквизиты.Ссылка | И ХарактеристикиНоменклатурыДополнительныеРеквизиты.Свойство = &СвойствоСерия | ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.pll_СопоставлениеНоменклатурыУППERP КАК pll_СопоставлениеНоменклатурыУППERP | ПО ПриобретениеТоваровУслугТовары.Номенклатура = pll_СопоставлениеНоменклатурыУППERP.НоменклатураERP |ГДЕ | ПриобретениеТоваровУслугТовары.Ссылка = &Ссылка»; СвойствоСерия = ПланыВидовХарактеристик.ДополнительныеРеквизитыИСведения.НайтиПоНаименованию(«Серия продукции»); Запрос.УстановитьПараметр(«Ссылка», Источник); Запрос.УстановитьПараметр(«СвойствоСерия», СвойствоСерия); РезультатЗапроса = Запрос.Выполнить(); Если РезультатЗапроса.Пустой() Тогда Отказ = Истина; КонецЕсли; МассивУдаляемыхКолонок = Новый Массив; МассивУдаляемыхКолонок.Добавить(«ПредставлениеНоменклатуры»); МассивУдаляемыхКолонок.Добавить(«ТипНоменклатуры»); МассивУдаляемыхКолонок.Добавить(«Номенклатура1»); МассивУдаляемыхКолонок.Добавить(«Серия1»); Для Каждого Колонка из РезультатЗапроса.Колонки Цикл НайденныйЭлемент = МассивУдаляемыхКолонок.Найти(Колонка.Имя); Если НайденныйЭлемент = Неопределено Тогда ТЗТовары.Колонки.Добавить(Колонка.Имя); КонецЕсли; КонецЦикла; ТЗУслуги = ТЗТовары.СкопироватьКолонки(); Выборка = РезультатЗапроса.Выбрать(); ПредставлениеИсточника = Строка(Источник); Пока Выборка.Следующий() Цикл Если Выборка.Номенклатура = NULL Тогда Отказ = Истина; ЗначениеСобытия = Новый Структура(«ИмяСобытия, ПредставлениеУровня, Комментарий, ДатаСобытия»); ЗначениеСобытия.ИмяСобытия = «Обмен данными. Ошибка сопоставления номенклатур»; ЗначениеСобытия.ПредставлениеУровня = «Ошибка»; ЗначениеСобытия.Комментарий = «Для объекта «+ПредставлениеИсточника +» и номенклатуры «+Выборка.ПредставлениеНоменклатуры+ » не найдено сопоставление номенклатур. Объект не выгружен!»; Параметры.СобытияДляЖурналаРегистрации.Добавить(ЗначениеСобытия); //Сообщаем пользователю ОбщегоНазначения.СообщитьПользователю(ЗначениеСобытия.Комментарий); ИначеЕсли Выборка.ТипНоменклатуры = Перечисления.ТипыНоменклатуры.Услуга Тогда ТЗ = ТЗУслуги; Иначе ТЗ = ТЗТовары; КонецЕсли; Если НЕ Отказ Тогда СтрокаТЗ = ТЗ.Добавить(); ЗаполнитьЗначенияСвойств(СтрокаТЗ,Выборка); КонецЕсли; КонецЦикла; Если Не Отказ Тогда Если ТипЗнч(ВходящиеДанные) <> Тип(«Структура») Тогда ВходящиеДанные = Новый Структура; КонецЕсли; ВходящиеДанные.Вставить(«Товары», ТЗТовары); ВходящиеДанные.Вставить(«Услуги», ТЗУслуги); КонецЕсли;

1. Вступление.

В этой статье хотелось бы минимально затронуть теорию или не трогать вообще. И в отличие от других ресурсов, показать на простых жизненных примерах разработку правил конвертации объектов. Хочется поделиться какими-то стандартными механизмами, зная которые, можно выделить более «нужные», «правильные» и без «мусора» правила.

2. Что понадобится: конфигурация 1С: Конвертация данных 2.* и обработки из пакета. Для Примера задач возьмем конфигурации 1С: Управление торговлей 11 и 1С: БП 3.*.

Итак, для разработки правил выгрузки данных в 1С потребуется конфигурация 1С: Конвертация объектов 2, а также обработки, входящие в пакет.

Например, у нас уже развернута база конвертации и запущена.


Разработку правил обмена будем писать между конфигурацией 1С: Управление торговлей 11 и 1С: Бухгалтерия предприятия 3 (правила обмена УТ / БУХ).

3. Нам понадобятся Обработки для выгрузки структуры метаданных и обмена.

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


Собственно, в распакованном каталоге конфигураций для конфигураций на управляемых формах нас интересует обработка MD83Exp.epf. Если выгрузку нужно сделать из конфигураций на обычных формах, тогда используется обработка MD82Exp.epf. Это если, например, нужно получить структуру из таких конфигураций, как 1С: УТ 10, 1С: Управление производственным предприятием 1.3, 1С: Комплексная автоматизация 1.1, 1С: Зуп 2.5 и так далее.
Далее уже для выгрузки-загрузки данных в 1С с помощью наших правил понадобится обработка «Универсальный обмен данными в формате XML» V8Exchan83.epf для конфигураций на управляемых формах таких как 1С: Управление торговлей 11.*, 1С БП 3, 1С: ERP 2.* и подобных. И соответственно V8Exchan83.epf — для конфигураций на обычных формах.

4. Выгрузка структуры метаданных конфигурации 1С: Управление торговлей 11.3 и 1С: Бухгалтерия предприятия 3.0.*

Начнем с выгрузки структуры метаданных из конфигурации 1С: Бухгалтерия предприятия 3.
Откроем обработку MD83Exp.epf


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

5. Загрузка структур метаданных конфигураций в базу конвертации.

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


В диалоговом окне загружаем структуру БП:

И аналогично — структуру Управления торговлей.

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

6. Создание правил конвертации в 1С на конкретном примере задачи.

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

В этом диалоговом окне ничего выполнять не будем, просто нажмем — «Закрыть».
Создадим правила для выгрузки не один документ в один, а один вид в другой, например, документ РеализацииТоваровУслуг из УТ 11 с необходимыми справочниками в документ ПоступлениеТоваровУслуг в БП 3.
Итак, создаем новое ПКО (правило конвертации объектов в 1С)
Выбираем источник РеализацияТоваровУслуг и приемник ПоступлениеТоваровУслуг и нажимаем ОК.
При этом появится диалоговое окно, где опять отказываемся от автоматического создания ПКС (Правил конвертации свойств). Далее выберем только необходимые.
А вот на предложение создать ПВД (правил выгрузки данных) отвечаем «Да».
Создаются ПВД, которые и будут отражаться в обработке универсального обмена XML для выбора:

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

Теперь начнем сопоставление необходимых свойств (реквизитов) объекта. Для этого жмем «СинхронизацияСвойств» (метка «1» на скрине). Убираем рекурсивное создание правил («2»). Снимаем все отмеченные реквизиты («3»). И выберем самостоятельно, что нам нужно.
Для примера выбираем необходимое:
Обращаю внимание на то, что мы сделаем ПКС контрагента в организацию, а организацию в контрагента, и еще сопоставим некоторые реквизиты, которые не совпадают по имени, например, «Валюта» и «Валюта документа».
Далее жмем ОК и получаем подобное:
Где видим, что еще нет правил конвертации.
Начнем по реквизитам проходить и описывать. Сначала настраиваем поиск документа так, как писал ранее, делаем выгрузку и поиск документа на начало даты, и сделаем подмену нумерации. Первые три символа будем подменять на свой префикс «УТБ». А так как в БП и УТ нумерация по 11 символов, делаем составной номер: наш префикс и 8 символов от источника. Пример на скрине ниже.
Выгрузку документов делаем всегда не проведенные и без движения. Предполагаем, что документы будут в приемнике проводиться после проверки пользователем.
Для этого ПКС установив, как не проведен, 0 или 1, используем как булево.
На примере валюты создаем для ПКС правило конвертации объекта. При этом считаем, что в обеих базах валюты имеются, и они должны синхронизироваться по коду. Поэтому в ПКО валют не будем создавать все ПКС, а только добавим Код для поиска. Т.е. от предложения создать ПКС для объекта – отказываемся.
В ПКО документа для ПКС подставилось созданное Правило конвертации. А само правило по умолчанию предлагается по уникальному идентификатору. Исправляем, делаем поиск по коду и устанавливаем свойство, чтобы не создавать новый объект.
В итоге получаем вариант:

Далее по аналогии создаем для остальных реквизитов ПКО и ПКС. Причем поиск организации по контрагенту и наоборот устанавливаем по ИНН. Примерно так это выглядит с минимальными реквизитами (можно добавлять при необходимости).
Для ПКО Договоры контрагентов делаем поиск по ПКС Контрагент, наименование и владелец.
Посмотрим, как указать в ПКС нужное значение в типе перечисления. Например, реквизит «ВидОперации». Тут можно использовать различные условия и подставлять значения. Например, нам нужно, чтобы «вид операции» выгружался всегда «Товары», в этом случае достаточно в «лоб» написать нужное значение строкой.
Ниже показано, как установить без сложностей и в большинстве случаев ПКС для КратностьВзаиморасчетов, КурсВзаиморасчетов, Счета учета.
Для ПКО Номенклатура оставим поиск по внутреннему уникальному идентификатору. Но обращу внимание на то, как можно переопределить свою группу. Например, мы согласны, что будет выгружаться новая номенклатура из конфигурации 1С: Управление торговлей 11, но нужно, чтобы номенклатура собиралась в определенной группе «НашаГруппа».
Для реализации данной задачи создаем ещё одно ПКО. Назовем его «НоменклатураРодитель», которое укажем в ПКС родителя в правиле конвертации.
Устанавливаем два поиска: по наименованию, где наименование жестко указываем нашей группы, и обязательное свойство признака «ЭтоГруппа» в истина.
Поскольку мы приняли решение, что у нас вся номенклатура падает в нашу группу, то нет необходимости при выгрузке выгружать группы из УТ 11. Для этого в ПКО Номенклатура в обработчике событий «ПередВыгрузкой» поставим фильтр, что не нужно выгружать группы «Отказ = Источник.ЭтоГруппа;».
В ПВД (правила выгрузки данных) РеализацииТоваровУслуг, добавим фильтр, чтобы не выгружались помеченные на удаление документы. Для этого в ПВД в обработчиках событий «ПередВыгрузкой» пропишем фильтр «Отказ = Объект.ПометкаУдаления;».
Сохраним разработанные правила в файл.

7. Подводим итоги: Выгрузка и загрузка данных с помощью разработанных правил обмена данными.

Открываем в 1С:Управление торговлей 11 обработку «Универсальный обмен данными в формате XML» V8Exchan83.epf.
Выгрузка прошла, теперь этой же обработкой делаем загрузку в 1С: Бухгалтерия предприятия 3.

Загрузка прошла. Проверяем, что как загрузилось. Итак, документ загружен, как мы и добивались — у нас Организация загружена в контрагента, а контрагент в организацию. Счета учета все загружены и установлены. Номер документа у нас получился с нашим префиксом и на начало дня. Все реквизиты, которые прописали, заполнены.
Проверяем загрузку номенклатуры. Видим, что всё получилось так, как мы и планировали.

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

Сергей ОМЕЛЬЧУК