1С
про нашего любимого желто-красно-синего друга
Столкнулся с необходимостью выгрузить документы из базы 1С Комлексная Автоматизация 8.2 в 1С Бухгалтерию 7.7
Через конвертацию данных оказалось не так просто это осуществить (хотя, надо сказать, это возможно, но быстрее было написать код выгрузки через OLE)
В интернете я нашел только описания работы через OLE, но там не рассматривались все нюансы, поэтому пришлось помучаться.
Мне нужно было выгружать только документы прихода и расхода, но при желании, воспользовавшись данным шаблоном обработки можно дописать выгрузку любых документов.
Для начала подключаемся к базе:
База7 = Новый COMОбъект("V77.Application"); МонопольныйРежимOLE = ""; ЗапускБезЗаставки = 1; Попытка РезультатПодключения = База7.Initialize ( База7.RMTrade , "/d" + ПутьКБазе + " /n" + Пользователь+ " /p" + Пароль + МонопольныйРежимOLE, ?(ЗапускБезЗаставки = 1,"NO_SPLASH_SHOW","")); Сообщить("Подключено!"); Исключение Предупреждение(ОписаниеОшибки()); РезультатПодключения=Ложь; Возврат; КонецПопытки;
Ищем и если не находим, то создаем группу для выгруженной номенклатуры
СпрНомТам=База7.CreateObject("Справочник.Номенклатура"); КодГруппыВЫГРУЖЕНО=СпрНомТам.НайтиПоНаименованию("ВЫГРУЖЕНО",0); Если КодГруппыВЫГРУЖЕНО=0 тогда Сообщить("Не нашел группу ВЫГРУЖЕНО - создаю"); СпрНомТам.НоваяГруппа(); СпрНомТам.Наименование="ВЫГРУЖЕНО"; СпрНомТам.Записать(); КодГруппыВЫГРУЖЕНО=СпрНомТам.НайтиПоНаименованию("ВЫГРУЖЕНО",0); Сообщить(СпрНомТам.Код); иначе Сообщить("Нашел группу ВЫГРУЖЕНО - использую"); Сообщить(СпрНомТам.Код); КонецЕсли;
Получаем список документов из нашей базы 1С8:
Запрос = Новый Запрос; Запрос.Текст = "ВЫБРАТЬ | ПоступлениеТоваровУслуг.Ссылка, | ПоступлениеТоваровУслуг.Номер |ИЗ | Документ.ПоступлениеТоваровУслуг КАК ПоступлениеТоваровУслуг |ГДЕ | ПоступлениеТоваровУслуг.Дата МЕЖДУ &ДатаНач И &ДатаКон | И ПоступлениеТоваровУслуг.Проведен = ИСТИНА"; Запрос.УстановитьПараметр("ДатаНач", НачалоДня(ДатаНач)); Запрос.УстановитьПараметр("ДатаКон", КонецДня(ДатаКон)); Результат = Запрос.Выполнить(); ВыборкаДетальныеЗаписи = Результат.Выбрать();
Проходим по выборке и создаем каждый документ в базе 1С 7.7.
//Создаем ссылку на справочник номенклатуры для поиска товаров СпрНомОле=База7.CreateObject("Справочник.Номенклатура"); //Создаем OLE ссылку на документы ДокОле=База7.CreateObject("Документ.ПоступлениеТоваров"); Пока ВыборкаДетальныеЗаписи.Следующий() Цикл ОлеНомер=Лев(ВыборкаДетальныеЗаписи.Номер,3)+Прав(ВыборкаДетальныеЗаписи.Номер,5); ОлеДата=ВыборкаДетальныеЗаписи.Ссылка.Дата; ДокНайден=ДокОле.НайтиПоНомеру(ОлеНомер,ОлеДата); Если ДокНайден=0 тогда //Тогда создаем в базе ДокОле.Новый(); ДокОле.НомерДок=ОлеНомер; ДокОле.ДатаДок=ВыборкаДетальныеЗаписи.Ссылка.Дата; СпрОле=База7.CreateObject("Справочник.МестаХранения"); // создаем объект справочника базы OLE СпрОле.НайтиПоКоду("00001",0); //Основной склад ДокОле.МестоХранения=СпрОле.ТекущийЭлемент(); // Вот теперь все в порядке //ЗаполнимНоменклатуру Для каждого СтрокаТовара из ВыборкаДетальныеЗаписи.Ссылка.Товары цикл КодВ7="ВГР"+Прав(СтрокаТовара.Номенклатура.Код,8); НашлиНоменклатуру=СпрНомОле.НайтиПоКоду(КодВ7,0); Если НашлиНоменклатуру=0 тогда Сообщить("Не нашел номенклатуру "+СтрокаТовара.Номенклатура.наименование+" - создаю"); СпрНомОле.Новый(); СпрНомОле.Наименование=СтрокаТовара.Номенклатура.наименование; СпрНомОле.Код=КодВ7; СпрНомОле.ТипНоменклатуры=База7.EvalExpr("Перечисление.ТипыНоменклатуры.Товар"); СпрНомОле.Родитель=СпрНомТам.ТекущийЭлемент(); СпрНомОле.Записать(); КонецЕсли; ДокОле.НоваяСтрока(); ДокОле.Товар=СпрНомОле.ТекущийЭлемент(); ДокОле.Количество=СтрокаТовара.Количество; ДокОле.Цена=СтрокаТовара.Цена; ДокОле.Сумма=СтрокаТовара.Сумма; ДокОле.НДС=СтрокаТовара.СуммаНДС; ДокОле.Всего=СтрокаТовара.Сумма; КонецЦикла; ДокОле.Записать(); // запишем документ в базе OLE Если ДокОле.Провести()=0 Тогда Сообщить("Не смогли провести документ! "+ОлеНомер); КонецЕсли; КонецЕсли КонецЦикла;
В итоге обработка ищет и если не находит то создает в справочнике номенклатура группу "ВЫГРУЖЕНО" и в нее запишет всю необходимую номенклатуру с кодами из Базы 1С 8 и префиксом "ВГР".
На всякий случай прикладываю рабочую обработку. Можете скачать и доработать под свои нужды.
Бухгалтеру понадобилась печатная форма МБ-4. МБ-8 в бухгалтерии есть, а МБ-4 на инфостарте лежит платная.
Пришлось сделать.
Пользуйтесь на здоровье.
Известно, что 1С не позволяет выгрузить базу через конфигуратор, если в базе присутствуют пользователи.
С файловым вариантом вопрос решался простым копированием файла данных .1cd
Когда работаешь с SQL сервером такой фокус не проходит.
Но есть очень простое решение:
Нужно в администрировании серверов 1С создать еще одну информационную базу с теми же настройками что и основная но другим именем.
Далее в список баз 1С добавляем новую базу со ссылкой на зеркало.
Заходим в конфигуратор и спокойно выгружаем .dt
Столкнулся со странным глюком 1С. В свойствах формы есть поле "РазрешеноЗакрытиеФормы". Отвечает за наличие крестика в правом верхнем углу формы. Так вот при сравнении и объединении конфигурации это свойство не переносится. Специально проверил несколько раз. Может, конечно, дело в конкретном релизе (У меня 8.2.17.169) - в дальнейшем проверим.