1С бухгалтерия

Так совпало, что мне на днях предстояло делать достаточно сложный обмен данными между несколькими совершенно разными конфигурациями. Для части данных основным источником является одна конфигурация, для части других данных другая конфигурация и т.д. Прежде чем приступать к этой задаче решил поковырять демонстрационную конфигу по обмену данными с ИТС. И тут же подкинули еще одну задачу, связанную с обменом данными. Почему-то в БП 3.0 при настроенном обмене по организации, обмен происходит по всем организациям, как будто фильтра вообще и нет.

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

  • Либо регистрируются изменения по всем организациям и фильтрация происходит при выгрузке
  • Либо фильтрация происходит уже на этапе регистрации изменений объектов и выгрузка уже ничего не фильтрует

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

Процедура ВыполнитьОбработчикПРОПослеОбработки(ПРО, Отказ, Объект, ОбъектМетаданных, Получатели, Знач Выгрузка)
 
	Если ПРО.ЕстьОбработчикПослеОбработки Тогда
 
		Попытка
			Выполнить(ПРО.ПослеОбработки);
		Исключение
...
 
КонецПроцедуры

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

ГлавныйУзел = ПланыОбмена.ГлавныйУзел();
 
Если ГлавныйУзел <> Неопределено И
	Объект.ОбменДанными.Отправитель <> ГлавныйУзел Тогда
	Получатели.Добавить(ГлавныйУзел);
КонецЕсли;
 
Если Не Выгрузка Тогда
	ПроцедурыОбменаДаннымиПоОрганизации.ВыполнитьРегистрациюСвязанныхПрисоединенныхФайлов(Объект.Ссылка, Получатели, "РеализацияТоваровУслугПрисоединенныеФайлы");
КонецЕсли;

Что мы здесь видим. На входе у нас пустой массив Получатели (как и должно быть, т.к. изменяется документ по не нужной нам организации), а на выходе нам тут добавляется в качестве получателя главный узел. При чем уже без всякой проверки на то, по какой организации происходит регистрация.
Так же из этого модуля видно, что косяк случается только на перифириойной базе (ГлавныйУзел <> Неопределено), в центральной базе регистрация изменений происходит только по выбранным организациям(ГлавныйУзел = Неопределено). Объект.ОбменДанными.Отправитель всегда равно Неопределено что в центральной, что в периферийной базе (т.к. запись объекта происходит не при обмене данными).

Как исправлять. Как вариант можно, наверное, подправить правила регистрации объектов, которые находятся в соответствующем макете в правилах обмена по организации. Но там слишком много придется вносить однообразных изменений, а если на автомате делать замену, то вполне возможно что-то лишнее можно зацепить.
Поэтому я решил внести изменения прямо в общем модуле "ОбменДаннымиСобытия":

Процедура ВыполнитьОбработчикПРОПослеОбработки(ПРО, Отказ, Объект, ОбъектМетаданных, Получатели, Знач Выгрузка)
 
	НачКол = Получатели.Количество(); // ХА
	Если ПРО.ЕстьОбработчикПослеОбработки Тогда
...
	КонецЕсли;
	// ХА
	КонКол = Получатели.Количество();
	Если КонКол > НачКол Тогда
		Если Метаданные.Документы.Содержит(ОбъектМетаданных) Тогда
			Получатели.Удалить(КонКол-1);
		КонецЕсли;
	КонецЕсли;
	// 		ХА
 
КонецПроцедуры
 

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

Отправить комментарий

Содержание этого поля является приватным и не предназначено к показу.
  • Адреса страниц и электронной почты автоматически преобразуются в ссылки.
  • Доступны HTML теги: <a> <em> <strong> <cite> <code> <ul> <ol> <li> <dl> <dt> <dd>
  • Строки и параграфы переносятся автоматически.
  • You can enable syntax highlighting of source code with the following tags: <code>, <blockcode>, <1c7>, <drupal5>, <drupal6>, <javascript>, <php>. Beside the tag style "<foo>" it is also possible to use "[foo]".