Содержание
- Проблема в КД 2
- Вводные и решение проблемы
- Выводы
Я Галина, ведущий разработчик 1С. Работаю в сфере 1С уже 8 лет. Специализируюсь на 1С:ЗУП, а также смежных программных продуктах и задачах. Прошла путь от фирмы-франчайзи до инхаус и аутсорсинговой компании. Несмотря на существенный опыт работы с 1С в целом, и с КД 2 в частности, до сих пор остаются вопросы. Мир 1С не перестает меня удивлять.
Проблема в КД 2
Есть две базы с разными конфигурациями 1С, между ними реализована синхронизация. В основе типовые правила обмена, но они доработаны под нужды компании — все работает хорошо. Задача: внести небольшое изменение в обмен, а именно добавить к нему реквизит документа, который уже участвует в синхронизации.
Казалось бы, задача простая и у специалиста с опытом работы КД не должно быть проблем. И вот тут произошло неожиданное: у выгружаемого реквизита объекта заполнялись только поля поиска. Нормально обрабатываться и заполняться новый реквизит, а вернее объект, которым заполняется реквизит, отказывался напрочь!
В процессе поиска решения проблемы было перепробовано много различных настроек, прописано условий и просмотрено обработчиков отладчиком. Надеюсь, другим специалистам, которые столкнутся с подобной ситуацией, не придется посвящать её решению много времени и достаточно будет информации в данной статье и предлагаемого решения.
Вводные и решение проблемы
Опишу основные вехи по задаче, нюансы в настройках и некоторые предпринятые варианты поиска решения, а также само решение.
Дано: уже существующий обмен данными между двумя 1С-ными конфигурациями, все работает без нареканий.
Задача: добавить к обмену реквизит документа Источника, чтобы при его отсутствии в Приемнике объект создавался, а при существовании находился. Звучит банально, что может пойти не так?
После обновления структуры метаданных конфигураций-участников обмена, делаем все стандартно:
1. Производим синхронизацию свойств Источника и Приемника. В нашем случае это СчетПолучателя с типом СправочникСсылка.БанковскиеСчетаКонтрагентов в Источнике, который должен преобразовываться в СчетКонтрагента с типом СправочникСсылка.БанковскиеСчета в Приемнике. Сопоставляются реквизиты документа, который уже отлично участвует в обмене.
2. Настраиваем правило конвертации свойств (ПКС). Тут тоже все стандартно
3. Создаем новое правило конвертации объектов (ПКО) в поле Правило, чтобы прописать условия поиска и создания объектов в базе-приемнике для нашего реквизита документа.
4. Настраиваем ПКО таким образом, чтобы сопоставлять объекты только по полям поиска, иметь возможность перезаполнять объекты, создавать новые объекты и автоматически генерировать код, потому что в базе-источнике код не заполняется, а в Приемнике он участвует.
На этом настройку ПКО завершаем.
5. Теперь строка с сопоставлением реквизитов Источника и Приемника нашего документа выглядит так:
6. Надо донастроить сопоставление наших справочников, для этого находим их в папке Справочники списка ПКО. Строка создалась.
7. Выполняем сопоставление реквизитов объектов Приемника и Источника и указываем, что у нас будет 3 поля поиска. Для Банка и Владельца у нас уже имеются подходящие ПКО.
8. Все готово. На всякий случай проверим настройки нашего основного объекта - документа. Флажок «Не выгружать объекты свойств Источника по ссылкам» снят.
9. Приступаем к тестам, получаем неудовлетворительный результат. Реквизит документа заполнился, но с ним что-то не так:
Открываем объект Счета контрагента, и видим, что он совсем плохо заполнился:
Напомню, что у нас были сопоставлены реквизиты: Банк, Владелец/Контрагент, Номер счета, Пометка удаления и Наименование. В результате видим, что наименование не заполнилось, а вот поля поиска заполнились отлично. Не заполнились и другие обязательные поля, но мы их не прописывали. Необходимо указать их заполнение.
10. Возвращаемся к настройке нашей ПКО «БанковскиеСчета_Контрагентов». Пропишем автозаполнение обязательных полей в обработчике «После загрузки» (выполняется до записи объекта в БД).
11. Тестируем повторно и обнаруживаем, что результат не изменился. Вызывает недоумение? Несомненно.
12. Перебрав различные варианты, покопавшись отладчиком и в настройках в Конвертации данных (КД), возник вывод: при загрузке в Приемнике настроенное ПКО «БанковскиеСчета_Контрагентов» при заполнении объекта реквизита передаваемого документа почему-то не применяется. В отладке в обработчиках загрузки нового объекта Счет контрагента почему-то ИмяПКО = "".
Почему же объект создается? Тут отрабатывают поля поиска и заполняются только они, именно поэтому хоть и сопоставленное, но не включенное в список полей поиска, поле Наименование не заполняется. С такой ситуацией столкнулась впервые, хоть и есть опыт работы с КД 2. Отмечу, что настройка правил выгрузки (ПВД) для данного случая тоже оказалась неэффективной. Смотрим почему же ПКО не применяется, если оно в явном виде указано? В файле выгрузки имеем:
В подчеркнутом месте между >< должно быть прописано «ИмяПКО="БанковскиеСчета_Контрагентов"»., а у нас почему-то это не прописано…
Изучив разные источники, решила попробовать вот такую строчку прописать в ПКО:
Описание об этом параметре в справке вот такое: «ТолькоПолучитьУзелСсылки - Если Истина, то объект не выгружается - лишь формируется узел ссылки. В списке выгруженных – объект ищется.» Что это конкретно означает и почему такая проблема возникла именно на указанном ПКО? Кроме того, в справке в явном виде не указано значение данного параметра по умолчанию. Видимо в моем случае значение параметра принимало значение ТолькоПолучитьУзелСсылки = Истина.
Попробую интерпретировать этот параметр на основе рассматриваемого примера. Если в момент выгрузки документа в свойстве этого документа встретилась ссылка на элемент справочника, то если ТолькоПолучитьУзелСсылки = Ложь, этот элемент справочника также будет выгружен согласно соответствующему ПКО “по ссылке”, а в свойстве документа будет указан узел ссылки на данный элемент справочника. В процессе загрузки документ и элемент справочника будут загружены полностью, а также за счет узла ссылки на элемент справочника, ссылка из документа на него будет сохранена. Если же в ПКО для справочника в обработчике «Перед выгрузкой» прописано ТолькоПолучитьУзелСсылки = Истина, то этот элемент не будет выгружен целиком, несмотря на другие настройки и обработчики, будет выгружен только узел ссылки. При выполнении загрузки, если данный элемент справочника уже присутствует в базе-приемнике и будет найден, то в свойстве документа заполнится ссылка на найденный объект, а если соответствующий элемент справочника не будет найден, то будет создан новый пустой элемент справочника без выполнения обработчиков ПКО, в котором будет только та информация, которая была в узле ссылки, то есть поля поиска.
Использование рассматриваемого параметра ТолькоПолучитьУзелСсылки позволяет сократить размер выгружаемого файла при обмене при необходимости.
14. Тестируем снова. Счет контрагента создался и корректно заполнился:
Даже обработчики «После загрузки» отработали. Красота!
Выводы
Если в работе с КД 2 возникает проблема с заполнением объектов, которые являются свойствами основных участников обмена, а именно не отрабатывают никакие обработчики ПКО, кроме «Перед выгрузкой», а также не заполняются никакие реквизиты, кроме полей поиска, то первым делом следует попробовать прописать в обработчике ПКО «Перед выгрузкой» следующую строку:
ТолькоПолучитьУзелСсылки = Ложь;
Это решение помогло решить мою задачу. Надеюсь, что оно пригодится и вам.
Автор: Галина Б., ведущий разработчик 1С.