Настраиваем обмен данными посредством редактирования правил регистрации объектов в конфигурации "Конвертация данных 2.0".

Ситуация: есть две базы, "Управление торговлей 11.2" и "Бухгалтерия предприятия 3.0". Между ними настроен типовой обмен данными через универсальный формат.

Задача: предоставить пользователю базы "УТ" возможность выборочно запрещать к выгрузке некоторые документы. Например, некоторые из массива документов "Поступление услуг и прочих активов".

Наверное, нам нужен реквизит в документе, чтобы пользователь указывал в нём необходимось запрета на выгрузку.

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

Теперь нужно как-то указать системе, что документы с установленным флагом в нашем новом реквизите выгружать не нужно.

Попробуем настроить это в правилах регистрации объектов.

В разделе "Синхронизация" программы "Управление торговлей" воспользуемся кнопкой "Выгрузить правила регистрации объектов в файл".

Затем откроем конфигурацию "Конвертация данных 2.0" и загрузим в неё выгруженный из "УТ" файл.

Переходим к настройке правил. Найдём в списке заголовок нужного документа "Поступление услуг и прочих активов". Откроем конструктор правила. Во встроенной справке конфигурации "Конвертация данных 2.0" есть описание событий, связанных с регистрацией объектов. Почитав описания, приходим к выводу, что для выполнения нашей задачи нужно обрабатывать событие "Перед обработкой". В соответствующей вкладке создадим обработчик, который будет проверять реквизит "Не выгружать при синхронизации данных" и в случае, когда значение – "Истина", запретит регистрацию объекта для выгрузки.

Текст обработчика:

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

Сохраняем файл с модифицированными правилами на жёсткий диск компьютера. Затем загружаем этот файл в программу "Управление торговлей". Кнопка : "Загрузить правила из файла".

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

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

Почему же так произошло? Похоже, при первом проведении система не "увидела" значение реквизита, указывающий на запрет выгрузки. Ведь флажок установлен на форме, а в объекте его ещё нет. К слову сказать, если решать не с помощью дополнительного реквизита, а посредством создания обычного, то такой проблемы не наблюдается.

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

В справочной системе конфигурации "Конвертация данных 2.0", в описании обработчика "Правила регистрации объектов.Перед обработкой" сказано, что обработчик может выполняться в разном контексте. В контексте "Перед записью объекта", либо в контексте "При выгрузке объекта". Контекст задаётся с помощью параметра "Выгрузка". Если параметр не задан, то по умолчанию контекст выполнения – "Перед записью объекта". Если же мы зададим параметр и присвоим ему значение "Истина", то контекст выполнения будет – "При выгрузке объекта". Это как-раз то, что нам нужно. Ведь при выгрузке объекта система уже должна без проблем считать значение дополнительного реквизита. Итак, добавим в наш код одну строчку, и в конечном варианте он будет выглядеть так:

Выгрузка = Истина;

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

Тестируем. Теперь, вроде бы, всё работает как надо.