Настраиваем обмен данными посредством редактирования правил регистрации объектов в конфигурации «Конвертация данных 2.0».
Ситуация: есть две базы, «Управление торговлей 11.2» и «Бухгалтерия предприятия 3.0». Между ними настроен типовой обмен данными через универсальный формат.
Задача: предоставить пользователю базы «УТ» возможность выборочно запрещать к выгрузке некоторые документы. Например, некоторые из массива документов «Поступление услуг и прочих активов».
Наверное, нам нужен реквизит в документе, чтобы пользователь указывал в нём необходимось запрета на выгрузку.
Чтобы сильно не менять конфигурацию, воспользуемся функционалом подсистемы дополнительных реквизитов. Итак, добавим для документа «Поступление услуг и прочих активов» дополнительный реквизит с наименованием «Не выгружать при синхронизации данных», тип «Булево».
Теперь нужно как-то указать системе, что документы с установленным флагом в нашем новом реквизите выгружать не нужно.
Попробуем настроить это в правилах регистрации объектов.
В разделе «Синхронизация» программы «Управление торговлей» воспользуемся кнопкой «Выгрузить правила регистрации объектов в файл».
Затем откроем конфигурацию «Конвертация данных 2.0» и загрузим в неё выгруженный из «УТ» файл.
Переходим к настройке правил. Найдём в списке заголовок нужного документа «Поступление услуг и прочих активов». Откроем конструктор правила. Во встроенной справке конфигурации «Конвертация данных 2.0» есть описание событий, связанных с регистрацией объектов. Почитав описания, приходим к выводу, что для выполнения нашей задачи нужно обрабатывать событие «Перед обработкой». В соответствующей вкладке создадим обработчик, который будет проверять реквизит «Не выгружать при синхронизации данных» и в случае, когда значение – «Истина», запретит регистрацию объекта для выгрузки.
Текст обработчика:
Запрос = Новый Запрос("ВЫБРАТЬ | ПоступлениеУслугПрочихАктивовДополнительныеРеквизиты.Свойство КАК Свойство, | ПоступлениеУслугПрочихАктивовДополнительныеРеквизиты.Значение КАК Значение |ИЗ | Документ.ПоступлениеУслугПрочихАктивов.ДополнительныеРеквизиты КАК ПоступлениеУслугПрочихАктивовДополнительныеРеквизиты |ГДЕ | ПоступлениеУслугПрочихАктивовДополнительныеРеквизиты.Ссылка = &Ссылка | И ПоступлениеУслугПрочихАктивовДополнительныеРеквизиты.Свойство = &Свойство | И ПоступлениеУслугПрочихАктивовДополнительныеРеквизиты.Значение = Истина"); Запрос.УстановитьПараметр("Ссылка", Объект.Ссылка); Запрос.УстановитьПараметр("Свойство", ПланыВидовХарактеристик.ДополнительныеРеквизитыИСведения.НайтиПоНаименованию("Не выгружать при синхронизации данных (Поступления услуг и прочих активов)")); РезультатЗапроса = Запрос.Выполнить().Выбрать(); Если РезультатЗапроса.Количество() > 0 Тогда Отказ = Истина; КонецЕсли;
Сохраняем файл с модифицированными правилами на жёсткий диск компьютера. Затем загружаем этот файл в программу «Управление торговлей». Кнопка : «Загрузить правила из файла».
Тестируем наши доработки: создаём документ «Поступление услуг и прочих активов» и устанавливаем флажок в поле дополнительного реквизита «Не выгружать при синхронизации данных». Проводим документ и идём в форму обработки «Регистрация изменений для обмена». Тут, вдруг, наблюдаем, что документ благополучно зарегистрировался к выгрузке не взирая на наши ухищрения.
Снимаем с документа регистрацию с помощью функционала обработки «Регистрация изменений для обмена». Проводим документ «Поступление услуг и прочих активов» ещё раз. Видим, что теперь документ к выгрузке не зарегистрировался.
Почему же так произошло? Похоже, при первом проведении система не «увидела» значение реквизита, указывающий на запрет выгрузки. Ведь флажок установлен на форме, а в объекте его ещё нет. К слову сказать, если решать не с помощью дополнительного реквизита, а посредством создания обычного, то такой проблемы не наблюдается.
Выполняя эту задачу, я немного поэкспериментировал с обработкой события «ПриИзменении» для поля формы нашего дополнительного реквизита. В стандартной конфигурации, в общем модуле «УправлениеСвойствами» есть процедура, призванная передавать значения дополнительных реквизитов из формы в объект. Её-то я и задействовал для обработки события «ПриИзменении». Однако желаемого результата не добился. Пришлось идти другим путём.
В справочной системе конфигурации «Конвертация данных 2.0», в описании обработчика «Правила регистрации объектов.Перед обработкой» сказано, что обработчик может выполняться в разном контексте. В контексте «Перед записью объекта», либо в контексте «При выгрузке объекта». Контекст задаётся с помощью параметра «Выгрузка». Если параметр не задан, то по умолчанию контекст выполнения – «Перед записью объекта». Если же мы зададим параметр и присвоим ему значение «Истина», то контекст выполнения будет – «При выгрузке объекта». Это как-раз то, что нам нужно. Ведь при выгрузке объекта система уже должна без проблем считать значение дополнительного реквизита. Итак, добавим в наш код одну строчку, и в конечном варианте он будет выглядеть так:
Выгрузка = Истина; Запрос = Новый Запрос("ВЫБРАТЬ | ПоступлениеУслугПрочихАктивовДополнительныеРеквизиты.Свойство КАК Свойство, | ПоступлениеУслугПрочихАктивовДополнительныеРеквизиты.Значение КАК Значение |ИЗ | Документ.ПоступлениеУслугПрочихАктивов.ДополнительныеРеквизиты КАК ПоступлениеУслугПрочихАктивовДополнительныеРеквизиты |ГДЕ | ПоступлениеУслугПрочихАктивовДополнительныеРеквизиты.Ссылка = &Ссылка | И ПоступлениеУслугПрочихАктивовДополнительныеРеквизиты.Свойство = &Свойство | И ПоступлениеУслугПрочихАктивовДополнительныеРеквизиты.Значение = Истина"); Запрос.УстановитьПараметр("Ссылка", Объект.Ссылка); Запрос.УстановитьПараметр("Свойство", ПланыВидовХарактеристик.ДополнительныеРеквизитыИСведения.НайтиПоНаименованию("Не выгружать при синхронизации данных (Поступления услуг и прочих активов)")); РезультатЗапроса = Запрос.Выполнить().Выбрать(); Если РезультатЗапроса.Количество() > 0 Тогда Отказ = Истина; КонецЕсли;
Тестируем. Теперь, вроде бы, всё работает как надо.
Добавить комментарий