В последнее время приходится много времени проводить в работе с 1С Розница и онлайн кассами. На днях понадобилось организовать обмен между 1С БП 3.0 и Розницей. Заказчик хотел чтобы были данные по оптовому и розничному складу в 1С рознице, соответственно оптовые отгрузки надо было проводить в рознице и выгружать в бухгалтерию.
Но как выяснилось синхронизация контрагентов из бухгалтерии в розницу происходит только по тем элементам, у которых договор с видом "С поставщиком". Соответственно такой способ ведения учета предполагал задвоение элементов.
Кроме того даже на начальном этапе хотелось бы всех контрагентов перекинуть из бухгалтерии в розницу. Стандартная обработка, которая позволяет вручную зарегистрировать изменения в плане обмена не срабатывает, т.к. видимо проходит через условие "только поставщики". Поэтому пришлось регистрацию делать программно.
Я в бухгалтерии создал подписку на событие "ПриЗаписи". Добавил свой модуль и написал небольшую процедуру:
Процедура ПриЗаписи(Источник, Отказ) Экспорт ТипЗначИст = ТипЗнч(Источник); Если ТипЗначИст = Тип("СправочникОбъект.Контрагенты") Тогда УзелОбмена = ПланыОбмена.ОбменРозницаБухгалтерияПредприятия30.НайтиПоНаименованию("Розница, редакция 2.2"); ПланыОбмена.ЗарегистрироватьИзменения(УзелОбмена, Источник.Ссылка); КонецЕсли; КонецПроцедуры
Соответственно при записи контрагентов данные будут регистрироваться для обмена. Но, как выяснилось, непосредственно при самом обмене зарегистрированные данные все равно не выгружаются. Ковыряться в правилах не очень люблю, да и меняются они периодически, поэтому пришлось создавать фиктивные договора с поставщиками. Процедура ПриЗаписи() приобретает такой вид:
ТипЗначИст = ТипЗнч(Источник); Если ТипЗначИст = Тип("СправочникОбъект.Контрагенты") Тогда Договор = Справочники.ДоговорыКонтрагентов.НайтиПоРеквизиту("ВидДоговора",Перечисления.ВидыДоговоровКонтрагентов.СПоставщиком,,Источник.Ссылка); Если Договор.Пустая() Тогда НовыйДоговор = Справочники.ДоговорыКонтрагентов.СоздатьЭлемент(); НовыйДоговор.Владелец = Источник.Ссылка; НовыйДоговор.Организация = Справочники.Организации.НайтиПоРеквизиту("ИНН","инн_вашей_орг"); НовыйДоговор.Наименование = "С поставщиком"; НовыйДоговор.ВидДоговора = Перечисления.ВидыДоговоровКонтрагентов.СПоставщиком; НовыйДоговор.УстановитьНовыйКод(); НовыйДоговор.ВалютаВзаиморасчетов = Константы.ВалютаРегламентированногоУчета.Получить(); НовыйДоговор.Комментарий = "Создан автоматически"; НовыйДоговор.Записать(); КонецЕсли; КонецЕсли;
Ну и по тому же сценарию можно написать обработку для переноса всех(или не всех) контрагентов:
&НаСервере Процедура Команда1НаСервере() Запрос = Новый Запрос; Запрос.Текст = "ВЫБРАТЬ | ДоговорыКонтрагентов.Ссылка КАК Ссылка, | ДоговорыКонтрагентов.Владелец КАК Контрагент |ИЗ | Справочник.ДоговорыКонтрагентов КАК ДоговорыКонтрагентов |ГДЕ | ДоговорыКонтрагентов.ВидДоговора <> &ВидДоговора | И НЕ ДоговорыКонтрагентов.ПометкаУдаления"; Запрос.УстановитьПараметр("ВидДоговора",Перечисления.ВидыДоговоровКонтрагентов.СПоставщиком); Выборка = Запрос.Выполнить().Выбрать(); Пока Выборка.Следующий() Цикл Договор = Справочники.ДоговорыКонтрагентов.НайтиПоРеквизиту("ВидДоговора",Перечисления.ВидыДоговоровКонтрагентов.СПоставщиком,,Выборка.Контрагент); Если Договор.Пустая() Тогда НовыйДоговор = Справочники.ДоговорыКонтрагентов.СоздатьЭлемент(); НовыйДоговор.Владелец = Выборка.Контрагент; НовыйДоговор.Организация = Справочники.Организации.НайтиПоРеквизиту("ИНН",""); НовыйДоговор.Наименование = "С поставщиком"; НовыйДоговор.ВидДоговора = Перечисления.ВидыДоговоровКонтрагентов.СПоставщиком; НовыйДоговор.УстановитьНовыйКод(); НовыйДоговор.ВалютаВзаиморасчетов = Константы.ВалютаРегламентированногоУчета.Получить(); НовыйДоговор.Комментарий = "Создан автоматически"; НовыйДоговор.Записать(); КонецЕсли; КонецЦикла; КонецПроцедуры &НаКлиенте Процедура Команда1(Команда) Команда1НаСервере(); КонецПроцедуры
В данном примере я подготовил данные по переносу всех контрагентов, у которых договора не с поставщиком.
Отправить комментарий