Kuzevich

Kuzevich

Просто памятка :)

Чтобы проверить как себя чувствует сервер защиты 1С Альфа-Авто нужно в браузере набрать:

для 4й версии: [имя сервера]:11998/state

для 5й версии: [имя сервера]:15201

Столкнулся с необходимостью выгрузить документы из базы 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