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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Комментарии   

0 #2 Максим Донецкий 01.11.2017 11:40
Цитирую Роман:
Спасибо вам за пояснение.
Очень долго мучался с данным вопросом.
Очень вам благодарен!

На здоровье :-)
Цитировать
0 #1 Роман 01.11.2017 11:13
Спасибо вам за пояснение.
Очень долго мучался с данным вопросом.
Очень вам благодарен!
Цитировать

Комментарии

  • pavlo 18.09.2018 13:59
    У меня по второму варианту не получилось. При такой настройке появилась колонка построчно со словами названия колонки ресурса.

    Подробнее...

     
  • Altavista- 17.09.2018 20:51
    Не бесспорное решение: 1. В регистр логичнее добавить 2й ресурс ("вТрансфертныхЦенах"); 2. РС "Наценки"? Однозначно, нет. Это реквизит справочника; 3. Реквизита "Контрагент" в условии задачи тоже нет и ...

    Подробнее...

     
  • Андрей 02.08.2018 09:55
    Большое спасибо! По "Варианту 2": в выбранных полях группировки колонок (у меня их несколько) кроме поля самой колонки пришлось добавить и ресурс.

    Подробнее...