Задача № 1. Обеспечить обмен между базой торговли и бухгалтерии таким образом, чтобы в базе бухгалтерии (где отсутствует партионный учет) появлялось бы столько позиций номенклатуры, сколько есть различных цен этой позиции в базе торговли. Т.е. номенклатуру нужно "размножать".

В конфигурации "Торговля" создаем служебный справочник "НоменклатураБух". Информацию о ценах будем получать из справочника партий. В справочник "Партии" добавляем ссылку на справочник "НоменклатураБух". Структура и связи между справочниками показаны на картинке. Реквизит "Номенклатура" в справочнике "НоменклатураБух" имеет признак сортировки.

Кроме этого потребуется добавить ссылку на справочник "НоменклатураБух" в документы по товародвижению:

Теперь нужно сделать так, чтобы при проведении приходных документов автоматически создавались элементы справочника "НоменклатураБух". При проведении и последующей передаче в базу бухгалтерии перемещений и расходных документов информация о номенклатуре для бухгалтерии будет присутствовать в партиях (движения по регистрам партий). Недостаток: пока документ не проведен, невозможно точно сказать по какой цене уйдет номенклатура (при автосписании партий).

Начнем с глобального модуля.

В глобальном модуле процедуру глОприходованиеПартийТМЦ() изменяем следующим образом:

Если Конт.Вид() = "ПоступлениеТМЦИмпорт" Тогда
    Если ТаблНоменклатуры.Количество*ТаблНоменклатуры.Коэффициент = 0 Тогда
        ПокупнаяЦена    = 0;
    Иначе    
        ПокупнаяЦена    = ТаблНоменклатуры.ТаможеннаяСтоимость/
                          (ТаблНоменклатуры.Количество*ТаблНоменклатуры.Коэффициент);
    КонецЕсли;    
Иначе
    ПокупнаяЦена        = ТаблНоменклатуры.Цена*Конт.Курс;    
КонецЕсли;    
РегПартии.Партия = глЗаполнитьПартию(СпрПартии,  ТаблНоменклатуры.Партия, Поставщик,
                   ДоговорПоставщика,ТекДок,ЗакупочнаяЦена,ПокупнаяЦена);

Функцию глЗаполнитьПартию() видоизменяем следующим образом:

Функция глЗаполнитьПартию(СпрПартии,Партия,Поставщик,ДоговорПоставщика,
                          ПриходныйДокумент,Цена,ПокупнаяЦена = 0) Экспорт
    Если ПокупнаяЦена = 0 Тогда
        ПокупнаяЦена = Цена;
    КонецЕсли;    
    
    Если (Партия.Поставщик<>Поставщик) или (Партия.ДоговорПоставщика<>ДоговорПоставщика) или
         (Партия.ПриходныйДокумент<>ПриходныйДокумент) или (Цена<>Партия.ЗакупочнаяЦена) или
         (ПокупнаяЦена<>Партия.ПокупнаяЦена) Тогда
        
       //...
        СпрПартии.НоменклатураБух    = НайтиНоменклатуруБух(Партия.Владелец, ПокупнаяЦена);
        ОбъектЗаписать(СпрПартии, );
    КонецЕсли;
    
    Возврат Партия;
КонецФункции // глЗаполнитьПартию()

Добавляем собственные функции:

Функция НайтиРодителяНоменкатурыБух(Номенклатура) Экспорт
    Если ПустоеЗначение(Номенклатура) = 1 Тогда
        Возврат "";
    КонецЕсли;

    Спр = СоздатьОбъект("Справочник.НоменклатураБух");
    Спр.ВыбратьЭлементыПоРеквизиту("Номенклатура", Номенклатура, 0, 1);    
    Пока Спр.ПолучитьЭлемент() = 1 Цикл
        Возврат Спр.ТекущийЭлемент();
    КонецЦикла;        
    
    Возврат "";
КонецФункции // НайтиРодителяНоменкатурыБух()

Функция НайтиНоменклатуруБух(Номенклатура, ПокупнаяЦена)
    Спр = СоздатьОбъект("Справочник.НоменклатураБух");
    Спр.ВыбратьЭлементыПоРеквизиту("Номенклатура", Номенклатура, 0, 0);    
    Пока Спр.ПолучитьЭлемент() = 1 Цикл
        Если Спр.ПокупнаяЦена = ПокупнаяЦена Тогда
            Возврат Спр.ТекущийЭлемент();
        КонецЕсли;    
    КонецЦикла;    
    
    Спр.Новый();
    Спр.Наименование    = Номенклатура.Наименование;
    Спр.Номенклатура    = Номенклатура;
    Спр.ПокупнаяЦена    = ПокупнаяЦена;
    Спр.Родитель        = НайтиРодителяНоменкатурыБух(Номенклатура.Родитель);
    ОбъектЗаписать(Спр, );
        
    Возврат Спр.ТекущийЭлемент();
КонецФункции // НайтиНоменклатуруБух()

При изменении наименования номенклатуры при необходимости меняем наименование элементов справочника "НоменклатураБух", также учитываем перенос элементов в другую группу (если группы нужны в бухгалтерской базе).  Также при записи новой группы в справочнике "Номенклатура" создаем группу в справочнике "НоменклатураБух" (если группы нужны в бухгалтерской базе).

В модулях приходных документов добавляем код после вызова процедуры глОприходованиеПартийТМЦ():

ВыбратьСтроки();
Пока ПолучитьСтроку() = 1 Цикл
    НоменклатураБух = Партия.НоменклатураБух;
КонецЦикла;

Теперь осталось учесть разницу в структурах документов конфигурации торговли и бухгалтерии. Для этого воспользуемся предопределенной процедурой МОДа ПриВыгрузкеДокумента(). Будем доставать номенклатуру из партий. А поскольку партии есть только в движениях (при автосписании), то придется перебирать движения по партиям.

Функция ПриВыгрузкеДокумента(Док,Статус,База) Экспорт
    Если СокрЛП(База) = "Бухгалтерия" Тогда
        Если Док.Вид() = "Реализация" Тогда
            Рег      = СоздатьОбъект("Регистр.ПартииНаличие");
            ТЗДок    = СоздатьОбъект("ТаблицаЗначений");
            ВремТЗ   = СоздатьОбъект("ТаблицаЗначений");
            
            Рег.ВыбратьДвиженияДокумента(Док);
            Пока Рег.ПолучитьДвижение() = 1 Цикл
                Если Рег.Количество = 0 Тогда
                    Продолжить;
                КонецЕсли;    
                
                Док.ВыгрузитьТабличнуюЧасть(ВремТЗ);    
                ВремТЗ.Выгрузить(ВремТЗ, Рег.НомерСтроки(), Рег.НомерСтроки());
                ВремТЗ.УстановитьЗначение(1, "Количество",        Рег.Количество);
                ВремТЗ.УстановитьЗначение(1, "НоменклатураБух",   Рег.Партия.НоменклатураБух);
                
                БылоСтрок = ТЗДок.КоличествоСтрок();
                Если БылоСтрок = 0 Тогда
                    ВремТЗ.Выгрузить(ТЗДок);
                Иначе
                    Если ВремТЗ.КоличествоСтрок() > 0 Тогда
                        ТЗДок.КоличествоСтрок(БылоСтрок + ВремТЗ.КоличествоСтрок());
                        ТЗДок.Заполнить(ВремТЗ, БылоСтрок + 1);
                    КонецЕсли;
                КонецЕсли;
            КонецЦикла;    
            
            ТЗДок.Свернуть("Номенклатура, Единица, Коэффициент, Цена, СтавкаНДС, 
                            СтавкаНП, НоменклатураБух", "Количество");
            Док.ЗагрузитьТабличнуюЧасть(ТЗДок);
            
            Док.ВыбратьСтроки();
            Пока Док.ПолучитьСтроку() = 1 Цикл
                глПересчетТаблЧасти(Док, "Количество");
            КонецЦикла;
        КонецЕсли;
    КонецЕсли;    
    
    Возврат 1;
КонецФункции

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

Осталось рассмотреть правила выгрузки и загрузки справочника "НоменклатураБух".

Правила выгрузки из торговой базы для справочника "НоменклатураБух":

Правила загрузки этого справочника в базу бухгалтерии:

Правила выгрузки документа "Реализация" из торговой базы:

Правила загрузки этого документа в базу бухгалтерии:

 

Задача № 2. Обеспечить передачу данных из справочника "Контрагенты" торговой базы в справочник "Контрагенты" бухгалтерской базы.

Торговая база - это модифицированная конфигурация "Торговля и склад". В справочнике "Контрагенты" есть реквизит ЮрФизЛицо, ссылка на справочники вида "ФизЛица", "ЮрЛица", "СвоиЮрЛица".

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

Правила обмена для выгрузки реквизитов из торговли в бухгалтерию:

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

В глобальном модуле конфигурации ТиС разместили такой код:

Функция глПарамДокУЛ(ЮрФизЛицо, Номер) Экспорт
    Если ЮрФизЛицо.Вид() <> "ФизЛица" Тогда
        Возврат "";
    КонецЕсли;    
    
    Стр = ЮрФизЛицо.ДокументУдЛичность;
    
    Стр1 = Стр;
    Стр = СтрЗаменить(Стр,"Иные документы, выдаваемые","Иные документы выдаваемые");
    Стр = СтрЗаменить(Стр,"Военный билет солдата (матроса, сержанта, старшины)",
                          "Военный билет солдата (матроса сержанта старшины)");
    СЗ = глРазложить(Стр);
    Если Найти(Стр1,"Иные документы, выдаваемые")>0 тогда
        СЗ.УдалитьЗначение(1);
        СЗ.ВставитьЗначение(1,"Иные документы, выдаваемые органами МВД")
    КонецЕсли;
    Если Найти(Стр1,"Военный билет солдата")>0 тогда
        СЗ.УдалитьЗначение(1);
        СЗ.ВставитьЗначение(1,"Военный билет солдата (матроса, сержанта, старшины)")
    КонецЕсли;
    
    Попытка
        Значение = СЗ.ПолучитьЗначение(Номер);
        Если Номер = 4 Тогда
            Значение = Дата(Значение);
        КонецЕсли;    
    Исключение
        Значение = "";
    КонецПопытки;    
    
    Возврат Значение;
КонецФункции // глПарамДокУЛ()

Правила обмена загрузки реквизитов в базу бухгалтерии из базы торговли:

 

Задача № 3. Обеспечить передачу данных из справочника "ЮрЛица" оперативной базы в справочник "Контрагенты" бухгалтерской базы. Обеспечить также передачу данных в обратном напрвлении, из базы бухгалтерии.

Как и в предыдущем примере справочник "Контрагенты" оперативной базы имеет реквизит ЮрФизЛицо ("ФизЛица", "ЮрЛица", "СвоиЮрЛица").

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

В обработках обмена (например, "ОбменДаннымиОЛЕ") разместим используемые функции:

Функция ОснДоговор(Значение)
    Спр = СоздатьОбъект("Справочник.Контрагенты");
    Спр.НайтиПоРеквизиту("ЮрФизЛицо", Значение, 1);
    Если Спр.Выбран() = 0 Тогда
        Возврат "";
    КонецЕсли;    
    
    Возврат Спр.ОсновнойДоговор;
КонецФункции

Функция ОснСчет(Значение)
    Спр = СоздатьОбъект("Справочник.Контрагенты");
    Спр.НайтиПоРеквизиту("ЮрФизЛицо", Значение, 1);
    Если Спр.Выбран() = 0 Тогда
        Возврат "";
    КонецЕсли;    
    
    Возврат Спр.ОсновнойСчет;
КонецФункции

Функция IDDКонтрагента(Значение)
    Спр = СоздатьОбъект("Справочник.Контрагенты");
    Спр.НайтиПоРеквизиту("ЮрФизЛицо", Значение, 1);
    Если Спр.Выбран() = 0 Тогда
        Возврат "";
    КонецЕсли;    
    
    Возврат Спр.IDD;
КонецФункции

Рассмотрим изменения в базе бухгалтерского учета.

В справочник "Контрагенты" добавим реквизит "IDDКонтрагента" (строка, 17). В процедуру ПриЗаписи() добавим код для заполнения реквизита.

Процедура ПриЗаписи()
    //Внимание: данная процедура при обновлении Менеджера будет перезаписана заново
    //без сохранения текущего кода !!!
    //Рекомендуем собственные алгоритмы записывать в старую процедуру с префиксом стар_
    ПриИзмененииОбъектаМОД(Контекст, ТекущийЭлемент(), РабочаяДата());
    
    Если ПустоеЗначение(IDDКонтрагента) = 1 Тогда
        IDDКонтрагента = Лев(IDD,7) + "1" + Прав(IDD,9);
    КонецЕсли;    
    
    стар_ПриЗаписи();
КонецПроцедуры

Правила загрузки справочника для базы "Бухгалтерия":

Правила выгрузки справочника "Контрагенты" из бухгалтерской базы показаны на картинке ниже. Обратите внимание на то, что справочник "Контрагенты" загружается в два справочника оперативной базы: "Контрагенты" и "ЮрЛица".

Правила загрузки справочника в базе оперативного учета:

 

Продолжение следует...

 

Другие статьи по МОДу:

Настройка обмена пакетами МОД по расписанию

Ускоряем регистрацию объектов в МОД (для SQL)