Как выгрузить регистр сведений 1с в файл

Обновлено: 08.07.2024

В блоке БСП, есть регистр сведений, хранящий информацию о связях между объектами баз, участвующими в обмене.
Случаются ситуации, когда возникают неверные связи. Они влекут за собой ошибки при обмене - к примеру - "<Объект не найден> (132:a459000e0c4e596e11e41917c6dc8625)"
А связано это с тем, что в базе источнике, в этом регистре, есть связь с объектом базы приемника, и поэтому он выгружается по ссылке.
И в случае отсутствия соответствующей записи в базе приемника, случаются проблемы.
Данная обработка упрощает поиск и удаление неверных записей.

Как работать (Будем называть базу источник - БИ, базу приемник БП):
1. В БИ открываем обработку и выбираем узел обмена. ТЧ заполняется всеми записями по данному узлу.

2. Выгрузка данных ТЧ, для анализа в БП возможен двумя способами:
а) В файл (указываем в шапке обработки) - команда "Выгрузить в файл"
б) В строку (пользуемся в том случае, если работа с файловой системой невозможна - безопасный режим, например) - команда "Выгрузить таблицы в строку"

3. Открываем обработку в БП, выбираем узел
4. Указываем путь к файлу, либо вставляем в поле "Текст строки", значение из БИ.
5. Выполняем соответствующую команду "Загрузить из файла" или "Загрузить таблицу из строки".
6. Выполняем команду "Удалить неверные записи", в этот момент происходит анализ таблиц регистров баз.
В случае, если для текущей записи из БП (текущей базе) не обнаружено соответствие из БИ, запись удаляется.
7. Проверяем результат выполнения, выполняем команду "Сохранить изменения" - производится перезапись данных регистра.

Далее, возвращаемся к пункту 2 и делаем все операции для БИ (базы источника).
В итоге в обеих базах мы получим полностью соответствующие друг другу регистры "Соответствия объектов информационных баз".

ДОПОЛНЕНИЕ

Появилась потребность не только вычищать РС от ненужных записей, но и научиться быстро сопоставлять объекты разных БД.

Из структуры регистра, понятно что добавив к определенному объекту сведения (ГУИД) объекта из другой базы, можно избежать проблем сопоставлении объектов на лету.

Алгоритм работы с эти блоком очень похож на ранее описанный для очистки записей.

1. В БИ запускаем обработку, переходим на закладку "Сопоставление объектов".

2. Выбираем узел, выбираем тип данных которые хотим сопоставить, нажимаем "Заполнить данными БД" и получаем таблицу со всеми записями.

3. Выгружаем таблицу в файл или строку.

4. В БП открываем обработку, переходим на соответствующую закладку, выбираем узел, тип данных и загружаем таблицу.

5. В процессе загрузки таблицы, обработка проверяет наличие записей в регистре сведений по УИДу приемника.

6. В итоге, получаем таблицу данных из БИ для каждой записи которой, нужно выбрать соответствие из текущей базы. Лишние строки можно удалить.

6. Завершив сопоставление, необходимо добавить записи в регистр сведений, выполнив команду "Сохранить соответствия".

Основной функционал и дополнительный, доступен в обработке под номером 2.

Универсальные переносы данных 1С (перенос документов, остатков и справочной информации):

КА 1.1 - КА 2

КА 1.1 - БП 3.0

УПП 1.3 - ЕРП 2

УПП 1.3 - БП 3.0

БП 3 - ЕРП 2

УТ 10 - УТ 11

КА 2 в УНФ 1.6

Перенос данных из 1С:Управление торговлей 11 в 1С:Управление нашей фирмой 1.6 + 4 мес. техподдержки + 12 мес. обновлений

БП 2 - КА 1.1

КА 1.1 - УТ 11

КА 1.1 - ЕРП 2

УПП 1.3 - КА 2

БП 3 - КА 2

БП 3 - УНФ 1.6

УТ 10.3 в УНФ 1.6

Перенос данных из 1С:Управление нашей фирмой 1.6 в 1С:ERP Управление предприятием 2 + 4 мес. техподдержки + 12 мес. обновлений

УТ 11 - БП 3

БП 2 - УТ 11

КА 1.1 - УПП 1.3

ERP 2 - БП 3

УПП 1.3 - УНФ 1.6

БП 3.0 - УПП 1.3

БП 3 - УТ 10.3

УТ 10 - КА 2

Перенос данных из 1С:Управление нашей фирмой 1.6 в 1С:Комплексная автоматизация 2

УТ 11 - УТ 10

БП 2 - КА 2

Данные программы разработаны в нашей компании. Позволяют комфортно выполнить переход со старых программ 1С на новые. В отличие от типовых переносов фирмы 1С эти разработки позволяют переносить документы за выбранный период.
Переносы данных можно приобрести за безналичный расчет на юридическое лицо (предоставим закрывающие документы) или оплатить банковской картой через шлюз Яндекс.Кассы (предоставим электронный чек). -->

Если необходимо конвертировать значения справочника в значения регистра или выгрузить сопутствующую информацию (например, для справочника Физические лица перенести паспортные данные физлиц и их ФИО с историей).

// Выгрузка присоединенных файлов физлиц
Запрос = Новый Запрос("
|ВЫБРАТЬ
| ФизическиеЛицаПрисоединенныеФайлы.Ссылка
|ИЗ
| Справочник.ФизическиеЛицаПрисоединенныеФайлы КАК ФизическиеЛицаПрисоединенныеФайлы
|ГДЕ
| ФизическиеЛицаПрисоединенныеФайлы.ВладелецФайла = &ВладелецФайла
| И ФизическиеЛицаПрисоединенныеФайлы.ПометкаУдаления = ЛОЖЬ
|
|УПОРЯДОЧИТЬ ПО
| ФизическиеЛицаПрисоединенныеФайлы.ВладелецФайла"
);
Запрос.УстановитьПараметр("ВладелецФайла", Источник.Ссылка);

Пока Выборка.Следующий() Цикл
ВыгрузитьПоПравилу(Выборка.Ссылка. "ХранилищеДополнительнойИнформации");
КонецЦикла;

// Выгрузка паспортных данных
Запрос = Новый Запрос("
|ВЫБРАТЬ
| ДокументыФизическихЛиц.Период,
| ДокументыФизическихЛиц.Физлицо,
| ДокументыФизическихЛиц.ВидДокумента,
| ДокументыФизическихЛиц.Серия,
| ДокументыФизическихЛиц.Номер,
| ДокументыФизическихЛиц.ДатаВыдачи,
| ДокументыФизическихЛиц.СрокДействия,
| ДокументыФизическихЛиц.КемВыдан,
| ДокументыФизическихЛиц.КодПодразделения,
| ДокументыФизическихЛиц.ЯвляетсяДокументомУдостоверяющимЛичность,
| ДокументыФизическихЛиц.Представление
|ИЗ
| РегистрСведений.ДокументыФизическихЛиц КАК ДокументыФизическихЛиц
|ГДЕ
| ДокументыФизическихЛиц.Физлицо = &Физлицо"
);
Запрос.УстановитьПараметр("ФизЛицо", Источник.Ссылка);

Пока Выборка.Следующий() Цикл
// ВыгрузитьПоПравилу(Выборка. "ПаспортныеДанныеФизЛиц");

Отбор = Новый ТаблицаЗначений;
Отбор.Колонки.Добавить("Имя");
Отбор.Колонки.Добавить("Значение");
Отбор.Колонки.Добавить("Использование");

СтрокаОтбора = Отбор.Добавить();
СтрокаОтбора.Имя = "ФизЛицо";
СтрокаОтбора.Значение = Выборка.ФизическоеЛицо;
СтрокаОтбора.Использование = Истина;

СтрокаОтбора = Отбор.Добавить();
СтрокаОтбора.Имя = "ВидДокумента";
СтрокаОтбора.Значение = Выборка.ВидДокумента;
СтрокаОтбора.Использование = Истина;

Строки = Новый ТаблицаЗначений;
Строки.Колонки.Добавить("Период");
Строки.Колонки.Добавить("Физлицо");
Строки.Колонки.Добавить("ВидДокумента");
Строки.Колонки.Добавить("Серия");
Строки.Колонки.Добавить("Номер");
Строки.Колонки.Добавить("ДатаВыдачи");
Строки.Колонки.Добавить("СрокДействия");
Строки.Колонки.Добавить("КемВыдан");
Строки.Колонки.Добавить("КодПодразделения");
Строки.Колонки.Добавить("ЯвляетсяДокументомУдостоверяющимЛичность");
Строки.Колонки.Добавить("Представление");

Строка = Строки.Добавить();
ЗаполнитьЗначенияСвойств(Строка, Выборка);

НаборЗаписей = Новый Структура("Отбор, Строки");
НаборЗаписей.Отбор = Отбор;
НаборЗаписей.Строки = Строки;

// Выгрузка ФИО физических лиц
Запрос = Новый Запрос("
|ВЫБРАТЬ
| ФИОФизЛиц.Период,
| ФИОФизЛиц.ФизическоеЛицо,
| ФИОФизЛиц.Фамилия,
| ФИОФизЛиц.Имя,
| ФИОФизЛиц.Отчество
|ИЗ
| РегистрСведений.ФИОФизическихЛиц КАК ФИОФизЛиц
|ГДЕ
| ФИОФизЛиц.ФизическоеЛицо = &ФизЛицо"
);
Запрос.УстановитьПараметр("ФизЛицо", Источник.Ссылка);

Пока Выборка.Следующий() Цикл
// ВыгрузитьПоПравилу(Выборка. "ФИОФизЛиц");

Отбор = Новый ТаблицаЗначений;
Отбор.Колонки.Добавить("Имя");
Отбор.Колонки.Добавить("Значение");
Отбор.Колонки.Добавить("Использование");

СтрокаОтбора = Отбор.Добавить();
СтрокаОтбора.Имя = "ФизическоеЛицо";
СтрокаОтбора.Значение = Выборка.ФизическоеЛицо;
СтрокаОтбора.Использование = Истина;

Строки = Новый ТаблицаЗначений;
Строки.Колонки.Добавить("ФизическоеЛицо");
Строки.Колонки.Добавить("Имя");
Строки.Колонки.Добавить("Отчество");
Строки.Колонки.Добавить("Фамилия");
Строки.Колонки.Добавить("Период");

Строка = Строки.Добавить();
ЗаполнитьЗначенияСвойств(Строка, Выборка);

НаборЗаписей = Новый Структура("Отбор, Строки");
НаборЗаписей.Отбор = Отбор;
НаборЗаписей.Строки = Строки;

А также можете посмотреть пример конвертации данных из справочника в регистр:

Отбор = Новый ТаблицаЗначений;
Отбор.Колонки.Добавить("Имя");
Отбор.Колонки.Добавить("Значение");
Отбор.Колонки.Добавить("Использование");

СтрокаОтбора = Отбор.Добавить();
СтрокаОтбора.Имя = "СтруктурнаяЕдиница";
СтрокаОтбора.Значение = Объект.Владелец;
СтрокаОтбора.Использование = Истина;

СтрокаОтбора = Отбор.Добавить();
СтрокаОтбора.Имя = "ОтветственноеЛицо";
СтрокаОтбора.Значение = Объект.ОтветственноеЛицо;
СтрокаОтбора.Использование = Истина;

Строки = Новый ТаблицаЗначений;
Строки.Колонки.Добавить("Активность");
Строки.Колонки.Добавить("Ссылка");
Строки.Колонки.Добавить("Период");
Строки.Колонки.Добавить("СтруктурнаяЕдиница");
Строки.Колонки.Добавить("ОтветственноеЛицо");
Строки.Колонки.Добавить("Должность");
Строки.Колонки.Добавить("ФизическоеЛицо");

Строка = Строки.Добавить();
ЗаполнитьЗначенияСвойств(Строка, Объект);

Строка.Период = Объект.ДатаНачала;
Строка.СтруктурнаяЕдиница = Объект.Владелец;
Строка.Активность = Истина;

НаборЗаписей = Новый Структура("Отбор, Строки");
НаборЗаписей.Отбор = Отбор;
НаборЗаписей.Строки = Строки;

В последнем примере в конфигурации-источнике данные - это справочник. А в приемнике - регистр сведений. Правила - из ПВД, "Перед выгрузкой".

А в первом примере указаны правила из ПКО, "После конвертации". Это сделано для того, чтобы для тех физлиц, которые только что выгружены, была перенесена доп. информация.

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

Постараюсь тут описать, как я решил эту проблему.

1) Для начала сохраним конфигурацию поставщика в файл. Конфигурация - Поддержка - Настройка поддержки - Сохранить в файл.


2) Затем полностью снимем конфигурацию с поддержки. Конфигурация - Поддержка - Настройка поддержки - Снять с поддержки.


3) Загрузим полностью сохраненную ранее типовую конфигурацию. Конфигурация - Загрузить конфигурацию из файла.

4) Следующим шагом нужно вычислить проблемные регистры.

Попробуем обновить конфигурацию базы и увидим ошибку. Принять изменения нельзя (кнопка не активна) и написано почему. В моем случае это "ДвоичныеДанныеФайлов. Имеются записи с одинаковыми измерениями." Не закрывая конфигуратор, сразу же заходим в режим предприятия и запускаем мою обработку. Выбираем этот регистр и нажимаем выгрузить. Используя механизм сериализации, данные будут выгружены в xml файл во временный каталог пользователя и регистр будет очищен.



5) Переходим в конфигуратор и пробуем обновить конфигурацию базы данных вновь. У меня еще одна ошибка "НомераЛистовКассовойКниги. Имеются записи с одинаковыми измерениями". Повторяем действия из пункта 4. И делаем до тех пор пока конфигурация не обновится.

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


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



6) Затем нужно восстановить данные очищенных регистров. Открываем режим предприятия, запускаем обработку и нажимаем загрузить.


Интерфейс и смысл обработки очень прост. Данные из проблемных регистров выгружаются в файл (даже картинки) и очищаются. Затем просто восстанавливаются.

По очереди или сразу можете указать имена регистров для выгрузки и очистки. Кнопка "Загрузить" станет активной когда будет создан необходимый каталог с файлами и тем самым станет возможным сделать загрузку.

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

Специальные предложения

Electronic Software Distribution

Интеграция 1С с системой Меркурий

Алкогольная декларация

Готовые переносы данных

54-ФЗ

Управление проектом на Инфостарте

Траектория обучения 1С-разработчика

(0) интересный подход.
а дублирующиеся записи перезаписываются и только?

(6) да-да, был такой случай:
- бухгалтер говорит не хочу лишнего платить - верните все к типовой, т.к. никакие эти доработки не используем
- согласно твоей методе сносим измерение вместе СО ВСЕМИ ДАННЫМИ (я так понял обработка делает именно так)
- на следующий день она же орёт, зачем Вы ЭТО удалили))) - ВЕРНИТЕ ВСЁ КАК БЫЛО

конечно же ей подсунули тестовую - т.к. знали что 99% этим закончится

(26)Моя обработка возьмет все данные, скопирует их в файл, затем восстановит. Уже надоело про это писать.

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

Вот эту ситуацию хотел описать - например есть РС.ТиповойРегистр
Типовое измерение / Мое измерение / Типовой ресурс
Контрагент1 / Машина1 / 1
Контрагент1 / Машина2 / 2
Контрагент1 / Машина3 / 3

После загрузки конфигурации поставщика - пропадает измерение <Мое измерение>

Далее загружаем данные из файла
Типовое измерение / Типовой ресурс
Контрагент1 / 3

Вот так ведь будет выглядеть РС с данными после этих манипуляций - поправьте пож-та если я ошибаюсь.
Спасибо

(28)не в коем случае я не обиделся. Просто много раз об этом уже писал. Вашу ситуацию, кстати, вообще не рассматривал. По логике будет да как вы сказали. Не проверял. Если ошибку при десириализации не выдаст и восстановит, то свое измерение просто пропустится. Будет время, попробую, отпишусь. Спасибо за наводку. (28)должен восстановить с одинаковым набором измерений. Просто без вашего измерения. Попробую проверить. Да интересно. А куда по итогу дубли то деются? Схлопываются при выгрузке? (2) Ну обработка с дублями ничего не делает. Она очищает регистр полностью. А потом просто возвращает к исходному состоянию. С теми ошибочными данными, что были раньше. Смысл этой работы именно вернуться к типовой. (4) я думал, что при перезаписи регистры становятся без дублей - старые записи перезаписываются новыми согласно измерениям - я так думал, видимо не так. (9)Нет. Они сначала выгружаются, полностью, в том виде в котором есть. Потом полностью очищаются. Потом нужно принять изменения и загрузить данные регистров вновь. С теме же ошибочными данными, что и ранее. Выгружаются в файл. Подобные обновления сомнительно вообще делать, т. к. они идут с некоторой потерей данных. Конечно, если клиента это устраивает, то можно и так. (5) о тех данных, из-за удаления которых стала появляться ошибка "Имеются записи с одинаковыми измерениями" (13)вы, видимо, не до конца поняли что делает обработка. По итогу работы все данные на месте. Со своими прежними проблемами. Решение этих проблем в этой разработке не рассматривается. В инструментах разработчика есть функционал, который умеет анализировать и исправлять такие проблемы. Подготовка к изменению структуры БД. (7) сделайте публикацию, вставьте сюда ссылку на статью - сделайте обзор. я к примеру не в курсе , о чем вы. (8)Полазав в нете, нашел только это
(с позволения модераторов кину сюда ссылку). Любопытно подсмотреть как у них реализован поиск проблемных регистров. А то думать над этим пока нет времени. Это бы сильно упростило (сделала бы более универсальной) лично мою текущую разработку. (12)О, Боже. Посмотрел как реализован поиск проблемных регистров. Что-то слишком сложный вариант. Надо искать что-то попроще)) (8) Мне казалось что ИР довольно известны. Все описания есть на сайте, по данному вопросу см. http://devtool1c.ucoz.ru/index/proverka_bazy_dannykh_pered_usecheniem_tipov/0-24 .
По шагам - сначала подготавливаем базу, но не обновляем (т.е. конфигурация сохранена, а кнопка "обновить конфигурацию базы данных" светится). Затем закрываем конфигуратор, запускаем ИР, жмем авто-коррекция. Ир подключится к конфигуратору, увидит различия по регистрам, и предложит варианты действий, останется принять решение. (16)Не пользовался никогда ИР. Спасибо. Ссылку уже нашел. Уже подсмотрел как реализовано. Можно, конечно, заморочиться и сделать также, но не в рамках этой работы за 1 стармани)) (17) А зачем "делать также"? Это уже реализовано, пользуйтесь. Я повсеместно применял этот механизм, и (к замечанию о сложности) могу сказать - что он гораздо удобнее и проще предложенного. Огромный плюс в том что все регистры видны сразу, а не по-одному. Кроме того, в некоторых случаях сложной реструктуризации описанный в статье подход не применим вовсе. Ждать несколько часов, чтобы увидеть ошибку - "такое себе".. (18)Моя обработка просто копирует данные и восстанавливает. И все. На премия дарвина я и не претендую. ИР не пользовался никогда. Честно, даже не слышал про это. На УФ тоже есть? (19) Нет, в УФ только расширение, которое работает в толстом УФ клиенте. Попробуйте, это набор очень удобных механизмов. Я использую ИР уже

5 лет, и за все это время ни разу не пришлось тратить время на "волшебные велосипеды" - обработок типа "провести эти 10500 документов с отбором по этому контрагенту" и т.п. Там все есть, причем сделано хорошо. Программистом для программистов. Есть описания, есть форум.

Здравствуйте! БУ 3.0.89.38
"Невозможно подключить дополнительную обработку из файла.
Возможно, она не подходит для этой версии программы.

Техническая информация:
Метод объекта не обнаружен (СведенияОВнешнейОбработке)"
?

(23) Эта обработка не изготавливалась как внешняя. Открывается только через файл-открыть. Спасибо очень помогли! Не загружался CFник, пришлось удалить 2 регистра сведений и через вашу обработку перенес их.

Обработка в коде «ПриСозданииНаСервере» создает каталог кодом:
Каталог = КаталогВременныхФайлов() + "RegisterData";

а в процедуре «СериализоватьРегистр» дополняет его именем файла:

ИмяФайла = Каталог + "\" + ИмяРегистра +"_"++"_"+".xml";

В таком варианте, если запустить обработку сразу на нескольких копиях обновляемой базы, либо запустить повторно перезапись в одной базе - создастся временный файл xml с одинаковым адресом и именем файла, что может привести к затиранию данного файла повторной выгрузкой, либо выгрузкой этого же регистра из другой копии базы. Это является уязвимостью обработки и может привести к потере данных. К тому же, это усложняет возможность редактировать файл выгрузки вручную, поскольку неизвестно место его сохранения.

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

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

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