Задача № 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); КонецЕсли; стар_ПриЗаписи(); КонецПроцедуры
Правила загрузки справочника для базы "Бухгалтерия":
Правила выгрузки справочника "Контрагенты" из бухгалтерской базы показаны на картинке ниже. Обратите внимание на то, что справочник "Контрагенты" загружается в два справочника оперативной базы: "Контрагенты" и "ЮрЛица".
Правила загрузки справочника в базе оперативного учета:
Продолжение следует...
Другие статьи по МОДу: