Добрый день!
Возникла проблема: исчезли ВСЕ документы за период с 1 по 14 декабря включительно. Где мы их только не искали - их нет. В товарах та же неразбериха - все что было поставлено на приход в это время - теперь в минусах.
Гуру, подскажите, есть ли возможность восстановления?
Конечно же, бэкапов никто никогда не делал. Есть база только за апрель месяц. Приходные и расходные накладные в бумажном виде отсутствуют, набить их заново просто невозможно. Возможно ли эти данные как то вернуть?
Большое спасибо за подсказки и поддержку.
1C 7.7 торговля и склад.
А база файловая или серверная? У меня есть обработка, которая поднимает документы даже если в 1С 7.7 они были окончательно удалены (если cdx файлы не почистили).
(1) Удаленные данные не вернуть, для начало разберитесь кто удалил. У Вас кто то пошалил, неплохо так. Посмотрите кто удалял, через журнал регистрации. И что еще этот пользователь делал, может там не только документы поступления удалили.
Без бэкапов, только с бумаги, но не понятно где они у Вас, как ведете бухгалтерию. Если они территориально в другом месте, запрашивайте сканы и заводите.
Как вариант еще (если вам не критичны поступления) занесите поступление по остатку, проведя инвентаризацию.
(1) вам повезло конец года. Покупайте новую версию УТ.
Проведете инвентаризацию введете остатки и дело в шляпе!
Если нужна будет консультация пишите в ЛС.
Все остальные варианты по описанию с вероятностью стремящейся к 0 ничего не дадут.
(22)
Куплена новая версия еще летом, на самом деле. Никак не можем перейти. Был другой программист, меня попросили поадминистрировать и корректно перейти на новую версию. Однако вероятно предыдущий коллега урезал версию 1с 77, так как обработчиков выгрузки нет. Товаров более 4к, и вбивать ручками остатки и проводить накладные - посчитали долгим и муторным занятием...
В данной теме это даже уже смешно звучит((
В идеале - вернуть утерянные 2 недели, найти обработчик выгрузки и перенести все данные в восьмерку.
Магазин работает, под новый год у них продажи зашкаливают - и тут такая катастрофа. Работают даже на выходных, два магазина. Когда делать инвентаризацию... Если только на январских праздниках. А доработать как-то нужно...
Добрый день!
Возникла проблема: исчезли ВСЕ документы за период с 1 по 14 декабря включительно. Где мы их только не искали - их нет. В товарах та же неразбериха - все что было поставлено на приход в это время - теперь в минусах.
Гуру, подскажите, есть ли возможность восстановления?
Конечно же, бэкапов никто никогда не делал. Есть база только за апрель месяц. Приходные и расходные накладные в бумажном виде отсутствуют, набить их заново просто невозможно. Возможно ли эти данные как то вернуть?
Большое спасибо за подсказки и поддержку.
1C 7.7 торговля и склад.
Добрый добрый, видимо кто-то у вас очень экономит на обслуживании... но это дело житейское, в любом случае первым делом стоит настроить резервное копирование,
опросить всех может кто-то из бухгалтеров делал копии,
выгружал какие-то отчеты и т.д.
проверить базу на ошибки и сравнить на целостность с конфигурацией которая от апреля...
кстати в бухгалтерию документы выгружаются может там что-то есть
(3)
Да, я учусь на своих ошибках... В голове решение проблемы - установить программку восстановления данных и попробовать измененные файлы восстановить. Но... слабое утешение что что-то получится.
(4) Здесь врятли получится обычной программкой, такие файлы перезатираются быстро, а они очень плохо восстанавливают перезатертые файлы, но попытка не пытка ( в вашем случае даже не знаю)
Как минимум компьютер надо выключить и подключать диск к другому и начинать, иначе все бесполезно.
Новая проблема вылетела.
Сейчас активно создаем на приход минусовые товары, делаем новые расходные (то что можем и нашли). Однако при проведении проблемного товара (который был на минусе ранее) выдается ошибка:
Если (Знак*НайденныйОстаток)>0 Тогда
{Глобальный модуль(1597)}: Операции сравнения на больше-меньше допустимы только над значениями совпадающих базовых типов (число, строка, дата)
И все тут)) Не списывается, расходная накладная не проводится.
П.С. все приходные которые нашли, ставим 1 декабрем.
(7) (Знак*НайденныйОстаток) видимо не число, по этому и такая ошибка. Возможно последствия удаления, а может еще что. Надо проверять значения этих переменных.
А база файловая или серверная? У меня есть обработка, которая поднимает документы даже если в 1С 7.7 они были окончательно удалены (если cdx файлы не почистили).
(16) Не в 1С, а файлы скуля, log и mdf, хотя из них не вытащить ничего особого, если на скуле бэкапы не настроены, из журнала транзакций максимум попытаться можно.
Я бы посоветовал, прежде чем что-то делать в таких случаях, скопировать базу в отдельное место.
Прогнать проверкой диска , диск на котором находилась база.
Сделать тестирование и исправление через конфигуратор.
В зависимости от результатов этого уже плясать.
#Область СлужебныйПрограммныйИнтерфейс
// Заполняет массив типов, для которых при выгрузке необходимо использовать аннотацию
// ссылок в файлах выгрузки.
//
// Параметры:
// Типы - Массив(ОбъектМетаданных).
//
Процедура ПриЗаполненииТиповТребующихАннотациюСсылокПриВыгрузке(Типы) Экспорт
ОбъектыСПредопределеннымиЭлементами = ВыгрузкаЗагрузкаПредопределенныхДанныхПовтИсп.ОбъектыМетаданныхСПредопределеннымиЭлементами();
Для Каждого ИмяТипа Из ОбъектыСПредопределеннымиЭлементами Цикл
Если ТребуетсяСопоставлениеСсылокНаПредопределенныеЭлементы(ИмяТипа) Тогда
Типы.Добавить(Метаданные.НайтиПоПолномуИмени(ИмяТипа));
КонецЕсли;
КонецЦикла;
КонецПроцедуры
// Вызывается при регистрации произвольных обработчиков выгрузки данных.
//
// Параметры: ТаблицаОбработчиков - ТаблицаЗначений, в данной процедуре требуется
// дополнить эту таблицу значений информацией о регистрируемых произвольных
// обработчиках выгрузки данных. Колонки:
// ОбъектМетаданных - ОбъектМетаданных, при выгрузке данных которого должен
// вызываться регистрируемый обработчик,
// Обработчик - ОбщийМодуль, общий модуль, в котором реализован произвольный
// обработчик выгрузки данных. Набор экспортных процедур, которые должны
// быть реализованы в обработчике, зависит от установки значений следующих
// колонок таблицы значений,
// Версия - Строка - номер версии интерфейса обработчиков выгрузки / загрузки данных,
// поддерживаемого обработчиком,
// ПередВыгрузкойТипа - Булево, флаг необходимости вызова обработчика перед
// выгрузкой всех объектов информационной базы, относящихся к данному объекту
// метаданных. Если присвоено значение Истина - в общем модуле обработчика должна
// быть реализована экспортируемая процедура ПередВыгрузкойТипа(),
// поддерживающая следующие параметры:
// Контейнер - ОбработкаОбъект.ВыгрузкаЗагрузкаДанныхМенеджерКонтейнера - менеджер
// контейнера, используемый в процессе выгрузи данных. Подробнее см. комментарий
// к программному интерфейсу обработки ВыгрузкаЗагрузкаДанныхМенеджерКонтейнера,
// Сериализатор - СериализаторXDTO, инициализированный с поддержкой выполнения
// аннотации ссылок. В случае, если в произвольном обработчике выгрузки требуется
// выполнять выгрузку дополнительных данных - следует использовать
// СериализаторXDTO, переданный в процедуру ПередВыгрузкойТипа() в качестве
// значения параметра Сериализатор, а не полученных с помощью свойства глобального
// контекста СериализаторXDTO,
// ОбъектМетаданных - ОбъектМетаданных, перед выгрузкой данных которого
// был вызван обработчик,
// Отказ - Булево. Если в процедуре ПередВыгрузкойТипа() установить значение
// данного параметра равным Истина - выгрузка объектов, соответствующих
// текущему объекту метаданных, выполняться не будет.
// ПередВыгрузкойОбъекта - Булево, флаг необходимости вызова обработчика перед
// выгрузкой конкретного объекта информационной базы. Если присвоено значение
// Истина - в общем модуле обработчика должна быть реализована экспортируемая процедура
// ПередВыгрузкойОбъекта(), поддерживающая следующие параметры:
// Контейнер - ОбработкаОбъект.ВыгрузкаЗагрузкаДанныхМенеджерКонтейнера - менеджер
// контейнера, используемый в процессе выгрузи данных. Подробнее см. комментарий
// к программному интерфейсу обработки ВыгрузкаЗагрузкаДанныхМенеджерКонтейнера,
// МенеджерВыгрузкиОбъекта - ОбработкаОбъект.ВыгрузкаЗагрузкаДанныхМенеджерВыгрузкиДанныхИнформационнойБазы -
// менеджер выгрузки текущего объекта. Подробнее см. комментарий к программному интерфейсу обработки
// ВыгрузкаЗагрузкаДанныхМенеджерВыгрузкиДанныхИнформационнойБазы. Параметр передается только при вызове
// процедур обработчиков, для которых при регистрации указана версия не ниже 1.0.0.1,
// Сериализатор - СериализаторXDTO, инициализированный с поддержкой выполнения
// аннотации ссылок. В случае, если в произвольном обработчике выгрузки требуется
// выполнять выгрузку дополнительных данных - следует использовать
// СериализаторXDTO, переданный в процедуру ПередВыгрузкойОбъекта() в качестве
// значения параметра Сериализатор, а не полученных с помощью свойства глобального
// контекста СериализаторXDTO,
// Объект - КонстантаМенеджерЗначения.*, СправочникОбъект.*, ДокументОбъект.*,
// БизнесПроцессОбъект.*, ЗадачаОбъект.*, ПланСчетовОбъект.*, ПланОбменаОбъект.*,
// ПланВидовХарактеристикОбъект.*, ПланВидовРасчетаОбъект.*, РегистрСведенийНаборЗаписей.*,
// РегистрНакопленияНаборЗаписей.*, РегистрБухгалтерииНаборЗаписей.*,
// РегистрРасчетаНаборЗаписей.*, ПоследовательностьНаборЗаписей.*, ПерерасчетНаборЗаписей.* -
// объект данных информационной базы, перед выгрузкой которого был вызван обработчик.
// Значение, переданное в процедуру ПередВыгрузкойОбъекта() в качестве значения параметра
// Объект может быть модифицировано внутри обработчика ПередВыгрузкойОбъекта(), при
// этом внесенные изменения будут отражены в сериализации объекта в файлах выгрузки, но
// не будут зафиксированы в информационной базе
// Артефакты - Массив(ОбъектXDTO) - набор дополнительной информации, логически неразрывно
// связанной с объектом, но не являющейся его частью (артефакты объекта). Артефакты должны
// сформированы внутри обработчика ПередВыгрузкойОбъекта() и добавлены в массив, переданный
// в качестве значения параметра Артефакты. Каждый артефакт должен являться XDTO-объектом,
// для типа которого в качестве базового типа используется абстрактный XDTO-тип
// {http://www.1c.ru/1cFresh/Data/Dump/1.0.2.1}Artefact. Допускается использовать XDTO-пакеты,
// помимо изначально поставляемых в составе подсистемы ВыгрузкаЗагрузкаДанных. В дальнейшем
// артефакты, сформированные в процедуре ПередВыгрузкойОбъекта(), будут доступны в процедурах
// обработчиков загрузки данных (см. комментарий к процедуре ПриРегистрацииОбработчиковЗагрузкиДанных().
// Отказ - Булево. Если в процедуре ПередВыгрузкойОбъекта() установить значение
// данного параметра равным Истина - выгрузка объекта, для которого был вызван обработчик,
// выполняться не будет.
// ПослеВыгрузкиТипа() - Булево, флаг необходимости вызова обработчика после выгрузки всех
// объектов информационной базы, относящихся к данному объекту метаданных. Если присвоено значение
// Истина - в общем модуле обработчика должна быть реализована экспортируемая процедура
// ПослеВыгрузкиТипа(), поддерживающая следующие параметры:
// Контейнер - ОбработкаОбъект.ВыгрузкаЗагрузкаДанныхМенеджерКонтейнера - менеджер
// контейнера, используемый в процессе выгрузи данных. Подробнее см. комментарий
// к программному интерфейсу обработки ВыгрузкаЗагрузкаДанныхМенеджерКонтейнера,
// Сериализатор - СериализаторXDTO, инициализированный с поддержкой выполнения
// аннотации ссылок. В случае, если в произвольном обработчике выгрузки требуется
// выполнять выгрузку дополнительных данных - следует использовать
// СериализаторXDTO, переданный в процедуру ПослеВыгрузкиТипа() в качестве
// значения параметра Сериализатор, а не полученных с помощью свойства глобального
// контекста СериализаторXDTO,
// ОбъектМетаданных - ОбъектМетаданных, после выгрузки данных которого
// был вызван обработчик.
//
Процедура ПриРегистрацииОбработчиковВыгрузкиДанных(ТаблицаОбработчиков) Экспорт
ОбъектыСПредопределеннымиЭлементами = ВыгрузкаЗагрузкаПредопределенныхДанныхПовтИсп.ОбъектыМетаданныхСПредопределеннымиЭлементами();
Для Каждого ИмяОбъектаМетаданных Из ОбъектыСПредопределеннымиЭлементами Цикл
Если ТребуетсяСопоставлениеСсылокНаПредопределенныеЭлементы(ИмяОбъектаМетаданных) Тогда
НовыйОбработчик = ТаблицаОбработчиков.Добавить();
НовыйОбработчик.ОбъектМетаданных = Метаданные.НайтиПоПолномуИмени(ИмяОбъектаМетаданных);
НовыйОбработчик.Обработчик = ВыгрузкаЗагрузкаПредопределенныхДанных;
НовыйОбработчик.ПослеВыгрузкиОбъекта = Истина;
НовыйОбработчик.Версия = ВыгрузкаЗагрузкаДанныхСлужебныйСобытия.ВерсияОбработчиков1_0_0_1();
КонецЕсли;
КонецЦикла;
КонецПроцедуры
Процедура ПослеВыгрузкиОбъекта(Контейнер, МенеджерВыгрузкиОбъекта, Сериализатор, Объект, Артефакты) Экспорт
Если ОбщегоНазначенияБТС.ЭтоСсылочныеДанныеПоддерживающиеПредопределенныеЭлементы(Объект.Метаданные()) Тогда
Если ТребуетсяСопоставлениеСсылокНаПредопределенныеЭлементы(Объект.Метаданные().ПолноеИмя()) Тогда
Если Объект.Предопределенный Тогда
ЕстественныйКлюч = Новый Структура("ИмяПредопределенныхДанных", Объект.ИмяПредопределенныхДанных);
МенеджерВыгрузкиОбъекта.ТребуетсяСопоставитьСсылкуПриЗагрузке(Объект.Ссылка, ЕстественныйКлюч);
КонецЕсли;
Иначе
ВызватьИсключение СтрШаблон(
НСтр("ru = 'Объект метаданных %1 не может быть обработан обработчиком
|ВыгрузкаЗагрузкаПредопределенныхДанных.ПередВыгрузкойОбъекта(),
|т.к. не требуется обеспечивать сопоставление ссылок на его предопределенные элементы!'", Метаданные.ОсновнойЯзык.КодЯзыка),
Объект.Метаданные().ПолноеИмя()
);
КонецЕсли;
Иначе
ВызватьИсключение СтрШаблон(
НСтр("ru = 'Объект метаданных %1 не может быть обработан обработчиком
|ВыгрузкаЗагрузкаПредопределенныхДанных.ПередВыгрузкойОбъекта(),
|т.к. не может содержать предопределенных элементов!'", Метаданные.ОсновнойЯзык.КодЯзыка),
Объект.Метаданные().ПолноеИмя()
);
КонецЕсли;
КонецПроцедуры
Процедура ПередОчисткойДанных(Контейнер) Экспорт
УстановитьИнициализациюПредопределенныхДанныхТекущейОбластиДанных(Контейнер.ПараметрыЗагрузки().ЗагружаемыеТипы);
КонецПроцедуры
Процедура ПриРегистрацииОбработчиковЗагрузкиДанных(ТаблицаОбработчиков) Экспорт
НовыйОбработчик = ТаблицаОбработчиков.Добавить();
НовыйОбработчик.Обработчик = ВыгрузкаЗагрузкаПредопределенныхДанных;
НовыйОбработчик.ПередОчисткойДанных = Истина;
НовыйОбработчик.Версия = ВыгрузкаЗагрузкаДанныхСлужебныйСобытия.ВерсияОбработчиков1_0_0_1();
ОбъектыСПредопределеннымиЭлементами = ВыгрузкаЗагрузкаПредопределенныхДанныхПовтИсп.ОбъектыМетаданныхСПредопределеннымиЭлементами();
Для Каждого ИмяОбъектаМетаданных Из ОбъектыСПредопределеннымиЭлементами Цикл
Если ТребуетсяСопоставлениеСсылокНаПредопределенныеЭлементы(ИмяОбъектаМетаданных) Тогда
НовыйОбработчик = ТаблицаОбработчиков.Добавить();
НовыйОбработчик.ОбъектМетаданных = Метаданные.НайтиПоПолномуИмени(ИмяОбъектаМетаданных);
НовыйОбработчик.Обработчик = ВыгрузкаЗагрузкаПредопределенныхДанных;
НовыйОбработчик.ПередСопоставлениемСсылок = Истина;
НовыйОбработчик.ПередЗагрузкойОбъекта = Истина;
НовыйОбработчик.Версия = ВыгрузкаЗагрузкаДанныхСлужебныйСобытия.ВерсияОбработчиков1_0_0_1();
КонецЕсли;
КонецЦикла;
КонецПроцедуры
Процедура ПередСопоставлениемСсылок(Контейнер, ОбъектМетаданных, ТаблицаИсходныхСсылок, СтандартнаяОбработка, Отказ) Экспорт
Если ОбщегоНазначенияБТС.ЭтоСсылочныеДанныеПоддерживающиеПредопределенныеЭлементы(ОбъектМетаданных)
И ТаблицаИсходныхСсылок.Колонки.Найти("ИмяПредопределенныхДанных") <> Неопределено Тогда
СтандартнаяОбработка = Ложь;
КонецЕсли;
КонецПроцедуры
Функция СопоставитьСсылки(Контейнер, МенеджерСопоставленияСсылок, ТаблицаИсходныхСсылок) Экспорт
ИсходныеСсылкиДляСтандартнойОбработки = Новый ТаблицаЗначений();
Для Каждого Колонка Из ТаблицаИсходныхСсылок.Колонки Цикл
Если Колонка.Имя <> "ИмяПредопределенныхДанных" Тогда
ИсходныеСсылкиДляСтандартнойОбработки.Колонки.Добавить(Колонка.Имя, Колонка.ТипЗначения);
КонецЕсли;
КонецЦикла;
ИмяКолонки = МенеджерСопоставленияСсылок.ИмяКолонкиИсходныхСсылок();
Результат = Новый ТаблицаЗначений();
Результат.Колонки.Добавить(ИмяКолонки, ТаблицаИсходныхСсылок.Колонки.Найти(ИмяКолонки).ТипЗначения);
Результат.Колонки.Добавить("Ссылка", ТаблицаИсходныхСсылок.Колонки.Найти(ИмяКолонки).ТипЗначения);
ОбъектМетаданных = Неопределено;
Для Каждого СтрокаТаблицыИсходныхСсылок Из ТаблицаИсходныхСсылок Цикл
Если ЗначениеЗаполнено(СтрокаТаблицыИсходныхСсылок.ИмяПредопределенныхДанных) Тогда
ТекстЗапроса =
"ВЫБРАТЬ
| Таблица.Ссылка КАК Ссылка
|ИЗ
| " + СтрокаТаблицыИсходныхСсылок[ИмяКолонки].Метаданные().ПолноеИмя() + " КАК Таблица
|ГДЕ
| Таблица.ИмяПредопределенныхДанных = &ИмяПредопределенныхДанных";
Запрос = Новый Запрос(ТекстЗапроса);
Запрос.УстановитьПараметр("ИмяПредопределенныхДанных", СтрокаТаблицыИсходныхСсылок.ИмяПредопределенныхДанных);
РезультатЗапроса = Запрос.Выполнить();
Если Не РезультатЗапроса.Пустой() Тогда
Выборка = РезультатЗапроса.Выбрать();
Если Выборка.Количество() = 1 Тогда
Выборка.Следующий();
СтрокаРезультата = Результат.Добавить();
СтрокаРезультата.Ссылка = Выборка.Ссылка;
СтрокаРезультата[ИмяКолонки] = СтрокаТаблицыИсходныхСсылок[ИмяКолонки];
Иначе
ВызватьИсключение СтрШаблон(
НСтр("ru = 'Обнаружено дублирование предопределенных элементов %1 в таблице %2!'", Метаданные.ОсновнойЯзык.КодЯзыка),
СтрокаТаблицыИсходныхСсылок.ИмяПредопределенныхДанных,
СтрокаТаблицыИсходныхСсылок[ИмяКолонки].Метаданные().ПолноеИмя()
);
КонецЕсли;
КонецЕсли;
Иначе
Если ОбъектМетаданных = Неопределено Тогда
ОбъектМетаданных = СтрокаТаблицыИсходныхСсылок[ИмяКолонки].Метаданные();
КонецЕсли;
СсылкаДляСтандартнойОбработки = ИсходныеСсылкиДляСтандартнойОбработки.Добавить();
ЗаполнитьЗначенияСвойств(СсылкаДляСтандартнойОбработки, СтрокаТаблицыИсходныхСсылок);
КонецЕсли;
КонецЦикла;
Если ИсходныеСсылкиДляСтандартнойОбработки.Количество() > 0 Тогда
Выборка = Обработки.ВыгрузкаЗагрузкаДанныхМенеджерСопоставленияСсылок.ВыборкаСопоставленияСсылок(
ОбъектМетаданных, ИсходныеСсылкиДляСтандартнойОбработки, ИмяКолонки);
Пока Выборка.Следующий() Цикл
СтрокаРезультата = Результат.Добавить();
СтрокаРезультата.Ссылка = Выборка.Ссылка;
СтрокаРезультата[ИмяКолонки] = Выборка[ИмяКолонки];
КонецЦикла;
КонецЕсли;
Возврат Результат;
КонецФункции
Процедура ПередЗагрузкойОбъекта(Контейнер, Объект, Артефакты, Отказ) Экспорт
ОбъектМетаданных = Объект.Метаданные();
Если НЕ ОбщегоНазначенияБТС.ЭтоСсылочныеДанныеПоддерживающиеПредопределенныеЭлементы(ОбъектМетаданных) Тогда
ВызватьИсключение СтрШаблон(
НСтр("ru = 'Объект метаданных %1 не может быть обработан обработчиком
|ВыгрузкаЗагрузкаПредопределенныхДанных.ПередЗагрузкойОбъекта(),
|т.к. не может содержать предопределенных элементов!'", Метаданные.ОсновнойЯзык.КодЯзыка),
Объект.Метаданные().ПолноеИмя()
);
КонецЕсли;
КонецПроцедуры
#КонецОбласти
#Область СлужебныеПроцедурыИФункции
Процедура УстановитьИнициализациюПредопределенныхДанныхТекущейОбластиДанных(ОбъектыМетаданных)
Для Каждого ОбъектМетаданных Из ОбъектыМетаданных Цикл
Если ОбщегоНазначенияБТС.ЭтоСсылочныеДанныеПоддерживающиеПредопределенныеЭлементы(ОбъектМетаданных) Тогда
Если ОбъектМетаданных.ПолучитьИменаПредопределенных().Количество() > 0 Тогда
Менеджер = ОбщегоНазначения.МенеджерОбъектаПоПолномуИмени(ОбъектМетаданных.ПолноеИмя());
Менеджер.УстановитьИнициализациюПредопределенныхДанных(Истина);
КонецЕсли;
КонецЕсли;
КонецЦикла;
КонецПроцедуры
Функция ТребуетсяСопоставлениеСсылокНаПредопределенныеЭлементы(ИмяТипа)
Если ОбщегоНазначенияПовтИсп.ЭтоРазделенныйОбъектМетаданных(ИмяТипа, РаботаВМоделиСервиса.РазделительОсновныхДанных())
ИЛИ ОбщегоНазначенияПовтИсп.ЭтоРазделенныйОбъектМетаданных(ИмяТипа, РаботаВМоделиСервиса.РазделительВспомогательныхДанных()) Тогда
Возврат Ложь;
Иначе
// Для неразделенных объектов сопоставление ссылок на предопределенные элементы требуется всегда.
Возврат Истина;
КонецЕсли;
КонецФункции
#КонецОбласти
#Область СлужебныйПрограммныйИнтерфейс
// Заполняет массив типов, для которых при выгрузке необходимо использовать аннотацию
// ссылок в файлах выгрузки.
//
// Параметры:
// Типы - Массив(ОбъектМетаданных).
//
Процедура ПриЗаполненииТиповТребующихАннотациюСсылокПриВыгрузке(Типы) Экспорт
ОбъектыСПредопределеннымиЭлементами = ВыгрузкаЗагрузкаПредопределенныхДанныхПовтИсп.ОбъектыМетаданныхСПредопределеннымиЭлементами();
Для Каждого ИмяТипа Из ОбъектыСПредопределеннымиЭлементами Цикл
Если ТребуетсяСопоставлениеСсылокНаПредопределенныеЭлементы(ИмяТипа) Тогда
Типы.Добавить(Метаданные.НайтиПоПолномуИмени(ИмяТипа));
КонецЕсли;
КонецЦикла;
КонецПроцедуры
// Вызывается при регистрации произвольных обработчиков выгрузки данных.
//
// Параметры: ТаблицаОбработчиков - ТаблицаЗначений, в данной процедуре требуется
// дополнить эту таблицу значений информацией о регистрируемых произвольных
// обработчиках выгрузки данных. Колонки:
// ОбъектМетаданных - ОбъектМетаданных, при выгрузке данных которого должен
// вызываться регистрируемый обработчик,
// Обработчик - ОбщийМодуль, общий модуль, в котором реализован произвольный
// обработчик выгрузки данных. Набор экспортных процедур, которые должны
// быть реализованы в обработчике, зависит от установки значений следующих
// колонок таблицы значений,
// Версия - Строка - номер версии интерфейса обработчиков выгрузки / загрузки данных,
// поддерживаемого обработчиком,
// ПередВыгрузкойТипа - Булево, флаг необходимости вызова обработчика перед
// выгрузкой всех объектов информационной базы, относящихся к данному объекту
// метаданных. Если присвоено значение Истина - в общем модуле обработчика должна
// быть реализована экспортируемая процедура ПередВыгрузкойТипа(),
// поддерживающая следующие параметры:
// Контейнер - ОбработкаОбъект.ВыгрузкаЗагрузкаДанныхМенеджерКонтейнера - менеджер
// контейнера, используемый в процессе выгрузи данных. Подробнее см. комментарий
// к программному интерфейсу обработки ВыгрузкаЗагрузкаДанныхМенеджерКонтейнера,
// Сериализатор - СериализаторXDTO, инициализированный с поддержкой выполнения
// аннотации ссылок. В случае, если в произвольном обработчике выгрузки требуется
// выполнять выгрузку дополнительных данных - следует использовать
// СериализаторXDTO, переданный в процедуру ПередВыгрузкойТипа() в качестве
// значения параметра Сериализатор, а не полученных с помощью свойства глобального
// контекста СериализаторXDTO,
// ОбъектМетаданных - ОбъектМетаданных, перед выгрузкой данных которого
// был вызван обработчик,
// Отказ - Булево. Если в процедуре ПередВыгрузкойТипа() установить значение
// данного параметра равным Истина - выгрузка объектов, соответствующих
// текущему объекту метаданных, выполняться не будет.
// ПередВыгрузкойОбъекта - Булево, флаг необходимости вызова обработчика перед
// выгрузкой конкретного объекта информационной базы. Если присвоено значение
// Истина - в общем модуле обработчика должна быть реализована экспортируемая процедура
// ПередВыгрузкойОбъекта(), поддерживающая следующие параметры:
// Контейнер - ОбработкаОбъект.ВыгрузкаЗагрузкаДанныхМенеджерКонтейнера - менеджер
// контейнера, используемый в процессе выгрузи данных. Подробнее см. комментарий
// к программному интерфейсу обработки ВыгрузкаЗагрузкаДанныхМенеджерКонтейнера,
// МенеджерВыгрузкиОбъекта - ОбработкаОбъект.ВыгрузкаЗагрузкаДанныхМенеджерВыгрузкиДанныхИнформационнойБазы -
// менеджер выгрузки текущего объекта. Подробнее см. комментарий к программному интерфейсу обработки
// ВыгрузкаЗагрузкаДанныхМенеджерВыгрузкиДанныхИнформационнойБазы. Параметр передается только при вызове
// процедур обработчиков, для которых при регистрации указана версия не ниже 1.0.0.1,
// Сериализатор - СериализаторXDTO, инициализированный с поддержкой выполнения
// аннотации ссылок. В случае, если в произвольном обработчике выгрузки требуется
// выполнять выгрузку дополнительных данных - следует использовать
// СериализаторXDTO, переданный в процедуру ПередВыгрузкойОбъекта() в качестве
// значения параметра Сериализатор, а не полученных с помощью свойства глобального
// контекста СериализаторXDTO,
// Объект - КонстантаМенеджерЗначения.*, СправочникОбъект.*, ДокументОбъект.*,
// БизнесПроцессОбъект.*, ЗадачаОбъект.*, ПланСчетовОбъект.*, ПланОбменаОбъект.*,
// ПланВидовХарактеристикОбъект.*, ПланВидовРасчетаОбъект.*, РегистрСведенийНаборЗаписей.*,
// РегистрНакопленияНаборЗаписей.*, РегистрБухгалтерииНаборЗаписей.*,
// РегистрРасчетаНаборЗаписей.*, ПоследовательностьНаборЗаписей.*, ПерерасчетНаборЗаписей.* -
// объект данных информационной базы, перед выгрузкой которого был вызван обработчик.
// Значение, переданное в процедуру ПередВыгрузкойОбъекта() в качестве значения параметра
// Объект может быть модифицировано внутри обработчика ПередВыгрузкойОбъекта(), при
// этом внесенные изменения будут отражены в сериализации объекта в файлах выгрузки, но
// не будут зафиксированы в информационной базе
// Артефакты - Массив(ОбъектXDTO) - набор дополнительной информации, логически неразрывно
// связанной с объектом, но не являющейся его частью (артефакты объекта). Артефакты должны
// сформированы внутри обработчика ПередВыгрузкойОбъекта() и добавлены в массив, переданный
// в качестве значения параметра Артефакты. Каждый артефакт должен являться XDTO-объектом,
// для типа которого в качестве базового типа используется абстрактный XDTO-тип
// {http://www.1c.ru/1cFresh/Data/Dump/1.0.2.1}Artefact. Допускается использовать XDTO-пакеты,
// помимо изначально поставляемых в составе подсистемы ВыгрузкаЗагрузкаДанных. В дальнейшем
// артефакты, сформированные в процедуре ПередВыгрузкойОбъекта(), будут доступны в процедурах
// обработчиков загрузки данных (см. комментарий к процедуре ПриРегистрацииОбработчиковЗагрузкиДанных().
// Отказ - Булево. Если в процедуре ПередВыгрузкойОбъекта() установить значение
// данного параметра равным Истина - выгрузка объекта, для которого был вызван обработчик,
// выполняться не будет.
// ПослеВыгрузкиТипа() - Булево, флаг необходимости вызова обработчика после выгрузки всех
// объектов информационной базы, относящихся к данному объекту метаданных. Если присвоено значение
// Истина - в общем модуле обработчика должна быть реализована экспортируемая процедура
// ПослеВыгрузкиТипа(), поддерживающая следующие параметры:
// Контейнер - ОбработкаОбъект.ВыгрузкаЗагрузкаДанныхМенеджерКонтейнера - менеджер
// контейнера, используемый в процессе выгрузи данных. Подробнее см. комментарий
// к программному интерфейсу обработки ВыгрузкаЗагрузкаДанныхМенеджерКонтейнера,
// Сериализатор - СериализаторXDTO, инициализированный с поддержкой выполнения
// аннотации ссылок. В случае, если в произвольном обработчике выгрузки требуется
// выполнять выгрузку дополнительных данных - следует использовать
// СериализаторXDTO, переданный в процедуру ПослеВыгрузкиТипа() в качестве
// значения параметра Сериализатор, а не полученных с помощью свойства глобального
// контекста СериализаторXDTO,
// ОбъектМетаданных - ОбъектМетаданных, после выгрузки данных которого
// был вызван обработчик.
//
Процедура ПриРегистрацииОбработчиковВыгрузкиДанных(ТаблицаОбработчиков) Экспорт
ОбъектыСПредопределеннымиЭлементами = ВыгрузкаЗагрузкаПредопределенныхДанныхПовтИсп.ОбъектыМетаданныхСПредопределеннымиЭлементами();
Для Каждого ИмяОбъектаМетаданных Из ОбъектыСПредопределеннымиЭлементами Цикл
Если ТребуетсяСопоставлениеСсылокНаПредопределенныеЭлементы(ИмяОбъектаМетаданных) Тогда
НовыйОбработчик = ТаблицаОбработчиков.Добавить();
НовыйОбработчик.ОбъектМетаданных = Метаданные.НайтиПоПолномуИмени(ИмяОбъектаМетаданных);
НовыйОбработчик.Обработчик = ВыгрузкаЗагрузкаПредопределенныхДанных;
НовыйОбработчик.ПослеВыгрузкиОбъекта = Истина;
НовыйОбработчик.Версия = ВыгрузкаЗагрузкаДанныхСлужебныйСобытия.ВерсияОбработчиков1_0_0_1();
КонецЕсли;
КонецЦикла;
КонецПроцедуры
Процедура ПослеВыгрузкиОбъекта(Контейнер, МенеджерВыгрузкиОбъекта, Сериализатор, Объект, Артефакты) Экспорт
Если ОбщегоНазначенияБТС.ЭтоСсылочныеДанныеПоддерживающиеПредопределенныеЭлементы(Объект.Метаданные()) Тогда
Если ТребуетсяСопоставлениеСсылокНаПредопределенныеЭлементы(Объект.Метаданные().ПолноеИмя()) Тогда
Если Объект.Предопределенный Тогда
ЕстественныйКлюч = Новый Структура("ИмяПредопределенныхДанных", Объект.ИмяПредопределенныхДанных);
МенеджерВыгрузкиОбъекта.ТребуетсяСопоставитьСсылкуПриЗагрузке(Объект.Ссылка, ЕстественныйКлюч);
КонецЕсли;
Иначе
ВызватьИсключение СтрШаблон(
НСтр("ru = 'Объект метаданных %1 не может быть обработан обработчиком
|ВыгрузкаЗагрузкаПредопределенныхДанных.ПередВыгрузкойОбъекта(),
|т.к. не требуется обеспечивать сопоставление ссылок на его предопределенные элементы!'", Метаданные.ОсновнойЯзык.КодЯзыка),
Объект.Метаданные().ПолноеИмя()
);
КонецЕсли;
Иначе
ВызватьИсключение СтрШаблон(
НСтр("ru = 'Объект метаданных %1 не может быть обработан обработчиком
|ВыгрузкаЗагрузкаПредопределенныхДанных.ПередВыгрузкойОбъекта(),
|т.к. не может содержать предопределенных элементов!'", Метаданные.ОсновнойЯзык.КодЯзыка),
Объект.Метаданные().ПолноеИмя()
);
КонецЕсли;
КонецПроцедуры
Процедура ПередОчисткойДанных(Контейнер) Экспорт
УстановитьИнициализациюПредопределенныхДанныхТекущейОбластиДанных(Контейнер.ПараметрыЗагрузки().ЗагружаемыеТипы);
КонецПроцедуры
Процедура ПриРегистрацииОбработчиковЗагрузкиДанных(ТаблицаОбработчиков) Экспорт
НовыйОбработчик = ТаблицаОбработчиков.Добавить();
НовыйОбработчик.Обработчик = ВыгрузкаЗагрузкаПредопределенныхДанных;
НовыйОбработчик.ПередОчисткойДанных = Истина;
НовыйОбработчик.Версия = ВыгрузкаЗагрузкаДанныхСлужебныйСобытия.ВерсияОбработчиков1_0_0_1();
ОбъектыСПредопределеннымиЭлементами = ВыгрузкаЗагрузкаПредопределенныхДанныхПовтИсп.ОбъектыМетаданныхСПредопределеннымиЭлементами();
Для Каждого ИмяОбъектаМетаданных Из ОбъектыСПредопределеннымиЭлементами Цикл
Если ТребуетсяСопоставлениеСсылокНаПредопределенныеЭлементы(ИмяОбъектаМетаданных) Тогда
НовыйОбработчик = ТаблицаОбработчиков.Добавить();
НовыйОбработчик.ОбъектМетаданных = Метаданные.НайтиПоПолномуИмени(ИмяОбъектаМетаданных);
НовыйОбработчик.Обработчик = ВыгрузкаЗагрузкаПредопределенныхДанных;
НовыйОбработчик.ПередСопоставлениемСсылок = Истина;
НовыйОбработчик.ПередЗагрузкойОбъекта = Истина;
НовыйОбработчик.Версия = ВыгрузкаЗагрузкаДанныхСлужебныйСобытия.ВерсияОбработчиков1_0_0_1();
КонецЕсли;
КонецЦикла;
КонецПроцедуры
Процедура ПередСопоставлениемСсылок(Контейнер, ОбъектМетаданных, ТаблицаИсходныхСсылок, СтандартнаяОбработка, Отказ) Экспорт
Если ОбщегоНазначенияБТС.ЭтоСсылочныеДанныеПоддерживающиеПредопределенныеЭлементы(ОбъектМетаданных)
И ТаблицаИсходныхСсылок.Колонки.Найти("ИмяПредопределенныхДанных") <> Неопределено Тогда
СтандартнаяОбработка = Ложь;
КонецЕсли;
КонецПроцедуры
Функция СопоставитьСсылки(Контейнер, МенеджерСопоставленияСсылок, ТаблицаИсходныхСсылок) Экспорт
ИсходныеСсылкиДляСтандартнойОбработки = Новый ТаблицаЗначений();
Для Каждого Колонка Из ТаблицаИсходныхСсылок.Колонки Цикл
Если Колонка.Имя <> "ИмяПредопределенныхДанных" Тогда
ИсходныеСсылкиДляСтандартнойОбработки.Колонки.Добавить(Колонка.Имя, Колонка.ТипЗначения);
КонецЕсли;
КонецЦикла;
ИмяКолонки = МенеджерСопоставленияСсылок.ИмяКолонкиИсходныхСсылок();
Результат = Новый ТаблицаЗначений();
Результат.Колонки.Добавить(ИмяКолонки, ТаблицаИсходныхСсылок.Колонки.Найти(ИмяКолонки).ТипЗначения);
Результат.Колонки.Добавить("Ссылка", ТаблицаИсходныхСсылок.Колонки.Найти(ИмяКолонки).ТипЗначения);
ОбъектМетаданных = Неопределено;
Для Каждого СтрокаТаблицыИсходныхСсылок Из ТаблицаИсходныхСсылок Цикл
Если ЗначениеЗаполнено(СтрокаТаблицыИсходныхСсылок.ИмяПредопределенныхДанных) Тогда
ТекстЗапроса =
"ВЫБРАТЬ
| Таблица.Ссылка КАК Ссылка
|ИЗ
| " + СтрокаТаблицыИсходныхСсылок[ИмяКолонки].Метаданные().ПолноеИмя() + " КАК Таблица
|ГДЕ
| Таблица.ИмяПредопределенныхДанных = &ИмяПредопределенныхДанных";
Запрос = Новый Запрос(ТекстЗапроса);
Запрос.УстановитьПараметр("ИмяПредопределенныхДанных", СтрокаТаблицыИсходныхСсылок.ИмяПредопределенныхДанных);
РезультатЗапроса = Запрос.Выполнить();
Если Не РезультатЗапроса.Пустой() Тогда
Выборка = РезультатЗапроса.Выбрать();
Если Выборка.Количество() = 1 Тогда
Выборка.Следующий();
СтрокаРезультата = Результат.Добавить();
СтрокаРезультата.Ссылка = Выборка.Ссылка;
СтрокаРезультата[ИмяКолонки] = СтрокаТаблицыИсходныхСсылок[ИмяКолонки];
Иначе
ВызватьИсключение СтрШаблон(
НСтр("ru = 'Обнаружено дублирование предопределенных элементов %1 в таблице %2!'", Метаданные.ОсновнойЯзык.КодЯзыка),
СтрокаТаблицыИсходныхСсылок.ИмяПредопределенныхДанных,
СтрокаТаблицыИсходныхСсылок[ИмяКолонки].Метаданные().ПолноеИмя()
);
КонецЕсли;
КонецЕсли;
Иначе
Если ОбъектМетаданных = Неопределено Тогда
ОбъектМетаданных = СтрокаТаблицыИсходныхСсылок[ИмяКолонки].Метаданные();
КонецЕсли;
СсылкаДляСтандартнойОбработки = ИсходныеСсылкиДляСтандартнойОбработки.Добавить();
ЗаполнитьЗначенияСвойств(СсылкаДляСтандартнойОбработки, СтрокаТаблицыИсходныхСсылок);
КонецЕсли;
КонецЦикла;
Если ИсходныеСсылкиДляСтандартнойОбработки.Количество() > 0 Тогда
Выборка = Обработки.ВыгрузкаЗагрузкаДанныхМенеджерСопоставленияСсылок.ВыборкаСопоставленияСсылок(
ОбъектМетаданных, ИсходныеСсылкиДляСтандартнойОбработки, ИмяКолонки);
Пока Выборка.Следующий() Цикл
СтрокаРезультата = Результат.Добавить();
СтрокаРезультата.Ссылка = Выборка.Ссылка;
СтрокаРезультата[ИмяКолонки] = Выборка[ИмяКолонки];
КонецЦикла;
КонецЕсли;
Возврат Результат;
КонецФункции
Процедура ПередЗагрузкойОбъекта(Контейнер, Объект, Артефакты, Отказ) Экспорт
ОбъектМетаданных = Объект.Метаданные();
Если НЕ ОбщегоНазначенияБТС.ЭтоСсылочныеДанныеПоддерживающиеПредопределенныеЭлементы(ОбъектМетаданных) Тогда
ВызватьИсключение СтрШаблон(
НСтр("ru = 'Объект метаданных %1 не может быть обработан обработчиком
|ВыгрузкаЗагрузкаПредопределенныхДанных.ПередЗагрузкойОбъекта(),
|т.к. не может содержать предопределенных элементов!'", Метаданные.ОсновнойЯзык.КодЯзыка),
Объект.Метаданные().ПолноеИмя()
);
КонецЕсли;
КонецПроцедуры
#КонецОбласти
#Область СлужебныеПроцедурыИФункции
Процедура УстановитьИнициализациюПредопределенныхДанныхТекущейОбластиДанных(ОбъектыМетаданных)
Для Каждого ОбъектМетаданных Из ОбъектыМетаданных Цикл
Если ОбщегоНазначенияБТС.ЭтоСсылочныеДанныеПоддерживающиеПредопределенныеЭлементы(ОбъектМетаданных) Тогда
Если ОбъектМетаданных.ПолучитьИменаПредопределенных().Количество() > 0 Тогда
Менеджер = ОбщегоНазначения.МенеджерОбъектаПоПолномуИмени(ОбъектМетаданных.ПолноеИмя());
Менеджер.УстановитьИнициализациюПредопределенныхДанных(Истина);
КонецЕсли;
КонецЕсли;
КонецЦикла;
КонецПроцедуры
Функция ТребуетсяСопоставлениеСсылокНаПредопределенныеЭлементы(ИмяТипа)
Если ОбщегоНазначенияПовтИсп.ЭтоРазделенныйОбъектМетаданных(ИмяТипа, РаботаВМоделиСервиса.РазделительОсновныхДанных())
ИЛИ ОбщегоНазначенияПовтИсп.ЭтоРазделенныйОбъектМетаданных(ИмяТипа, РаботаВМоделиСервиса.РазделительВспомогательныхДанных()) Тогда
Возврат Ложь;
Иначе
// Для неразделенных объектов сопоставление ссылок на предопределенные элементы требуется всегда.
Возврат Истина;
КонецЕсли;
КонецФункции
#КонецОбласти
#Область СлужебныйПрограммныйИнтерфейс
// Заполняет массив типов, для которых при выгрузке необходимо использовать аннотацию
// ссылок в файлах выгрузки.
//
// Параметры:
// Типы - Массив(ОбъектМетаданных).
//
Процедура ПриЗаполненииТиповТребующихАннотациюСсылокПриВыгрузке(Типы) Экспорт
ОбъектыСПредопределеннымиЭлементами = ВыгрузкаЗагрузкаПредопределенныхДанныхПовтИсп.ОбъектыМетаданныхСПредопределеннымиЭлементами();
Для Каждого ИмяТипа Из ОбъектыСПредопределеннымиЭлементами Цикл
Если ТребуетсяСопоставлениеСсылокНаПредопределенныеЭлементы(ИмяТипа) Тогда
Типы.Добавить(Метаданные.НайтиПоПолномуИмени(ИмяТипа));
КонецЕсли;
КонецЦикла;
КонецПроцедуры
// Вызывается при регистрации произвольных обработчиков выгрузки данных.
//
// Параметры: ТаблицаОбработчиков - ТаблицаЗначений, в данной процедуре требуется
// дополнить эту таблицу значений информацией о регистрируемых произвольных
// обработчиках выгрузки данных. Колонки:
// ОбъектМетаданных - ОбъектМетаданных, при выгрузке данных которого должен
// вызываться регистрируемый обработчик,
// Обработчик - ОбщийМодуль, общий модуль, в котором реализован произвольный
// обработчик выгрузки данных. Набор экспортных процедур, которые должны
// быть реализованы в обработчике, зависит от установки значений следующих
// колонок таблицы значений,
// Версия - Строка - номер версии интерфейса обработчиков выгрузки / загрузки данных,
// поддерживаемого обработчиком,
// ПередВыгрузкойТипа - Булево, флаг необходимости вызова обработчика перед
// выгрузкой всех объектов информационной базы, относящихся к данному объекту
// метаданных. Если присвоено значение Истина - в общем модуле обработчика должна
// быть реализована экспортируемая процедура ПередВыгрузкойТипа(),
// поддерживающая следующие параметры:
// Контейнер - ОбработкаОбъект.ВыгрузкаЗагрузкаДанныхМенеджерКонтейнера - менеджер
// контейнера, используемый в процессе выгрузи данных. Подробнее см. комментарий
// к программному интерфейсу обработки ВыгрузкаЗагрузкаДанныхМенеджерКонтейнера,
// Сериализатор - СериализаторXDTO, инициализированный с поддержкой выполнения
// аннотации ссылок. В случае, если в произвольном обработчике выгрузки требуется
// выполнять выгрузку дополнительных данных - следует использовать
// СериализаторXDTO, переданный в процедуру ПередВыгрузкойТипа() в качестве
// значения параметра Сериализатор, а не полученных с помощью свойства глобального
// контекста СериализаторXDTO,
// ОбъектМетаданных - ОбъектМетаданных, перед выгрузкой данных которого
// был вызван обработчик,
// Отказ - Булево. Если в процедуре ПередВыгрузкойТипа() установить значение
// данного параметра равным Истина - выгрузка объектов, соответствующих
// текущему объекту метаданных, выполняться не будет.
// ПередВыгрузкойОбъекта - Булево, флаг необходимости вызова обработчика перед
// выгрузкой конкретного объекта информационной базы. Если присвоено значение
// Истина - в общем модуле обработчика должна быть реализована экспортируемая процедура
// ПередВыгрузкойОбъекта(), поддерживающая следующие параметры:
// Контейнер - ОбработкаОбъект.ВыгрузкаЗагрузкаДанныхМенеджерКонтейнера - менеджер
// контейнера, используемый в процессе выгрузи данных. Подробнее см. комментарий
// к программному интерфейсу обработки ВыгрузкаЗагрузкаДанныхМенеджерКонтейнера,
// МенеджерВыгрузкиОбъекта - ОбработкаОбъект.ВыгрузкаЗагрузкаДанныхМенеджерВыгрузкиДанныхИнформационнойБазы -
// менеджер выгрузки текущего объекта. Подробнее см. комментарий к программному интерфейсу обработки
// ВыгрузкаЗагрузкаДанныхМенеджерВыгрузкиДанныхИнформационнойБазы. Параметр передается только при вызове
// процедур обработчиков, для которых при регистрации указана версия не ниже 1.0.0.1,
// Сериализатор - СериализаторXDTO, инициализированный с поддержкой выполнения
// аннотации ссылок. В случае, если в произвольном обработчике выгрузки требуется
// выполнять выгрузку дополнительных данных - следует использовать
// СериализаторXDTO, переданный в процедуру ПередВыгрузкойОбъекта() в качестве
// значения параметра Сериализатор, а не полученных с помощью свойства глобального
// контекста СериализаторXDTO,
// Объект - КонстантаМенеджерЗначения.*, СправочникОбъект.*, ДокументОбъект.*,
// БизнесПроцессОбъект.*, ЗадачаОбъект.*, ПланСчетовОбъект.*, ПланОбменаОбъект.*,
// ПланВидовХарактеристикОбъект.*, ПланВидовРасчетаОбъект.*, РегистрСведенийНаборЗаписей.*,
// РегистрНакопленияНаборЗаписей.*, РегистрБухгалтерииНаборЗаписей.*,
// РегистрРасчетаНаборЗаписей.*, ПоследовательностьНаборЗаписей.*, ПерерасчетНаборЗаписей.* -
// объект данных информационной базы, перед выгрузкой которого был вызван обработчик.
// Значение, переданное в процедуру ПередВыгрузкойОбъекта() в качестве значения параметра
// Объект может быть модифицировано внутри обработчика ПередВыгрузкойОбъекта(), при
// этом внесенные изменения будут отражены в сериализации объекта в файлах выгрузки, но
// не будут зафиксированы в информационной базе
// Артефакты - Массив(ОбъектXDTO) - набор дополнительной информации, логически неразрывно
// связанной с объектом, но не являющейся его частью (артефакты объекта). Артефакты должны
// сформированы внутри обработчика ПередВыгрузкойОбъекта() и добавлены в массив, переданный
// в качестве значения параметра Артефакты. Каждый артефакт должен являться XDTO-объектом,
// для типа которого в качестве базового типа используется абстрактный XDTO-тип
// {http://www.1c.ru/1cFresh/Data/Dump/1.0.2.1}Artefact. Допускается использовать XDTO-пакеты,
// помимо изначально поставляемых в составе подсистемы ВыгрузкаЗагрузкаДанных. В дальнейшем
// артефакты, сформированные в процедуре ПередВыгрузкойОбъекта(), будут доступны в процедурах
// обработчиков загрузки данных (см. комментарий к процедуре ПриРегистрацииОбработчиковЗагрузкиДанных().
// Отказ - Булево. Если в процедуре ПередВыгрузкойОбъекта() установить значение
// данного параметра равным Истина - выгрузка объекта, для которого был вызван обработчик,
// выполняться не будет.
// ПослеВыгрузкиТипа() - Булево, флаг необходимости вызова обработчика после выгрузки всех
// объектов информационной базы, относящихся к данному объекту метаданных. Если присвоено значение
// Истина - в общем модуле обработчика должна быть реализована экспортируемая процедура
// ПослеВыгрузкиТипа(), поддерживающая следующие параметры:
// Контейнер - ОбработкаОбъект.ВыгрузкаЗагрузкаДанныхМенеджерКонтейнера - менеджер
// контейнера, используемый в процессе выгрузи данных. Подробнее см. комментарий
// к программному интерфейсу обработки ВыгрузкаЗагрузкаДанныхМенеджерКонтейнера,
// Сериализатор - СериализаторXDTO, инициализированный с поддержкой выполнения
// аннотации ссылок. В случае, если в произвольном обработчике выгрузки требуется
// выполнять выгрузку дополнительных данных - следует использовать
// СериализаторXDTO, переданный в процедуру ПослеВыгрузкиТипа() в качестве
// значения параметра Сериализатор, а не полученных с помощью свойства глобального
// контекста СериализаторXDTO,
// ОбъектМетаданных - ОбъектМетаданных, после выгрузки данных которого
// был вызван обработчик.
//
Процедура ПриРегистрацииОбработчиковВыгрузкиДанных(ТаблицаОбработчиков) Экспорт
ОбъектыСПредопределеннымиЭлементами = ВыгрузкаЗагрузкаПредопределенныхДанныхПовтИсп.ОбъектыМетаданныхСПредопределеннымиЭлементами();
Для Каждого ИмяОбъектаМетаданных Из ОбъектыСПредопределеннымиЭлементами Цикл
Если ТребуетсяСопоставлениеСсылокНаПредопределенныеЭлементы(ИмяОбъектаМетаданных) Тогда
НовыйОбработчик = ТаблицаОбработчиков.Добавить();
НовыйОбработчик.ОбъектМетаданных = Метаданные.НайтиПоПолномуИмени(ИмяОбъектаМетаданных);
НовыйОбработчик.Обработчик = ВыгрузкаЗагрузкаПредопределенныхДанных;
НовыйОбработчик.ПослеВыгрузкиОбъекта = Истина;
НовыйОбработчик.Версия = ВыгрузкаЗагрузкаДанныхСлужебныйСобытия.ВерсияОбработчиков1_0_0_1();
КонецЕсли;
КонецЦикла;
КонецПроцедуры
Процедура ПослеВыгрузкиОбъекта(Контейнер, МенеджерВыгрузкиОбъекта, Сериализатор, Объект, Артефакты) Экспорт
Если ОбщегоНазначенияБТС.ЭтоСсылочныеДанныеПоддерживающиеПредопределенныеЭлементы(Объект.Метаданные()) Тогда
Если ТребуетсяСопоставлениеСсылокНаПредопределенныеЭлементы(Объект.Метаданные().ПолноеИмя()) Тогда
Если Объект.Предопределенный Тогда
ЕстественныйКлюч = Новый Структура("ИмяПредопределенныхДанных", Объект.ИмяПредопределенныхДанных);
МенеджерВыгрузкиОбъекта.ТребуетсяСопоставитьСсылкуПриЗагрузке(Объект.Ссылка, ЕстественныйКлюч);
КонецЕсли;
Иначе
ВызватьИсключение СтрШаблон(
НСтр("ru = 'Объект метаданных %1 не может быть обработан обработчиком
|ВыгрузкаЗагрузкаПредопределенныхДанных.ПередВыгрузкойОбъекта(),
|т.к. не требуется обеспечивать сопоставление ссылок на его предопределенные элементы!'", Метаданные.ОсновнойЯзык.КодЯзыка),
Объект.Метаданные().ПолноеИмя()
);
КонецЕсли;
Иначе
ВызватьИсключение СтрШаблон(
НСтр("ru = 'Объект метаданных %1 не может быть обработан обработчиком
|ВыгрузкаЗагрузкаПредопределенныхДанных.ПередВыгрузкойОбъекта(),
|т.к. не может содержать предопределенных элементов!'", Метаданные.ОсновнойЯзык.КодЯзыка),
Объект.Метаданные().ПолноеИмя()
);
КонецЕсли;
КонецПроцедуры
Процедура ПередОчисткойДанных(Контейнер) Экспорт
УстановитьИнициализациюПредопределенныхДанныхТекущейОбластиДанных(Контейнер.ПараметрыЗагрузки().ЗагружаемыеТипы);
КонецПроцедуры
Процедура ПриРегистрацииОбработчиковЗагрузкиДанных(ТаблицаОбработчиков) Экспорт
НовыйОбработчик = ТаблицаОбработчиков.Добавить();
НовыйОбработчик.Обработчик = ВыгрузкаЗагрузкаПредопределенныхДанных;
НовыйОбработчик.ПередОчисткойДанных = Истина;
НовыйОбработчик.Версия = ВыгрузкаЗагрузкаДанныхСлужебныйСобытия.ВерсияОбработчиков1_0_0_1();
ОбъектыСПредопределеннымиЭлементами = ВыгрузкаЗагрузкаПредопределенныхДанныхПовтИсп.ОбъектыМетаданныхСПредопределеннымиЭлементами();
Для Каждого ИмяОбъектаМетаданных Из ОбъектыСПредопределеннымиЭлементами Цикл
Если ТребуетсяСопоставлениеСсылокНаПредопределенныеЭлементы(ИмяОбъектаМетаданных) Тогда
НовыйОбработчик = ТаблицаОбработчиков.Добавить();
НовыйОбработчик.ОбъектМетаданных = Метаданные.НайтиПоПолномуИмени(ИмяОбъектаМетаданных);
НовыйОбработчик.Обработчик = ВыгрузкаЗагрузкаПредопределенныхДанных;
НовыйОбработчик.ПередСопоставлениемСсылок = Истина;
НовыйОбработчик.ПередЗагрузкойОбъекта = Истина;
НовыйОбработчик.Версия = ВыгрузкаЗагрузкаДанныхСлужебныйСобытия.ВерсияОбработчиков1_0_0_1();
КонецЕсли;
КонецЦикла;
КонецПроцедуры
Процедура ПередСопоставлениемСсылок(Контейнер, ОбъектМетаданных, ТаблицаИсходныхСсылок, СтандартнаяОбработка, Отказ) Экспорт
Если ОбщегоНазначенияБТС.ЭтоСсылочныеДанныеПоддерживающиеПредопределенныеЭлементы(ОбъектМетаданных)
И ТаблицаИсходныхСсылок.Колонки.Найти("ИмяПредопределенныхДанных") <> Неопределено Тогда
СтандартнаяОбработка = Ложь;
КонецЕсли;
КонецПроцедуры
Функция СопоставитьСсылки(Контейнер, МенеджерСопоставленияСсылок, ТаблицаИсходныхСсылок) Экспорт
ИсходныеСсылкиДляСтандартнойОбработки = Новый ТаблицаЗначений();
Для Каждого Колонка Из ТаблицаИсходныхСсылок.Колонки Цикл
Если Колонка.Имя <> "ИмяПредопределенныхДанных" Тогда
ИсходныеСсылкиДляСтандартнойОбработки.Колонки.Добавить(Колонка.Имя, Колонка.ТипЗначения);
КонецЕсли;
КонецЦикла;
ИмяКолонки = МенеджерСопоставленияСсылок.ИмяКолонкиИсходныхСсылок();
Результат = Новый ТаблицаЗначений();
Результат.Колонки.Добавить(ИмяКолонки, ТаблицаИсходныхСсылок.Колонки.Найти(ИмяКолонки).ТипЗначения);
Результат.Колонки.Добавить("Ссылка", ТаблицаИсходныхСсылок.Колонки.Найти(ИмяКолонки).ТипЗначения);
ОбъектМетаданных = Неопределено;
Для Каждого СтрокаТаблицыИсходныхСсылок Из ТаблицаИсходныхСсылок Цикл
Если ЗначениеЗаполнено(СтрокаТаблицыИсходныхСсылок.ИмяПредопределенныхДанных) Тогда
ТекстЗапроса =
"ВЫБРАТЬ
| Таблица.Ссылка КАК Ссылка
|ИЗ
| " + СтрокаТаблицыИсходныхСсылок[ИмяКолонки].Метаданные().ПолноеИмя() + " КАК Таблица
|ГДЕ
| Таблица.ИмяПредопределенныхДанных = &ИмяПредопределенныхДанных";
Запрос = Новый Запрос(ТекстЗапроса);
Запрос.УстановитьПараметр("ИмяПредопределенныхДанных", СтрокаТаблицыИсходныхСсылок.ИмяПредопределенныхДанных);
РезультатЗапроса = Запрос.Выполнить();
Если Не РезультатЗапроса.Пустой() Тогда
Выборка = РезультатЗапроса.Выбрать();
Если Выборка.Количество() = 1 Тогда
Выборка.Следующий();
СтрокаРезультата = Результат.Добавить();
СтрокаРезультата.Ссылка = Выборка.Ссылка;
СтрокаРезультата[ИмяКолонки] = СтрокаТаблицыИсходныхСсылок[ИмяКолонки];
Иначе
ВызватьИсключение СтрШаблон(
НСтр("ru = 'Обнаружено дублирование предопределенных элементов %1 в таблице %2!'", Метаданные.ОсновнойЯзык.КодЯзыка),
СтрокаТаблицыИсходныхСсылок.ИмяПредопределенныхДанных,
СтрокаТаблицыИсходныхСсылок[ИмяКолонки].Метаданные().ПолноеИмя()
);
КонецЕсли;
КонецЕсли;
Иначе
Если ОбъектМетаданных = Неопределено Тогда
ОбъектМетаданных = СтрокаТаблицыИсходныхСсылок[ИмяКолонки].Метаданные();
КонецЕсли;
СсылкаДляСтандартнойОбработки = ИсходныеСсылкиДляСтандартнойОбработки.Добавить();
ЗаполнитьЗначенияСвойств(СсылкаДляСтандартнойОбработки, СтрокаТаблицыИсходныхСсылок);
КонецЕсли;
КонецЦикла;
Если ИсходныеСсылкиДляСтандартнойОбработки.Количество() > 0 Тогда
Выборка = Обработки.ВыгрузкаЗагрузкаДанныхМенеджерСопоставленияСсылок.ВыборкаСопоставленияСсылок(
ОбъектМетаданных, ИсходныеСсылкиДляСтандартнойОбработки, ИмяКолонки);
Пока Выборка.Следующий() Цикл
СтрокаРезультата = Результат.Добавить();
СтрокаРезультата.Ссылка = Выборка.Ссылка;
СтрокаРезультата[ИмяКолонки] = Выборка[ИмяКолонки];
КонецЦикла;
КонецЕсли;
Возврат Результат;
КонецФункции
Процедура ПередЗагрузкойОбъекта(Контейнер, Объект, Артефакты, Отказ) Экспорт
ОбъектМетаданных = Объект.Метаданные();
Если НЕ ОбщегоНазначенияБТС.ЭтоСсылочныеДанныеПоддерживающиеПредопределенныеЭлементы(ОбъектМетаданных) Тогда
ВызватьИсключение СтрШаблон(
НСтр("ru = 'Объект метаданных %1 не может быть обработан обработчиком
|ВыгрузкаЗагрузкаПредопределенныхДанных.ПередЗагрузкойОбъекта(),
|т.к. не может содержать предопределенных элементов!'", Метаданные.ОсновнойЯзык.КодЯзыка),
Объект.Метаданные().ПолноеИмя()
);
КонецЕсли;
КонецПроцедуры
#КонецОбласти
#Область СлужебныеПроцедурыИФункции
Процедура УстановитьИнициализациюПредопределенныхДанныхТекущейОбластиДанных(ОбъектыМетаданных)
Для Каждого ОбъектМетаданных Из ОбъектыМетаданных Цикл
Если ОбщегоНазначенияБТС.ЭтоСсылочныеДанныеПоддерживающиеПредопределенныеЭлементы(ОбъектМетаданных) Тогда
Если ОбъектМетаданных.ПолучитьИменаПредопределенных().Количество() > 0 Тогда
Менеджер = ОбщегоНазначения.МенеджерОбъектаПоПолномуИмени(ОбъектМетаданных.ПолноеИмя());
Менеджер.УстановитьИнициализациюПредопределенныхДанных(Истина);
КонецЕсли;
КонецЕсли;
КонецЦикла;
КонецПроцедуры
Функция ТребуетсяСопоставлениеСсылокНаПредопределенныеЭлементы(ИмяТипа)
Если ОбщегоНазначенияПовтИсп.ЭтоРазделенныйОбъектМетаданных(ИмяТипа, РаботаВМоделиСервиса.РазделительОсновныхДанных())
ИЛИ ОбщегоНазначенияПовтИсп.ЭтоРазделенныйОбъектМетаданных(ИмяТипа, РаботаВМоделиСервиса.РазделительВспомогательныхДанных()) Тогда
Возврат Ложь;
Иначе
// Для неразделенных объектов сопоставление ссылок на предопределенные элементы требуется всегда.
Возврат Истина;
КонецЕсли;
КонецФункции
#КонецОбласти
(33) Читайте внимательно.
1) Бэкапов нет и не делали.
2) Если бы было так, то не было бы отрицательных остатков, а так, продажи есть а поступлений нет.
35.
user598655_ilia-bers
18.12.18 10:23 Сейчас в теме
Вообще если не делали упаковку файлов базы то документы никуда из таблиц не делись, они в служебном поле помечены как удаленные. Надо в копии базы открыть файл с документами дбфнавигатором и посмотреть что там поискать по номеру документа. Если документы есть, то можно попробовать написать скрипт который их вернет из небытия.Но дело это муторное каждый файл с документом так надо отработать, потом выгрузить и загрузить базу. Доверия к данным остаткам все равно не будет, так что как уже писали люди выше лучше сделать инвентаризацию и внести остатки в новую УТ. А документы имеет смысл восстановить только расходные Накладные и финансовые доки для информации.
36.
user598655_ilia-bers
18.12.18 10:31 Сейчас в теме
(35) найти название файла например с приходными накладными можно открыв в блокноте файл с раcширением DD и поиском найти имя документа, там будет прописано имя файла. Все операции естественно надо делать на копии. С восстановлением файлов в какой нибудь Р-студио даже время не стоит терять - это просто невозможно.
Большое спасибо! Благодаря обработке Senator_I - мы смогли все вернуть. Сделали кучу копий сначала... Возможно не все файлы вернулись, но большинство, плюс ушла ошибка глобального модуля, из-за которого мы не могли работать.
Я не могу сказать что сейчас все идеально, но до НГ мы доработаем, а на январских праздниках, в затишье, мы будем делать инвентаризацию и вносить все на восьмерку.
Огромное всем спасибо за помощь, считаю проблему решенной)
Я как то ошибся в коде одной обработки (не поставил отбор на владельца штрихкода) и стер ВСЕ штрихкоды... А рез.копия базы была 4х дневной давности. Меня спасло что два из четырех дней были выходными. Но даже в этом случае 300+ кодов пришлось собирать вручную...
был случай > 10 лет назад на 7.7 файловой УТ я сдуру наполовину стер рабочую базу причем в тот момент когда в ней работали спасло наличие рбд и недавний обмен, с тех пор бекапить всё и всегда вошло в привычку
(39) Есть два типа программистов, кто еще не делает бэкапы и кто уже делает. К сожалению, частенько приходится на живых базах вносить изменения, но я так делать не рекомендую.