Используется OLE подключение к базе 7.7.
Это не конечное решение, а набор процедур и функций, упрощающих перенос данных из базы 7.7 в базу 8.2.
Примеры обработок использовались для переноса данных из реальных баз 1С бухгалтерия 7.7. (Общий режим и УСН). Обработки настроены на перенос счетов по которым были остатки в базах. Использовался релиз 1С Бухгалтерия предприятия 1.6.21.6
======================================================
При переносе остатков в базу на PostgreSQL выяснилось, что платформа вылетает с ошибкой при выполнении поиска в справочнике по наименованию.
В обработках, приложенных к публикации, поиск по наименованию используется в процедурах ИмпортДанныхОрганизации, УстановитьРеквизитыВнеоборотныхАктивов, ПолучитьОсновнойСклад и в обработке УСН в процедуре ПолучитьПодразделение.
Пока 1С не исправила эту ошибку следует вместо строки
Эл82 = Справочники.Организации.НайтиПоНаименованию( Наименование );
использовать что то типа
Эл82 = Справочники.Организации.ПустаяСсылка();
Выборка = Справочники.Организации.Выбрать();
Пока Выборка.Следующий() Цикл
Если СокрЛП(Выборка.Наименование) = Наименование Тогда
Эл82 = Выборка.Ссылка;
КонецЕсли;
КонецЦикла;
Хотя это все равно не поможет. Платформа вылетает при попытке интерактивного поиска в справочнике по наименованию.
======================================================
Служебный справочник.
В конфигурации необходимо создать справочник «СоответствиеСправочников».
Длина кода 40, Строка
Длина наименования 80.
Реквизит - Справочник82. СправочникСсылка.
Автонумерация – Ложь. (Нет)
Импорт справочников.
При импорте справочников копируется структура групп, как она задана в базе 7.7. При повторной загрузке данных структура групп не анализируется, проверяется только наличие загружаемого элемента справочника.
Перед тем как импортировать данные следует определить соответствие справочников конфигураций.
Для этого определены две процедуры:
Процедура ДобавитьСоответствиеСправочников( п_ВидСпр77, п_СсылкаСпр82 )
п_ВидСпр77 – вид справочника 7.7 так, как он определен в конфигураторе.
П_ссылкаСпр82 - СправочникМенеджер..
Например:
ДобавитьСоответствиеСправочников( "Сотрудники", Справочники.ФизическиеЛица );
В результате будет создано соответствие с ключем "Сотрудники&ФизическиеЛица". Этот ключ в дальнейшем должен использоваться для импорта данных из справочника Сотрудники 7.7 в справочник ФизическиеЛица 8.2.
Процедура ДобавитьСоответствиеРеквизитов( п_Ключ, п_ИмяРек77, п_ТипРек, п_ИмяРек82, п_КлючФунк = неопределено )
п_Ключ – ключ соответствия справочников.
п_ИмяРек77 – название реквизита (атрибута) справочника 7.7.
п_ТипРек – тип реквизита (см. ниже ).
п_ИмяРек82 - название реквизита справочника 8.2.
п_КлючФунк – ключ соответствия справочника или имя функции.
Параметр функции п_ТипРек может принимать следующие значения:
0 - типы полей число, строка или дата. Значение будет скопировано.
1 - ссылка на элемент справочника. Элемент справочника будет создан, если его нет.
10 - вызывается процедура обработки. Для типов отличных от типов для значения 0 или если типы не совпадают.
11 - вызывается процедура установки владельца справочника.
12 - вызывается процедура установки реквизитов содержащих перекрестные ссылки. Например Контрагенты являются владельцем справочника Договоры, и содержат реквизит ОсновнойДоговор.
Для п_ТипРек = 0 параметр КлючФункция не используется.
Для значения 1 КлючФункция содержит ключ соответствия для справочника.
Для значений 10 и 11 и 12 КлючФункция содержит имя функции обработки. Значения параметров п_ИмяРек77 и п_ИмяРек82 не анализируются и могут быть произвольными.
Например:
Поля имеют тип строка:
ДобавитьСоответствиеРеквизитов( "Сотрудники&ФизическиеЛица", "ИНН", 0, "ИНН" );
Поля имеют тип справочник:
ДобавитьСоответствиеРеквизитов( "Номенклатура&Номенклатура", "ЕдиницаИзмерения", 1, "БазоваяЕдиницаИзмерения", "ЕдиницыИзмерений&КлассификаторЕдиницИзмерения" );
Установка прочих реквизитов справочника:
ДобавитьСоответствиеРеквизитов( "Сотрудники&ФизическиеЛица", "ПрочиеРеквизиты", 10, "", "УстановитьРеквизитыФизЛица" );
Установка владельца справочника:
ДобавитьСоответствиеРеквизитов( "Договоры&ДоговорыКонтрагентов", "УстановкаВладельца", 11, "", "УстановитьВладельцаДоговора" );
Установки реквизитов содержащих перекрестные ссылки:
ДобавитьСоответствиеРеквизитов( "Контрагенты&Контрагенты", "ПрочиеРеквизиты", 12, "", "УстановитьДоговорИСчетКонтрагента" );
При импорте справочников программа анализирует установленное соответствие справочников и реквизитов и выполняет требуемое действие – копирует значение элемента, устанавливает ссылку на элемент справочника ( и создает его, если необходимо ) или вызывает процедуру обработки.
Для процедур типа 10 прототип процедуры имеет следующий вид:
Процедура ИмяПроцедуры( п_Спр77, п_Эл82, п_ИмяРек77, п_ИмяРек82 )
Для процедур типа 11 и 12 прототип процедуры имеет следующий вид:
Процедура ИмяПроцедуры( п_Спр77, п_Эл82 )
где
п_Спр77 – COM ссылка на элемент справочника 7.7.
п_Эл82 – справочник.объект 8.2.
п_ИмяРек77 – название реквизита справочника 7.7 так как оно определено в конфигураторе
п_ИмяРек82 – название реквизита справочника 8.2 так как оно определено в конфигураторе
Например:
Процедура УстановитьРеквизитыФизЛица( п_Спр77, п_Эл82, ИмяРек77, ИмяРек82 )
Если п_Спр77.Пол.Идентификатор() = "Мужской" Тогда
п_Эл82.Пол = Перечисления.ПолФизическихЛиц.Мужской;
Иначе
п_Эл82.Пол = Перечисления.ПолФизическихЛиц.Женский;
КонецЕсли;
КонецПроцедуры
Процедура УстановитьВладельцаДоговора( п_Спр77, п_Эл82 )>
п_Эл82.Владелец = ПолучитьЭлементСправочника82( п_Спр77.Владелец, "Контрагенты", Истина );
КонецПроцедуры
Процедура УстановитьДоговорИСчетКонтрагента( п_Спр77, п_Эл82 )
п_Эл82.ОсновнойДоговорКонтрагента = ПолучитьЭлементСправочника82( п_Спр77.ОсновнойДоговор, "ДоговорыКонтрагентов", Истина );
п_Эл82.ОсновнойБанковскийСчет = ПолучитьЭлементСправочника82( п_Спр77.ОсновнойСчет, "БанковскиеСчета", Истина );
КонецПроцедуры
Для импорта всего справочника определены две процедуры
Процедура ИмпортироватьСправочник( п_Ключ )
и
Процедура ИмпортироватьПодчиненныйСправочник( п_Ключ, п_ВидСпрВладелец77, п_Функ = "" )
где
п_Ключ - ключ соответствия справочников.
п_ВидСпрВладелец77 – вид справочника владельца 7.7 так как он определен в конфигураторе.
п_Функ – имя функции определения необходимости импортировать элемент справочника. Эта функция должна возвращать Истина, если элемент необходимо импортировать или Ложь, в противном случае.
Прототип функции:
Функция ИмяФункции( п_Спр77, п_СпрВладелец77 )
Например:
ИмпортироватьСправочник( "Сотрудники&ФизическиеЛица" );
ИмпортироватьСправочник( "МестаХранения&Склады" );
ИмпортироватьПодчиненныйСправочник( "РасчетныеСчета&БанковскиеСчета", "Контрагенты" );
ИмпортироватьПодчиненныйСправочник( "Договоры&ДоговорыКонтрагентов", "Контрагенты", "ПроверитьНеобходимостьИмпортаДоговора" );
Пример функции определения необходимости импортировать элемент справочника:
Функция ПроверитьНеобходимостьИмпортаДоговора( п_Спр77, п_СпрВладелец77 )Функция импорта элемента справочника это
Если п_Спр77.Наименование = "Без договора (служебный; для платежей без указания договора)" Тогда
Возврат Ложь;
КонецЕсли;
Если ПолучитьКодЭлемента77(п_СпрВладелец77.ОсновнойДоговор) <> ПолучитьКодЭлемента77(п_Спр77.ТекущийЭлемент()) Тогда
Возврат Ложь;
КонецЕсли;
Возврат Истина;
КонецФункции
Функция ПолучитьЭлементСправочника82( п_Спр77, п_ВидСпр82, п_ИзбежатьЗацикливания = ложь )
Где
п_Спр77 – СОМ ссылка на элемент справочника 7.7.
п_ВидСпр82 – вид справочника 8.2. так как он определен в конфигураторе.
ИзбежатьЗацикливания – установленный в Истина используется при получении перекрестных ссылок, для случаев когда элемент справочника еще не записан, и возможен взаимный вызов данной функции при попытке создания элементов справочников, ссылающихся друг на друга.
Например:
п_Эл82.Владелец = ПолучитьЭлементСправочника82( п_Спр77.Владелец, "Контрагенты", Истина );Эта функция создаст элемент справочника, если на найдет его в базе, используя данные по соответствию реквизитов . Поиск наличия элементов осуществляется по вспомогательному справочнику «СоответствиеСправочников».
Импорт остатков по счетам.
Для импорта остатков по счетам определена процедура ИмпортироватьОстаткиПоСчету. Процедура выбирает остатки, согласно переданным параметрам и формирует документ «ВводНачальныхОстатков». Функция автоматически импортирует субконто вида справочник, для которых установлено соответствие. Для субконто других видов следует использовать процедуры обработки.Прототип функции:
Процедура ИмпортироватьОстаткиПоСчету( п_РазделУчета, п_ФункФО, п_Счет82, п_КодСчета77, п_Суб82_1, п_Суб82_2, п_Суб82_3, п_НомерСуб77_1 = Неопределено, п_НомерСуб77_2 = Неопределено, п_НомерСуб77_3 = Неопределено )
где
п_РазделУчета – ПеречислениеСсылка.РазделыУчетаДляВводаОстатков. (значение реквизита документа )
п_ФункФО – имя процедуры импортирования остатков.
п_Счет82 - ПланСчетовСсылка.Хозрасчетный. (Остатки п счету 8.2 ).
п_КодСчета77 – код счета 7.7.
п_Суб82_1, п_Суб82_2, п_Суб82_3 - Характеристика.ВидыСубконтоХозрасчетные (Субконто 8.2.)
п_НомерСуб77_1, п_НомерСуб77_2, п_НомерСуб77_3 – номер субконто 7.7, соответствующий субконто 8.2
или описатель функции обработки значения субконто.
Например:
Импортировать остатки по счету 60.1 (7.7.) -> 60.01 (8.2). Субконто счета 7.7 соответствуют субконто счета 8.2
для импорта используется процедура «СформироватьОстаткиПоПоставщикам»:
ИмпортироватьОстаткиПоСчету( Перечисления.РазделыУчетаДляВводаОстатков.РасчетыСПоставщикамиИПодрядчиками, "СформироватьОстаткиПоПоставщикам",
ПланыСчетов.Хозрасчетный.РасчетыСПоставщиками, "60.1", Справочники.Контрагенты, Справочники.ДоговорыКонтрагентов, Неопределено, 1, 2 );
Импортировать остатки по счету 50.1 (7.7.) -> 50.01 (8.2). Субконто не используются (или отсутствуют)
ИмпортироватьОстаткиПоСчету( Перечисления.РазделыУчетаДляВводаОстатков.ДенежныеСредства, "СформироватьОстаткиПоКассе",
ПланыСчетов.Хозрасчетный.КассаОрганизации, "50.1", Неопределено, Неопределено, Неопределено )
Импортировать остатки по счету 68.1 (7.7.) ->68.01 (8.2). Для получения субконто 7.7 используется функция «Субконто1_68», субконто соответствует первому субконто 8.2.
ИмпортироватьОстаткиПоСчету( Перечисления.РазделыУчетаДляВводаОстатков.РасчетыПоНалогамИСборам, "СформироватьОстаткиПоНалогам",
ПланыСчетов.Хозрасчетный.НДФЛ, "68.1", Неопределено, Неопределено, Неопределено, "1&Субконто1_68" );
Прототип процедуры импортирования остатков:
Процедура ИмяПроцедуры( п_Док, п_Счет82, п_Суб1, п_Суб2, п_Суб3, п_БухИтоги77, п_КолДт, п_СуммаДт, п_КолКт, п_СуммаКт )
где
п_Док - ДокументОбъект. ВводНачальныхОстатков.
п_Счет82 - ПланСчетовСсылка.Хозрасчетный.
п_Суб1, п_Суб2, п_Суб3 – ссылки на субконто 8.2., в зависимости от типа
п_БухИтоги77 – СОМ ссылка на бухгалтерские итоги. Итоги выбираются по субконто.
п_КолДт, п_СуммаДт, п_КолКт, п_СуммаКт – итоги верхнего уровня субконто. Необходимы для вычисления стоимости по счетам без суммового учета, например по складам.
Например:
Процедура СформироватьОстаткиПоПоставщикам( п_Док, п_Счет82, п_Суб1, п_Суб2, п_Суб3, п_БухИтоги77, п_КолДт, п_СуммаДт, п_КолКт, п_СуммаКт )
п_Док.ОтражатьПоСпециальнымРегистрам = ложь;
ТабСтр = п_Док.РасчетыСКонтрагентами.Добавить();
ТабСтр.СчетУчета = п_Счет82;
ТабСтр.Контрагент = п_Суб1;
ТабСтр.ДоговорКонтрагента = п_Суб2;
Если п_Счет82.Код = "60.01" или п_Счет82.Код = "62.02" Тогда
ТабСтр.Сумма = п_БухИтоги77.СНК("С");
Иначе
ТабСтр.Сумма = п_БухИтоги77.СНД("С");
КонецЕсли;
ТабСтр.Документ = ПолучитьДокРасчета();
КонецПроцедуры
Описатель функции обработки значения субконто выглядит так: «НомерСубконт&ИмяФункции».
Прототип функции:
Функция ИмяФункции( п_Суб77, п_БухИтоги77 )
где
п_Суб77 – СОМ ссылка на субконто 7.7 в зависимости от типа субконто 7.7.
п_БухИтоги77 – СОМ ссылка на бухгалтерские итоги. Итоги будут на том уровне на котором находится субконто.
Например:
Функция Субконто1_68( п_Суб77, п_БухИтоги77 )
Возврат ПолучитьВидПлатежаВБюджет( п_Суб77 );
КонецФункции