При попытке доступа к документу "Платежный ордер списание денежных средств" база вылетает с ошибкой.
Ошибка СУБД: Ошибка SQL: Таблица не найдена '_Document151_VT3126' по причине: Ошибка SQL: Таблица не найдена '_Document151_VT3126'
Так же (как выяснилось позже) при получении оборотов за период в целом и по декадам выводились разные цифры.
Обработка переноса данных в идентичную конфигурацию не подошла, из за того, что так же вылетала с ошибкой БД.
Первой мыслью было перенести все документы, кроме битых. Однако ее даже не начал реализовывать, т.к. не хотелось бы бороться с пересортами.
Поэтому решил переносить документы вместе с движениями. Задача не замысловатая. В режиме "Предприятие" открыл обработку MD82Exp.epf. Снял все галки и выгрузил описание метаданных в XML файл
Далее запустил конвертацию данных 2.0 и загрузил метаданные в нее.
Так же создал новую конфигурацию но основе имеющейся конфигурации. Запустил ее, произвел первоначальную настройку. Это нужно для того, что бы на счетах, контролируемых системой была установлена соответствующая аналитика.
Далее все просто. Создал новую конвертацию и с помощью мастера автоматический создал правила конвертации объектов.
Нашел ПКО для документа "Платежный ордер списание денежных средств" и событии выгрузки "ПередВыгрузкой" написал два слова:
Отказ = Истина;
Так же с помощью мастера создал правила выгрузки данных.
Пришло время "испорченных" документов. Дело в том, что получить доступ к оборотам по счету я мог, и они включали движения документов, таблица которого повреждена. Поэтому я решил вытащить эти обороты из ОСВ. Для этого в настройках правил обмена на закладе "Алгоритмы/Запросы" создал новый запрос с именем БУ
ВЫБРАТЬ НАЧАЛОПЕРИОДА(БУ.Период, ДЕНЬ) КАК Дата, ИСТИНА КАК Активность, БУ.СчетДт, БУ.СчетКт, БУ.СубконтоДт1, БУ.СубконтоДт2, БУ.СубконтоДт3, БУ.СубконтоКт1, БУ.СубконтоКт2, БУ.СубконтоКт3, БУ.Организация, БУ.ВалютаДт, БУ.ВалютаКт, БУ.СтруктурноеПодразделениеДт, БУ.СтруктурноеПодразделениеКт, БУ.СуммаОборот КАК Сумма, БУ.ВалютнаяСуммаОборотДт КАК ВалютнаяСуммаДт, БУ.ВалютнаяСуммаОборотКт КАК ВалютнаяСуммаКт, БУ.КоличествоОборотДт КАК КоличествоДт, БУ.КоличествоОборотКт КАК КоличествоКт ИЗ РегистрБухгалтерии.Типовой.ОборотыДтКт(, , Регистратор, , , СчетКт = ЗНАЧЕНИЕ(ПланСчетов.Типовой.ДенежныеСредстваНаТекущихБанковскихСчетах), , ) КАК БУ ГДЕ ТИПЗНАЧЕНИЯ(БУ.Регистратор) = ТИП(Документ.ПлатежныйОрдерСписаниеДенежныхСредств) УПОРЯДОЧИТЬ ПО БУ.Период
т.е. "вытащил" все проводки документа "ПлатежныйОрдерСписаниеДенежныхСредств". Периодичность "Регистратор" нужна для того, что бы можно было поставить отбор на его тип. Аналогично создал запрос НУ, который получает данные из налогового учета.
ВЫБРАТЬ НАЧАЛОПЕРИОДА(НУ.Период, ДЕНЬ) КАК Дата, ИСТИНА КАК Активность, НУ.СчетДт КАК СчетДт, НУ.СчетКт КАК СчетКт, НУ.СубконтоДт1 КАК СубконтоДт1, НУ.СубконтоДт2 КАК СубконтоДт2, НУ.СубконтоДт3 КАК СубконтоДт3, НУ.СубконтоКт1 КАК СубконтоКт1, НУ.СубконтоКт2 КАК СубконтоКт2, НУ.СубконтоКт3 КАК СубконтоКт3, НУ.Организация КАК Организация, НУ.ВидУчетаДт, НУ.ВидУчетаКт, НУ.СтруктурноеПодразделениеДт КАК СтруктурноеПодразделениеДт, НУ.СтруктурноеПодразделениеКт КАК СтруктурноеПодразделениеКт, НУ.СуммаОборот КАК Сумма, НУ.КоличествоОборотДт КАК КоличествоДт, НУ.КоличествоОборотКт КАК КоличествоКт ИЗ РегистрБухгалтерии.Налоговый.ОборотыДтКт(, , Регистратор, , , СчетКт = ЗНАЧЕНИЕ(ПланСчетов.Налоговый.ДенежныеСредстваВКассеИНаРасчетныхСчетах), , ) КАК НУ ГДЕ ТИПЗНАЧЕНИЯ(НУ.Регистратор) = ТИП(Документ.ПлатежныйОрдерСписаниеДенежныхСредств) УПОРЯДОЧИТЬ ПО НУ.Период
Создал новое ПКО, где объект источник -- пустое значение, а объект приемник -- документ ОперацияБух. Назвал его ОперацияБухПО. Правила конвертации свойств для него так же заполнил автоматически. Создал в ручную ПравилоВыгрузкиДанных со следующими настройками Объект выборки: Не указан Способ выборки: Произвольный алгоритм Правило конвертации: ОперацияБухПО.
Организация = УправлениеПользователями.ПолучитьЗначениеПоУмолчанию(глТекущийПользователь, "ОсновнаяОрганизация"); БУ = Запросы.БУ.Выполнить().Выгрузить(); НУ = Запросы.НУ.Выполнить().Выгрузить(); Операции = БУ.Скопировать(,"Дата"); Операции.Свернуть("Дата"); Операции.Колонки.Добавить("Номер"); Операции.Колонки.Добавить("ПометкаУдаления"); Операции.Колонки.Добавить("Организация"); Операции.Колонки.Добавить("Автор"); Операции.Колонки.Добавить("Комментарий"); Операции.Колонки.Добавить("Ответственный"); Операции.Колонки.Добавить("Содержание"); Операции.Колонки.Добавить("СтруктурноеПодразделение"); Операции.Колонки.Добавить("ТиповаяОперация"); Операции.Колонки.Добавить("СуммаОперации"); Операции.Колонки.Добавить("Типовой"); Операции.Колонки.Добавить("Налоговый"); Операции.Колонки.Добавить("ЗапрашиваемыеПараметры"); Типовой = Неопределено; Налоговый = Неопределено; ЗапрашиваемыеПараметры = Неопределено; Выполнить(Алгоритмы.ПодготовитьТаблицыПроводок); Год = 0; СЦ = 0; Для Каждого Операция ИЗ Операции Цикл Если Год <> Год(Операция.Дата) Тогда Год = Год(Операция.Дата);СЦ = 0; КонецЕсли; СЦ = СЦ+1; Операция.Номер = ПривестиНомерКДлине(Строка(СЦ),11,,"ПО-"); Операция.ПометкаУдаления = ЛОЖЬ; Операция.ТиповаяОперация = Справочники.ТиповыеОперации.ПустаяСсылка(); Операция.Организация = Организация; Операция.Комментарий = "Перенос проводок списания денежных средств за "+Формат(Операция.Дата,"ДФ='dd MMMM yyyy'"); Операция.Автор = глТекущийПользователь; Операция.Ответственный = глТекущийПользователь; Операция.Содержание = Операция.Комментарий; // Операция.Типовой = Типовой.СкопироватьКолонки(); Операция.Налоговый = Налоговый.СкопироватьКолонки(); Операция.ЗапрашиваемыеПараметры = ЗапрашиваемыеПараметры.СкопироватьКолонки(); Строки = БУ.НайтиСтроки(Новый Структура("Дата", Операция.Дата)); СуммаОперации = 0; ТЧ = Операция.Типовой; Выполнить(Алгоритмы.ПолучитьПроводки); Операция.СуммаОперации = СуммаОперации; Строки = НУ.НайтиСтроки(Новый Структура("Дата", Операция.Дата)); ТЧ = Операция.Налоговый; Выполнить(Алгоритмы.ПолучитьПроводки); КонецЦикла; ВыборкаДанных = Операции;
Что бы не плодить кучу документов сделал так, что бы обороты содились по дням, в независимости от того, сколько за этот день было фактические документов, создается одна операция.
В модуле, для сокращения его размера (и повышения читабельности) создание служебных таблиц вынес в алгоритмы. ПодготовитьТаблицыПроводок и ПолучитьПроводки
//ПодготовитьТаблицыПроводок Типовой = Новый ТаблицаЗначений; Типовой.Колонки.Добавить("Активность"); Типовой.Колонки.Добавить("ВалютаДт"); Типовой.Колонки.Добавить("ВалютаКт"); Типовой.Колонки.Добавить("ВалютнаяСуммаДт"); Типовой.Колонки.Добавить("ВалютнаяСуммаКт"); Типовой.Колонки.Добавить("ВидРегламентнойОперации"); Типовой.Колонки.Добавить("КоличествоДт"); Типовой.Колонки.Добавить("КоличествоКт"); Типовой.Колонки.Добавить("НомерЖурнала"); Типовой.Колонки.Добавить("Организация"); Типовой.Колонки.Добавить("Период"); Типовой.Колонки.Добавить("Регистратор"); Типовой.Колонки.Добавить("Содержание"); Типовой.Колонки.Добавить("СтруктурноеПодразделениеДт"); Типовой.Колонки.Добавить("СтруктурноеПодразделениеКт"); Типовой.Колонки.Добавить("СубконтоДт"); Типовой.Колонки.Добавить("СубконтоКт"); Типовой.Колонки.Добавить("Сумма"); Типовой.Колонки.Добавить("СчетДт"); Типовой.Колонки.Добавить("СчетКт"); Налоговый = Новый ТаблицаЗначений; Налоговый.Колонки.Добавить("Активность"); Налоговый.Колонки.Добавить("ВидРегламентнойОперации"); Налоговый.Колонки.Добавить("ВидУчетаДт"); Налоговый.Колонки.Добавить("ВидУчетаКт"); Налоговый.Колонки.Добавить("КоличествоДт"); Налоговый.Колонки.Добавить("КоличествоКт"); Налоговый.Колонки.Добавить("НомерЖурнала"); Налоговый.Колонки.Добавить("Организация"); Налоговый.Колонки.Добавить("Период"); Налоговый.Колонки.Добавить("Регистратор"); Налоговый.Колонки.Добавить("Содержание"); Налоговый.Колонки.Добавить("СтруктурноеПодразделениеДт"); Налоговый.Колонки.Добавить("СтруктурноеПодразделениеКт"); Налоговый.Колонки.Добавить("СубконтоДт"); Налоговый.Колонки.Добавить("СубконтоКт"); Налоговый.Колонки.Добавить("Сумма"); Налоговый.Колонки.Добавить("СчетДт"); Налоговый.Колонки.Добавить("СчетКт"); ЗапрашиваемыеПараметры = Новый ТаблицаЗначений; ЗапрашиваемыеПараметры.Колонки.Добавить("Значение"); ЗапрашиваемыеПараметры.Колонки.Добавить("Имя"); ЗапрашиваемыеПараметры.Колонки.Добавить("Представление");
//ПолучитьПроводки Для Каждого Проводка ИЗ Строки Цикл СуммаОперации = СуммаОперации + Проводка.Сумма; стрТЧ = ТЧ.Добавить(); ЗаполнитьЗначенияСвойств(стрТЧ, Проводка); стрТЧ.Период = КонецДня(Проводка.Дата); стрТЧ.СубконтоДт = Новый Соответствие; Если Проводка.СчетДт.ВидыСубконто.Количество() > 0 Тогда стрТЧ.СубконтоДт.Вставить(Проводка.СчетДт.ВидыСубконто[0].ВидСубконто, Проводка.СубконтоДт1); КонецЕсли; Если Проводка.СчетДт.ВидыСубконто.Количество() > 1 Тогда стрТЧ.СубконтоДт.Вставить(Проводка.СчетДт.ВидыСубконто[1].ВидСубконто, Проводка.СубконтоДт2); КонецЕсли; Если Проводка.СчетДт.ВидыСубконто.Количество() > 2 Тогда стрТЧ.СубконтоДт.Вставить(Проводка.СчетДт.ВидыСубконто[2].ВидСубконто, Проводка.СубконтоДт3); КонецЕсли; стрТЧ.СубконтоКт = Новый Соответствие; Если Проводка.СчетКт.ВидыСубконто.Количество() > 0 Тогда стрТЧ.СубконтоКт.Вставить(Проводка.СчетКт.ВидыСубконто[0].ВидСубконто, Проводка.СубконтоКт1); КонецЕсли; Если Проводка.СчетКт.ВидыСубконто.Количество() > 1 Тогда стрТЧ.СубконтоКт.Вставить(Проводка.СчетКт.ВидыСубконто[1].ВидСубконто, Проводка.СубконтоКт2); КонецЕсли; Если Проводка.СчетКт.ВидыСубконто.Количество() > 2 Тогда стрТЧ.СубконтоКт.Вставить(Проводка.СчетКт.ВидыСубконто[2].ВидСубконто, Проводка.СубконтоКт3); КонецЕсли; КонецЦикла;
Алгоритм "ПодготовитьТаблицыПроводок" просто создает нужные ТЗ.
Алгоритм "ПолучитьПроводки" заполняет аналитику.
На этом, мне казалось, что все. Сохранил правила обмена. Выгрузил данные из битой конфы, загрузил в новую. Все прошло без ошибок.
Но тут меня ждал сюрприз с таблицами итогов. По видимому они тоже повредились, что привело к расхождению данных за период с разным видом оборотов.
По согласованию с заказчиком было решено перенести лишь входящие остатки на начало года. Для этого создал новый запрос ОСВ_БУ
ВЫБРАТЬ &ДатаОкончания КАК Дата, БУ.Счет КАК Счет, ИСТИНА КАК Активность, ВЫБОР КОГДА БУ.Счет.Вид = &Активный ТОГДА БУ.Счет ИНАЧЕ &Счет0 КОНЕЦ КАК СчетДт, ВЫБОР КОГДА БУ.Счет.Вид = &Пассивный ТОГДА БУ.Счет ИНАЧЕ &Счет0 КОНЕЦ КАК СчетКт, ВЫБОР КОГДА БУ.Счет.Вид = &Активный ТОГДА БУ.Субконто1 ИНАЧЕ NULL КОНЕЦ КАК СубконтоДт1, ВЫБОР КОГДА БУ.Счет.Вид = &Активный ТОГДА БУ.Субконто2 ИНАЧЕ NULL КОНЕЦ КАК СубконтоДт2, ВЫБОР КОГДА БУ.Счет.Вид = &Активный ТОГДА БУ.Субконто3 ИНАЧЕ NULL КОНЕЦ КАК СубконтоДт3, ВЫБОР КОГДА БУ.Счет.Вид = &Пассивный ТОГДА БУ.Субконто1 ИНАЧЕ NULL КОНЕЦ КАК СубконтоКт1, ВЫБОР КОГДА БУ.Счет.Вид = &Пассивный ТОГДА БУ.Субконто2 ИНАЧЕ NULL КОНЕЦ КАК СубконтоКт2, ВЫБОР КОГДА БУ.Счет.Вид = &Пассивный ТОГДА БУ.Субконто3 ИНАЧЕ NULL КОНЕЦ КАК СубконтоКт3, ВЫБОР КОГДА БУ.Счет.Вид = &Активный ТОГДА БУ.Валюта ИНАЧЕ NULL КОНЕЦ КАК ВалютаДт, ВЫБОР КОГДА БУ.Счет.Вид = &Пассивный ТОГДА БУ.Валюта ИНАЧЕ NULL КОНЕЦ КАК ВалютаКт, ВЫБОР КОГДА БУ.Счет.Вид = &Активный ТОГДА БУ.СуммаОстатокДт ИНАЧЕ БУ.СуммаОстатокКт КОНЕЦ КАК Сумма, БУ.Организация, БУ.СтруктурноеПодразделение КАК СтруктурноеПодразделениеДт, БУ.СтруктурноеПодразделение КАК СтруктурноеПодразделениеКт, БУ.ВалютнаяСуммаОстатокДт КАК ВалютнаяСуммаДт, БУ.ВалютнаяСуммаОстатокКт КАК ВалютнаяСуммаКт, БУ.КоличествоОстатокДт КАК КоличествоДт, БУ.КоличествоОстатокКт КАК КоличествоКт ИЗ РегистрБухгалтерии.Типовой.Остатки(&ДатаОкончания, , , ) КАК БУ УПОРЯДОЧИТЬ ПО БУ.Счет.Код
который получает остатки по всем счетам. Создал правило правило выгрузки данных "Перенос ОСВ", так же по произвольному алгоритму. И указал для него следующий текст.
Организация = УправлениеПользователями.ПолучитьЗначениеПоУмолчанию(глТекущийПользователь, "ОсновнаяОрганизация"); Запросы.ОСВ_БУ.УстановитьПараметр("ДатаОкончания", ДатаОкончания); Запросы.ОСВ_БУ.УстановитьПараметр("Счет0", ПланыСчетов.Типовой.Вспомогательный); Запросы.ОСВ_БУ.УстановитьПараметр("Активный", ВидСчета.Активный); Запросы.ОСВ_БУ.УстановитьПараметр("Пассивный", ВидСчета.Пассивный); БУ = Запросы.ОСВ_БУ.Выполнить().Выгрузить(); Операции = БУ.Скопировать(,"Счет"); Операции.Свернуть("Счет"); Операции.Колонки.Добавить("Дата"); Операции.Колонки.Добавить("Номер"); Операции.Колонки.Добавить("ПометкаУдаления"); Операции.Колонки.Добавить("Организация"); Операции.Колонки.Добавить("Автор"); Операции.Колонки.Добавить("Комментарий"); Операции.Колонки.Добавить("Ответственный"); Операции.Колонки.Добавить("Содержание"); Операции.Колонки.Добавить("СтруктурноеПодразделение"); Операции.Колонки.Добавить("ТиповаяОперация"); Операции.Колонки.Добавить("СуммаОперации"); Операции.Колонки.Добавить("Типовой"); Операции.Колонки.Добавить("Налоговый"); Операции.Колонки.Добавить("ЗапрашиваемыеПараметры"); Типовой = Неопределено; Налоговый = Неопределено; ЗапрашиваемыеПараметры = Неопределено; Выполнить(Алгоритмы.ПодготовитьТаблицыПроводок); СЦ = 0; Для Каждого Операция ИЗ Операции Цикл СЦ = СЦ + 1; Операция.Номер = ПривестиНомерКДлине(Строка(СЦ),11,,"ОСВ-"); Операция.Дата = ДатаОкончания; Операция.ПометкаУдаления = ЛОЖЬ; Операция.ТиповаяОперация = Справочники.ТиповыеОперации.ПустаяСсылка(); Операция.Организация = Организация; Операция.Автор = глТекущийПользователь; Операция.Комментарий = "Перенос остатов по счету БУ "+Операция.Счет; Операция.Содержание = Операция.Комментарий; Операция.Типовой = Типовой.СкопироватьКолонки(); Операция.Налоговый = Налоговый.СкопироватьКолонки(); Операция.ЗапрашиваемыеПараметры = ЗапрашиваемыеПараметры.СкопироватьКолонки(); Строки = БУ.НайтиСтроки(Новый Структура("Счет", Операция.Счет)); ТЧ = Операция.Типовой; СуммаОперации = 0; Выполнить(Алгоритмы.ПолучитьПроводки); Операция.СуммаОперации = СуммаОперации; КонецЦикла; ВыборкаДанных = Операции;
После этого данные бух. учета у меня сели нормально.
Остались регистры накопления. Начну с правила выгрузки данных. т.к. ПКО зависит него. Назвал его "ОстаткиРегистрыНакопления". Они так же выгружаются по произвольному алгоритму Событие "ПередВыгрузкой" содержит следующий код:
ВыборкаДанных = Новый ТаблицаЗначений; ВыборкаДанных.Колонки.Добавить("Автор"); ВыборкаДанных.Колонки.Добавить("Комментарий"); ВыборкаДанных.Колонки.Добавить("Организация"); ВыборкаДанных.Колонки.Добавить("Ответственный"); ВыборкаДанных.Колонки.Добавить("Дата"); ВыборкаДанных.Колонки.Добавить("Номер"); ВыборкаДанных.Колонки.Добавить("ТаблицаРегистровНакопления"); Запрос = Новый Запрос; Имена = Новый Структура; Запрос.УстановитьПараметр("Дата", ДатаОкончания+1); Для Каждого Рег ИЗ Метаданные.РегистрыНакопления Цикл Если Рег.ВидРегистра = Метаданные.СвойстваОбъектов.ВидРегистраНакопления.Обороты Тогда Продолжить; КонецЕсли; Запрос.Текст = "ВЫБРАТЬ * ИЗ РегистрНакопления."+Рег.Имя+".Остатки(&Дата)"; Результат = Запрос.Выполнить(); Если НЕ Результат.Пустой() Тогда Поля = ""; Для Каждого Изм ИЗ Рег.Измерения Цикл Поля = Поля + Изм.Имя+","; КонецЦикла; Для Каждого Рес ИЗ Рег.Ресурсы Цикл Поля = Поля + Рес.Имя+"Остаток КАК "+Рес.Имя+","; КонецЦикла; Поля = Лев(Поля,СтрДлина(Поля)-1); Имена.Вставить(Рег.Имя,Поля); ВыборкаДанных.Колонки.Добавить(Рег.Имя); КонецЕсли; КонецЦикла; Стр = ВыборкаДанных.Добавить(); Стр.ТаблицаРегистровНакопления = Новый ТаблицаЗначений; Стр.ТаблицаРегистровНакопления.Колонки.Добавить("Имя"); Стр.ТаблицаРегистровНакопления.Колонки.Добавить("Представление"); Для Каждого КиЗ ИЗ Имена Цикл сРг = Стр.ТаблицаРегистровНакопления.Добавить(); сРг.Имя = КиЗ.Ключ; сРг.Представление = Метаданные.РегистрыНакопления[КиЗ.Ключ].Синоним; Запрос.Текст = "ВЫБРАТЬ ИСТИНА КАК Активность, |"+КиЗ.Значение+" |ИЗ РегистрНакопления."+КиЗ.Ключ+".Остатки(&Дата)"; Стр[Киз.Ключ] = Запрос.Выполнить().Выгрузить(); Стр[Киз.Ключ].Колонки.Добавить("ВидДвижения"); Стр[Киз.Ключ].Колонки.Добавить("Период"); Стр[Киз.Ключ].Колонки.Добавить("Регистратор"); Стр[Киз.Ключ].ЗаполнитьЗначения(ВидДвиженияНакопления.Приход,"ВидДвижения"); Стр[Киз.Ключ].ЗаполнитьЗначения(ДатаОкончания,"Период"); КонецЦикла; Стр.Номер = "ОР-00000001"; Стр.Дата = ДатаОкончания; Стр.Автор = глТекущийПользователь; Стр.Организация = УправлениеПользователями.ПолучитьЗначениеПоУмолчанию(глТекущийПользователь,"ОсновнаяОрганизация"); Стр.Комментарий = "Перенос остатков регистров накопления"; Стр.Ответственный = глТекущийПользователь;
т.е. у меня выгружаются только те регистры, которые имеют остатки.
Проверил в режиме "предприятие" эту обработку, и посмотрел, какие регистры имеют остатки. Создал ПКО для документ "КорректировкаЗаписейРегистров". В нем объект источник так же не указан.
В правила конвертации свойств добавил только те таблицы, которые мне нужны. При настройке ПКС для регистров необходимо снять галочки с реквизитов. т.к. по ним мы в любом случае не получим остатки, соответственно их переносить не нужно. Получилось вот такая картина На этом настройка закончилась, перенос данных отработал и все жили долго и счастливо :) А базы настроили на регулярную резервную архивацию на дисках, не связанных с диском БД!!!