Интеграция с 1С 7.7 Бухгалтерия (записки с фронта). - 1Cv7 ВСД в ГИС Меркурий - КБ99 Redmine

Проект

Общее

Профиль

Интеграция с 1С 7.7 Бухгалтерия (записки с фронта).

Добавил(а) Анисимов Михаил больше 6 лет назад

Если кому то будет интересно то могу выкладывать проблемы и решения с которыми я столкнулся или столкнусь при интеграции данного продукта с не комплексной конфигурацией.

Вводные:
1) УС на базе 1С 7.7 Бухгалтерия
2) Уже давно реализован партионный учет материалов, товаров, готовой продукции, полуфабрикатов. То есть в системе есть полная прослеживаемость что-куда.
3) Есть входное сырье которое идет с ВСД.
4) Мы производственная компания. Половина нашей продукции подлежит ВСД (кормовые добавки).
5) У нас есть агентские договора на реализацию нашей продукции через представителей.


Ответы (51)

RE: Интеграция с 1С 7.7 Бухгалтерия (записки с фронта). - Добавил(а) кб99 Синявский Филипп больше 6 лет назад

Михаил, вы не даете расслабиться ;))

1) Необходимо сделать дополнительные функции:

ок, добавлю

2) Можно в обработках оставить определение и запуск дополнительного интеграционного модуля (чтобы не приходилось каждый раз при обновлении раскоментировать строчки кода по активации доп модуля), и в базовой (в вашем) варианте убрать оттуда все >переопределяемые функции (файл приложен, щас он просто пустышка, никаких функций не выполняет).

так ведь если функция в классе определена, тогда выполнение перейдет на эту переопределенную функцию
Это может запутать, особенно на начальном этапе, и сильно осложнить понимание работы модуля.
Предлагаю всё же оставить в комментариях - думаю снять 2 строки комментария не составит сложности...

3) Функционал по обмену ВСД планируется переносить в класс? Просто есть две обработки (обмен и групповая обработка) с дублированием функций по отправке/приему.

в классе Меркурий_ГлобальныйМодуль будут только общие функции, за прием и отправку ВСД отвечает Меркурий_Обмен_тест.ert

RE: Интеграция с 1С 7.7 Бухгалтерия (записки с фронта). - Добавил(а) кб99 Синявский Филипп больше 6 лет назад

Михаил, спасибо!
Внес ваши изменения.
Надеюсь в таком виде будет всех устраивать...

RE: Интеграция с 1С 7.7 Бухгалтерия (записки с фронта). - Добавил(а) Анисимов Михаил больше 6 лет назад

Филипп, спасибо!!!

Ну звпуск меркурия в обязаловку на носу! У нас по региону это 01.12.2017, так что ситуация обязывает )))

Просто определение функции в классе - не ведет к ее переопределению в базовом модуле, только если эта функции переопределятся в функции Инициализация()

Функция Инициализация(модульМеркурий) Экспорт

    Меркурий = модульМеркурий;

    //Здесь описываются все функции которые будут переопределены
    //Меркурий.ПереопределитьФункцию("ПолучитьИНН"                    ,Сам());

КонецФункции // Инициализация

а здесь она закомментирована, приведена только для примера оформления. Таким образом при использовании оригинального файла никаких переопределений не будет.

По обмену с ВСД - хорошо.

P.S. Ну и я не только задаю вопросы но и предлагаю почти готовые решения :)

RE: Интеграция с 1С 7.7 Бухгалтерия (записки с фронта). - Добавил(а) Анисимов Михаил больше 6 лет назад

На рабочей базе (другая ОС) столкнулся с проблемами при регистрации DLL

1) Мне кажется более удобным является одновременная регистрация обоих DLL файлов (как тестовой так и рабочей), пусть даже в наличии только одна из них.

2) Путь к DLL потребовалось заключить в кавычки.

Итоговый код регистрации DLL из обработки Меркурий_Параметры_ТЕСТ.ert ниже

Процедура ЗарегистрироватьDLL()

    ИмяФайла="";
    КаталогОбработки="";

    РасположениеФайла(КаталогОбработки, ИмяФайла);

     КаталогИсточник = КаталогОбработки;
     Если Прав(КаталогИсточник,1)<>"\" Тогда
         КаталогИсточник = КаталогИсточник + "\";
     КонецЕсли;                                  

     //Регистрируем рабочую DLL
     Попытка
         текстБАТ = Создатьобъект("Текст");
         текстБАТ.Очистить();
         текстБАТ.КодоваяСтраница(1);

         текстБАТ.ДобавитьСтроку(" 
         //|@echo off
         |%systemdrive%
         |cd %systemroot%\Microsoft.NET\Framework
         |for /d %%d in (v4*.*) do (
         |cd %%%d 
         |regasm """+КаталогОбработки+"SoapDLL_work.dll"" /codebase
         |pause)
         |exit /b 99");

         текстБАТ.Записать(КаталогОбработки + "setupdll_work.bat");  
         ЗапуститьПриложение(КаталогОбработки + "setupdll_work.bat");
     Исключение
         Сообщить(ОписаниеОшибки());
     КонецПопытки;

     //Регистрируем тестовую DLL
     Попытка
         текстБАТ = Создатьобъект("Текст");
         текстБАТ.Очистить();
         текстБАТ.КодоваяСтраница(1);

         текстБАТ.ДобавитьСтроку(" 
         //|@echo off
         |%systemdrive%
         |cd %systemroot%\Microsoft.NET\Framework
         |for /d %%d in (v4*.*) do (
         |cd %%%d 
         |regasm """+КаталогОбработки+"SoapDLL_test.dll"" /codebase
         |pause)
         |exit /b 99");

         текстБАТ.Записать(КаталогОбработки + "setupdll_test.bat");  
         ЗапуститьПриложение(КаталогОбработки + "setupdll_test.bat");
     Исключение
         Сообщить(ОписаниеОшибки());
     КонецПопытки;
КонецПроцедуры

RE: Интеграция с 1С 7.7 Бухгалтерия (записки с фронта). - Добавил(а) кб99 Синявский Филипп больше 6 лет назад

Анисимов Михаил писал(а):

На рабочей базе (другая ОС) столкнулся с проблемами при регистрации DLL

1) Мне кажется более удобным является одновременная регистрация обоих DLL файлов (как тестовой так и рабочей), пусть даже в наличии только одна из них.

Насколько мне известно у вас нет рабочей dll, или я что-то не знаю?

тестовая и рабочая dll регистрируются и работают одновременно без проблем.

2) Путь к DLL потребовалось заключить в кавычки.

Итоговый код регистрации DLL из обработки Меркурий_Параметры_ТЕСТ.ert ниже

Спасибо, поправлю.

RE: Интеграция с 1С 7.7 Бухгалтерия (записки с фронта). - Добавил(а) Анисимов Михаил больше 6 лет назад

Рабочей нет. Но я переопределил у себя режим определения рабочая или нет. Поставил модуль на рабочий сервер и столкнулся с проблемой. По умолчанию система определяет что это рабочий сервер (константы не определены а значит имеют нулевое значение), и при переключении между серверами у меня идет проверка на успешность переключения, а так как библиотеки еще не зарегены - не переключалось, вообщем получился замкнутый круг. Выходом из него попытка регистрации обоих библиотек сразу. Рабочая - проавл, тестовая - успех. И появилась возможность перейти с рабочей на тест. Как то так.

RE: Интеграция с 1С 7.7 Бухгалтерия (записки с фронта). - Добавил(а) кб99 Синявский Филипп больше 6 лет назад

Михаил, все же мне кажется с переключением версий кнопкой вы еще намучаетесь...
лучше - через имя файла:
  • Проще
  • Понятнее
  • Надежнее

RE: Интеграция с 1С 7.7 Бухгалтерия (записки с фронта). - Добавил(а) Анисимов Михаил больше 6 лет назад

Возможно. Время покажет. Никогда не поздно вернуться к вашему варианту.

RE: Интеграция с 1С 7.7 Бухгалтерия (записки с фронта). - Добавил(а) Анисимов Михаил больше 6 лет назад

Добрался до обработки Меркурий_ГрупповаяОбработкаДокументов_Транзакция.

Для работы потребовалось внести изменения в процедуру сбор данных по реализации.
Часть кода из процедуры ЗаполнитьСписокДокументов_Реализации (модуль Меркурий_ГрупповаяОбработкаДокументов_Транзакция) вынесена в модуль Меркурий_ГлобавльныйМодуль, ну и далее переопределена в Модуль_Интеграции. Базовый функционал полностью сохранен.

Что сделано:
1) Модуль Меркурий_ГрупповаяОбработкаДокументов_Транзакция изменена функция ЗаполнитьСписокДокументов_Реализации

Процедура ЗаполнитьСписокДокументов_Реализации()  

    ТЗ = ГМ.ЗаполнитьСписокДокументов_Реализации(ВыбФирма,ВыбКонтрагент,НачДата,КонДата);
    Если ТЗ = "" тогда
        сообщить ("Ошибка сбора данных по реализациям! Данные не собраны!");
        Возврат;
    КонецЕсли;    

    Попытка

        СписокДокументов.УдалитьСтроки();

        тзДок = СоздатьОбъект("ТаблицаЗначений");
        СписокДокументов.Выгрузить(тзДок);

        тз.ВыбратьСтроки();
        Ном=0;
        ПредДок="";
        Пока тз.ПолучитьСтроку()=1 Цикл 
            тзДок.НоваяСтрока();
            тзДок.Пометка            = 1;
            тзДок.Контрагент         = тз.Контрагент;
            тзДок.Грузополучатель             = тз.Грузополучатель;
            тзДок.Док             = тз.Док;
            тзДок.Колво             = тз.Колво;
            тзДок.Вес             = тз.Вес;
            тзДок.КолвоМест         = тз.КолвоМест;
            тзДок.ХозСубъект         = тз.ХозСубъект;
            тзДок.Площадка             = тз.Площадка;
            тзДок.ВСД             = тз.ВСД;
        КонецЦикла; 

        РаскраситьСписокДокументов( тзДок );
        ОбновитьИнф();
    Исключение
        Сообщить("Не удалось выполнить запрос по документам. Проверьте параметры
        |"+ ОписаниеОшибки());
    КонецПопытки;        
КонецПроцедуры

2) Добавлена новая функция ЗаполнитьСписокДокументов_Реализации в модуль Меркурий_ГлобальныйМодуль, результат работы - возврат таблицы значений с необходимыми данными.

//======= ФУНКЦИИ ВЫБОРКИ ДАННЫХ ИЗ УЧЕТНОЙ СИСТЕМЫ ==============

Функция ЗаполнитьСписокДокументов_Реализации(ВыбФирма,ВыбКонтрагент="",НачДата,КонДата) Экспорт

    //{Проверим на переопределение функции, если переопределена вызовем из перекрывающего модуля
    ОбъектВыполнения = ПроверитьПереопределениеФункции("ЗаполнитьСписокДокументов_Реализации");
    Если ПустоеЗначение(ОбъектВыполнения)=0 Тогда
        Возврат ОбъектВыполнения.ЗаполнитьСписокДокументов_Реализации(ВыбФирма,ВыбКонтрагент,НачДата,КонДата);
    КонецЕсли;    
    //}

    //Обязательная к возврату структура таблицы
    тзДок = СоздатьОбъект("ТаблицаЗначений");
    тзДок.НоваяКолонка("Контрагент",,,,,10,);
    тзДок.НоваяКолонка("Грузополучатель",,,,,70,);
    тзДок.НоваяКолонка("Док",,,,,30,);
    тзДок.НоваяКолонка("Колво",,,,,10,);
    тзДок.НоваяКолонка("Вес",,,,,10,);
    тзДок.НоваяКолонка("КолвоМест",,,,,10,);
    тзДок.НоваяКолонка("ХозСубъект",,,,,10,);
    тзДок.НоваяКолонка("Площадка",,,,,30,);
    тзДок.НоваяКолонка("ВСД",,,,,10,);

    //Восстановим значения параматров из прочитанных ранее констант
    НазваниеРеквизитаГрузополучатель     = СписокКонстант.Получить("НазваниеРеквизитаГрузополучатель");
    НазваниеРеквизитаКоличество         = СписокКонстант.Получить("НазваниеРеквизитаКоличество");
    НазваниеРеквизитаКоличествоМест     = СписокКонстант.Получить("НазваниеРеквизитаКоличествоМест");
    НазваниеВидаДокументаРеализация     = СписокКонстант.Получить("НазваниеВидаДокументаРеализация");
    ВСД_Продукция_Свойство                 = СписокКонстант.Получить("ВСД_Продукция_Свойство");

    Попытка

        Если ЭтоSQL=1 Тогда     
            RS = СоздатьОбъект("ODBCRecordset");
            RS.УстБД1С();     

            ТекстЗапроса = " 
            |SELECT
            |    Жур.IDDoc as [Док $Документ],
            |    Жур.IDDocDef as Док_вид,
            |    ДокВСД.IDDoc as [ДокВСД $Документ.ВСД_транзакция],
            |    Жур.DocNo as [НомерДок],
            |    $ДокР."+НазваниеРеквизитаГрузополучатель+" as [Клиент $Справочник.Контрагенты],
            |    SUM($ДокСтроки."+НазваниеРеквизитаКоличество+") [Количество],
            |    SUM($ДокСтроки."+НазваниеРеквизитаКоличествоМест+") [КоличествоМест]
            |FROM
            |    _1SJourn Жур
            |INNER JOIN 
            |    $ДокументСтроки."+НазваниеВидаДокументаРеализация+" as ДокСтроки 
            |        ON Жур.IDDoc = ДокСтроки.IDDoc
            |INNER JOIN 
            |    $Документ."+НазваниеВидаДокументаРеализация+" as ДокР 
            |        ON Жур.IDDoc = ДокР.IDDoc
            |Left join 
            |    $Документ.ВСД_транзакция as ДокВСД
            |    ON SUBSTRING($ДокВСД.ДокОснование, 5, 8) = Жур.IDDoc
            |
            |WHERE
            |    Жур.Date_Time_IDDoc BETWEEN :НачДата AND :КонДата~ AND
            |    Жур.IDDocDef = $ВидДокумента."+НазваниеВидаДокументаРеализация+" 
            |    and Жур.Closed & 1 = 1
            |    %УсловиеПоГрузополучателю%
            //|    %УсловиеПоСвойствуТовара%
            //|    %УсловиеПоФирме%
            //|    %УсловиеПоФилиалу%
            |
            |GROUP BY
            |    Жур.IDDoc,
            |    Жур.IDDocDef,
            |    Жур.DocNo,
            |    $ДокР."+НазваниеРеквизитаГрузополучатель+",
            |    ДокВСД.IDDoc
            |
            |order by Жур.DocNo
            |";            

            УсловиеПоГрузополучателю = "";
            Если ПустоеЗначение(ВыбКонтрагент) = 0 Тогда        
                УсловиеПоГрузополучателю = " and $ДокР."+НазваниеРеквизитаГрузополучатель+" IN (SELECT Val FROM #ГруппаК) ";
            КонецЕсли;
            ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "%УсловиеПоГрузополучателю%", УсловиеПоГрузополучателю);

            RS.УложитьСписокОбъектов(ВыбКонтрагент, "#ГруппаК","Контрагенты");
            RS.УстановитьТекстовыйПараметр("ВСД_Продукция_Свойство", ВСД_Продукция_Свойство);    
            RS.УстановитьТекстовыйПараметр("НачДата", НачДата);
            RS.УстановитьТекстовыйПараметр("КонДата", КонДата);

            //RS.Отладка(1);
            ТЗ = RS.ВыполнитьИнструкцию(ТекстЗапроса);
            //ТЗ.ВыбратьСтроку();

        Иначе    

            Запрос = базаДанных.НовыйЗапрос();

            ТекстЗапроса = " 
            |SELECT
            |    Жур.IDDoc as [Док :Документ],
            |    Жур.IDDocDef as Док_вид,
            |    Жур.DocNo as [НомерДок],
            |    ДокВСД.IDDoc as [ДокВСД $Документ.ВСД_транзакция],
            |    ДокР."+НазваниеРеквизитаГрузополучатель+" as [Клиент :Справочник.Контрагенты],
            |    SUM(ДокСтроки."+НазваниеРеквизитаКоличество+") [Количество],
            |    SUM(ДокСтроки."+НазваниеРеквизитаКоличествоМест+") [КоличествоМест]
            |FROM
            |    Журнал Жур
            |INNER JOIN 
            |    [ДокументСтроки."+НазваниеВидаДокументаРеализация+"] as ДокСтроки 
            |        ON Жур.IDDoc = ДокСтроки.IDDoc
            |INNER JOIN 
            |    [Документ."+НазваниеВидаДокументаРеализация+"] as ДокР 
            |        ON Жур.IDDoc = ДокР.IDDoc
            |Left join 
            |    [Документ.ВСД_транзакция] as ДокВСД
            |    ON SUBSTR(ДокВСД.ДокОснование, 5, 8) = Жур.IDDoc
            |
            |WHERE
            |    Жур.idx_date_time_iddoc BETWEEN :НачДата AND :КонДата~ AND
            |    Жур.IDDocDef = :ВидДокумента."+НазваниеВидаДокументаРеализация+" 
            |    and Жур.Closed & 1 = 1
            |    %УсловиеПоГрузополучателю%
            //|    %УсловиеПоСвойствуТовара%
            //|    %УсловиеПоФирме%
            |    AND ДокСтроки."+НазваниеРеквизитаКоличество+" >0
            |
            |GROUP BY
            |    Жур.IDDoc,
            |    Жур.IDDocDef,
            |    Жур.DocNo,
            |    ДокР."+НазваниеРеквизитаГрузополучатель+",
            |    ДокВСД.IDDoc
            |
            |order by Жур.DocNo
            |";

            УсловиеПоГрузополучателю = "";

            Если ПустоеЗначение(ВыбКонтрагент) = 0 Тогда        
                УсловиеПоГрузополучателю = " and ДокР."+НазваниеРеквизитаГрузополучатель+" IN (SELECT Val FROM ГруппаК) ";
                базаДанных.УложитьОбъекты(ВыбКонтрагент, "ГруппаК",, "Контрагенты");
            КонецЕсли;
            ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "%УсловиеПоГрузополучателю%", УсловиеПоГрузополучателю);

            Запрос.Подставлять("ВСД_Продукция_Свойство", ВСД_Продукция_Свойство);    
            Запрос.Подставлять("НачДата", НачДата);
            Запрос.Подставлять("КонДата", КонДата);
            Запрос.Подставлять("ВыбФирма", ВыбФирма);

            //Запрос.Отладка();
            ТЗ = Запрос.ВыполнитьЗапрос(ТекстЗапроса);
            //ТЗ.ВыбратьСтроку();
        КонецЕсли;

        тз.ВыбратьСтроки();
        Ном=0;
        ПредДок="";
        Пока тз.ПолучитьСтроку()=1 Цикл 
                тзДок.НоваяСтрока();
                тзДок.Контрагент         = тз.Клиент;
                тзДок.Грузополучатель     = тз.Док.ПолучитьАтрибут(НазваниеРеквизитаГрузополучатель);
                тзДок.Док                 = тз.Док;
                тзДок.Колво             = тз.Количество;
                тзДок.Вес                 = тз.Количество;

                Попытка            
                    тзДок.КолвоМест     = тз.КоличествоМест;
                Исключение            
                КонецПопытки;

                тзДок.ХозСубъект = НайтиХозСубъект(тз.Клиент);
                Если ПустоеЗначение(тзДок.ХозСубъект)=0 Тогда
                    тзДок.Площадка         = НайтиПлощадкуПоКонтрагенту( тзДок.Грузополучатель);
                КонецЕсли;

                Попытка
                    Если тз.ДокВСД.ПометкаУдаления()=0 Тогда 
                        тзДок.ВСД         = тз.ДокВСД;
                    КонецЕсли;
                Исключение
                КонецПопытки;
        КонецЦикла; 

    Исключение
        Сообщить("Не удалось выполнить запрос по документам. Проверьте параметры
        |"+ ОписаниеОшибки());
        Возврат "";
    КонецПопытки;        

    Возврат тзДок;
КонецФункции

//======= СЛУЖЕБНЫЕ ФУНКЦИИ ПО НАСТРОЙКЕ РАБОТЫ МОДУЛЯ ==============

Проверить в работе к сожалению не смог, конфигурация не та. Но думаю ошибок нет. Эту функцию у себя я переопределяю под свою конфигурацию.

RE: Интеграция с 1С 7.7 Бухгалтерия (записки с фронта). - Добавил(а) кб99 Синявский Филипп больше 6 лет назад

Анисимов Михаил писал(а):

3) Функционал по обмену ВСД планируется переносить в класс? Просто есть две обработки (обмен и групповая обработка) с дублированием функций по отправке/приему.

все функции по отправке и приему ответов из Меркурия плавно мигрировали в класс Меркурий_ГлобальныйМодуль

RE: Интеграция с 1С 7.7 Бухгалтерия (записки с фронта). - Добавил(а) Анисимов Михаил больше 6 лет назад

Филипп, спасибище!

Разделался с текущими задачами и вернулся снова к этому проекту. Скачал модули на текущий момент.

Вопросы:
1) насколько необходимо сейчас иметь вкладку параметры для обработок (кроме обработки Меркурий_Параметры), они сейчас хранятся в объекте класса .. чисто для информативности?
2) хотелось бы услышать о назначении обработок, в принципе они выполняют схожие процессы обмена, но для чего то они были созданы, особенно 2.2 и 2.3, разные подходы по визуализации процесса отправки?
2.1) Меркурий_ГрупповаяОбработкаДокументов_ТЕСТ
2.2) Меркурий_ГрупповаяОбработкаДокументов_Транзакции_ТЕСТ
2.3) Меркурий_ГО_Реализации_Транзакции_ТЕСТ
3) Наблюдаю некоторую избыточность данных. Есть партияВСД, к нам приходит партия, уходит партия, или их набор. Этаже информацию дублируется в документах ВСД в виде отдельных полей. Может я не до понимаю конечно задумку автора ...

Вставлю свои пять копеек, как бы мне хотелось видеть (может быть пойду таким путем по реализации обмена) с учетом своей специфики.

Имеется форма с следующими вкладками:
1) Приход
ПО умолчанию отображаются все входящие ВСД требующие внимания (не погашенные).
Создается документ ВСД входящий, создается партия ВСД_Партия
В системе 1С на момент гашения должен быть создан документ ПоступлениеМатериалов или ПоступлениеТоваров с занесением строк по партиямУС (учетной системы) (причем некоторые строки поставщика могут еще раздробиться на несколько партийУС - специфика приемки сырья)
Выполняется привязка партийВСД к партиямУС (реализовать скажем в глобальномМодуле вызов спец функции например ПривязатьПартиюВСДвУС(ПартияВСД), возврат 1 - ок, 0 - ошибка), в случае необходимости (в моем случае это 100%) ее переопределить в модуле интеграции. Привязкой добиваемся отношение много партийУС = одна партияВСД.
После полной привязки партий + контроль количества, доступно гашение, с генерацией события в глобальном модуле Событие_ГашениеВходящегоВСД(ДокВСД). При этом в УС выполняется такие функции например блокировка вход докумнта от изменений и т.д. А если дальше идти то надо две функции Событие_ПередГашениемВходящегоВСД() с возможностью отмены (возврат 0), и Событие_ПослеГашенияВходящегоВСД()

2) Реализация
По умолчанию отображаются все документы реализации, по которым небыли отправлены ВСД. Список документов должен возвращаться через функцию, которую можно переопределить. А вообще наверное лучше чтобы возвращался список товарный позиций с указанным ВСД_Продукция_Элемент и партиейВСД, которые надо отгрузить.
Отправка через документ транзакции.
Так же добавляем событие До отправки и после отправки, плюс события отказ в приеме, событие при успешной отправке, событие при гашении и другие возникающие события.

3) Производство
ПО умолчанию отображаются список произведенной продукции (не отправленной в ВСД). Получение данного списка а так же списанного сырья через функции как было сказано выше.
Отправка документа в ГИС с генерацией набора событий.

4) Списания
Пока не добрался и много по нему вопросов.

Вообщем общие идеи таковы:
1) Выборку данных через функции ГлобальногоМодуля с возможностью переопределения в модуле интеграции. Главное описать структуру данных что они должны возвращать и какие входные параметры для отбора
2) Создание системы генерации событий на происходящее, для того чтобы максимально подстроить учетную систему под работу меркурия.

P.S. Для наглядности попробую до конца недели реализовать обработку с выгрузкой "производство".

RE: Интеграция с 1С 7.7 Бухгалтерия (записки с фронта). - Добавил(а) кб99 Синявский Филипп больше 6 лет назад

Добрый день, Михаил, рад увидеть от вас весточку, даже если она на несколько листов ;)

Анисимов Михаил писал(а):

Вопросы:
1) насколько необходимо сейчас иметь вкладку параметры для обработок (кроме обработки Меркурий_Параметры), они сейчас хранятся в объекте класса .. чисто для информативности?

в основном для информации + используются 3 параметра ВСД_Экспертиза, ВСД_Местность, ВСД_особые условия

2) хотелось бы услышать о назначении обработок, в принципе они выполняют схожие процессы обмена, но для чего то они были созданы, особенно 2.2 и 2.3, разные подходы по визуализации процесса отправки?
2.1) Меркурий_ГрупповаяОбработкаДокументов_ТЕСТ
2.2) Меркурий_ГрупповаяОбработкаДокументов_Транзакции_ТЕСТ
2.3) Меркурий_ГО_Реализации_Транзакции_ТЕСТ

Меркурий_ГрупповаяОбработкаДокументов_ТЕСТ - формирует документы ВСД_исходящий на основании Реализаций
Меркурий_ГрупповаяОбработкаДокументов_Транзакции_ТЕСТ - формирует документы ВСД_транзакция на основании Реализаций и ПеремещенийТМЦ
Меркурий_ГО_Реализации_Транзакции_ТЕСТ - формирует документы ВСД_транзакция на основании Реализаций, новый интерфейс

3) Наблюдаю некоторую избыточность данных. Есть партияВСД, к нам приходит партия, уходит партия, или их набор. Этаже информацию дублируется в документах ВСД в виде отдельных полей. Может я не до понимаю конечно задумку автора ...

Справочник ВСД_Партия является результатом документов ВСД_Входящий, ВСД_исходящий
то есть вы заполняете документы, отправляете запрос, если всё в порядке - создается ВСД_Партия - от избыточности никуда не деться, поскольку решение основывается на структуре ответов Ветис.API...
я, конечно, попытаюсь упростить но главное чтобы не усложнить... ;)

Вставлю свои пять копеек, как бы мне хотелось видеть (может быть пойду таким путем по реализации обмена) с учетом своей специфики.

Спасибо, очень рад вашим предложениям, правда не гарантирую что все они будут использованы, сначала нужно обсудить...

Имеется форма с следующими вкладками:
1) Приход
ПО умолчанию отображаются все входящие ВСД требующие внимания (не погашенные).
Создается документ ВСД входящий, создается партия ВСД_Партия

получить список созданных / CREATED Входящих ВСД - функция ПолучитьСписокВСД
после получения ВСД входящий нужно "подтвердить / CONFIRMED* - отправить запрос в Меркурий - этот функционал проверялся поверхностно, т.к. нет электронных Входящий ВСД

В системе 1С на момент гашения должен быть создан документ ПоступлениеМатериалов или ПоступлениеТоваров с занесением строк по партиямУС (учетной системы) (причем некоторые строки поставщика могут еще раздробиться на несколько партийУС - специфика приемки сырья)

много вопросов: насколько понимаю, на основании созданного входящего ВСД можно сформировать только 1 ВСД + 1 возвратный ВСД

Выполняется привязка партийВСД к партиямУС (реализовать скажем в глобальномМодуле вызов спец функции например ПривязатьПартиюВСДвУС(ПартияВСД), возврат 1 - ок, 0 - ошибка), в случае необходимости (в моем случае это 100%) ее переопределить в модуле интеграции. Привязкой добиваемся отношение много партийУС = одна партияВСД.

наверно все же 1 партияУС = 1 партия ВСД - на каждую строку в Табличной части документа Поступление ТМЦ оформляется 1 партия ВСД

После полной привязки партий + контроль количества, доступно гашение, с генерацией события в глобальном модуле Событие_ГашениеВходящегоВСД(ДокВСД). При этом в УС выполняется такие функции например блокировка вход докумнта от изменений и т.д. А если дальше идти то надо две функции Событие_ПередГашениемВходящегоВСД() с возможностью отмены (возврат 0), и Событие_ПослеГашенияВходящегоВСД()

если гашение = подтверждение, то входящий ВСД можно подтвердить 1 раз
Для чего нужны события?

2) Реализация
По умолчанию отображаются все документы реализации, по которым небыли отправлены ВСД. Список документов должен возвращаться через функцию, которую можно переопределить. А вообще наверное лучше чтобы возвращался список товарный позиций с указанным ВСД_Продукция_Элемент и партиейВСД, которые надо отгрузить.
Отправка через документ транзакции.
Так же добавляем событие До отправки и после отправки, плюс события отказ в приеме, событие при успешной отправке, событие при гашении и другие возникающие события.

После отправки ВСД_исходящий имеет статус Подтвержден / CONFIRMED
для получения погашенных / UTILIZED нужно формировать запрос получения списка ВСД

3) Производство
ПО умолчанию отображаются список произведенной продукции (не отправленной в ВСД). Получение данного списка а так же списанного сырья через функции как было сказано выше.
Отправка документа в ГИС с генерацией набора событий.

4) Списания
Пока не добрался и много по нему вопросов.

Вообщем общие идеи таковы:
1) Выборку данных через функции ГлобальногоМодуля с возможностью переопределения в модуле интеграции. Главное описать структуру данных что они должны возвращать и какие входные параметры для отбора

ок, сделаю

2) Создание системы генерации событий на происходящее, для того чтобы максимально подстроить учетную систему под работу меркурия.

Мне не совсем понятно зачем нужны события...

P.S. Для наглядности попробую до конца недели реализовать обработку с выгрузкой "производство".

Спасибо, очень интересно.

RE: Интеграция с 1С 7.7 Бухгалтерия (записки с фронта). - Добавил(а) кб99 Синявский Филипп больше 6 лет назад

Привязку Номенклатуры к ВСД_Продукция_Элемент все же придется менять - поступила информация от сетей, они просят\приказывают выгружать партию по каждому товару отдельно.
Думаю, добавить отдельный реквизит в справочник Номенклатура => ВСД_Продукция_Элемент
связь Много товаров - один ВСД_Продукция_Элемент будет работать

RE: Интеграция с 1С 7.7 Бухгалтерия (записки с фронта). - Добавил(а) Анисимов Михаил больше 6 лет назад

Синявский Филипп писал(а):

Привязку Номенклатуры к ВСД_Продукция_Элемент все же придется менять - поступила информация от сетей, они просят\приказывают выгружать партию по каждому товару отдельно.
Думаю, добавить отдельный реквизит в справочник Номенклатура => ВСД_Продукция_Элемент
связь Много товаров - один ВСД_Продукция_Элемент будет работать

Это требование обязательно для всех начиная с 01.01.2018 года.

Плюс вчера видел одну интересную штуку, коэффициент пересчета. Например, к нам сырье приходит в тоннах, мы в УС учет ведем в кг (иначе большие погрешности в нормах). Далее для нас еденица учета готовой продукции 5 коробок (мы его называем шоубокс) для покупателей вести учет лучше в коробках ... и т.д. Это как предложение к рассмотрению.

RE: Интеграция с 1С 7.7 Бухгалтерия (записки с фронта). - Добавил(а) кб99 Синявский Филипп больше 6 лет назад

1) Приход
ПО умолчанию отображаются все входящие ВСД требующие внимания (не погашенные).
Создается документ ВСД входящий, создается партия ВСД_Партия
В системе 1С на момент гашения должен быть создан документ ПоступлениеМатериалов или ПоступлениеТоваров с занесением строк по партиямУС (учетной системы) (причем некоторые строки поставщика могут еще раздробиться на несколько партийУС - специфика приемки сырья)
Выполняется привязка партийВСД к партиямУС (реализовать скажем в глобальномМодуле вызов спец функции например ПривязатьПартиюВСДвУС(ПартияВСД), возврат 1 - ок, 0 - ошибка), в случае необходимости (в моем случае это 100%) ее переопределить в модуле интеграции. Привязкой добиваемся отношение много партийУС = одна партияВСД.

Для "привязки" партий вижу 2 варианта со своими плюсами и минусами:

1. Указывать в документе ПоступлениеТМЦ в табличной части нужную ВСД
Плюсы:
  • точная привязка к справочнику партий
  • за остатки отвечает стандартные регистры, поскольку количество списания Партия ВСД берется = количеству по регистру
Минусы:
  • расхождения между фактической отгрузкой и партиями в 1С - на складе могут отгрузить то что лежит ближе (как обычно и делают). Для точного соответствия остатков по партиям в 1С и остатками на складе должен быть ордерный склад - это отдельная большая тема для разговора
2. Объединять партии с одинаковой номенклатурой
Плюсы:
  • Срок годности в объединенной партии будет указываться периодом, фактические сроки годности вероятнее будут попадать в этот период
  • Упрощенный вариант выбора партий
Минусы:
  • будут ли разрешать сети указывать срок годности периодом ???

Пока что больше плюсов в варианте №2 ...

RE: Интеграция с 1С 7.7 Бухгалтерия (записки с фронта). - Добавил(а) Анисимов Михаил больше 6 лет назад

мы (наша организация)) пойдем 1 путем. Уже два года эта работа выстраивается. Внедрение Меркурия еще один из "пинков" для склада чтобы он отгружал как надо, или менял партии в отгрузочных документах если это требуется.
у нас история с партионным учетом еще раньше началась, с учетом лекарственных препаратов для животных. Кстати по ним тоже планируется внедрение Меркурия.

2 путь - да проще и наверное единственный вариант где партионный учет не ведется или не велся ранее. Но ооочень большой вопрос по тому пойдут на это федеральные сети или нет.

RE: Интеграция с 1С 7.7 Бухгалтерия (записки с фронта). - Добавил(а) Анисимов Михаил больше 6 лет назад

Не уложился я до пятницы с формой по работе с производственными документами. Дела ...
Но уже дошел до отправки. Вопрос всплыл в другой ветке по формату и обязательному реквизиту. Ждем решения.

Еще вопрос, в связи с тем что возможны ответы типа REJECT не получается связи 1 документ производства = 1 док ВСД, а если в таких случаях затирать данные в ВСД о факте отправки, исправлять документ и отсылать заново? На сколько это "криминально"?

что нам дает история о таких не удачных запросах?

Или с подобной ситуацией столкнемся не раз в других аспектах обмена?

RE: Интеграция с 1С 7.7 Бухгалтерия (записки с фронта). - Добавил(а) Анисимов Михаил больше 6 лет назад

Необходимо внести изменения в глобальныймодуль

Функция ПолучитьАвтора() Экспорт
    //{Проверим на переопределение функции, если переопределена вызовем из перекрывающего модуля
    ОбъектВыполнения = ПроверитьПереопределениеФункции("ПолучитьАвтора");
    Если ПустоеЗначение(ОбъектВыполнения)=0 Тогда
        Возврат ОбъектВыполнения.ПолучитьАвтора();
    КонецЕсли;    
    //}

    //стандартное поведение функции
    Возврат глПользователь;
КонецФункции

Функция ПолучитьОсновнуюФирму() Экспорт

    //{Проверим на переопределение функции, если переопределена вызовем из перекрывающего модуля
    ОбъектВыполнения = ПроверитьПереопределениеФункции("ПолучитьОсновнуюФирму");
    Если ПустоеЗначение(ОбъектВыполнения)=0 Тогда
        Возврат ОбъектВыполнения.ПолучитьОсновнуюФирму();
    КонецЕсли;    
    //}

    //стандартное поведение функции
    Возврат глПользователь.ОсновнаяФирма;
КонецФункции

Функция ПолучитьФилиал() Экспорт

    //{Проверим на переопределение функции, если переопределена вызовем из перекрывающего модуля
    ОбъектВыполнения = ПроверитьПереопределениеФункции("ПолучитьФилиал");
    Если ПустоеЗначение(ОбъектВыполнения)=0 Тогда
        Возврат ОбъектВыполнения.ПолучитьФилиал();
    КонецЕсли;    
    //}

    //стандартное поведение функции
    Возврат глПользователь.Филиал;
КонецФункции
Процедура ЗагрузитьXML_ВСД(имяФайла, докОснование, ВидДокумента)

    //objDom=СоздатьОбъект("MSXML2.DOMDocument");
    //objDom.load(имяФайла);                    

    objDom=СоздатьОбъект("MSXML2.DOMDocument.6.0");
    objDom.load(ИмяФайла);    

    objDom.setProperty("SelectionNamespaces", " 
        |xmlns:bs='http://api.vetrf.ru/schema/cdm/base' 
        |xmlns:argc='http://api.vetrf.ru/schema/cdm/argus/common' 
        |xmlns:ent='http://api.vetrf.ru/schema/cdm/cerberus/enterprise' 
        |xmlns:prod='http://api.vetrf.ru/schema/cdm/argus/production' 
        |xmlns:ns2='http://api.vetrf.ru/schema/cdm/mercury/vet-document' 
        |xmlns:ns1='http://api.vetrf.ru/schema/cdm/mercury/applications' 
        |xmlns:vetd='http://api.vetrf.ru/schema/cdm/mercury/vet-document'
        |xmlns:default='http://www.w3.org/2001/XMLSchema'
        |" );

    applicationId = objDom.selectSingleNode("//*[local-name() = 'applicationId']").text ;

    //vetDocument = objDom.selectSingleNode("//merc:vetDocument") ;
    //vetDocumentList = objDom.selectNodes("//merc:vetDocument") ;
    vetDocumentList = objDom.selectNodes("//*[local-name() = 'vetDocument']") ;    

    Для i1 = 0 По vetDocumentList.length - 1 Цикл
        vetDocument=vetDocumentList.item(i1);
        uuid = vetDocument.selectSingleNode("*[local-name()='uuid']").text;

        //uuid = vetDocument.selectSingleNode("bs:uuid").text;
        st      = vetDocument.selectSingleNode("vetd:status").text;
        type = vetDocument.selectSingleNode("vetd:type").text;

        ВидДокумента = ВыбратьВидДокументаВСД(type);

        createDate = vetDocument.selectSingleNode("vetd:issueDate").text;

        consignorBusinessEntity = vetDocument.selectSingleNode("vetd:consignor").selectSingleNode("ent:businessEntity").selectSingleNode("bs:guid").text;
        consignorEnterprise     = vetDocument.selectSingleNode("vetd:consignor").selectSingleNode("ent:enterprise").selectSingleNode("bs:guid").text;

        Попытка
            consigneeBusinessEntity = vetDocument.selectSingleNode("vetd:consignee").selectSingleNode("ent:businessEntity").selectSingleNode("bs:guid").text;
        Исключение
            consigneeBusinessEntity ="";
        КонецПопытки;
        Попытка
            consigneeEnterprise     = vetDocument.selectSingleNode("vetd:consignee").selectSingleNode("ent:enterprise").selectSingleNode("bs:guid").text;
        Исключение
            consigneeEnterprise = "";
        КонецПопытки;

        batch = vetDocument.selectSingleNode("vetd:batch");

        product     = batch.selectSingleNode("vetd:product").selectSingleNode("bs:guid").text;
        subProduct     = batch.selectSingleNode("vetd:subProduct").selectSingleNode("bs:guid").text;

        Попытка
            productItem = batch.selectSingleNode("*[local-name()='productItem'] ").selectSingleNode("*[local-name()='name']").text;
        Исключение
            Сообщить("Не удалось получить элемент [productItem]","!");
            productItem = "";
        КонецПопытки;

        Попытка
            productItemUuid = batch.selectSingleNode("vetd:productItem").selectSingleNode("bs:uuid").text;
        Исключение
            productItemUuid="";
        КонецПопытки;
        volume         = batch.selectSingleNode("vetd:volume").text;
        unitGuid    = batch.selectSingleNode("vetd:unit").selectSingleNode("bs:guid").text;

        Попытка
            packingFormUuid    = batch.selectSingleNode("*[local-name()='packingList']").selectSingleNode("*[local-name()='packingForm']").selectSingleNode("bs:uuid").text;            
        Исключение
            Сообщить("Не удалось получить элемент [packingForm] [uuid]","!");
            packingFormUuid = "";            
        КонецПопытки;
        Попытка
            packingFormName    = batch.selectSingleNode("*[local-name()='packingList']").selectSingleNode("*[local-name()='packingForm']").selectSingleNode("*[local-name()='name']").text;            
        Исключение
            packingFormName="";
            Сообщить("Не удалось получить элемент [packingForm] [name]","!");
        КонецПопытки;

        packingAmount = batch.selectSingleNode("vetd:packingAmount").text;

        Попытка            
            producer = batch.selectSingleNode("vetd:producerList").selectSingleNode("ent:producer").selectSingleNode("ent:enterprise").selectSingleNode("bs:guid").text;
        Исключение
            producer = "";
        КонецПопытки;

        owner = batch.selectSingleNode("vetd:owner").selectSingleNode("bs:guid").text; //ХозСубъект
        ВладелецХС = НайтиХСпоGUID(owner);

        докОбъект = НайтиВсд(applicationId, uuid, ВидДокумента);
        докОбъект.UUID = uuid;
        Если докОбъект.ТекущийДокумент() <> докОснование Тогда 
            докОбъект.ДокОснование = докОснование;
        КонецЕсли;
        //док.UUID = Компонента.DocUUID;                    

        Попытка 
            докОбъект.Отправитель_ХозСубъект     = НайтиХСпоGUID(consignorBusinessEntity);
        Исключение            
        КонецПопытки;
        Попытка            
            докОбъект.Отправитель_Площадка         = НайтиПлощадку(consignorEnterprise);
        Исключение            
        КонецПопытки;

        Попытка
            докОбъект.Получатель_ХозСубъект     = НайтиХСпоGUID(consigneeBusinessEntity);
        Исключение            
        КонецПопытки;

        Попытка            
            докОбъект.Получатель_Площадка         = НайтиПлощадку(consigneeEnterprise);
        Исключение            
        КонецПопытки;

        докОбъект.Производитель_Площадка     = НайтиПлощадку(producer);
        //Попытка
        //    докОбъект.Производитель_ХозСубъект = докОбъект.Производитель_Площадка.Контрагент;
        //Исключение
        //    Сообщить(ОписаниеОшибки());
        //КонецПопытки;        
        //ДокПартия.Перевозчик_ХозСубъект = ;
        докОбъект.Продукция     = НайтиПродукцию(product);
        докОбъект.ВидПродукции     = НайтиВидПродукции(subProduct);

        докОбъект.Продукция_Элемент = Найти_Продукция_Элемент(productItem, productItemUuid, докОбъект.Продукция, докОбъект.ВидПродукции);
        докОбъект.СвойствоНоменклатурыЗначение = докОбъект.Продукция_Элемент.СвойствоНоменклатурыЗначение;

        докОбъект.Количество     = Число(volume);
        докОбъект.КоличествоМест = Число(packingAmount);
        ФормаУпаковки             = НайтиФормуУпаковки( packingFormUuid, packingFormName);
        докОбъект.ФормаУпаковки = ФормаУпаковки;    

        докОбъект.ЕдиницаИзмерения = НайтиЕдИзмерения( unitGuid );;

        докОбъект.Статус = st;        
        докОбъект.НаименованиеПродукции = productItem;
        докОбъект.Фирма = ПолучитьОсновнуюФирму();
        докОбъект.Автор = ПолучитьАвтора();
        Попытка
            докОбъект.Филиал = ПолучитьФилиал();
        Исключение
        КонецПопытки;

        докОбъект.ДатаДок = СтрокаВДату(createDate);

        докОбъект.Записать();
        докОбъект.Провести();

        Сообщить("Записан "+ВидДокумента+" от "+докОбъект.ДатаДок+" ["+uuid+"]");
    КонецЦикла;

КонецПроцедуры

Функция ЗаписатьПартию(stockEntry)

        //t = stockEntry.text;    
        active = stockEntry.selectSingleNode("bs:active").text;

        uuid = stockEntry.selectSingleNode("bs:uuid").text;
        guid = stockEntry.selectSingleNode("bs:guid").text;
        st = stockEntry.selectSingleNode("bs:status").text;
        entryNumber = stockEntry.selectSingleNode("ns2:entryNumber").text;
        updateDate = stockEntry.selectSingleNode("bs:updateDate").text;
        createDate = stockEntry.selectSingleNode("bs:createDate").text;

        batch = stockEntry.selectSingleNode("ns2:batch");

        product     = batch.selectSingleNode("ns2:product").selectSingleNode("bs:guid").text;
        subProduct     = batch.selectSingleNode("ns2:subProduct").selectSingleNode("bs:guid").text;

        Попытка
            productItemName = batch.selectSingleNode("*[local-name()='productItem'] ").selectSingleNode("*[local-name()='name']").text;
        Исключение
            Сообщить("Не удалось получить элемент [productItem]","!");
            productItemName = "";
        КонецПопытки;

        Попытка
            productItemUuid = batch.selectSingleNode("vetd:productItem").selectSingleNode("bs:uuid").text;
        Исключение            
            productItemUuid="";
        КонецПопытки;

        volume         = batch.selectSingleNode("ns2:volume").text;
        unit        = batch.selectSingleNode("ns2:unit").selectSingleNode("bs:guid").text;

        Попытка
            unitGuid    = batch.selectSingleNode("ns2:unit").selectSingleNode("bs:guid").text;            
        Исключение
            unitGuid = "";            
        КонецПопытки;
        Попытка
            unitUuid    = batch.selectSingleNode("ns2:unit").selectSingleNode("bs:uuid").text;            
        Исключение
            unitUuid = "";            
        КонецПопытки;

        Попытка
            packingFormUuid    = batch.selectSingleNode("*[local-name()='packingList']").selectSingleNode("*[local-name()='packingForm']").selectSingleNode("bs:uuid").text;            
        Исключение
            Сообщить("Не удалось получить элемент [packingForm] [uuid]","!");
            packingFormUuid = "";            
        КонецПопытки;
        Попытка
            packingFormName    = batch.selectSingleNode("*[local-name()='packingList']").selectSingleNode("*[local-name()='packingForm']").selectSingleNode("*[local-name()='name']").text;            
        Исключение
            packingFormName="";
            Сообщить("Не удалось получить элемент [packingForm] [name]","!");
        КонецПопытки;

        packingAmount = batch.selectSingleNode("ns2:packingAmount").text;

        // dateOfProduction 1
        ДатаИзготовления1="";
        ДатаИзготовления="";
        попытка            
            год = ""+batch.selectSingleNode("ns2:dateOfProduction").selectSingleNode("ns2:firstDate").selectSingleNode("bs:year").text;
            мес = ""+batch.selectSingleNode("ns2:dateOfProduction").selectSingleNode("ns2:firstDate").selectSingleNode("bs:month").text;
            день = ""+batch.selectSingleNode("ns2:dateOfProduction").selectSingleNode("ns2:firstDate").selectSingleNode("bs:day").text;
            ДатаИзготовления1 = Дата(год, мес, день);
        Исключение
            Попытка
                ДатаИзготовления = ""+batch.selectSingleNode("ns2:dateOfProduction").text;
            Исключение                
            КонецПопытки;
        КонецПопытки;                
        ДатаИзготовления2="";
        попытка
            год = ""+batch.selectSingleNode("ns2:dateOfProduction").selectSingleNode("ns2:secondDate").selectSingleNode("bs:year").text;
            мес = ""+batch.selectSingleNode("ns2:dateOfProduction").selectSingleNode("ns2:secondDate").selectSingleNode("bs:month").text;
            день = ""+batch.selectSingleNode("ns2:dateOfProduction").selectSingleNode("ns2:secondDate").selectSingleNode("bs:day").text;
            ДатаИзготовления2 = Дата(год, мес, день);
        Исключение            
        КонецПопытки;

        //ДатаСрокГодности
        попытка            
            год = ""+batch.selectSingleNode("ns2:expiryDate").selectSingleNode("ns2:firstDate").selectSingleNode("bs:year").text;
            мес = ""+batch.selectSingleNode("ns2:expiryDate").selectSingleNode("ns2:firstDate").selectSingleNode("bs:month").text;
            день = ""+batch.selectSingleNode("ns2:expiryDate").selectSingleNode("ns2:firstDate").selectSingleNode("bs:day").text;
            ДатаСрокГодности1 = Дата(год, мес, день);
        Исключение
            Попытка
                ДатаСрокГодности = ""+batch.selectSingleNode("ns2:expiryDate").text;
            Исключение                
            КонецПопытки;
        КонецПопытки;
        ДатаСрокГодности2="";
        попытка
            год = ""+batch.selectSingleNode("ns2:expiryDate").selectSingleNode("ns2:secondDate").selectSingleNode("bs:year").text;
            мес = ""+batch.selectSingleNode("ns2:expiryDate").selectSingleNode("ns2:secondDate").selectSingleNode("bs:month").text;
            день = ""+batch.selectSingleNode("ns2:expiryDate").selectSingleNode("ns2:secondDate").selectSingleNode("bs:day").text;
            ДатаСрокГодности2 = Дата(год, мес, день);
        Исключение            
        КонецПопытки;

        Попытка            
            producer = batch.selectSingleNode("ns2:producerList").selectSingleNode("ent:producer").selectSingleNode("ent:enterprise").selectSingleNode("bs:guid").text;
        Исключение
            producer = "";
        КонецПопытки;

        Попытка                
            owner = batch.selectSingleNode("ns2:owner").selectSingleNode("bs:guid").text; //ХозСубъект
            ВладелецХС = НайтиХСпоGUID(owner);
        Исключение
            ВладелецХС = "";
        КонецПопытки;

        Партия = НайтиПартиюПоGUID(guid);

        Если active="false" Тогда 
            Сообщить("Изменения в партию "+Партия+" uuid ["+uuid+"] не внесены. Признак партии = не активна","i");
            Партия.Удалить(0);
            Возврат Партия;
        КонецЕсли;

        Сообщить(" ВСД_Партия от "+createDate+" # "+entryNumber);

        //Партия.ДатаДок = СтрокаВДату(createDate);
        Партия.ДатаИзменения = СтрокаВДату( updateDate );

        Партия.Получатель_ХозСубъект = ВладелецХС;
        Партия.Получатель_Площадка = СписокКонстант.Получить("Отправитель_Площадка"); 
        Партия.Производитель_Площадка = НайтиПлощадку(producer);
        Попытка
            Партия.Производитель_ХозСубъект = Партия.Производитель_Площадка.Контрагент;
        Исключение
            Сообщить(ОписаниеОшибки());
        КонецПопытки;
        Партия.Продукция     = НайтиПродукцию(product);
        Партия.ВидПродукции = НайтиВидПродукции(subProduct);

        Партия.Продукция_Элемент = Найти_Продукция_Элемент(productItemName, productItemUuid, Партия.Продукция, Партия.ВидПродукции);
        Партия.СвойствоНоменклатурыЗначение = Партия.Продукция_Элемент.СвойствоНоменклатурыЗначение;

        Партия.Количество     = Число(volume);
        Партия.КоличествоМест = Число(packingAmount);
        Партия.ФормаУпаковки = НайтиФормуУпаковки( packingFormUuid, packingFormName);;

        Партия.ЕдиницаИзмерения = НайтиЕдИзмерения( unitGuid, unitUUID );;

        Партия.ДатаИзготовления1 = ДатаИзготовления1;
        Партия.ДатаИзготовления2 = ДатаИзготовления2;
        Партия.ДатаИзготовления =  ДатаИзготовления;
        Партия.ДатаСрокГодности = ДатаСрокГодности;
        Партия.ДатаСрокГодности1 = ДатаСрокГодности1;
        Партия.ДатаСрокГодности2 = ДатаСрокГодности2;
        Партия.Статус = st;        
        Партия.GUID = guid;
        Партия.UUID = uuid;
        //Партия.ДатаИзменения = updateDate;
        Партия.НомерЗаписи = entryNumber;
        Партия.НаименованиеПродукции = productItemName;
        Если ПустоеЗначение(productItemName)=0 Тогда 
            Партия.Наименование = productItemName;
        Иначе
            Партия.Наименование = Партия.Продукция_Элемент.Наименование;
        КонецЕсли;
        Партия.Фирма = ПолучитьОсновнуюФирму();
        Если ПустоеЗначение(Партия.Автор)=1 Тогда
            Партия.Автор = ПолучитьАвтора();
        КонецЕсли;

        Попытка
            Партия.Филиал = ПолучитьФилиал();
        Исключение
        КонецПопытки;

        Партия.ВсдДата = СтрокаВДату(createDate);

        Если Партия.Количество=0 Тогда 

            Если ( ПустоеЗначение( Партия.ТекущийЭлемент() ) =0 ) Тогда
                Сообщить("Количество партии guid ["+guid+"] uuid ["+uuid+"] = 0. Партия удалена. ");
                Партия.Удалить(0);
            Иначе
                Сообщить("Количество партии guid ["+guid+"] uuid ["+uuid+"] = 0. Партия пропущена. ");
                Возврат "";
            КонецЕсли;
        КонецЕсли;

        Партия.Записать();

        Возврат Партия;
КонецФункции

связано с заполнением реквизитов филиал,фирма,автор - переделано на вызов процедур.

RE: Интеграция с 1С 7.7 Бухгалтерия (записки с фронта). - Добавил(а) Анисимов Михаил больше 6 лет назад

функции ЗагрузитьXML и ЗаписатьПартию - лучше исправить руками, у меня может быть не последняя версия модуля.

RE: Интеграция с 1С 7.7 Бухгалтерия (записки с фронта). - Добавил(а) Анисимов Михаил больше 6 лет назад

Документ ВСД_Производства после того как он отправлен в ГИС лучше блокировать для изменения. Вопрос по статусу REJECTED ...

RE: Интеграция с 1С 7.7 Бухгалтерия (записки с фронта). - Добавил(а) Анисимов Михаил больше 6 лет назад

Внесены изменения в глобальный модуль.

Добавлена функция получения указанного сохраненного параметра

Функция ПолучитьПараметр(ИмяПараметра) Экспорт //mbIkola
    //{Проверим на переопределение функции, если переопределена вызовем из перекрывающего модуля
    ОбъектВыполнения = ПроверитьПереопределениеФункции("ПолучитьПараметр");
    Если ПустоеЗначение(ОбъектВыполнения)=0 Тогда
        Возврат ОбъектВыполнения.ПолучитьПараметр(ИмяПараметра);
    КонецЕсли;    
    //}

    возврат СписокКонстант.Получить(ИмяПараметра);    
КонецФункции    

Функция ПолучитьПартии
добавлена проверка входного параметра, и если он не передан то берем из сохраненных настроек

Функция ПолучитьПартии(Отправитель_Площадка="", Смещение=0) Экспорт

//Если не указана площадка отправитель, то возьмем ее из сохраненных параметров
Если ПустоеЗначение(Отправитель_Площадка)=1 Тогда
Отправитель_Площадка = ПолучитьПараметр("Отправитель_Площадка");
КонецЕсли;
Если ПустоеЗначение(Отправитель_Площадка.GUID)=1 Тогда 
Сообщить("В выбранной Площадке пустой GUID");
Возврат "REJECTED";
КонецЕсли;
Результат = Компонента.GetStockList(СокрЛП(Отправитель_Площадка.GUID), Смещение);
appID = Компонента.ApplicationId;
//Отладка();
УдалитьXML( Компонента.LogFilename);
Результат = ПолучитьПартииОтветXML(appID);
Пока Результат="IN_PROCESS" Цикл
Пауза();
Результат = ПолучитьПартииОтветXML(appID);
КонецЦикла;
УдалитьXML( Компонента.LogFilename);
Возврат Результат;

КонецФункции

RE: Интеграция с 1С 7.7 Бухгалтерия (записки с фронта). - Добавил(а) Анисимов Михаил больше 6 лет назад

Такс уперся в обязательное требование Меркурия. некоторые единицы измерения делить нельзя. Например коробка может быть только целой!!!
Выход использование коэффициента пересчета, как я писал уже ранее.

RE: Интеграция с 1С 7.7 Бухгалтерия (записки с фронта). - Добавил(а) Анисимов Михаил больше 6 лет назад

Вот что за фигня.

Вчера не мог отправить дробные коробки, а сегодня без проблем ((((((((((((

RE: Интеграция с 1С 7.7 Бухгалтерия (записки с фронта). - Добавил(а) Анисимов Михаил больше 6 лет назад

Анисимов Михаил писал(а):

Вот что за фигня.

Вчера не мог отправить дробные коробки, а сегодня без проблем ((((((((((((

Поспешил с выводом. С утра отправлял производсвенные ВСД ответ пришел статус CONFIRMED а не COMPLETED. И что щас делать с этим статусом? запросить статус заново?

Сейчас отправил снова новый ВСД - REJECTED причина дробна упаковка

RE: Интеграция с 1С 7.7 Бухгалтерия (записки с фронта). - Добавил(а) кб99 Синявский Филипп больше 6 лет назад

количество коробок = целое число = int
Дробное количество коробок у вас получится отправить, только если привести целому числу int

(26-50/51)